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+IC0tIEFkZGl0aW9uYWwgYXNzZW1ibHkgZmxhZ3MKKy1ETElCT01QX0xERkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gIC0tIEFkZGl0aW9uYWwgbGlua2VyIGZsYWdzCistRExJQk9NUF9MSUJGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAtLSBBZGRpdGlvbmFsIGxpYnJhcmllcyB0byBsaW5rCistRExJQk9NUF9GRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gICAtLSBBZGRpdGlvbmFsIEZvcnRyYW4gY29tcGlsZXIgZmxhZ3MKKworPT09PT09PT09PT09PT09PT09PT09PT0KK0V4YW1wbGUgdXNhZ2VzIG9mIENNYWtlCis9PT09PT09PT09PT09PT09PT09PT09PQorLS0tLSBUeXBpY2FsIHVzYWdlIC0tLS0KK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1pY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9aWNwYyAuLgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLi4KK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZyAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrIC4uCisKKy0tLS0gV2l0aCBWYXJpb3VzIE9wdGlvbnMgLS0tLQorLSBCdWlsZCB0aGUgaTM4NiBMaW51eCBsaWJyYXJ5IHVzaW5nIEdDQyoKK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrIC1ETElCT01QX0FSQ0g9aTM4NiAuLgorCistIEJ1aWxkIHRoZSB4ODZfNjQgZGVidWcgTWFjIGxpYnJhcnkgdXNpbmcgQ2xhbmcqCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Y2xhbmcgLURDTUFLRV9DWFhfQ09NUElMRVI9Y2xhbmcrKyAtRExJQk9NUF9BUkNIPXg4Nl82NCAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4KKworLSBCdWlsZCB0aGUgbGlicmFyeSAoYXJjaGl0ZWN0dXJlIGRldGVybWluZWQgYnkgcHJvYmluZyBjb21waWxlcikgdXNpbmcgdGhlCisgIEludGVsKFIpIEMgQ29tcGlsZXIgYW5kIHRoZSBJbnRlbChSKSBDKysgQ29tcGlsZXIuIEFsc28sIGNyZWF0ZSB0aGUgZm9ydHJhbiBtb2R1bGVzIHVzaW5nCisgIHRoZSBJbnRlbChSKSBGb3J0cmFuIENvbXBpbGVyLgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWljYyAtRENNQUtFX0NYWF9DT01QSUxFUj1pY3BjIC1EQ01BS0VfRm9ydHJhbl9DT01QSUxFUj1pZm9ydCAtRExJQk9NUF9GT1JUUkFOX01PRFVMRVM9b24gLi4KKworLSBIYXZlIENNYWtlIEZpbmQgdGhlIEMvQysrIGNvbXBpbGVyLCBhbmQgc3BlY2lmeSBhZGRpdGlvbmFsIGZsYWdzIGZvciB0aGUgQyBjb21waWxlciwgcHJlcHJvY2Vzc29yLCBhbmQgQysrIGNvbXBpbGVyLgorY21ha2UgLURMSUJPTVBfQ0ZMQUdTPSctc3BlY2lmaWMtZmxhZycgLURMSUJPTVBfQ1BQRkxBR1M9Jy1ETkVXX0ZFQVRVUkU9MSAtRE9MRF9GRUFUVVJFPTAnIC1ETElCT01QX0NYWEZMQUdTPSctLW9uZS1zcGVjaWZpYy1mbGFnIC0tdHdvLXNwZWNpZmljLWZsYWcnIC4uCisKKy0tLS0gQnVpbGQgdGhlIHN0dWJzIGxpYnJhcnkgLS0tLQorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURMSUJPTVBfTElCX1RZUEU9c3R1YnMgLi4KKworPT09PT09PT09CitGb290bm90ZXMKKz09PT09PT09PQorWypdIE90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL0NNYWtlTGlzdHMudHh0IGIvcmMzL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyMjViNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzk3IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgQ01BS0UgbGlib21wCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44IEZBVEFMX0VSUk9SKQorCisjIEFkZCBjbWFrZSBkaXJlY3RvcnkgdG8gc2VhcmNoIGZvciBjdXN0b20gY21ha2UgZnVuY3Rpb25zCitzZXQoQ01BS0VfTU9EVUxFX1BBVEggJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlICR7Q01BS0VfTU9EVUxFX1BBVEh9KQorCisjIFN0YW5kYWxvbmUgYnVpbGQgb3IgcGFydCBvZiBMTFZNPworc2V0KExJQk9NUF9TVEFOREFMT05FX0JVSUxEIEZBTFNFKQoraWYoT1BFTk1QX1NUQU5EQUxPTkVfQlVJTEQgT1IKKyAgICIke0NNQUtFX1NPVVJDRV9ESVJ9IiBTVFJFUVVBTCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IiBPUgorICAgIiR7Q01BS0VfU09VUkNFX0RJUn0vcnVudGltZSIgU1RSRVFVQUwgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSIpCisgIHByb2plY3QobGlib21wIEMgQ1hYKQorICBzZXQoTElCT01QX1NUQU5EQUxPTkVfQlVJTEQgVFJVRSkKK2VuZGlmKCkKKworIyBTZXQgbGlib21wIHZlcnNpb24KK3NldChMSUJPTVBfVkVSU0lPTl9NQUpPUiA1KQorc2V0KExJQk9NUF9WRVJTSU9OX01JTk9SIDApCisKKyMgVGhlc2UgaW5jbHVkZSBmaWxlcyBhcmUgaW4gdGhlIGNtYWtlLyBzdWJkaXJlY3RvcnkKK2luY2x1ZGUoTGlib21wVXRpbHMpCitpbmNsdWRlKExpYm9tcEdldEFyY2hpdGVjdHVyZSkKK2luY2x1ZGUoTGlib21wSGFuZGxlRmxhZ3MpCitpbmNsdWRlKExpYm9tcERlZmluaXRpb25zKQorCisjIERldGVybWluZSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQoraWYoJHtMSUJPTVBfU1RBTkRBTE9ORV9CVUlMRH0pCisgICMgSWYgYWRkaW5nIGEgbmV3IGFyY2hpdGVjdHVyZSwgdGFrZSBhIGxvb2sgYXQgY21ha2UvTGlib21wR2V0QXJjaGl0ZWN0dXJlLmNtYWtlCisgIGxpYm9tcF9nZXRfYXJjaGl0ZWN0dXJlKExJQk9NUF9ERVRFQ1RFRF9BUkNIKQorICBzZXQoTElCT01QX0FSQ0ggJHtMSUJPTVBfREVURUNURURfQVJDSH0gQ0FDSEUgU1RSSU5HCisgICAgIlRoZSBhcmNoaXRlY3R1cmUgdG8gYnVpbGQgZm9yICh4ODZfNjQvaTM4Ni9hcm0vcHBjNjQvcHBjNjRsZS9hYXJjaDY0L21pYy9taXBzL21pcHM2NCkuIikKKyAgIyBBbGxvdyB1c2VyIHRvIGNob29zZSBhIHN1ZmZpeCBmb3IgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCisgIHNldChMSUJPTVBfTElCRElSX1NVRkZJWCAiIiBDQUNIRSBTVFJJTkcKKyAgICAic3VmZml4IG9mIGxpYiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGUuZy4sIDY0ID0+IGxpYjY0IikKKyAgIyBTaG91bGQgYXNzZXJ0aW9ucyBiZSBlbmFibGVkPyAgVGhleSBhcmUgb24gYnkgZGVmYXVsdC4KKyAgc2V0KExJQk9NUF9FTkFCTEVfQVNTRVJUSU9OUyBUUlVFIENBQ0hFIEJPT0wKKyAgICAiZW5hYmxlIGFzc2VydGlvbnM/IikKKyAgc2V0KExJQk9NUF9FTkFCTEVfV0VSUk9SIEZBTFNFIENBQ0hFIEJPT0wKKyAgICAiRW5hYmxlIC1XZXJyb3IgZmxhZ3MgdG8gdHVybiB3YXJuaW5ncyBpbnRvIGVycm9ycyBmb3Igc3VwcG9ydGluZyBjb21waWxlcnMuIikKKyAgIyBDTUFLRV9CVUlMRF9UWVBFIHdhcyBub3QgZGVmaW5lZCwgc2V0IGRlZmF1bHQgdG8gUmVsZWFzZQorICBpZihOT1QgQ01BS0VfQlVJTERfVFlQRSkKKyAgICBzZXQoQ01BS0VfQlVJTERfVFlQRSBSZWxlYXNlKQorICBlbmRpZigpCitlbHNlKCkgIyBQYXJ0IG9mIExMVk0gYnVpbGQKKyAgIyBEZXRlcm1pbmUgdGhlIG5hdGl2ZSBhcmNoaXRlY3R1cmUgZnJvbSBMTFZNLgorICBzdHJpbmcoVE9MT1dFUiAiJHtMTFZNX1RBUkdFVF9BUkNIfSIgTElCT01QX05BVElWRV9BUkNIKQorICBpZiggTElCT01QX05BVElWRV9BUkNIIFNUUkVRVUFMICJob3N0IiApCisgICAgc3RyaW5nKFJFR0VYIE1BVENIICJeW14tXSoiIExJQk9NUF9OQVRJVkVfQVJDSCAke0xMVk1fSE9TVF9UUklQTEV9KQorICBlbmRpZiAoKQorICBpZihMSUJPTVBfTkFUSVZFX0FSQ0ggTUFUQ0hFUyAiaVsyLTZdODYiKQorICAgIHNldChMSUJPTVBfQVJDSCBpMzg2KQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIFNUUkVRVUFMICJ4ODYiKQorICAgIHNldChMSUJPTVBfQVJDSCBpMzg2KQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIFNUUkVRVUFMICJhbWQ2NCIpCisgICAgc2V0KExJQk9NUF9BUkNIIHg4Nl82NCkKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBTVFJFUVVBTCAieDg2XzY0IikKKyAgICBzZXQoTElCT01QX0FSQ0ggeDg2XzY0KQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIE1BVENIRVMgInBvd2VycGM2NGxlIikKKyAgICBzZXQoTElCT01QX0FSQ0ggcHBjNjRsZSkKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBNQVRDSEVTICJwb3dlcnBjIikKKyAgICBzZXQoTElCT01QX0FSQ0ggcHBjNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggTUFUQ0hFUyAiYWFyY2g2NCIpCisgICAgc2V0KExJQk9NUF9BUkNIIGFhcmNoNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggTUFUQ0hFUyAiYXJtNjQiKQorICAgIHNldChMSUJPTVBfQVJDSCBhYXJjaDY0KQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIE1BVENIRVMgImFybSIpCisgICAgc2V0KExJQk9NUF9BUkNIIGFybSkKKyAgZWxzZSgpCisgICAgIyBsYXN0IGRpdGNoIGVmZm9ydAorICAgIGxpYm9tcF9nZXRfYXJjaGl0ZWN0dXJlKExJQk9NUF9BUkNIKQorICBlbmRpZiAoKQorICBzZXQoTElCT01QX0xJQkRJUl9TVUZGSVggJHtMTFZNX0xJQkRJUl9TVUZGSVh9KQorICBzZXQoTElCT01QX0VOQUJMRV9BU1NFUlRJT05TICR7TExWTV9FTkFCTEVfQVNTRVJUSU9OU30pCisgIHNldChMSUJPTVBfRU5BQkxFX1dFUlJPUiAke0xMVk1fRU5BQkxFX1dFUlJPUn0pCitlbmRpZigpCitsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX0FSQ0ggMzJlIHg4Nl82NCAzMiBpMzg2IGFybSBwcGM2NCBwcGM2NGxlIGFhcmNoNjQgbWljIG1pcHMgbWlwczY0KQorCitzZXQoTElCT01QX0xJQl9UWVBFIG5vcm1hbCBDQUNIRSBTVFJJTkcKKyAgIlBlcmZvcm1hbmNlLFByb2ZpbGluZyxTdHVicyBsaWJyYXJ5IChub3JtYWwvcHJvZmlsZS9zdHVicykiKQorbGlib21wX2NoZWNrX3ZhcmlhYmxlKExJQk9NUF9MSUJfVFlQRSBub3JtYWwgcHJvZmlsZSBzdHVicykKK3NldChMSUJPTVBfT01QX1ZFUlNJT04gNDUgQ0FDSEUgU1RSSU5HCisgICJUaGUgT3Blbk1QIHZlcnNpb24gKDQ1LzQwLzMwKSIpCitpZihMSUJPTVBfT01QX1ZFUlNJT04gRVFVQUwgNDEpCisgIGxpYm9tcF93YXJuaW5nX3NheSgiTElCT01QX09NUF9WRVJTSU9OPTQxIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGxhdGVyIHZlcnNpb24uIFBsZWFzZSB1c2UgNDUuIikKKyAgc2V0KExJQk9NUF9PTVBfVkVSU0lPTiA0NSkKK2VuZGlmKCkKK2xpYm9tcF9jaGVja192YXJpYWJsZShMSUJPTVBfT01QX1ZFUlNJT04gNDUgNDAgMzApCisjIFNldCB0aGUgT3Blbk1QIFllYXIgYW5kIE1vbnRoIGFzc2lvY2lhdGVkIHdpdGggdmVyc2lvbgoraWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgNDUgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDQ1KQorICBzZXQoTElCT01QX09NUF9ZRUFSX01PTlRIIDIwMTUxMSkKK2Vsc2VpZigke0xJQk9NUF9PTVBfVkVSU0lPTn0gR1JFQVRFUiA0MCBPUiAke0xJQk9NUF9PTVBfVkVSU0lPTn0gRVFVQUwgNDApCisgIHNldChMSUJPTVBfT01QX1lFQVJfTU9OVEggMjAxMzA3KQorZWxzZWlmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDMwIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCAzMCkKKyAgc2V0KExJQk9NUF9PTVBfWUVBUl9NT05USCAyMDExMDcpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9PTVBfWUVBUl9NT05USCAyMDA1MDUpCitlbmRpZigpCitzZXQoTElCT01QX01JQ19BUkNIIGtuYyBDQUNIRSBTVFJJTkcKKyAgIkludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSAoSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSkgKGtuZi9rbmMpLiAgSWdub3JlZCBpZiBub3QgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSBidWlsZC4iKQoraWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAibWljIikKKyAgbGlib21wX2NoZWNrX3ZhcmlhYmxlKExJQk9NUF9NSUNfQVJDSCBrbmYga25jKQorZW5kaWYoKQorc2V0KExJQk9NUF9GT1JUUkFOX01PRFVMRVMgRkFMU0UgQ0FDSEUgQk9PTAorICAiQ3JlYXRlIEZvcnRyYW4gbW9kdWxlIGZpbGVzPyAocmVxdWlyZXMgZm9ydHJhbiBjb21waWxlcikiKQorCisjIC0gU3VwcG9ydCBmb3IgdW5pdmVyc2FsIGZhdCBiaW5hcnkgYnVpbGRzIG9uIE1hYworIyAtIEhhdmluZyB0aGlzIGV4dHJhIHZhcmlhYmxlIGFsbG93cyBwZW9wbGUgdG8gYnVpbGQgdGhpcyBsaWJyYXJ5IGFzIGEgdW5pdmVyc2FsIGxpYnJhcnkKKyMgICB3aXRob3V0IGZvcmNpbmcgYSB1bml2ZXJzYWwgYnVpbGQgb2YgdGhlIGxsdm0vY2xhbmcgY29tcGlsZXIuCitzZXQoTElCT01QX09TWF9BUkNISVRFQ1RVUkVTICIke0NNQUtFX09TWF9BUkNISVRFQ1RVUkVTfSIgQ0FDSEUgU1RSSU5HCisgICJGb3IgTWFjIGJ1aWxkcywgc2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIGFyY2hpdGVjdHVyZXMgdG8gYnVpbGQgZm9yIHVuaXZlcnNhbCBmYXQgYmluYXJ5LiIpCitzZXQoQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVMgJHtMSUJPTVBfT1NYX0FSQ0hJVEVDVFVSRVN9KQorCisjIFNob3VsZCBAcnBhdGggYmUgdXNlZCBmb3IgZHluYW1pYyBsaWJyYXJpZXMgb24gTWFjPworIyBUaGUgaWYoTk9UIERFRklORUQpIGlzIHRoZXJlIHRvIGd1YXJkIGEgY2FjaGVkIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpZiBvbmUKKyMgZXhpc3RzIHNvIHRoZXJlIGlzIG5vIGludGVyZmVyZW5jZSB3aXRoIHdoYXQgdGhlIHVzZXIgd2FudHMuICBBbHNvLCBubyBjYWNoZSBlbnRyeQorIyBpcyBjcmVhdGVkIHNvIHRoZXJlIGFyZSBubyBpbmFkdmVydGFudCBlZmZlY3RzIG9uIG90aGVyIHBhcnRzIG9mIExMVk0uCitpZihOT1QgREVGSU5FRCBDTUFLRV9NQUNPU1hfUlBBVEgpCisgIHNldChDTUFLRV9NQUNPU1hfUlBBVEggVFJVRSkKK2VuZGlmKCkKKworIyBVc2VyIHNwZWNpZmllZCBmbGFncy4gIFRoZXNlIGFyZSBhcHBlbmRlZCB0byB0aGUgY29uZmlndXJlZCBmbGFncy4KK3NldChMSUJPTVBfQ0ZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgQyBjb21waWxlciBmbGFncy4iKQorc2V0KExJQk9NUF9DWFhGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIEMrKyBjb21waWxlciBmbGFncy4iKQorc2V0KExJQk9NUF9DUFBGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIEMgcHJlcHJvY2Vzc29yIGZsYWdzLiIpCitzZXQoTElCT01QX0FTTUZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgYXNzZW1ibGVyIGZsYWdzLiIpCitzZXQoTElCT01QX0xERkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBsaW5rZXIgZmxhZ3MuIikKK3NldChMSUJPTVBfTElCRkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBsaW5rZWQgbGlicyBmbGFncy4gKGUuZy4sIC1sbSkiKQorc2V0KExJQk9NUF9GRkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBGb3J0cmFuIGNvbXBpbGVyIGZsYWdzLiAgVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiBMSUJPTVBfRk9SVFJBTl9NT0RVTEVTPT1UUlVFLiIpCisKKyMgU2hvdWxkIHRoZSBsaWJvbXAgbGlicmFyeSBhbmQgZ2VuZXJhdGVkIGhlYWRlcnMgYmUgY29waWVkIGludG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBleHBvcnRzLyBkaXJlY3RvcnkKKyMgVHVybmluZyB0aGlzIHRvIEZBTFNFIGFpZHMgcGFyYWxsZWwgYnVpbGRzIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLgorIyBDdXJyZW50bHksIHRoZSB0ZXN0c3VpdGUgbW9kdWxlIGV4cGVjdHMgdGhlIGp1c3QgYnVpbHQgT3Blbk1QIGxpYnJhcnkgdG8gYmUgbG9jYXRlZCBpbnNpZGUgdGhlIGV4cG9ydHMvCisjIGRpcmVjdG9yeS4gIFRPRE86IGhhdmUgdGVzdHN1aXRlIHJ1biB1bmRlciBsbHZtLWxpdCBkaXJlY3RseS4gIFdlIGNhbiB0aGVuIGdldCByaWQgb2YgY29weWluZyB0byBleHBvcnRzLworc2V0KExJQk9NUF9DT1BZX0VYUE9SVFMgVFJVRSBDQUNIRSBTVFJJTkcKKyAgIlNob3VsZCBleHBvcnRzIGJlIGNvcGllZCBpbnRvIHNvdXJjZSBleHBvcnRzLyBkaXJlY3Rvcnk/IikKKworIyBIV0xPQy1zdXBwb3J0CitzZXQoTElCT01QX1VTRV9IV0xPQyBGQUxTRSBDQUNIRSBCT09MCisgICJVc2UgSHdsb2MgKGh0dHA6Ly93d3cub3Blbi1tcGkub3JnL3Byb2plY3RzL2h3bG9jLykgbGlicmFyeSBmb3IgYWZmaW5pdHk/IikKK3NldChMSUJPTVBfSFdMT0NfSU5TVEFMTF9ESVIgL3Vzci9sb2NhbCBDQUNIRSBQQVRICisgICJJbnN0YWxsIHBhdGggZm9yIGh3bG9jIGxpYnJhcnkiKQorCisjIEdldCB0aGUgYnVpbGQgbnVtYmVyIGZyb20ga21wX3ZlcnNpb24uY3BwCitsaWJvbXBfZ2V0X2J1aWxkX251bWJlcigiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IiBMSUJPTVBfVkVSU0lPTl9CVUlMRCkKK21hdGgoRVhQUiBMSUJPTVBfVkVSU0lPTl9CVUlMRF9ZRUFSICIke0xJQk9NUF9WRVJTSU9OX0JVSUxEfS8xMDAwMCIpCittYXRoKEVYUFIgTElCT01QX1ZFUlNJT05fQlVJTERfTU9OVEhfREFZICIke0xJQk9NUF9WRVJTSU9OX0JVSUxEfSUxMDAwMCIpCisKKyMgQ3VycmVudGx5IGRvbid0IHJlY29yZCBhbnkgdGltZXN0YW1wcworc2V0KExJQk9NUF9CVUlMRF9EQVRFICJOb19UaW1lc3RhbXAiKQorCisjIEFyY2hpdGVjdHVyZQorc2V0KElBMzIgRkFMU0UpCitzZXQoSU5URUw2NCBGQUxTRSkKK3NldChBUk0gRkFMU0UpCitzZXQoQUFSQ0g2NCBGQUxTRSkKK3NldChQUEM2NEJFIEZBTFNFKQorc2V0KFBQQzY0TEUgRkFMU0UpCitzZXQoUFBDNjQgRkFMU0UpCitzZXQoTUlDIEZBTFNFKQorc2V0KE1JUFM2NCBGQUxTRSkKK3NldChNSVBTIEZBTFNFKQoraWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAiaTM4NiIgT1IgIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAiMzIiKSAgICAjIElBLTMyIGFyY2hpdGVjdHVyZQorICBzZXQoSUEzMiBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgIng4Nl82NCIgT1IgIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAiMzJlIikgIyBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUKKyAgc2V0KElOVEVMNjQgVFJVRSkKK2Vsc2VpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJhcm0iKSAjIEFSTSBhcmNoaXRlY3R1cmUKKyAgc2V0KEFSTSBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgInBwYzY0IikgIyBQUEM2NEJFIGFyY2hpdGVjdHVyZQorICBzZXQoUFBDNjRCRSBUUlVFKQorICBzZXQoUFBDNjQgVFJVRSkKK2Vsc2VpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJwcGM2NGxlIikgIyBQUEM2NExFIGFyY2hpdGVjdHVyZQorICBzZXQoUFBDNjRMRSBUUlVFKQorICBzZXQoUFBDNjQgVFJVRSkKK2Vsc2VpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJhYXJjaDY0IikgIyBBQVJDSDY0IGFyY2hpdGVjdHVyZQorICBzZXQoQUFSQ0g2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgIm1pYyIpICMgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisgIHNldChNSUMgVFJVRSkKK2Vsc2VpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJtaXBzIikgIyBNSVBTIGFyY2hpdGVjdHVyZQorICAgIHNldChNSVBTIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAibWlwczY0IikgIyBNSVBTNjQgYXJjaGl0ZWN0dXJlCisgICAgc2V0KE1JUFM2NCBUUlVFKQorZW5kaWYoKQorCisjIFNldCBzb21lIGZsYWdzIGJhc2VkIG9uIGJ1aWxkX3R5cGUKK3NldChSRUxFQVNFX0JVSUxEIEZBTFNFKQorc2V0KERFQlVHX0JVSUxEIEZBTFNFKQorc2V0KFJFTFdJVEhERUJJTkZPX0JVSUxEIEZBTFNFKQorc2V0KE1JTlNJWkVSRUxfQlVJTEQgRkFMU0UpCitzdHJpbmcoVE9MT1dFUiAiJHtDTUFLRV9CVUlMRF9UWVBFfSIgbGlib21wX2J1aWxkX3R5cGVfbG93ZXJjYXNlKQoraWYoIiR7bGlib21wX2J1aWxkX3R5cGVfbG93ZXJjYXNlfSIgU1RSRVFVQUwgInJlbGVhc2UiKQorICBzZXQoUkVMRUFTRV9CVUlMRCBUUlVFKQorZWxzZWlmKCIke2xpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJkZWJ1ZyIpCisgIHNldChERUJVR19CVUlMRCBUUlVFKQorZWxzZWlmKCIke2xpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJyZWx3aXRoZGViaW5mbyIpCisgIHNldChSRUxXSVRIREVCSU5GT19CVUlMRCBUUlVFKQorZWxzZWlmKCIke2xpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJtaW5zaXplcmVsIikKKyAgc2V0KE1JTlNJWkVSRUxfQlVJTEQgVFJVRSkKK2VuZGlmKCkKKworIyBJbmNsdWRlIGl0dCBub3RpZnkgaW50ZXJmYWNlPworc2V0KExJQk9NUF9VU0VfSVRUX05PVElGWSBUUlVFIENBQ0hFIEJPT0wKKyAgIkVuYWJsZSBJVFQgbm90aWZ5PyIpCisKKyMgbm9ybWFsLCBwcm9maWxlLCBzdHVicyBsaWJyYXJ5Lgorc2V0KE5PUk1BTF9MSUJSQVJZIEZBTFNFKQorc2V0KFNUVUJTX0xJQlJBUlkgRkFMU0UpCitzZXQoUFJPRklMRV9MSUJSQVJZIEZBTFNFKQoraWYoIiR7TElCT01QX0xJQl9UWVBFfSIgU1RSRVFVQUwgIm5vcm1hbCIpCisgIHNldChOT1JNQUxfTElCUkFSWSBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9MSUJfVFlQRX0iIFNUUkVRVUFMICJwcm9maWxlIikKKyAgc2V0KFBST0ZJTEVfTElCUkFSWSBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9MSUJfVFlQRX0iIFNUUkVRVUFMICJzdHVicyIpCisgIHNldChTVFVCU19MSUJSQVJZIFRSVUUpCitlbmRpZigpCisKKyMgU2V0dGluZyBkaXJlY3RvcnkgbmFtZXMKK3NldChMSUJPTVBfQkFTRV9ESVIgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorc2V0KExJQk9NUF9TUkNfRElSICR7TElCT01QX0JBU0VfRElSfS9zcmMpCitzZXQoTElCT01QX1RPT0xTX0RJUiAke0xJQk9NUF9CQVNFX0RJUn0vdG9vbHMpCitzZXQoTElCT01QX0lOQ19ESVIgJHtMSUJPTVBfU1JDX0RJUn0vaW5jbHVkZS8ke0xJQk9NUF9PTVBfVkVSU0lPTn0pCitzZXQoTElCT01QX0JJTkFSWV9ESVIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIEVuYWJsaW5nIEZvcnRyYW4gaWYgaXQgaXMgbmVlZGVkCitpZigke0xJQk9NUF9GT1JUUkFOX01PRFVMRVN9KQorICBlbmFibGVfbGFuZ3VhZ2UoRm9ydHJhbikKK2VuZGlmKCkKKyMgRW5hYmxlIE1BU00gQ29tcGlsZXIgaWYgaXQgaXMgbmVlZGVkIChXaW5kb3dzIG9ubHkpCitpZihXSU4zMikKKyAgZW5hYmxlX2xhbmd1YWdlKEFTTV9NQVNNKQorZW5kaWYoKQorCisjIEdldHRpbmcgbGVnYWwgdHlwZS9hcmNoCitsaWJvbXBfZ2V0X2xlZ2FsX3R5cGUoTElCT01QX0xFR0FMX1RZUEUpCitsaWJvbXBfZ2V0X2xlZ2FsX2FyY2goTElCT01QX0xFR0FMX0FSQ0gpCisKKyMgQ29tcGlsZXIgZmxhZyBjaGVja3MsIGxpYnJhcnkgY2hlY2tzLCB0aHJlYWRpbmcgY2hlY2ssIGV0Yy4KK2luY2x1ZGUoY29uZmlnLWl4KQorCisjIElzIHRoZXJlIGEgcXVhZCBwcmVjaXNpb24gZGF0YSB0eXBlIGF2YWlsYWJsZT8KKyMgVE9ETzogTWFrZSB0aGlzIGEgcmVhbCBmZWF0dXJlIGNoZWNrCitzZXQoTElCT01QX1VTRV9RVUFEX1BSRUNJU0lPTiAiJHtMSUJPTVBfSEFWRV9RVUFEX1BSRUNJU0lPTn0iIENBQ0hFIEJPT0wKKyAgIlNob3VsZCAxMjgtYml0IHByZWNpc2lvbiBlbnRyeSBwb2ludHMgYmUgYnVpbHQ/IikKK2lmKExJQk9NUF9VU0VfUVVBRF9QUkVDSVNJT04gQU5EIChOT1QgTElCT01QX0hBVkVfUVVBRF9QUkVDSVNJT04pKQorICBsaWJvbXBfZXJyb3Jfc2F5KCIxMjgtYml0IHF1YWQgcHJlY2lzaW9uIGZ1bmN0aW9uYWxpdHkgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIikKK2VuZGlmKCkKKworIyBsaWJnb21wIGRyb3AtaW4gY29tcGF0aWJpbGl0eSByZXF1aXJlcyB2ZXJzaW9uZWQgc3ltYm9scworc2V0KExJQk9NUF9VU0VfVkVSU0lPTl9TWU1CT0xTICIke0xJQk9NUF9IQVZFX1ZFUlNJT05fU1lNQk9MU30iIENBQ0hFIEJPT0wKKyAgIlNob3VsZCB2ZXJzaW9uIHN5bWJvbHMgYmUgdXNlZD8gVGhlc2UgcHJvdmlkZSBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGxpYmdvbXAuIikKK2lmKExJQk9NUF9VU0VfVkVSU0lPTl9TWU1CT0xTIEFORCAoTk9UIExJQk9NUF9IQVZFX1ZFUlNJT05fU1lNQk9MUykpCisgIGxpYm9tcF9lcnJvcl9zYXkoIlZlcnNpb24gc3ltYm9scyBmdW5jdGlvbmFsaXR5IHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIpCitlbmRpZigpCisKKyMgT24gbXVsdGlub2RlIHN5c3RlbXMsIGxhcmdlciBhbGlnbm1lbnQgaXMgZGVzaXJlZCB0byBhdm9pZCBmYWxzZSBzaGFyaW5nCitzZXQoTElCT01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UIEZBTFNFIENBQ0hFIEJPT0wKKyAgIlNob3VsZCBsYXJnZXIgYWxpZ25tZW50ICg0MDk2IGJ5dGVzKSBiZSB1c2VkIGZvciBzb21lIGxvY2tzIGFuZCBkYXRhIHN0cnVjdHVyZXM/IikKKworIyBCdWlsZCBjb2RlIHRoYXQgYWxsb3dzIHRoZSBPcGVuTVAgbGlicmFyeSB0byBjb252ZW5pZW50bHkgaW50ZXJmYWNlIHdpdGggZGVidWdnZXJzCitzZXQoTElCT01QX1VTRV9ERUJVR0dFUiBGQUxTRSBDQUNIRSBCT09MCisgICJFbmFibGUgZGVidWdnZXIgaW50ZXJmYWNlIGNvZGU/IikKKworIyBTaG91bGQgd2UgbGluayB0byBDKysgbGlicmFyeT8KK3NldChMSUJPTVBfVVNFX1NURENQUExJQiBGQUxTRSBDQUNIRSBCT09MCisgICJTaG91bGQgd2UgbGluayB0byBDKysgbGlicmFyeT8iKQorCisjIFRTWCAoeDg2KSBiYXNlZCBsb2NrcyBoYXZlIF9fYXNtIGNvZGUgd2hpY2ggY2FuIGJlIHRyb3VibGVzb21lIGZvciBzb21lIGNvbXBpbGVycy4KKyMgVE9ETzogTWFrZSB0aGlzIGEgcmVhbCBmZWF0dXJlIGNoZWNrCitzZXQoTElCT01QX1VTRV9BREFQVElWRV9MT0NLUyAiJHtMSUJPTVBfSEFWRV9BREFQVElWRV9MT0NLU30iIENBQ0hFIEJPT0wKKyAgIlNob3VsZCBUU1gtYmFzZWQgbG9jayBiZSBjb21waWxlZCAoYWRhcHRpdmUgbG9jayBpbiBrbXBfbG9jay5jcHApLiAgVGhlc2UgYXJlIHg4NiBzcGVjaWZpYy4iKQoraWYoTElCT01QX1VTRV9BREFQVElWRV9MT0NLUyBBTkQgKE5PVCBMSUJPTVBfSEFWRV9BREFQVElWRV9MT0NLUykpCisgIGxpYm9tcF9lcnJvcl9zYXkoIkFkYXB0aXZlIGxvY2tzIChUU1gpIGZ1bmN0aW9uYWxpdHkgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIikKK2VuZGlmKCkKKworIyAtIHN0YXRzLWdhdGhlcmluZyBlbmFibGVzIE9wZW5NUCBzdGF0cyB3aGVyZSB0aGluZ3MgbGlrZSB0aGUgbnVtYmVyIG9mCisjIHBhcmFsbGVsIHJlZ2lvbnMsIGNsb2NrIHRpY2tzIHNwZW50IGluIHBhcnRpY3VsYXIgb3Blbm1wIHJlZ2lvbnMgYXJlIHJlY29yZGVkLgorc2V0KExJQk9NUF9TVEFUUyBGQUxTRSBDQUNIRSBCT09MCisgICJTdGF0cy1HYXRoZXJpbmcgZnVuY3Rpb25hbGl0eT8iKQoraWYoTElCT01QX1NUQVRTIEFORCAoTk9UIExJQk9NUF9IQVZFX1NUQVRTKSkKKyAgbGlib21wX2Vycm9yX3NheSgiU3RhdHMtZ2F0aGVyaW5nIGZ1bmN0aW9uYWxpdHkgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIikKK2VuZGlmKCkKKyMgVGhlIHN0YXRzIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZXMgdGhlIHN0ZCBjKysgbGlicmFyeQoraWYoTElCT01QX1NUQVRTKQorICBzZXQoTElCT01QX1VTRV9TVERDUFBMSUIgVFJVRSkKK2VuZGlmKCkKKworIyBTaGFyZWQgbGlicmFyeSBjYW4gYmUgc3dpdGNoZWQgdG8gYSBzdGF0aWMgbGlicmFyeQorc2V0KExJQk9NUF9FTkFCTEVfU0hBUkVEIFRSVUUgQ0FDSEUgQk9PTAorICAiU2hhcmVkIGxpYnJhcnkgaW5zdGVhZCBvZiBzdGF0aWMgbGlicmFyeT8iKQorCitpZihXSU4zMiBBTkQgTk9UIExJQk9NUF9FTkFCTEVfU0hBUkVEKQorICBsaWJvbXBfZXJyb3Jfc2F5KCJTdGF0aWMgbGlicmFyaWVzIHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzIikKK2VuZGlmKCkKKworIyBPTVBULXN1cHBvcnQKK3NldChMSUJPTVBfT01QVF9ERUJVRyBGQUxTRSBDQUNIRSBCT09MCisgICJUcmFjZSBPTVBUIGluaXRpYWxpemF0aW9uPyIpCitzZXQoTElCT01QX09NUFRfU1VQUE9SVCBGQUxTRSBDQUNIRSBCT09MCisgICJPTVBULXN1cHBvcnQ/IikKK3NldChMSUJPTVBfT01QVF9CTEFNRSBUUlVFIENBQ0hFIEJPT0wKKyAgIk9NUFQtYmxhbWU/IikKK3NldChMSUJPTVBfT01QVF9UUkFDRSBUUlVFIENBQ0hFIEJPT0wKKyAgIk9NUFQtdHJhY2U/IikKK2lmKExJQk9NUF9PTVBUX1NVUFBPUlQgQU5EIChOT1QgTElCT01QX0hBVkVfT01QVF9TVVBQT1JUKSkKKyAgbGlib21wX2Vycm9yX3NheSgiT3Blbk1QIFRvb2xzIEludGVyZmFjZSByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorCisjIFRTQU4tc3VwcG9ydAorc2V0KExJQk9NUF9UU0FOX1NVUFBPUlQgRkFMU0UgQ0FDSEUgQk9PTAorICAiVFNBTi1zdXBwb3J0PyIpCitpZihMSUJPTVBfVFNBTl9TVVBQT1JUIEFORCAoTk9UIExJQk9NUF9IQVZFX1RTQU5fU1VQUE9SVCkpCisgIGxpYm9tcF9lcnJvcl9zYXkoIlRTQU4gZnVuY3Rpb25hbGl0eSByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorCisjIEVycm9yIGNoZWNrIGh3bG9jIHN1cHBvcnQgYWZ0ZXIgY29uZmlnLWl4IGhhcyBydW4KK2lmKExJQk9NUF9VU0VfSFdMT0MgQU5EIChOT1QgTElCT01QX0hBVkVfSFdMT0MpKQorICBsaWJvbXBfZXJyb3Jfc2F5KCJId2xvYyByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorCisjIFNldHRpbmcgZmluYWwgbGlicmFyeSBuYW1lCitzZXQoTElCT01QX0RFRkFVTFRfTElCX05BTUUgbGlib21wKQoraWYoJHtQUk9GSUxFX0xJQlJBUll9KQorICBzZXQoTElCT01QX0RFRkFVTFRfTElCX05BTUUgJHtMSUJPTVBfREVGQVVMVF9MSUJfTkFNRX1wcm9mKQorZW5kaWYoKQoraWYoJHtTVFVCU19MSUJSQVJZfSkKKyAgc2V0KExJQk9NUF9ERUZBVUxUX0xJQl9OQU1FICR7TElCT01QX0RFRkFVTFRfTElCX05BTUV9c3R1YnMpCitlbmRpZigpCitzZXQoTElCT01QX0xJQl9OQU1FICR7TElCT01QX0RFRkFVTFRfTElCX05BTUV9IENBQ0hFIFNUUklORyAiQmFzZSBPTVAgbGlicmFyeSBuYW1lIikKKworaWYoJHtMSUJPTVBfRU5BQkxFX1NIQVJFRH0pCisgIHNldChMSUJPTVBfTElCUkFSWV9TVUZGSVggJHtDTUFLRV9TSEFSRURfTElCUkFSWV9TVUZGSVh9KQorICBzZXQoTElCT01QX0xJQlJBUllfS0lORCBTSEFSRUQpCisgIHNldChMSUJPTVBfSU5TVEFMTF9LSU5EIExJQlJBUlkpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9MSUJSQVJZX1NVRkZJWCAke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0pCisgIHNldChMSUJPTVBfTElCUkFSWV9LSU5EIFNUQVRJQykKKyAgc2V0KExJQk9NUF9JTlNUQUxMX0tJTkQgQVJDSElWRSkKK2VuZGlmKCkKKworc2V0KExJQk9NUF9MSUJfRklMRSAke0xJQk9NUF9MSUJfTkFNRX0ke0xJQk9NUF9MSUJSQVJZX1NVRkZJWH0pCisKKyMgT3B0aW9uYWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYWxpYXNlcy4KK3NldChMSUJPTVBfSU5TVEFMTF9BTElBU0VTIFRSVUUgQ0FDSEUgQk9PTAorICAiSW5zdGFsbCBsaWJnb21wIGFuZCBsaWJpb21wNSBsaWJyYXJ5IGFsaWFzZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IikKKworIyBQcmludCBjb25maWd1cmF0aW9uIGFmdGVyIGFsbCB2YXJpYWJsZXMgYXJlIHNldC4KK2lmKCR7TElCT01QX1NUQU5EQUxPTkVfQlVJTER9KQorICBsaWJvbXBfc2F5KCJPcGVyYXRpbmcgU3lzdGVtICAgICAtLSAke0NNQUtFX1NZU1RFTV9OQU1FfSIpCisgIGxpYm9tcF9zYXkoIlRhcmdldCBBcmNoaXRlY3R1cmUgIC0tICR7TElCT01QX0FSQ0h9IikKKyAgaWYoJHtNSUN9KQorICAgIGxpYm9tcF9zYXkoIkludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgICAgLS0gJHtMSUJPTVBfTUlDX0FSQ0h9IikKKyAgZW5kaWYoKQorICBsaWJvbXBfc2F5KCJCdWlsZCBUeXBlICAgICAgICAgICAtLSAke0NNQUtFX0JVSUxEX1RZUEV9IikKKyAgbGlib21wX3NheSgiT3Blbk1QIFZlcnNpb24gICAgICAgLS0gJHtMSUJPTVBfT01QX1ZFUlNJT059IikKKyAgbGlib21wX3NheSgiTGlicmFyeSBLaW5kICAgICAgICAgLS0gJHtMSUJPTVBfTElCUkFSWV9LSU5EfSIpCisgIGxpYm9tcF9zYXkoIkxpYnJhcnkgVHlwZSAgICAgICAgIC0tICR7TElCT01QX0xJQl9UWVBFfSIpCisgIGxpYm9tcF9zYXkoIkZvcnRyYW4gTW9kdWxlcyAgICAgIC0tICR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30iKQorICAjIHdpbGwgc2F5IGRldmVsb3BtZW50IGlmIGFsbCB6ZXJvcworICBpZigke0xJQk9NUF9WRVJTSU9OX0JVSUxEfSBTVFJFUVVBTCAwMDAwMDAwMCkKKyAgICBzZXQoTElCT01QX0JVSUxEIERldmVsb3BtZW50KQorICBlbHNlKCkKKyAgICBzZXQoTElCT01QX0JVSUxEICR7TElCT01QX1ZFUlNJT05fQlVJTER9KQorICBlbmRpZigpCisgIGxpYm9tcF9zYXkoIkJ1aWxkICAgICAgICAgICAgICAgIC0tICR7TElCT01QX0JVSUxEfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBTdGF0cy1nYXRoZXJpbmcgIC0tICR7TElCT01QX1NUQVRTfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBEZWJ1Z2dlci1zdXBwb3J0IC0tICR7TElCT01QX1VTRV9ERUJVR0dFUn0iKQorICBsaWJvbXBfc2F5KCJVc2UgSVRUIG5vdGlmeSAgICAgICAtLSAke0xJQk9NUF9VU0VfSVRUX05PVElGWX0iKQorICBsaWJvbXBfc2F5KCJVc2UgT01QVC1zdXBwb3J0ICAgICAtLSAke0xJQk9NUF9PTVBUX1NVUFBPUlR9IikKKyAgaWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgICBsaWJvbXBfc2F5KCJVc2UgT01QVC1ibGFtZSAgICAgICAtLSAke0xJQk9NUF9PTVBUX0JMQU1FfSIpCisgICAgbGlib21wX3NheSgiVXNlIE9NUFQtdHJhY2UgICAgICAgLS0gJHtMSUJPTVBfT01QVF9UUkFDRX0iKQorICBlbmRpZigpCisgIGxpYm9tcF9zYXkoIlVzZSBBZGFwdGl2ZSBsb2NrcyAgIC0tICR7TElCT01QX1VTRV9BREFQVElWRV9MT0NLU30iKQorICBsaWJvbXBfc2F5KCJVc2UgcXVhZCBwcmVjaXNpb24gICAtLSAke0xJQk9NUF9VU0VfUVVBRF9QUkVDSVNJT059IikKKyAgbGlib21wX3NheSgiVXNlIFRTQU4tc3VwcG9ydCAgICAgLS0gJHtMSUJPTVBfVFNBTl9TVVBQT1JUfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBId2xvYyBsaWJyYXJ5ICAgIC0tICR7TElCT01QX1VTRV9IV0xPQ30iKQorZW5kaWYoKQorCithZGRfc3ViZGlyZWN0b3J5KHNyYykKK2FkZF9zdWJkaXJlY3RvcnkodGVzdCkKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL1JFQURNRS50eHQgYi9yYzMvcnVudGltZS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZTAxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTE2IEBACisKKyAgICAgICAgICAgICAgIFJFQURNRSBmb3IgdGhlIExMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5CisgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitIb3cgdG8gQnVpbGQgRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIG1haW4gZG9jdW1lbnRhdGlvbiBpcyBpbiBEb3h5Z2VuKiBmb3JtYXQsIGFuZCB0aGlzIGRpc3RyaWJ1dGlvbgorc2hvdWxkIGNvbWUgd2l0aCBwcmUtYnVpbHQgUERGIGRvY3VtZW50YXRpb24gaW4gZG9jL1JlZmVyZW5jZS5wZGYuCitIb3dldmVyLCBhbiBIVE1MIHZlcnNpb24gY2FuIGJlIGJ1aWx0IGJ5IGV4ZWN1dGluZzoKKworJSBkb3h5Z2VuIGRvYy9kb3h5Z2VuL2NvbmZpZworCitpbiB0aGUgcnVudGltZSBkaXJlY3RvcnkuCisKK1RoYXQgd2lsbCBwcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jL2RveHlnZW4vZ2VuZXJhdGVkCitkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBwb2ludGluZyBhIHdlYiBicm93c2VyIGF0IHRoZQoraW5kZXguaHRtbCBmaWxlIHRoZXJlLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBEb3h5Z2VuIGluc3RhbGxlZCwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tCit3d3cuZG94eWdlbi5vcmcuCisKKworSG93IHRvIEJ1aWxkIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSW4tdHJlZSBidWlsZDoKKworJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlCitDaGVjayBvdXQgb3Blbm1wIGludG8gbGx2bS9wcm9qZWN0cworJCBjZCB3aGVyZS15b3Utd2FudC10by1idWlsZAorJCBta2RpciBidWlsZCAmJiBjZCBidWlsZAorJCBjbWFrZSBwYXRoL3RvL2xsdm0gLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPgorJCBtYWtlIG9tcAorCitPdXQtb2YtdHJlZSBidWlsZDoKKworJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlCitDaGVjayBvdXQgb3Blbm1wCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUvb3Blbm1wL3J1bnRpbWUKKyQgbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQKKyQgY21ha2UgcGF0aC90by9vcGVubXAgLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPgorJCBtYWtlCisKK0ZvciBkZXRhaWxzIGFib3V0IGJ1aWxkaW5nLCBwbGVhc2UgbG9vayBhdCBCdWlsZF9XaXRoX0NNYWtlLnR4dAorCitBcmNoaXRlY3R1cmVzIFN1cHBvcnRlZAorPT09PT09PT09PT09PT09PT09PT09PT0KKyogSUEtMzIgYXJjaGl0ZWN0dXJlCisqIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZQorKiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKyogQVJNKiBhcmNoaXRlY3R1cmUKKyogQWFyY2g2NCAoNjQtYml0IEFSTSkgYXJjaGl0ZWN0dXJlCisqIElCTShSKSBQb3dlciBhcmNoaXRlY3R1cmUgKGJpZyBlbmRpYW4pCisqIElCTShSKSBQb3dlciBhcmNoaXRlY3R1cmUgKGxpdHRsZSBlbmRpYW4pCisqIE1JUFMgYW5kIE1JUFM2NCBhcmNoaXRlY3R1cmUKKworU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUEtMzIgYXJjaGl0ZWN0dXJlLCBJbnRlbChSKSA2NCwgYW5kCitJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKworICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIHwgICBpY2MvaWNsICAgICB8ICAgIGdjYyAgICAgIHwgICBjbGFuZyAgICAgIHwKKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICAgWWVzKDEsNSkgICAgfCAgWWVzKDIsNCkgICB8IFllcyg0LDYsNykgICB8Cit8IEZyZWVCU0QqICAgIHwgICBObyAgICAgICAgICB8ICBObyAgICAgICAgIHwgWWVzKDQsNiw3LDgpIHwKK3wgT1MgWCogICAgICAgfCAgIFllcygxLDMsNCkgIHwgIE5vICAgICAgICAgfCBZZXMoNCw2LDcpICAgfAorfCBXaW5kb3dzKiBPUyB8ICAgWWVzKDEsNCkgICAgfCAgTm8gICAgICAgICB8IE5vICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKDEpIE9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQsIGljYy9pY2wgdmVyc2lvbnMgMTIueCBhcmUKKyAgICBzdXBwb3J0ZWQgKDEyLjEgaXMgcmVjb21tZW5kZWQpLgorKDIpIEdDQyogdmVyc2lvbiA0LjcgaXMgc3VwcG9ydGVkLgorKDMpIEZvciBpY2Mgb24gT1MgWCosIE9TIFgqIHZlcnNpb24gMTAuNS44IGlzIHN1cHBvcnRlZC4KKyg0KSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgbm90IHN1cHBvcnRlZC4KKyg1KSBPbiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUsIGljYy9pY2wgdmVyc2lvbnMgMTMuMAorICAgIG9yIGxhdGVyIGFyZSByZXF1aXJlZC4KKyg2KSBDbGFuZyogdmVyc2lvbiAzLjMgaXMgc3VwcG9ydGVkLgorKDcpIENsYW5nKiBjdXJyZW50bHkgZG9lcyBub3Qgb2ZmZXIgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZCAxMjggYml0IGV4dGVuZGVkCisgICAgcHJlY2lzaW9uIHR5cGUuICBUaHVzLCBhbGwgZW50cnkgcG9pbnRzIHJlbGlhbnQgb24gdGhpcyB0eXBlIGFyZSByZW1vdmVkCisgICAgZnJvbSB0aGUgbGlicmFyeSBhbmQgY2Fubm90IGJlIGNhbGxlZCBpbiB0aGUgdXNlciBwcm9ncmFtLiAgVGhlIGZvbGxvd2luZworICAgIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZToKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfKgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl8qCisgICAgX19rbXBjX2F0b21pY18qX2ZwCisoOCkgQ29tbXVuaXR5IGNvbnRyaWJ1dGlvbiBwcm92aWRlZCBBUyBJUywgbm90IHRlc3RlZCBieSBJbnRlbC4KKworU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IElCTShSKSBQb3dlciA3IGFuZCBQb3dlciA4CisKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgfCAgIGdjYyAgICAgIHwgICBjbGFuZyAgICAgIHwKKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwKK3wgTGludXgqIE9TICAgfCAgWWVzKDEsMikgIHwgWWVzKDMsNCkgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKDEpIE9uIFBvd2VyIDcsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC4KKygyKSBPbiBQb3dlciA4LCBnY2MgdmVyc2lvbiA0LjguMiBpcyBzdXBwb3J0ZWQuCisoMykgT24gUG93ZXIgNywgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLgorKDQpIE9uIFBvd2VyIDgsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC4KKworCitGcm9udC1lbmQgQ29tcGlsZXJzIHRoYXQgd29yayB3aXRoIHRoaXMgUlRMCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byBkbyBjb21wYXRpYmxlIGNvZGUgZ2VuZXJhdGlvbiBmb3IKK3RoaXMgUlRMOiBjbGFuZyAoZnJvbSB0aGUgT3Blbk1QIGRldmVsb3BtZW50IGJyYW5jaCBhdAoraHR0cDovL2NsYW5nLW9tcC5naXRodWIuaW8vICksIEludGVsIGNvbXBpbGVycywgR0NDLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uCitmb3IgbW9yZSBkZXRhaWxzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RpY2VzCis9PT09PT09CisKKypPdGhlciBuYW1lcyBhbmQgYnJhbmRzIG1heSBiZSBjbGFpbWVkIGFzIHRoZSBwcm9wZXJ0eSBvZiBvdGhlcnMuCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0ZvcnRyYW5GbGFnLmNtYWtlIGIvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wQ2hlY2tGb3J0cmFuRmxhZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzdiM2FkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wQ2hlY2tGb3J0cmFuRmxhZy5jbWFrZQpAQCAtMCwwICsxLDczIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgQ2hlY2tpbmcgYSBmb3J0cmFuIGNvbXBpbGVyIGZsYWcKKyMgVGhlcmUgaXMgbm8gcmVhbCB0cml2aWFsIHdheSB0byBkbyB0aGlzIGluIENNYWtlLCBzbyB3ZSBpbXBsZW1lbnQgaXQgaGVyZQorIyB0aGlzIHdpbGwgaGF2ZSAke2Jvb2xlYW59ID0gVFJVRSBpZiB0aGUgZmxhZyBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLgorZnVuY3Rpb24obGlib21wX2NoZWNrX2ZvcnRyYW5fZmxhZyBmbGFnIGJvb2xlYW4pCisgIGlmKE5PVCBERUZJTkVEICIke2Jvb2xlYW59IikKKyAgICBzZXQocmV0dmFsIFRSVUUpCisgICAgc2V0KGZvcnRyYW5fc291cmNlCisiICAgICAgcHJvZ3JhbSBoZWxsbworICAgICAgICAgICBwcmludCAqLCBcIkhlbGxvIFdvcmxkIVwiCisgICAgICBlbmQgcHJvZ3JhbSBoZWxsbyIpCisKKyAgc2V0KGZhaWxlZF9yZWdleGVzICJbRWVdcnJvcjtbVXVdbmtub3duO1tTc11raXBwaW5nIikKKyAgaWYoQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVIgMy4xIE9SIENNQUtFX1ZFUlNJT04gVkVSU0lPTl9FUVVBTCAzLjEpCisgICAgaW5jbHVkZShDaGVja0ZvcnRyYW5Tb3VyY2VDb21waWxlcykKKyAgICBjaGVja19mb3J0cmFuX3NvdXJjZV9jb21waWxlcygiJHtmb3J0cmFuX3NvdXJjZX0iICR7Ym9vbGVhbn0gRkFJTF9SRUdFWCAiJHtmYWlsZWRfcmVnZXhlc30iKQorICAgIHNldCgke2Jvb2xlYW59ICR7JHtib29sZWFufX0gUEFSRU5UX1NDT1BFKQorICAgIHJldHVybigpCisgIGVsc2UoKQorICAgICMgT3VyIG1hbnVhbCBjaGVjayBmb3IgY21ha2UgdmVyc2lvbnMgdGhhdCBkb24ndCBoYXZlIENoZWNrRm9ydHJhblNvdXJjZUNvbXBpbGVzCisgICAgc2V0KGJhc2VfZGlyICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VUbXAvZm9ydHJhbl9mbGFnX2NoZWNrKQorICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtiYXNlX2Rpcn0pCisgICAgZmlsZShXUklURSAke2Jhc2VfZGlyfS9mb3J0cmFuX3NvdXJjZS5mICIke2ZvcnRyYW5fc291cmNlfSIpCisKKyAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0iKQorICAgIGV4ZWN1dGVfcHJvY2VzcygKKyAgICAgIENPTU1BTkQgJHtDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSfSAiJHtmbGFnfSIgJHtiYXNlX2Rpcn0vZm9ydHJhbl9zb3VyY2UuZgorICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtiYXNlX2Rpcn0KKyAgICAgIFJFU1VMVF9WQVJJQUJMRSBleGl0X2NvZGUKKyAgICAgIE9VVFBVVF9WQVJJQUJMRSBPVVRQVVQKKyAgICAgIEVSUk9SX1ZBUklBQkxFIE9VVFBVVAorICAgICkKKworICAgIGlmKCR7ZXhpdF9jb2RlfSBFUVVBTCAwKQorICAgICAgZm9yZWFjaChyZWdleCBJTiBMSVNUUyBmYWlsZWRfcmVnZXhlcykKKyAgICAgICAgaWYoIiR7T1VUUFVUfSIgTUFUQ0hFUyAke3JlZ2V4fSkKKyAgICAgICAgICBzZXQocmV0dmFsIEZBTFNFKQorICAgICAgICBlbmRpZigpCisgICAgICBlbmRmb3JlYWNoKCkKKyAgICBlbHNlKCkKKyAgICAgIHNldChyZXR2YWwgRkFMU0UpCisgICAgZW5kaWYoKQorCisgICAgaWYoJHtyZXR2YWx9KQorICAgICAgc2V0KCR7Ym9vbGVhbn0gMSBDQUNIRSBJTlRFUk5BTCAiVGVzdCAke2Jvb2xlYW59IikKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIFRlc3QgJHtib29sZWFufSAtIFN1Y2Nlc3MiKQorICAgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZU91dHB1dC5sb2cKKyAgICAgICAgIlBlcmZvcm1pbmcgRm9ydHJhbiBDb21waWxlciBGbGFnIHRlc3QgJHtib29sZWFufSBzdWNjZWVkZWQgd2l0aCB0aGUgZm9sbG93aW5nIG91dHB1dDpcbiIKKyAgICAgICAgIiR7T1VUUFVUfVxuIgorICAgICAgICAiU291cmNlIGZpbGUgd2FzOlxuJHtmb3J0cmFuX3NvdXJjZX1cbiIpCisgICAgZWxzZSgpCisgICAgICBzZXQoJHtib29sZWFufSAiIiBDQUNIRSBJTlRFUk5BTCAiVGVzdCAke2Jvb2xlYW59IikKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIFRlc3QgJHtib29sZWFufSAtIEZhaWxlZCIpCisgICAgICBmaWxlKEFQUEVORCAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlRXJyb3IubG9nCisgICAgICAgICJQZXJmb3JtaW5nIEZvcnRyYW4gQ29tcGlsZXIgRmxhZyB0ZXN0ICR7Ym9vbGVhbn0gZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCisgICAgICAgICIke09VVFBVVH1cbiIKKyAgICAgICAgIlNvdXJjZSBmaWxlIHdhczpcbiR7Zm9ydHJhbl9zb3VyY2V9XG4iKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorCisgIHNldCgke2Jvb2xlYW59ICR7cmV0dmFsfSBQQVJFTlRfU0NPUEUpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcENoZWNrTGlua2VyRmxhZy5jbWFrZSBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcENoZWNrTGlua2VyRmxhZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWEzOGUzCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wQ2hlY2tMaW5rZXJGbGFnLmNtYWtlCkBAIC0wLDAgKzEsNjggQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBDaGVja2luZyBhIGxpbmtlciBmbGFnIHRvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkKKyMgVGhlcmUgaXMgbm8gcmVhbCB0cml2aWFsIHdheSB0byBkbyB0aGlzIGluIENNYWtlLCBzbyB3ZSBpbXBsZW1lbnQgaXQgaGVyZQorIyB0aGlzIHdpbGwgaGF2ZSAke2Jvb2xlYW59ID0gVFJVRSBpZiB0aGUgZmxhZyBzdWNjZWVkcywgb3RoZXJ3aXNlIEZBTFNFLgorZnVuY3Rpb24obGlib21wX2NoZWNrX2xpbmtlcl9mbGFnIGZsYWcgYm9vbGVhbikKKyAgaWYoTk9UIERFRklORUQgIiR7Ym9vbGVhbn0iKQorICBzZXQocmV0dmFsIFRSVUUpCisgIHNldChsaWJyYXJ5X3NvdXJjZQorICAgICJpbnQgZm9vKGludCBhKSB7IHJldHVybiBhKmE7IH0iKQorICBzZXQoY21ha2Vfc291cmNlCisgICAgImNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjgpCisgICAgIHByb2plY3QoZm9vIEMpCisgICAgIHNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTIFwiJHtmbGFnfVwiKQorICAgICBhZGRfbGlicmFyeShmb28gU0hBUkVEIHNyY190b19saW5rLmMpIikKKyAgc2V0KGZhaWxlZF9yZWdleGVzICJbRWVdcnJvcjtbVXVdbmtub3duO1tTc11raXBwaW5nO0xJTksgOiB3YXJuaW5nIikKKyAgc2V0KGJhc2VfZGlyICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VUbXAvbGlua19mbGFnX2NoZWNrXyR7Ym9vbGVhbn0pCisgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtiYXNlX2Rpcn0pCisgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtiYXNlX2Rpcn0vYnVpbGQpCisgIGZpbGUoV1JJVEUgJHtiYXNlX2Rpcn0vc3JjX3RvX2xpbmsuYyAiJHtsaWJyYXJ5X3NvdXJjZX0iKQorICBmaWxlKFdSSVRFICR7YmFzZV9kaXJ9L0NNYWtlTGlzdHMudHh0ICIke2NtYWtlX3NvdXJjZX0iKQorCisgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIFRlc3QgJHtib29sZWFufSIpCisgIHRyeV9jb21waWxlKAorICAgIHRyeV9jb21waWxlX3Jlc3VsdAorICAgICR7YmFzZV9kaXJ9L2J1aWxkCisgICAgJHtiYXNlX2Rpcn0KKyAgICBmb28KKyAgICBPVVRQVVRfVkFSSUFCTEUgT1VUUFVUKQorCisgIGlmKHRyeV9jb21waWxlX3Jlc3VsdCkKKyAgICBmb3JlYWNoKHJlZ2V4IElOIExJU1RTIGZhaWxlZF9yZWdleGVzKQorICAgICAgaWYoIiR7T1VUUFVUfSIgTUFUQ0hFUyAke3JlZ2V4fSkKKyAgICAgICAgc2V0KHJldHZhbCBGQUxTRSkKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRmb3JlYWNoKCkKKyAgZWxzZSgpCisgICAgc2V0KHJldHZhbCBGQUxTRSkKKyAgZW5kaWYoKQorCisgIGlmKCR7cmV0dmFsfSkKKyAgICBzZXQoJHtib29sZWFufSAxIENBQ0hFIElOVEVSTkFMICJUZXN0ICR7Ym9vbGVhbn0iKQorICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIFRlc3QgJHtib29sZWFufSAtIFN1Y2Nlc3MiKQorICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VPdXRwdXQubG9nCisgICAgICAiUGVyZm9ybWluZyBDIExpbmtlciBGbGFnIHRlc3QgJHtib29sZWFufSBzdWNjZWVkZWQgd2l0aCB0aGUgZm9sbG93aW5nIG91dHB1dDpcbiIKKyAgICAgICIke09VVFBVVH1cbiIKKyAgICAgICJTb3VyY2UgZmlsZSB3YXM6XG4ke2xpYnJhcnlfc291cmNlfVxuIikKKyAgZWxzZSgpCisgICAgc2V0KCR7Ym9vbGVhbn0gIiIgQ0FDSEUgSU5URVJOQUwgIlRlc3QgJHtib29sZWFufSIpCisgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IC0gRmFpbGVkIikKKyAgICBmaWxlKEFQUEVORCAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlRXJyb3IubG9nCisgICAgICAiUGVyZm9ybWluZyBDIExpbmtlciBGbGFnIHRlc3QgJHtib29sZWFufSBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIG91dHB1dDpcbiIKKyAgICAgICIke09VVFBVVH1cbiIKKyAgICAgICJTb3VyY2UgZmlsZSB3YXM6XG4ke2xpYnJhcnlfc291cmNlfVxuIikKKyAgZW5kaWYoKQorCisgIHNldCgke2Jvb2xlYW59ICR7cmV0dmFsfSBQQVJFTlRfU0NPUEUpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcERlZmluaXRpb25zLmNtYWtlIGIvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wRGVmaW5pdGlvbnMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjZmJiOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcERlZmluaXRpb25zLmNtYWtlCkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworZnVuY3Rpb24obGlib21wX2dldF9kZWZpbml0aW9uc19mbGFncyBjcHBmbGFncykKKyAgc2V0KGNwcGZsYWdzX2xvY2FsKQorCisgIGlmKFdJTjMyKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9XSU5ET1dTIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfV0lOTlQiKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9XSU4zMl9XSU5OVD0weDA1MDEiKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9VU1JETEwiKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9JVEVSQVRPUl9ERUJVR19MRVZFTD0wIiBJRl9UUlVFIERFQlVHX0JVSUxEKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9ERUJVRyIgSUZfVFJVRSBERUJVR19CVUlMRCkKKyAgZWxzZSgpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX0dOVV9TT1VSQ0UiKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9SRUVOVFJBTlQiKQorICBlbmRpZigpCisKKyAgIyBDTWFrZSBkb2Vzbid0IGluY2x1ZGUgQ1BQRkxBR1MgZnJvbSBlbnZpcm9ubWVudCwgYnV0IHdlIHdpbGwuCisgIHNldCgke2NwcGZsYWdzfSAke2NwcGZsYWdzX2xvY2FsfSAke0xJQk9NUF9DUFBGTEFHU30gJEVOVntDUFBGTEFHU30gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBFeHBvcnRzLmNtYWtlIGIvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wRXhwb3J0cy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGEzMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wRXhwb3J0cy5jbWFrZQpAQCAtMCwwICsxLDEwMCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIExpYm9tcEV4cG9ydHMuY21ha2UKKyMgICBDb3B5IGxpYnJhcnkgYW5kIGhlYWRlciBmaWxlcyBpbnRvIHRoZSBleHBvcnRzLyBzdWJkaXJlY3RvcnkgYWZ0ZXIgbGlicmFyeSBidWlsZAorCisjIENyZWF0ZSB0aGUgc3VmZml4IGZvciB0aGUgZXhwb3J0IGRpcmVjdG9yeQorIyAtIE9ubHkgYWRkIHRvIHN1ZmZpeCB3aGVuIG5vdCBhIGRlZmF1bHQgdmFsdWUKKyMgLSBFeGFtcGxlIHN1ZmZpeDogLmRlYi4zMC5zMQorIyAgIGZpbmFsIGV4cG9ydCBkaXJlY3Rvcnk6IGV4cG9ydHMvbGluXzMyZS5kZWIuMzAuczEvbGliCisjIC0gVGhlc2Ugc3VmZml4ZXMgaW1wbHkgdGhlIGJ1aWxkIGlzIGEgRGVidWcsIE9wZW5NUCAzLjAsIFN0YXRzLUdhdGhlcmluZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CitzZXQobGlib21wX3N1ZmZpeCkKK2xpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAuZGViIERFQlVHX0JVSUxEKQorbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5kaWEgUkVMV0lUSERFQklORk9fQlVJTEQpCitsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLm1pbiBNSU5TSVpFUkVMX0JVSUxEKQoraWYoTk9UICIke0xJQk9NUF9PTVBfVkVSU0lPTn0iIFNUUkVRVUFMICI0NSIpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAuJHtMSUJPTVBfT01QX1ZFUlNJT059KQorZW5kaWYoKQorbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5zMSBMSUJPTVBfU1RBVFMpCitsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLm9tcHQgTElCT01QX09NUFRfU1VQUE9SVCkKK2lmKCR7TElCT01QX09NUFRfU1VQUE9SVH0pCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAubm8tb21wdC1ibGFtZSBJRl9GQUxTRSBMSUJPTVBfT01QVF9CTEFNRSkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5uby1vbXB0LXRyYWNlIElGX0ZBTFNFIExJQk9NUF9PTVBUX1RSQUNFKQorZW5kaWYoKQorc3RyaW5nKFJFUExBQ0UgIjsiICIiIGxpYm9tcF9zdWZmaXggIiR7bGlib21wX3N1ZmZpeH0iKQorCisjIFNldCBleHBvcnRzIGxvY2F0aW9ucworaWYoJHtNSUN9KQorICBzZXQobGlib21wX3BsYXRmb3JtICIke0xJQk9NUF9QRVJMX1NDUklQVF9PU31fJHtMSUJPTVBfTUlDX0FSQ0h9IikgIyBlLmcuLCBsaW5fa25mLCBsaW5fa25jCitlbHNlKCkKKyAgaWYoJHtJQTMyfSkKKyAgICBzZXQobGlib21wX3BsYXRmb3JtICIke0xJQk9NUF9QRVJMX1NDUklQVF9PU31fMzIiKQorICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICBzZXQobGlib21wX3BsYXRmb3JtICIke0xJQk9NUF9QRVJMX1NDUklQVF9PU31fMzJlIikKKyAgZWxzZSgpCisgICAgc2V0KGxpYm9tcF9wbGF0Zm9ybSAiJHtMSUJPTVBfUEVSTF9TQ1JJUFRfT1N9XyR7TElCT01QX0FSQ0h9IikgIyBlLmcuLCBsaW5fYXJtLCBsaW5fcHBjNjQKKyAgZW5kaWYoKQorZW5kaWYoKQorc2V0KExJQk9NUF9FWFBPUlRTX0RJUiAiJHtMSUJPTVBfQkFTRV9ESVJ9L2V4cG9ydHMiKQorc2V0KExJQk9NUF9FWFBPUlRTX1BMQVRGT1JNX0RJUiAiJHtMSUJPTVBfRVhQT1JUU19ESVJ9LyR7bGlib21wX3BsYXRmb3JtfSR7bGlib21wX3N1ZmZpeH0iKQorc2V0KExJQk9NUF9FWFBPUlRTX0NNTl9ESVIgIiR7TElCT01QX0VYUE9SVFNfRElSfS9jb21tb24ke2xpYm9tcF9zdWZmaXh9L2luY2x1ZGUiKQorc2V0KExJQk9NUF9FWFBPUlRTX0lOQ19ESVIgIiR7TElCT01QX0VYUE9SVFNfUExBVEZPUk1fRElSfS9pbmNsdWRlIikKK3NldChMSUJPTVBfRVhQT1JUU19NT0RfRElSICIke0xJQk9NUF9FWFBPUlRTX1BMQVRGT1JNX0RJUn0vaW5jbHVkZV9jb21wYXQiKQorc2V0KExJQk9NUF9FWFBPUlRTX0xJQl9ESVIgIiR7TElCT01QX0VYUE9SVFNfRElSfS8ke2xpYm9tcF9wbGF0Zm9ybX0ke2xpYm9tcF9zdWZmaXh9L2xpYiIpCisKKyMgUHV0IGhlYWRlcnMgaW4gZXhwb3J0cy8gZGlyZWN0b3J5IHBvc3QgYnVpbGQKK2FkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgb21wIFBPU1RfQlVJTEQKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfQ01OX0RJUn0KKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgb21wLmggJHtMSUJPTVBfRVhQT1JUU19DTU5fRElSfQorKQoraWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5IG9tcHQuaCAke0xJQk9NUF9FWFBPUlRTX0NNTl9ESVJ9CisgICkKK2VuZGlmKCkKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgbGlib21wLW1vZCBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfTU9EX0RJUn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSBvbXBfbGliLm1vZCAke0xJQk9NUF9FWFBPUlRTX01PRF9ESVJ9CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgb21wX2xpYl9raW5kcy5tb2QgJHtMSUJPTVBfRVhQT1JUU19NT0RfRElSfQorICApCisgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgb21wIFBPU1RfQlVJTEQKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSBvbXBfbGliLmggJHtMSUJPTVBfRVhQT1JUU19DTU5fRElSfQorICApCitlbmRpZigpCisKKyMgQ29weSBPcGVuTVAgbGlicmFyeSBpbnRvIGV4cG9ydHMvIGRpcmVjdG9yeSBwb3N0IGJ1aWxkCitpZihXSU4zMikKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXAgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZKQorZWxzZSgpCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QX09VVFBVVF9ESVJFQ1RPUlkgb21wIExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSkKK2VuZGlmKCkKK2lmKE5PVCBMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSkKKyAgc2V0KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKK2VuZGlmKCkKK2FkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgb21wIFBPU1RfQlVJTEQKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfTElCX0RJUn0KKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9ICR7TElCT01QX0VYUE9SVFNfTElCX0RJUn0KKykKKworIyBDb3B5IFdpbmRvd3MgaW1wb3J0IGxpYnJhcnkgaW50byBleHBvcnRzLyBkaXJlY3RvcnkgcG9zdCBidWlsZAoraWYoV0lOMzIpCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUlkgb21waW1wIEFSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSkKKyAgaWYoTk9UIExJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZKQorICAgIHNldChMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisgIGVuZGlmKCkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXBpbXAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0xJQk9NUF9FWFBPUlRTX0xJQl9ESVJ9CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfSU1QX0xJQl9GSUxFfSAke0xJQk9NUF9FWFBPUlRTX0xJQl9ESVJ9CisgICkKK2VuZGlmKCkKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wR2V0QXJjaGl0ZWN0dXJlLmNtYWtlIGIvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wR2V0QXJjaGl0ZWN0dXJlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNmI0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBHZXRBcmNoaXRlY3R1cmUuY21ha2UKQEAgLTAsMCArMSw3MCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGZyb20gcHJlZGVmaW5lZCBjb21waWxlciBtYWNyb3MKKyMgVGhlIGFyY2hpdGVjdHVyZSBuYW1lIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHVuZGVyc2NvcmVzIChpLmUuLCBDIGlkZW50aWZpZXIpCisKKyMgdm9pZCBnZXRfYXJjaGl0ZWN0dXJlKHN0cmluZyogcmV0dXJuX2FyY2gpCisjIC0gUmV0dXJucyB0aGUgYXJjaGl0ZWN0dXJlIGluIHJldHVybl9hcmNoCitmdW5jdGlvbihsaWJvbXBfZ2V0X2FyY2hpdGVjdHVyZSByZXR1cm5fYXJjaCkKKyAgc2V0KGRldGVjdF9hcmNoX3NyY190eHQgIgorICAgICNpZiBkZWZpbmVkKF9fS05DX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPW1pYworICAgICNlbGlmIGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKF9fYW1kNjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NCkgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fQU1ENjQpCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPXg4Nl82NAorICAgICNlbGlmIGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fSUEzMl9fKSB8fCBkZWZpbmVkKF9NX0k4NikgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9fWDg2X18pIHx8IGRlZmluZWQoX1g4Nl8pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWkzODYKKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfN19fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN1JfXykgfHwgIGRlZmluZWQoX19BUk1fQVJDSF83QV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN01fXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF83U19fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNkpfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZLX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82VDJfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZaS19fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVFX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVKX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF80X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF80VF9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfM19fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfM01fXykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9YXJtCisgICAgI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzJfXykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9YXJtCisgICAgI2VsaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9NX0FSTSkgfHwgZGVmaW5lZChfQVJNKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hYXJjaDY0CisgICAgI2VsaWYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSAmJiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1wcGM2NGxlCisgICAgI2VsaWYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1wcGM2NAorICAgICNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19taXBzNjQpCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPW1pcHM2NAorICAgICNlbGlmIGRlZmluZWQoX19taXBzX18pICYmICFkZWZpbmVkKF9fbWlwczY0KQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1taXBzCisgICAgI2Vsc2UKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9VW5rbm93bkFyY2hpdGVjdHVyZQorICAgICNlbmRpZgorICAiKQorICAjIFdyaXRlIG91dCAke2RldGVjdF9hcmNoX3NyY190eHR9IHRvIGEgZmlsZSB3aXRoaW4gdGhlIGNtYWtlLyBzdWJkaXJlY3RvcnkKKyAgZmlsZShXUklURSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYm9tcF9kZXRlY3RfYXJjaC5jIiAke2RldGVjdF9hcmNoX3NyY190eHR9KQorCisgICMgVHJ5IHRvIGNvbXBpbGUgdXNpbmcgdGhlIEMgQ29tcGlsZXIuICBJdCB3aWxsIGFsd2F5cyBlcnJvciBvdXQgd2l0aCBhbiAjZXJyb3IgZGlyZWN0aXZlLCBzbyBzdG9yZSBlcnJvciBvdXRwdXQgdG8gJHtsb2NhbF9hcmNoaXRlY3R1cmV9CisgIHRyeV9ydW4ocnVuX2R1bW15IGNvbXBpbGVfZHVtbXkgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJvbXBfZGV0ZWN0X2FyY2guYyIgQ09NUElMRV9PVVRQVVRfVkFSSUFCTEUgbG9jYWxfYXJjaGl0ZWN0dXJlKQorCisgICMgTWF0Y2ggdGhlIGltcG9ydGFudCBhcmNoaXRlY3R1cmUgbGluZSBhbmQgc3RvcmUgb25seSB0aGF0IG1hdGNoaW5nIHN0cmluZyBpbiAke2xvY2FsX2FyY2hpdGVjdHVyZX0KKyAgc3RyaW5nKFJFR0VYIE1BVENIICJBUkNISVRFQ1RVUkU9KFthLXpBLVowLTlfXSspIiBsb2NhbF9hcmNoaXRlY3R1cmUgIiR7bG9jYWxfYXJjaGl0ZWN0dXJlfSIpCisKKyAgIyBHZXQgcmlkIG9mIHRoZSBBUkNISVRFQ1RVUkU9IHBhcnQgb2YgdGhlIHN0cmluZworICBzdHJpbmcoUkVQTEFDRSAiQVJDSElURUNUVVJFPSIgIiIgbG9jYWxfYXJjaGl0ZWN0dXJlICIke2xvY2FsX2FyY2hpdGVjdHVyZX0iKQorCisgICMgc2V0IHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIGFyY2hpdGVjdHVyZSBkZXRlY3RlZCAoZS5nLiwgMzJlLCAzMiwgYXJtLCBwcGM2NCwgZXRjLikKKyAgc2V0KCR7cmV0dXJuX2FyY2h9ICIke2xvY2FsX2FyY2hpdGVjdHVyZX0iIFBBUkVOVF9TQ09QRSkKKworICAjIFJlbW92ZSAke2RldGVjdF9hcmNoX3NyY190eHR9IGZyb20gY21ha2UvIHN1YmRpcmVjdG9yeQorICBmaWxlKFJFTU9WRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYm9tcF9kZXRlY3RfYXJjaC5jIikKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcEhhbmRsZUZsYWdzLmNtYWtlIGIvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wSGFuZGxlRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjOGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcEhhbmRsZUZsYWdzLmNtYWtlCkBAIC0wLDAgKzEsMjA4IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgU2V0dXAgdGhlIGZsYWdzIGNvcnJlY3RseSBmb3IgY21ha2UgKGNvdmVydCB0byBzdHJpbmcpCisjIFByZXR0eSB0aGVtIHVwIChTVFJJUCBhbnkgYmVnaW5uaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLAorIyByZW1vdmUgZHVwbGljYXRlcywgcmVtb3ZlIGVtcHR5IGVudHJpZXMpCittYWNybyhsaWJvbXBfc2V0dXBfZmxhZ3MgZmxhZ3MpCisgIGlmKE5PVCAiJHske2ZsYWdzfX0iIFNUUkVRVUFMICIiKSAjIGlmIGZsYWdzIGFyZSBlbXB0eSwgZG9uJ3QgZG8gYW55dGhpbmcKKyAgICBzZXQoZmxhZ3NfbG9jYWwpCisgICAgbGlzdChSRU1PVkVfRFVQTElDQVRFUyAke2ZsYWdzfSkgIyByZW1vdmUgZHVwbGljYXRlcworICAgIGxpc3QoUkVNT1ZFX0lURU0gJHtmbGFnc30gIiIpICMgcmVtb3ZlIGVtcHR5IGl0ZW1zCisgICAgbGlib21wX2xpc3RfdG9fc3RyaW5nKCIkeyR7ZmxhZ3N9fSIgZmxhZ3NfbG9jYWwpCisgICAgc3RyaW5nKFNUUklQICIke2ZsYWdzX2xvY2FsfSIgZmxhZ3NfbG9jYWwpCisgICAgc2V0KCR7ZmxhZ3N9ICIke2ZsYWdzX2xvY2FsfSIpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBHZXRzIGZsYWdzIGNvbW1vbiB0byBib3RoIHRoZSBDIGFuZCBDKysgY29tcGlsZXIKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfY19hbmRfY3h4ZmxhZ3NfY29tbW9uIGZsYWdzKQorICBzZXQoZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLXN0ZD1jKysxMSBMSUJPTVBfSEFWRV9TVERfQ1BQMTFfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtZm5vLWV4Y2VwdGlvbnMgTElCT01QX0hBVkVfRk5PX0VYQ0VQVElPTlNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtZm5vLXJ0dGkgTElCT01QX0hBVkVfRk5PX1JUVElfRkxBRykKKyAgaWYoJHtMSUJPTVBfRU5BQkxFX1dFUlJPUn0pCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV2Vycm9yIExJQk9NUF9IQVZFX1dFUlJPUl9GTEFHKQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1zaWduLWNvbXBhcmUgTElCT01QX0hBVkVfV05PX1NJR05fQ09NUEFSRV9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIExJQk9NUF9IQVZFX1dOT19VTlVTRURfRlVOQ1RJT05fRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXVudXNlZC1sb2NhbC10eXBlZGVmIExJQk9NUF9IQVZFX1dOT19VTlVTRURfTE9DQUxfVFlQRURFRl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdW51c2VkLXZhbHVlIExJQk9NUF9IQVZFX1dOT19VTlVTRURfVkFMVUVfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXVudXNlZC12YXJpYWJsZSBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX1ZBUklBQkxFX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1zd2l0Y2ggTElCT01QX0hBVkVfV05PX1NXSVRDSF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCBMSUJPTVBfSEFWRV9XTk9fQ09WRVJFRF9TV0lUQ0hfREVGQVVMVF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciBMSUJPTVBfSEFWRV9XTk9fREVQUkVDQVRFRF9SRUdJU1RFUl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tZ251LWFub255bW91cy1zdHJ1Y3QgTElCT01QX0hBVkVfV05PX0dOVV9BTk9OWU1PVVNfU1RSVUNUX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby11bmtub3duLXByYWdtYXMgTElCT01QX0hBVkVfV05PX1VOS05PV05fUFJBR01BU19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgTElCT01QX0hBVkVfV05PX01JU1NJTkdfRklFTERfSU5JVElBTElaRVJTX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1taXNzaW5nLWJyYWNlcyBMSUJPTVBfSEFWRV9XTk9fTUlTU0lOR19CUkFDRVNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLWNvbW1lbnQgTElCT01QX0hBVkVfV05PX0NPTU1FTlRfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXNlbGYtYXNzaWduIExJQk9NUF9IQVZFX1dOT19TRUxGX0FTU0lHTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdmxhLWV4dGVuc2lvbiBMSUJPTVBfSEFWRV9XTk9fVkxBX0VYVEVOU0lPTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tZm9ybWF0LXBlZGFudGljIExJQk9NUF9IQVZFX1dOT19GT1JNQVRfUEVEQU5USUNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvR1MgTElCT01QX0hBVkVfR1NfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvRUhzYyBMSUJPTVBfSEFWRV9FSFNDX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgL095LSBMSUJPTVBfSEFWRV9PWV9fRkxBRykKKyAgIyBJbnRlbChSKSBDIENvbXBpbGVyIGZsYWdzCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgL1FzYWZlc2VoIExJQk9NUF9IQVZFX1FTQUZFU0VIX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVFvcHRpb24sY3BwLC0tZXh0ZW5kZWRfZmxvYXRfdHlwZXMgTElCT01QX0hBVkVfRVhURU5ERURfRkxPQVRfVFlQRVNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtUWxvbmdfZG91YmxlIExJQk9NUF9IQVZFX0xPTkdfRE9VQkxFX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVFkaWFnLWRpc2FibGU6MTc3IExJQk9NUF9IQVZFX0RJQUdfRElTQUJMRV8xNzdfRkxBRykKKyAgaWYoJHtSRUxFQVNFX0JVSUxEfSBPUiAke1JFTFdJVEhERUJJTkZPX0JVSUxEfSkKKyAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1RaW5saW5lLW1pbi1zaXplPTEgTElCT01QX0hBVkVfSU5MSU5FX01JTl9TSVpFX0ZMQUcpCisgIGVuZGlmKCkKKyAgIyBBcmNoaXRlY3R1cmFsIEMgYW5kIEMrKyBmbGFncworICBpZigke0lBMzJ9KQorICAgIGlmKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgOCkKKyAgICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvYXJjaDpTU0UyIExJQk9NUF9IQVZFX0FSQ0hfU1NFMl9GTEFHKQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLW1zc2UyIExJQk9NUF9IQVZFX01TU0UyX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtZmFsaWduLXN0YWNrPW1haW50YWluLTE2LWJ5dGUgTElCT01QX0hBVkVfRkFMSUdOX1NUQUNLX0ZMQUcpCisgIGVsc2VpZigke01JQ30pCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtbW1pYyBMSUJPTVBfSEFWRV9NTUlDX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtZnRscy1tb2RlbD1pbml0aWFsLWV4ZWMgTElCT01QX0hBVkVfRlRMU19NT0RFTF9GTEFHKQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgIi1vcHQtc3RyZWFtaW5nLXN0b3JlcyBuZXZlciIgTElCT01QX0hBVkVfT1BUX1NUUkVBTUlOR19TVE9SRVNfRkxBRykKKyAgZW5kaWYoKQorICBzZXQoJHtmbGFnc30gJHtmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIEMgY29tcGlsZXIgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfY2ZsYWdzIGNmbGFncykKKyAgc2V0KGNmbGFnc19sb2NhbCkKKyAgbGlib21wX2dldF9jX2FuZF9jeHhmbGFnc19jb21tb24oY2ZsYWdzX2xvY2FsKQorICAjIGZsYWdzIG9ubHkgZm9yIHRoZSBDIENvbXBpbGVyCisgIGxpYm9tcF9hcHBlbmQoY2ZsYWdzX2xvY2FsIC9UUCBMSUJPTVBfSEFWRV9UUF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGNmbGFnc19sb2NhbCAiLXggYysrIiBMSUJPTVBfSEFWRV9YX0NQUF9GTEFHKQorICBzZXQoY2ZsYWdzX2xvY2FsICR7Y2ZsYWdzX2xvY2FsfSAke0xJQk9NUF9DRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MoY2ZsYWdzX2xvY2FsKQorICBzZXQoJHtjZmxhZ3N9ICR7Y2ZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgQysrIGNvbXBpbGVyIGZsYWdzCitmdW5jdGlvbihsaWJvbXBfZ2V0X2N4eGZsYWdzIGN4eGZsYWdzKQorICBzZXQoY3h4ZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9nZXRfY19hbmRfY3h4ZmxhZ3NfY29tbW9uKGN4eGZsYWdzX2xvY2FsKQorICBzZXQoY3h4ZmxhZ3NfbG9jYWwgJHtjeHhmbGFnc19sb2NhbH0gJHtMSUJPTVBfQ1hYRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MoY3h4ZmxhZ3NfbG9jYWwpCisgIHNldCgke2N4eGZsYWdzfSAke2N4eGZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgQXNzZW1ibGVyIGZsYWdzCitmdW5jdGlvbihsaWJvbXBfZ2V0X2FzbWZsYWdzIGFzbWZsYWdzKQorICBzZXQoYXNtZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgIi14IGFzc2VtYmxlci13aXRoLWNwcCIgTElCT01QX0hBVkVfWF9BU1NFTUJMRVJfV0lUSF9DUFBfRkxBRykKKyAgIyBBcmNoaXRlY3R1cmFsIGFzc2VtYmxlciBmbGFncworICBpZigke0lBMzJ9KQorICAgIGlmKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgOCkKKyAgICAgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChhc21mbGFnc19sb2NhbCAvc2FmZXNlaCBMSUJPTVBfSEFWRV9TQUZFU0VIX01BU01fRkxBRykKKyAgICBsaWJvbXBfYXBwZW5kKGFzbWZsYWdzX2xvY2FsIC9jb2ZmIExJQk9NUF9IQVZFX0NPRkZfTUFTTV9GTEFHKQorICBlbHNlaWYoJHtNSUN9KQorICAgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgLW1taWMgTElCT01QX0hBVkVfTU1JQ19GTEFHKQorICBlbmRpZigpCisgIHNldChhc21mbGFnc19sb2NhbCAke2FzbWZsYWdzX2xvY2FsfSAke0xJQk9NUF9BU01GTEFHU30pCisgIGxpYm9tcF9zZXR1cF9mbGFncyhhc21mbGFnc19sb2NhbCkKKyAgc2V0KCR7YXNtZmxhZ3N9ICR7YXNtZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyBMaW5rZXIgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfbGRmbGFncyBsZGZsYWdzKQorICBzZXQobGRmbGFnc19sb2NhbCkKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsICIke0NNQUtFX0xJTktfREVGX0ZJTEVfRkxBR30ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtMSUJPTVBfTElCX05BTUV9LmRlZiIKKyAgICBJRl9ERUZJTkVEIENNQUtFX0xJTktfREVGX0ZJTEVfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsICIke0NNQUtFX0NfT1NYX0NVUlJFTlRfVkVSU0lPTl9GTEFHfSR7TElCT01QX1ZFUlNJT05fTUFKT1J9LiR7TElCT01QX1ZFUlNJT05fTUlOT1J9IgorICAgIElGX0RFRklORUQgQ01BS0VfQ19PU1hfQ1VSUkVOVF9WRVJTSU9OX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAiJHtDTUFLRV9DX09TWF9DT01QQVRJQklMSVRZX1ZFUlNJT05fRkxBR30ke0xJQk9NUF9WRVJTSU9OX01BSk9SfS4ke0xJQk9NUF9WRVJTSU9OX01JTk9SfSIKKyAgICBJRl9ERUZJTkVEIENNQUtFX0NfT1NYX0NPTVBBVElCSUxJVFlfVkVSU0lPTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLVdsLC0td2Fybi1zaGFyZWQtdGV4dHJlbCBMSUJPTVBfSEFWRV9XQVJOX1NIQVJFRF9URVhUUkVMX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtV2wsLS1hcy1uZWVkZWQgTElCT01QX0hBVkVfQVNfTkVFREVEX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtMSUJPTVBfU1JDX0RJUn0vZXhwb3J0c19zby50eHQiIExJQk9NUF9IQVZFX1ZFUlNJT05fU0NSSVBUX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtc3RhdGljLWxpYmdjYyBMSUJPTVBfSEFWRV9TVEFUSUNfTElCR0NDX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtV2wsLXosbm9leGVjc3RhY2sgTElCT01QX0hBVkVfWl9OT0VYRUNTVEFDS19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLVdsLC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9maW5pIExJQk9NUF9IQVZFX0ZJTklfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1uby1pbnRlbC1leHRlbnNpb25zIExJQk9NUF9IQVZFX05PX0lOVEVMX0VYVEVOU0lPTlNfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1zdGF0aWMtaW50ZWwgTElCT01QX0hBVkVfU1RBVElDX0lOVEVMX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAvU0FGRVNFSCBMSUJPTVBfSEFWRV9TQUZFU0VIX0ZMQUcpCisgICMgQXJjaGl0ZWN0dXJhbCBsaW5rZXIgZmxhZ3MKKyAgaWYoJHtJQTMyfSkKKyAgICBpZihDTUFLRV9TSVpFT0ZfVk9JRF9QIEVRVUFMIDgpCisgICAgICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1tc3NlMiBMSUJPTVBfSEFWRV9NU1NFMl9GTEFHKQorICBlbHNlaWYoJHtNSUN9KQorICAgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtbW1pYyBMSUJPTVBfSEFWRV9NTUlDX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1XbCwteCBMSUJPTVBfSEFWRV9YX0ZMQUcpCisgIGVuZGlmKCkKKyAgc2V0KGxkZmxhZ3NfbG9jYWwgJHtsZGZsYWdzX2xvY2FsfSAke0xJQk9NUF9MREZMQUdTfSkKKyAgbGlib21wX3NldHVwX2ZsYWdzKGxkZmxhZ3NfbG9jYWwpCisgIHNldCgke2xkZmxhZ3N9ICR7bGRmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIExpYnJhcnkgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfbGliZmxhZ3MgbGliZmxhZ3MpCisgIHNldChsaWJmbGFnc19sb2NhbCkKKyAgbGlib21wX2FwcGVuZChsaWJmbGFnc19sb2NhbCAiJHtDTUFLRV9USFJFQURfTElCU19JTklUfSIpCisgIGxpYm9tcF9hcHBlbmQobGliZmxhZ3NfbG9jYWwgIiR7TElCT01QX0hXTE9DX0xJQlJBUll9IiBMSUJPTVBfVVNFX0hXTE9DKQorICBpZigke0lBMzJ9KQorICAgIGxpYm9tcF9hcHBlbmQobGliZmxhZ3NfbG9jYWwgLWxpcmNfcGljIExJQk9NUF9IQVZFX0lSQ19QSUNfTElCUkFSWSkKKyAgZW5kaWYoKQorICBJRigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJOZXRCU0QiKQorICAgIGxpYm9tcF9hcHBlbmQobGliZmxhZ3NfbG9jYWwgLWxtKQorICBFTkRJRigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJOZXRCU0QiKQorICBzZXQobGliZmxhZ3NfbG9jYWwgJHtsaWJmbGFnc19sb2NhbH0gJHtMSUJPTVBfTElCRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MobGliZmxhZ3NfbG9jYWwpCisgIHNldCgke2xpYmZsYWdzfSAke2xpYmZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgRm9ydHJhbiBmbGFncworZnVuY3Rpb24obGlib21wX2dldF9mZmxhZ3MgZmZsYWdzKQorICBzZXQoZmZsYWdzX2xvY2FsKQorICBpZigke0lBMzJ9KQorICAgIGxpYm9tcF9hcHBlbmQoZmZsYWdzX2xvY2FsIC1tMzIgTElCT01QX0hBVkVfTTMyX0ZPUlRSQU5fRkxBRykKKyAgZW5kaWYoKQorICBzZXQoZmZsYWdzX2xvY2FsICR7ZmZsYWdzX2xvY2FsfSAke0xJQk9NUF9GRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MoZmZsYWdzX2xvY2FsKQorICBzZXQoJHtmZmxhZ3N9ICR7ZmZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgUGVybCBnZW5lcmF0ZS1kZWZzLnBsIGZsYWdzIChGb3IgV2luZG93cyBvbmx5KQorZnVuY3Rpb24obGlib21wX2dldF9nZGZsYWdzIGdkZmxhZ3MpCisgIHNldChnZGZsYWdzX2xvY2FsKQorICBpZigke0lBMzJ9KQorICAgIHNldChsaWJvbXBfZ2RmbGFnX2FyY2ggYXJjaF8zMikKKyAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgc2V0KGxpYm9tcF9nZGZsYWdfYXJjaCBhcmNoXzMyZSkKKyAgZWxzZSgpCisgICAgc2V0KGxpYm9tcF9nZGZsYWdfYXJjaCBhcmNoXyR7TElCT01QX0FSQ0h9KQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgJHtsaWJvbXBfZ2RmbGFnX2FyY2h9IikKKyAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBtc3ZjX2NvbXBhdCIpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgbm9ybSIgTk9STUFMX0xJQlJBUlkpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgcHJvZiIgUFJPRklMRV9MSUJSQVJZKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIHN0dWIiIFNUVUJTX0xJQlJBUlkpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgSEFWRV9RVUFEIiBMSUJPTVBfVVNFX1FVQURfUFJFQ0lTSU9OKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIFVTRV9ERUJVR0dFUiIgTElCT01QX1VTRV9ERUJVR0dFUikKKyAgaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgNDUgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDQ1KQorICAgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgT01QXzQ1IikKKyAgZW5kaWYoKQorICBpZigke0xJQk9NUF9PTVBfVkVSU0lPTn0gR1JFQVRFUiA0MCBPUiAke0xJQk9NUF9PTVBfVkVSU0lPTn0gRVFVQUwgNDApCisgICAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBPTVBfNDAiKQorICBlbmRpZigpCisgIGlmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDMwIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCAzMCkKKyAgICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIE9NUF8zMCIpCisgIGVuZGlmKCkKKyAgaWYoJHtERUJVR19CVUlMRH0gT1IgJHtSRUxXSVRIREVCSU5GT19CVUlMRH0pCisgICAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBLTVBfREVCVUciKQorICBlbmRpZigpCisgIHNldCgke2dkZmxhZ3N9ICR7Z2RmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wTWljcm9UZXN0cy5jbWFrZSBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcE1pY3JvVGVzdHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxOGZkZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcE1pY3JvVGVzdHMuY21ha2UKQEAgLTAsMCArMSwyMjggQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBUaGUgZm9sbG93aW5nIG1pY3JvLXRlc3RzIGFyZSBzbWFsbCB0ZXN0cyB0byBwZXJmb3JtIG9uIHRoZSBsaWJyYXJ5IGp1c3QgY3JlYXRlZC4KKyMgVGhlcmUgYXJlIGN1cnJlbnRseSBmaXZlIG1pY3JvLXRlc3RzOgorIyAoMSkgdGVzdC10b3VjaAorIyAgLSBDb21waWxlIGFuZCBydW4gYSBzbWFsbCBwcm9ncmFtIHVzaW5nIG5ld2x5IGNyZWF0ZWQgbGlib21wIGxpYnJhcnkKKyMgIC0gRmFpbHMgaWYgdGVzdC10b3VjaC5jIGRvZXMgbm90IGNvbXBpbGUgb3IgaWYgdGVzdC10b3VjaC5jIGRvZXMgbm90IHJ1biBhZnRlciBjb21waWxhdGlvbgorIyAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogZ2NjIG9yIGcrKywgZ3JlcCwgYm91cm5lIHNoZWxsCisjICAtIEF2YWlsYWJsZSBmb3IgYWxsIFVuaXgsTWFjLFdpbmRvd3MgYnVpbGRzLiAgTm90IGF2YWlsYWJsZSBvbiBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGJ1aWxkcy4KKyMgKDIpIHRlc3QtcmVsbworIyAgLSBUZXN0cyBkeW5hbWljIGxpYnJhcmllcyBmb3IgcG9zaXRpb24tZGVwZW5kZW50IGNvZGUgKGNhbiBub3QgaGF2ZSBhbnkgcG9zaXRpb24gZGVwZW5kZW50IGNvZGUpCisjICAtIEZhaWxzIGlmIFRFWFRSRUwgaXMgaW4gb3V0cHV0IG9mIHJlYWRlbGYgLWQgbGlib21wLnNvIGNvbW1hbmQKKyMgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IHJlYWRlbGYsIGdyZXAsIGJvdXJuZSBzaGVsbAorIyAgLSBBdmFpbGFibGUgZm9yIFVuaXgsIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgZHluYW1pYyBsaWJyYXJ5IGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisjICgzKSB0ZXN0LWV4ZWNzdGFjaworIyAgLSBUZXN0cyBpZiBzdGFjayBpcyBleGVjdXRhYmxlCisjICAtIEZhaWxzIGlmIHN0YWNrIGlzIGV4ZWN1dGFibGUuIFNob3VsZCBvbmx5IGJlIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4gTm90IGV4ZWN0dWFibGUuCisjICAtIFByb2dyYW0gZGVwZW5kZW5jaWVzOiBwZXJsLCByZWFkZWxmCisjICAtIEF2YWlsYWJsZSBmb3IgVW5peCBkeW5hbWljIGxpYnJhcnkgYnVpbGRzLiBOb3QgYXZhaWxhYmxlIG90aGVyd2lzZS4KKyMgKDQpIHRlc3QtaW5zdHIgKEludGVsKFIpIE1JQyBBcmNoaXRlY3V0cmUgb25seSkKKyMgIC0gVGVzdHMgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSBsaWJyYXJpZXMgZm9yIHZhbGlkIGluc3RydWN0aW9uIHNldAorIyAgLSBGYWlscyBpZiBmaW5kcyBpbnZhbGlkIGluc3RydWN0aW9uIGZvciBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlICh3YXNuJ3QgY29tcGlsZWQgd2l0aCBjb3JyZWN0IGZsYWdzKQorIyAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogcGVybCwgb2JqZHVtcAorIyAgLSBBdmFpbGFibGUgZm9yIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgYW5kIGkzODYgYnVpbGRzLiBOb3QgYXZhaWxhYmxlIG90aGVyd2lzZS4KKyMgKDUpIHRlc3QtZGVwcworIyAgLSBUZXN0cyBuZXdseSBjcmVhdGVkIGxpYm9tcCBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyMgIC0gRmFpbHMgaWYgc2VlcyBhIGRlcGVuZGVuY2Ugbm90IGxpc3RlZCBpbiB0ZF9leHAgdmFyaWFibGUgYmVsb3cKKyMgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IHBlcmwsICh1bml4KXJlYWRlbGYsIChtYWMpb3Rvb2xbNjRdLCAod2luZG93cylsaW5rLmV4ZQorIyAgLSBBdmFpbGFibGUgZm9yIFVuaXgsTWFjLFdpbmRvd3MsIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgZHluYW1pYyBidWlsZHMgYW5kIFdpbmRvd3MKKyMgICAgc3RhdGljIGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisKKyMgZ2V0IGxpYnJhcnkgbG9jYXRpb24KK2lmKFdJTjMyKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZIG9tcCBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkpCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUlkgb21waW1wIEFSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSkKKyAgaWYoTk9UIExJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZKQorICAgIHNldChMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisgIGVuZGlmKCkKK2Vsc2UoKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZIG9tcCBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkpCitlbmRpZigpCitpZihOT1QgTElCT01QX09VVFBVVF9ESVJFQ1RPUlkpCisgIHNldChMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCitlbmRpZigpCisKKyMgdGVzdC10b3VjaAorZmluZF9wcm9ncmFtKExJQk9NUF9TSEVMTCBzaCkKK2lmKFdJTjMyKQorICBpZihMSUJPTVBfU0hFTEwpCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX3RhcmdldHMgdGVzdC10b3VjaC1tZC8uc3VjY2VzcyB0ZXN0LXRvdWNoLW10Ly5zdWNjZXNzKQorICBlbmRpZigpCisgICMgcGljayB0ZXN0LXRvdWNoIGNvbXBpbGVyCisgIHNldChsaWJvbXBfdGVzdF90b3VjaF9jb21waWxlciAke0NNQUtFX0NfQ09NUElMRVJ9KQorICAjIHRlc3QtdG91Y2ggY29tcGlsYXRpb24gZmxhZ3MKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9jZmxhZ3MgL25vbG9nbykKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9saWJzICR7TElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0lNUF9MSUJfRklMRX0pCisgIGlmKCR7SUEzMn0pCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9sZGZsYWdzIC9zYWZlc2VoKQorICBlbmRpZigpCitlbHNlKCkgIyAoVW5peCBiYXNlZCBzeXN0ZW1zLCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLCBhbmQgTWFjKQorICBpZihMSUJPTVBfU0hFTEwpCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX3RhcmdldHMgdGVzdC10b3VjaC1ydC8uc3VjY2VzcykKKyAgZW5kaWYoKQorICAjIHBpY2sgdGVzdC10b3VjaCBjb21waWxlcgorICBpZigke0xJQk9NUF9VU0VfU1REQ1BQTElCfSkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfY29tcGlsZXIgJHtDTUFLRV9DWFhfQ09NUElMRVJ9KQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfY29tcGlsZXIgJHtDTUFLRV9DX0NPTVBJTEVSfSkKKyAgZW5kaWYoKQorICAjIHRlc3QtdG91Y2ggY29tcGlsYXRpb24gZmxhZ3MKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9saWJzICIke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IikKKyAgaWYoJHtJQTMyfSkKKyAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2NmbGFncyAtbTMyIExJQk9NUF9IQVZFX00zMl9GTEFHKQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGlicyAke0xJQk9NUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9MSUJfRklMRX0pCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGlicyAiJHtMSUJPTVBfSFdMT0NfTElCUkFSWX0iIExJQk9NUF9VU0VfSFdMT0MpCisgIGlmKEFQUExFKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF9lbnYgIkRZTERfTElCUkFSWV9QQVRIPS46JHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX06JEVOVntEWUxEX0xJQlJBUllfUEFUSH0iKQorICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGRmbGFncyAiLVdsLC1ycGF0aCwke0xJQk9NUF9IV0xPQ19MSUJSQVJZX0RJUn0iIExJQk9NUF9VU0VfSFdMT0MpCisgIGVsc2UoKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF9lbnYgIkxEX0xJQlJBUllfUEFUSD0uOiR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9OiRFTlZ7TERfTElCUkFSWV9QQVRIfSIpCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9sZGZsYWdzICItV2wsLXJwYXRoPSR7TElCT01QX0hXTE9DX0xJQlJBUllfRElSfSIgTElCT01QX1VTRV9IV0xPQykKKyAgZW5kaWYoKQorZW5kaWYoKQorbWFjcm8obGlib21wX3Rlc3RfdG91Y2hfcmVjaXBlIHRlc3RfdG91Y2hfZGlyKQorICBzZXQobGlib21wX3Rlc3RfdG91Y2hfZGVwZW5kZW5jaWVzICR7TElCT01QX1NSQ19ESVJ9L3Rlc3QtdG91Y2guYyBvbXApCisgIHNldChsaWJvbXBfdGVzdF90b3VjaF9leGUgJHt0ZXN0X3RvdWNoX2Rpcn0vdGVzdC10b3VjaCR7Q01BS0VfRVhFQ1VUQUJMRV9TVUZGSVh9KQorICBzZXQobGlib21wX3Rlc3RfdG91Y2hfb2JqICR7dGVzdF90b3VjaF9kaXJ9L3Rlc3QtdG91Y2gke0NNQUtFX0NfT1VUUFVUX0VYVEVOU0lPTn0pCisgIGlmKFdJTjMyKQorICAgIGlmKCR7UkVMRUFTRV9CVUlMRH0gT1IgJHtSRUxXSVRIREVCSU5GT19CVUlMRH0pCisgICAgICBpZigke3Rlc3RfdG91Y2hfZGlyfSBNQVRDSEVTICJ0ZXN0LXRvdWNoLW10IikKKyAgICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9jZmxhZ3MgL01UKQorICAgICAgZWxzZSgpCisgICAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzIC9NRCkKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgIGlmKCR7dGVzdF90b3VjaF9kaXJ9IE1BVENIRVMgInRlc3QtdG91Y2gtbXQiKQorICAgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2NmbGFncyAvTVRkKQorICAgICAgZWxzZSgpCisgICAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzIC9NRGQpCisgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF9vdXRfZmxhZ3MgLUZlJHtsaWJvbXBfdGVzdF90b3VjaF9leGV9IC1GbyR7bGlib21wX3Rlc3RfdG91Y2hfb2JqfSkKKyAgICBsaXN0KEFQUEVORCBsaWJvbXBfdGVzdF90b3VjaF9kZXBlbmRlbmNpZXMgb21waW1wKQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfb3V0X2ZsYWdzIC1vICR7bGlib21wX3Rlc3RfdG91Y2hfZXhlfSkKKyAgZW5kaWYoKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICAke3Rlc3RfdG91Y2hfZGlyfS8uc3VjY2VzcyAke2xpYm9tcF90ZXN0X3RvdWNoX2V4ZX0gJHtsaWJvbXBfdGVzdF90b3VjaF9vYmp9CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke3Rlc3RfdG91Y2hfZGlyfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW1vdmUgLWYgJHt0ZXN0X3RvdWNoX2Rpcn0vKgorICAgIENPTU1BTkQgJHtsaWJvbXBfdGVzdF90b3VjaF9jb21waWxlcn0gJHtsaWJvbXBfdGVzdF90b3VjaF9vdXRfZmxhZ3N9ICR7bGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzfQorICAgICAgJHtMSUJPTVBfU1JDX0RJUn0vdGVzdC10b3VjaC5jICR7bGlib21wX3Rlc3RfdG91Y2hfbGRmbGFnc30gJHtsaWJvbXBfdGVzdF90b3VjaF9saWJzfQorICAgIENPTU1BTkQgJHtMSUJPTVBfU0hFTEx9IC1jIFwiJHtsaWJvbXBfdGVzdF90b3VjaF9lbnZ9ICR7bGlib21wX3Rlc3RfdG91Y2hfZXhlfVwiCisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRvdWNoICR7dGVzdF90b3VjaF9kaXJ9Ly5zdWNjZXNzCisgICAgREVQRU5EUyAke2xpYm9tcF90ZXN0X3RvdWNoX2RlcGVuZGVuY2llc30KKyAgKQorZW5kbWFjcm8oKQorbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9lbnYgIktNUF9WRVJTSU9OPTEiKQorYWRkX2N1c3RvbV90YXJnZXQobGlib21wLXRlc3QtdG91Y2ggREVQRU5EUyAke2xpYm9tcF90ZXN0X3RvdWNoX3RhcmdldHN9KQoraWYoV0lOMzIpCisgIGxpYm9tcF90ZXN0X3RvdWNoX3JlY2lwZSh0ZXN0LXRvdWNoLW10KQorICBsaWJvbXBfdGVzdF90b3VjaF9yZWNpcGUodGVzdC10b3VjaC1tZCkKK2Vsc2UoKQorICBsaWJvbXBfdGVzdF90b3VjaF9yZWNpcGUodGVzdC10b3VjaC1ydCkKK2VuZGlmKCkKKworIyB0ZXN0LXJlbG8KK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LXJlbG8gREVQRU5EUyB0ZXN0LXJlbG8vLnN1Y2Nlc3MpCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCAgdGVzdC1yZWxvLy5zdWNjZXNzIHRlc3QtcmVsby9yZWFkZWxmLmxvZworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3QtcmVsbworICBDT01NQU5EIHJlYWRlbGYgLWQgJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9ID4gdGVzdC1yZWxvL3JlYWRlbGYubG9nCisgIENPTU1BTkQgZ3JlcCAtZSBURVhUUkVMIHRlc3QtcmVsby9yZWFkZWxmLmxvZyBcOyB0ZXN0ICQkPyAtZXEgMQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1yZWxvLy5zdWNjZXNzCisgIERFUEVORFMgb21wCispCisKKyMgdGVzdC1leGVjc3RhY2sKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LWV4ZWNzdGFjayBERVBFTkRTIHRlc3QtZXhlY3N0YWNrLy5zdWNjZXNzKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgIHRlc3QtZXhlY3N0YWNrLy5zdWNjZXNzCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGVzdC1leGVjc3RhY2sKKyAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9jaGVjay1leGVjc3RhY2sucGwKKyAgICAtLWFyY2g9JHtMSUJPTVBfUEVSTF9TQ1JJUFRfQVJDSH0gJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9CisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcworICBERVBFTkRTIG9tcAorKQorCisjIHRlc3QtaW5zdHIKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LWluc3RyIERFUEVORFMgdGVzdC1pbnN0ci8uc3VjY2VzcykKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUICB0ZXN0LWluc3RyLy5zdWNjZXNzCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGVzdC1pbnN0cgorICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke0xJQk9NUF9UT09MU19ESVJ9L2NoZWNrLWluc3RydWN0aW9uLXNldC5wbCAtLW9zPSR7TElCT01QX1BFUkxfU0NSSVBUX09TfQorICAgIC0tYXJjaD0ke0xJQk9NUF9QRVJMX1NDUklQVF9BUkNIfSAtLXNob3cgLS1taWMtYXJjaD0ke0xJQk9NUF9NSUNfQVJDSH0gJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9CisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWluc3RyLy5zdWNjZXNzCisgIERFUEVORFMgb21wICR7TElCT01QX1RPT0xTX0RJUn0vY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCispCisKKyMgdGVzdC1kZXBzCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtdGVzdC1kZXBzIERFUEVORFMgdGVzdC1kZXBzLy5zdWNjZXNzKQorc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMpCitpZihDTUFLRV9TWVNURU1fTkFNRSBNQVRDSEVTICJGcmVlQlNEIikKKyAgc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliYy5zby43IGxpYnRoci5zby4zKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliaHdsb2Muc28uNSBMSUJPTVBfVVNFX0hXTE9DKQorZWxzZWlmKENNQUtFX1NZU1RFTV9OQU1FIE1BVENIRVMgIk5ldEJTRCIpCisgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uMTIgbGlicHRocmVhZC5zby4xIGxpYm0uc28uMCkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmh3bG9jLnNvLjUgTElCT01QX1VTRV9IV0xPQykKK2Vsc2VpZihBUFBMRSkKKyAgc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIpCitlbHNlaWYoV0lOMzIpCisgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGtlcm5lbDMyLmRsbCkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIHBzYXBpLmRsbCBMSUJPTVBfT01QVF9TVVBQT1JUKQorZWxzZSgpCisgIGlmKCR7TUlDfSkKKyAgICBzZXQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYgbGlicHRocmVhZC5zby4wIGxpYmRsLnNvLjIpCisgICAgaWYoIiR7TElCT01QX01JQ19BUkNIfSIgU1RSRVFVQUwgImtuZiIpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQtbGludXgtbDFvbS5zby4yKQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmdjY19zLnNvLjEpCisgICAgZWxzZWlmKCIke0xJQk9NUF9NSUNfQVJDSH0iIFNUUkVRVUFMICJrbmMiKQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxkLWxpbnV4LWsxb20uc28uMikKKyAgICBlbmRpZigpCisgIGVsc2UoKQorICAgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmRsLnNvLjIgbGliZ2NjX3Muc28uMSkKKyAgICBpZigke0lBMzJ9KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC5zby4yKQorICAgIGVsc2VpZigke0lOVEVMNjR9KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC14ODYtNjQuc28uMikKKyAgICBlbHNlaWYoJHtBUk19KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJmZmkuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJmZmkuc28uNSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC1hcm1oZi5zby4zKQorICAgIGVsc2VpZigke1BQQzY0fSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQ2NC5zby4xKQorICAgIGVsc2VpZigke01JUFN9IE9SICR7TUlQUzY0fSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQuc28uMSkKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYnB0aHJlYWQuc28uMCBJRl9GQUxTRSBTVFVCU19MSUJSQVJZKQorICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJod2xvYy5zby41IExJQk9NUF9VU0VfSFdMT0MpCisgIGVuZGlmKCkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYnN0ZGMrKy5zby42IExJQk9NUF9VU0VfU1REQ1BQTElCKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGlibS5zby42IExJQk9NUF9TVEFUUykKK2VuZGlmKCkKKyMgUGVybCBzY3JpcHQgZXhwZWN0cyBjb21tYSBzZXBhcmF0ZWQgbGlzdAorc3RyaW5nKFJFUExBQ0UgIjsiICIsIiBsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzICIke2xpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHN9IikKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUICB0ZXN0LWRlcHMvLnN1Y2Nlc3MKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90ZXN0LWRlcHMKKyAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9jaGVjay1kZXBlbmRzLnBsIC0tb3M9JHtMSUJPTVBfUEVSTF9TQ1JJUFRfT1N9CisgICAgLS1hcmNoPSR7TElCT01QX1BFUkxfU0NSSVBUX0FSQ0h9IC0tZXhwZWN0ZWQ9IiR7bGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwc30iICR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0xJQl9GSUxFfQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1kZXBzLy5zdWNjZXNzCisgIERFUEVORFMgb21wICR7TElCT01QX1RPT0xTX0RJUn0vY2hlY2stZGVwZW5kcy5wbAorKQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wVXRpbHMuY21ha2UgYi9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBVdGlscy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGNmYThjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wVXRpbHMuY21ha2UKQEAgLTAsMCArMSwxOTUgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyB2b2lkIGxpYm9tcF9zYXkoc3RyaW5nIG1lc3NhZ2VfdG9fdXNlcik7CisjIC0gcHJpbnRzIG91dCBtZXNzYWdlX3RvX3VzZXIKK21hY3JvKGxpYm9tcF9zYXkgbWVzc2FnZV90b191c2VyKQorICBtZXNzYWdlKFNUQVRVUyAiTElCT01QOiAke21lc3NhZ2VfdG9fdXNlcn0iKQorZW5kbWFjcm8oKQorCisjIHZvaWQgbGlib21wX3dhcm5pbmdfc2F5KHN0cmluZyBtZXNzYWdlX3RvX3VzZXIpOworIyAtIHByaW50cyBvdXQgbWVzc2FnZV90b191c2VyIHdpdGggYSB3YXJuaW5nCittYWNybyhsaWJvbXBfd2FybmluZ19zYXkgbWVzc2FnZV90b191c2VyKQorICBtZXNzYWdlKFdBUk5JTkcgIkxJQk9NUDogJHttZXNzYWdlX3RvX3VzZXJ9IikKK2VuZG1hY3JvKCkKKworIyB2b2lkIGxpYm9tcF9lcnJvcl9zYXkoc3RyaW5nIG1lc3NhZ2VfdG9fdXNlcik7CisjIC0gcHJpbnRzIG91dCBtZXNzYWdlX3RvX3VzZXIgd2l0aCBhbiBlcnJvciBhbmQgZXhpdHMgY21ha2UKK21hY3JvKGxpYm9tcF9lcnJvcl9zYXkgbWVzc2FnZV90b191c2VyKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJMSUJPTVA6ICR7bWVzc2FnZV90b191c2VyfSIpCitlbmRtYWNybygpCisKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IFsoSUZfVFJVRSB8IElGX0ZBTFNFIHwgSUZfVFJVRV8xXzAgKSBCT09MRUFOXSkKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+KQorIyAgIC0gdW5jb25kaXRpb25hbGx5IGFwcGVuZHMgPGZsYWc+IHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zCisjCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PiA8Qk9PTEVBTj4pCisjICAgLSBhcHBlbmRzIDxmbGFnPiB0byB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyBpZiBCT09MRUFOIGlzIHRydWUKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IElGX1RSVUUgPEJPT0xFQU4+KQorIyAgIC0gYXBwZW5kcyA8ZmxhZz4gdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMgaWYgQk9PTEVBTiBpcyB0cnVlCisjCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PiBJRl9GQUxTRSA8Qk9PTEVBTj4pCisjICAgLSBhcHBlbmRzIDxmbGFnPiB0byB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyBpZiBCT09MRUFOIGlzIGZhbHNlCisjCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PiBJRl9ERUZJTkVEIDxWQVJJQUJMRT4pCisjICAgLSBhcHBlbmRzIDxmbGFnPiB0byB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyBpZiBWQVJJQUJMRSBpcyBkZWZpbmVkCisjCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PiBJRl9UUlVFXzFfMCA8Qk9PTEVBTj4pCisjICAgLSBhcHBlbmRzIDxmbGFnPj0xIHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zIGlmIDxCT09MRUFOPiBpcyB0cnVlLCA8ZmxhZz49MCBvdGhlcndpc2UKKyMgZS5nLiwgbGlib21wX2FwcGVuZCgiLUQgVVNFX0ZFQVRVUkUiIElGX1RSVUVfMV8wIEhBVkVfRkVBVFVSRSkKKyMgICAgIGFwcGVuZHMgIi1EIFVTRV9GRUFUVVJFPTEiIGlmIEhBVkVfRkVBVFVSRSBpcyB0cnVlCisjICAgICBvciAiLUQgVVNFX0ZFQVRVUkU9MCIgaWYgSEFWRV9GRUFUVVJFIGlzIGZhbHNlCittYWNybyhsaWJvbXBfYXBwZW5kIGZsYWdzIGZsYWcpCisgIGlmKE5PVCAoJHtBUkdDfSBFUVVBTCAyIE9SICR7QVJHQ30gRVFVQUwgMyBPUiAke0FSR0N9IEVRVUFMIDQpKQorICAgIGxpYm9tcF9lcnJvcl9zYXkoImxpYm9tcF9hcHBlbmQ6IHRha2VzIDIsIDMsIG9yIDQgYXJndW1lbnRzIikKKyAgZW5kaWYoKQorICBpZigke0FSR0N9IEVRVUFMIDIpCisgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ30iKQorICBlbHNlaWYoJHtBUkdDfSBFUVVBTCAzKQorICAgIGlmKCR7QVJHVjJ9KQorICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ30iKQorICAgIGVuZGlmKCkKKyAgZWxzZSgpCisgICAgaWYoJHtBUkdWMn0gU1RSRVFVQUwgIklGX1RSVUUiKQorICAgICAgaWYoJHtBUkdWM30pCisgICAgICAgIGxpc3QoQVBQRU5EICR7ZmxhZ3N9ICIke2ZsYWd9IikKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlaWYoJHtBUkdWMn0gU1RSRVFVQUwgIklGX0ZBTFNFIikKKyAgICAgIGlmKE5PVCAke0FSR1YzfSkKKyAgICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ30iKQorICAgICAgZW5kaWYoKQorICAgIGVsc2VpZigke0FSR1YyfSBTVFJFUVVBTCAiSUZfREVGSU5FRCIpCisgICAgICBpZihERUZJTkVEICR7QVJHVjN9KQorICAgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfSIpCisgICAgICBlbmRpZigpCisgICAgZWxzZWlmKCR7QVJHVjJ9IFNUUkVRVUFMICJJRl9UUlVFXzFfMCIpCisgICAgICBpZigke0FSR1YzfSkKKyAgICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ309MSIpCisgICAgICBlbHNlKCkKKyAgICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ309MCIpCisgICAgICBlbmRpZigpCisgICAgZWxzZSgpCisgICAgICBsaWJvbXBfZXJyb3Jfc2F5KCJsaWJvbXBfYXBwZW5kOiB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiBJRl9UUlVFLCBJRl9GQUxTRSwgSUZfREVGSU5FRCwgSUZfVFJVRV8xXzAiKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorZW5kbWFjcm8oKQorCisjIHZvaWQgbGlib21wX2dldF9sZWdhbF9hcmNoKHN0cmluZyogcmV0dXJuX2FyY2hfc3RyaW5nKTsKKyMgLSByZXR1cm5zICh0aHJvdWdoIHJldHVybl9hcmNoX3N0cmluZykgdGhlIGZvcm1hbCBhcmNoaXRlY3R1cmUKKyMgICBzdHJpbmcgb3Igd2FybnMgdXNlciBvZiB1bmtub3duIGFyY2hpdGVjdHVyZQorZnVuY3Rpb24obGlib21wX2dldF9sZWdhbF9hcmNoIHJldHVybl9hcmNoX3N0cmluZykKKyAgaWYoJHtJQTMyfSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJJQS0zMiIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJJbnRlbChSKSA2NCIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtNSUN9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIkludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtBUk19KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIkFSTSIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtQUEM2NEJFfSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJQUEM2NEJFIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke1BQQzY0TEV9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIlBQQzY0TEUiIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7QUFSQ0g2NH0pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiQUFSQ0g2NCIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtNSVBTfSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJNSVBTIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke01JUFM2NH0pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiTUlQUzY0IiBQQVJFTlRfU0NPUEUpCisgIGVsc2UoKQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIiR7TElCT01QX0FSQ0h9IiBQQVJFTlRfU0NPUEUpCisgICAgbGlib21wX3dhcm5pbmdfc2F5KCJsaWJvbXBfZ2V0X2xlZ2FsX2FyY2goKTogV2FybmluZzogVW5rbm93biBhcmNoaXRlY3R1cmU6IFVzaW5nICR7TElCT01QX0FSQ0h9IikKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgbGlib21wX2NoZWNrX3ZhcmlhYmxlKHN0cmluZyB2YXIsIC4uLik7CisjIC0gcnVucyB0aHJvdWdoIGFsbCB2YWx1ZXMgY2hlY2tpbmcgaWYgJHt2YXJ9ID09IHZhbHVlCisjIC0gdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgZG8gbm90IG1hdHRlcgorIyAtIGlmIHRoZSB2YXIgaXMgZm91bmQsIHRoZW4ganVzdCBwcmludCBpdCBvdXQKKyMgLSBpZiB0aGUgdmFyIGlzIG5vdCBmb3VuZCwgdGhlbiBlcnJvciBvdXQKK2Z1bmN0aW9uKGxpYm9tcF9jaGVja192YXJpYWJsZSB2YXIpCisgIHNldCh2YWxpZF9mbGFnIDApCisgIHN0cmluZyhUT0xPV0VSICIkeyR7dmFyfX0iIHZhcl9sb3dlcikKKyAgZm9yZWFjaCh2YWx1ZSBJTiBMSVNUUyBBUkdOKQorICAgIHN0cmluZyhUT0xPV0VSICIke3ZhbHVlfSIgdmFsdWVfbG93ZXIpCisgICAgaWYoIiR7dmFyX2xvd2VyfSIgU1RSRVFVQUwgIiR7dmFsdWVfbG93ZXJ9IikKKyAgICAgIHNldCh2YWxpZF9mbGFnIDEpCisgICAgICBzZXQodGhlX3ZhbHVlICIke3ZhbHVlfSIpCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoKCkKKyAgaWYoJHt2YWxpZF9mbGFnfSBFUVVBTCAwKQorICAgIGxpYm9tcF9lcnJvcl9zYXkoImxpYm9tcF9jaGVja192YXJpYWJsZSgpOiAke3Zhcn0gPSAkeyR7dmFyfX0gaXMgdW5rbm93biIpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGxpYm9tcF9nZXRfYnVpbGRfbnVtYmVyKHN0cmluZyBzcmNfZGlyLCBzdHJpbmcqIHJldHVybl9idWlsZF9udW1iZXIpOworIyAtIGdyYWIgdGhlIGVpZ2h0IGRpZ2l0IGJ1aWxkIG51bWJlciAob3IgMDAwMDAwMDApIGZyb20ga21wX3ZlcnNpb24uY3BwCitmdW5jdGlvbihsaWJvbXBfZ2V0X2J1aWxkX251bWJlciBzcmNfZGlyIHJldHVybl9idWlsZF9udW1iZXIpCisgICMgc2V0cyBmaWxlX2xpbmVzX2xpc3QgdG8gYSBsaXN0IG9mIGFsbCBsaW5lcyBpbiBrbXBfdmVyc2lvbi5jcHAKKyAgZmlsZShTVFJJTkdTICIke3NyY19kaXJ9L3NyYy9rbXBfdmVyc2lvbi5jcHAiIGZpbGVfbGluZXNfbGlzdCkKKworICAjIHJ1bnMgdGhyb3VnaCBlYWNoIGxpbmUgaW4ga21wX3ZlcnNpb24uY3BwCisgIGZvcmVhY2gobGluZSBJTiBMSVNUUyBmaWxlX2xpbmVzX2xpc3QpCisgICAgIyBpZiB0aGUgbGluZSBiZWdpbnMgd2l0aCAiI2RlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCIgdGhlbiB3ZSB0YWtlIG5vdCBvZiB0aGUgYnVpbGQgbnVtYmVyCisgICAgc3RyaW5nKFJFR0VYIE1BVENIICJeWyBcdF0qI2RlZmluZVsgXHRdK0tNUF9WRVJTSU9OX0JVSUxEIiB2YWxpZCAiJHtsaW5lfSIpCisgICAgaWYoTk9UICIke3ZhbGlkfSIgU1RSRVFVQUwgIiIpICMgaWYgd2UgbWF0Y2hlZCAiI2RlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCIsIHRoZW4gZ3JhYiB0aGUgYnVpbGQgbnVtYmVyCisgICAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXlsgXHRdKiNkZWZpbmVbIFx0XStLTVBfVkVSU0lPTl9CVUlMRFsgXHRdKyhbMC05XSspIiAiXFwxIgorICAgICAgICAgICBidWlsZF9udW1iZXIgIiR7bGluZX0iCisgICAgICApCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoKCkKKyAgc2V0KCR7cmV0dXJuX2J1aWxkX251bWJlcn0gIiR7YnVpbGRfbnVtYmVyfSIgUEFSRU5UX1NDT1BFKSAjIHJldHVybiBidWlsZCBudW1iZXIKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGxpYm9tcF9nZXRfbGVnYWxfdHlwZShzdHJpbmcqIHJldHVybl9sZWdhbF90eXBlKTsKKyMgLSBzZXQgdGhlIGxlZ2FsIHR5cGUgbmFtZSBQZXJmb3JtYW5jZS9Qcm9maWxpbmcvU3R1YgorZnVuY3Rpb24obGlib21wX2dldF9sZWdhbF90eXBlIHJldHVybl9sZWdhbF90eXBlKQorICBpZigke05PUk1BTF9MSUJSQVJZfSkKKyAgICBzZXQoJHtyZXR1cm5fbGVnYWxfdHlwZX0gIlBlcmZvcm1hbmNlIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke1BST0ZJTEVfTElCUkFSWX0pCisgICAgc2V0KCR7cmV0dXJuX2xlZ2FsX3R5cGV9ICJQcm9maWxpbmciIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7U1RVQlNfTElCUkFSWX0pCisgICAgc2V0KCR7cmV0dXJuX2xlZ2FsX3R5cGV9ICJTdHViIiBQQVJFTlRfU0NPUEUpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGxpYm9tcF9hZGRfc3VmZml4KHN0cmluZyBzdWZmaXgsIGxpc3Q8c3RyaW5nPiogbGlzdF9vZl9pdGVtcyk7CisjIC0gcmV0dXJucyBsaXN0X29mX2l0ZW1zIHdpdGggc3VmZml4IGFwcGVuZGVkIHRvIGFsbCBpdGVtcworIyAtIG9yaWdpbmFsIGxpc3QgaXMgbW9kaWZpZWQKK2Z1bmN0aW9uKGxpYm9tcF9hZGRfc3VmZml4IHN1ZmZpeCBsaXN0X29mX2l0ZW1zKQorICBzZXQobG9jYWxfbGlzdCAiIikKKyAgZm9yZWFjaChpdGVtIElOIExJU1RTICIke2xpc3Rfb2ZfaXRlbXN9IikKKyAgICBpZihOT1QgIiR7aXRlbX0iIFNUUkVRVUFMICIiKQorICAgICAgbGlzdChBUFBFTkQgbG9jYWxfbGlzdCAiJHtpdGVtfSR7c3VmZml4fSIpCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoKCkKKyAgc2V0KCR7bGlzdF9vZl9pdGVtc30gIiR7bG9jYWxfbGlzdH0iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGxpYm9tcF9saXN0X3RvX3N0cmluZyhsaXN0PHN0cmluZz4gbGlzdF9vZl90aGluZ3MsIHN0cmluZyogcmV0dXJuX3N0cmluZyk7CisjIC0gY29udmVydHMgYSBsaXN0IHRvIGEgc3BhY2Ugc2VwYXJhdGVkIHN0cmluZworZnVuY3Rpb24obGlib21wX2xpc3RfdG9fc3RyaW5nIGxpc3Rfb2ZfdGhpbmdzIHJldHVybl9zdHJpbmcpCisgIHN0cmluZyhSRVBMQUNFICI7IiAiICIgb3V0cHV0X3ZhcmlhYmxlICIke2xpc3Rfb2ZfdGhpbmdzfSIpCisgIHNldCgke3JldHVybl9zdHJpbmd9ICIke291dHB1dF92YXJpYWJsZX0iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGxpYm9tcF9zdHJpbmdfdG9fbGlzdChzdHJpbmcgc3RyLCBsaXN0PHN0cmluZz4qIHJldHVybl9saXN0KTsKKyMgLSBjb252ZXJ0cyBhIHN0cmluZyB0byBhIHNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdAorIyAtIHdoYXQgaXQgcmVhbGx5IGRvZXMgaXMganVzdCBzdHJpbmdfcmVwbGFjZSBhbGwgcnVubmluZyB3aGl0ZXNwYWNlIHRvIGEgc2VtaWNvbG9uCisjIC0gaW4gY21ha2UsIGEgbGlzdCBpcyBzdHJpbmdzIHNlcGFyYXRlZCBieSBzZW1pY29sb25zOiBpLmUuLCBsaXN0IG9mIGZvdXIgaXRlbXMsIGxpc3QgPSAiaXRlbTE7aXRlbTI7aXRlbTM7aXRlbTQiCitmdW5jdGlvbihsaWJvbXBfc3RyaW5nX3RvX2xpc3Qgc3RyIHJldHVybl9saXN0KQorICBzZXQob3V0c3RyKQorICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiWyBcdF0rIiAiOyIgb3V0c3RyICIke3N0cn0iKQorICBzZXQoJHtyZXR1cm5fbGlzdH0gIiR7b3V0c3RyfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9jbWFrZS9jb25maWctaXguY21ha2UgYi9yYzMvcnVudGltZS9jbWFrZS9jb25maWctaXguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3NWQyMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2NtYWtlL2NvbmZpZy1peC5jbWFrZQpAQCAtMCwwICsxLDI3NCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitpbmNsdWRlKENoZWNrQ0NvbXBpbGVyRmxhZykKK2luY2x1ZGUoQ2hlY2tDU291cmNlQ29tcGlsZXMpCitpbmNsdWRlKENoZWNrQ1hYQ29tcGlsZXJGbGFnKQoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlKQoraW5jbHVkZShDaGVja0xpYnJhcnlFeGlzdHMpCitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGVzKQoraW5jbHVkZShMaWJvbXBDaGVja0xpbmtlckZsYWcpCitpbmNsdWRlKExpYm9tcENoZWNrRm9ydHJhbkZsYWcpCisKKyMgQ2hlY2sgZm9yIHZlcnNpb25lZCBzeW1ib2xzCitmdW5jdGlvbihsaWJvbXBfY2hlY2tfdmVyc2lvbl9zeW1ib2xzIHJldHZhbCkKKyAgc2V0KHNvdXJjZV9jb2RlCisgICAgIiNpbmNsdWRlIDxzdGRpby5oPgorICAgIHZvaWQgZnVuYzEoKSB7IHByaW50ZihcIkhlbGxvXCIpOyB9CisgICAgdm9pZCBmdW5jMigpIHsgcHJpbnRmKFwiV29ybGRcIik7IH0KKyAgICBfX2FzbV9fKFwiLnN5bXZlciBmdW5jMSwgZnVuY0BWRVIxXCIpOworICAgIF9fYXNtX18oXCIuc3ltdmVyIGZ1bmMyLCBmdW5jQFZFUjJcIik7CisgICAgaW50IG1haW4oKSB7CisgICAgICBmdW5jMSgpOworICAgICAgZnVuYzIoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0iKQorICBzZXQodmVyc2lvbl9zY3JpcHRfc291cmNlICJWRVIxIHsgfTsgVkVSMiB7IH0gVkVSMTsiKQorICBmaWxlKFdSSVRFICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9fX3ZlcnNpb25fc2NyaXB0LnR4dCAiJHt2ZXJzaW9uX3NjcmlwdF9zb3VyY2V9IikKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTIC1XbCwtLXZlcnNpb24tc2NyaXB0PSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9fX3ZlcnNpb25fc2NyaXB0LnR4dCkKKyAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIiR7c291cmNlX2NvZGV9IiAke3JldHZhbH0pCisgIHNldCgke3JldHZhbH0gJHske3JldHZhbH19IFBBUkVOVF9TQ09QRSkKKyAgZmlsZShSRU1PVkUgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L19fdmVyc2lvbl9zY3JpcHQudHh0KQorZW5kZnVuY3Rpb24oKQorCisjIEluY2x1ZGVzIHRoZSBhcmNoaXRlY3R1cmUgZmxhZyBpbiBib3RoIGNvbXBpbGUgYW5kIGxpbmsgcGhhc2UKK2Z1bmN0aW9uKGxpYm9tcF9jaGVja19hcmNoaXRlY3R1cmVfZmxhZyBmbGFnIHJldHZhbCkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIke2ZsYWd9IikKKyAgY2hlY2tfY19jb21waWxlcl9mbGFnKCIke2ZsYWd9IiAke3JldHZhbH0pCisgIHNldCgke3JldHZhbH0gJHske3JldHZhbH19IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyBDaGVja2luZyBDLCBDWFgsIExpbmtlciBGbGFncworY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLXN0ZD1jKysxMSBMSUJPTVBfSEFWRV9TVERfQ1BQMTFfRkxBRykKK2NoZWNrX2N4eF9jb21waWxlcl9mbGFnKC1mbm8tZXhjZXB0aW9ucyBMSUJPTVBfSEFWRV9GTk9fRVhDRVBUSU9OU19GTEFHKQorY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLWZuby1ydHRpIExJQk9NUF9IQVZFX0ZOT19SVFRJX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoIi14IGMrKyIgTElCT01QX0hBVkVfWF9DUFBfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV2Vycm9yIExJQk9NUF9IQVZFX1dFUlJPUl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdW51c2VkLWZ1bmN0aW9uIExJQk9NUF9IQVZFX1dOT19VTlVTRURfRlVOQ1RJT05fRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3VudXNlZC1sb2NhbC10eXBlZGVmIExJQk9NUF9IQVZFX1dOT19VTlVTRURfTE9DQUxfVFlQRURFRl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdW51c2VkLXZhbHVlIExJQk9NUF9IQVZFX1dOT19VTlVTRURfVkFMVUVfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3VudXNlZC12YXJpYWJsZSBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX1ZBUklBQkxFX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdzd2l0Y2ggTElCT01QX0hBVkVfV05PX1NXSVRDSF9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCBMSUJPTVBfSEFWRV9XTk9fQ09WRVJFRF9TV0lUQ0hfREVGQVVMVF9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XZGVwcmVjYXRlZC1yZWdpc3RlciBMSUJPTVBfSEFWRV9XTk9fREVQUkVDQVRFRF9SRUdJU1RFUl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1Xc2lnbi1jb21wYXJlIExJQk9NUF9IQVZFX1dOT19TSUdOX0NPTVBBUkVfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV2dudS1hbm9ueW1vdXMtc3RydWN0IExJQk9NUF9IQVZFX1dOT19HTlVfQU5PTllNT1VTX1NUUlVDVF9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdW5rbm93bi1wcmFnbWFzIExJQk9NUF9IQVZFX1dOT19VTktOT1dOX1BSQUdNQVNfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV21pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIExJQk9NUF9IQVZFX1dOT19NSVNTSU5HX0ZJRUxEX0lOSVRJQUxJWkVSU19GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XbWlzc2luZy1icmFjZXMgTElCT01QX0hBVkVfV05PX01JU1NJTkdfQlJBQ0VTX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdjb21tZW50IExJQk9NUF9IQVZFX1dOT19DT01NRU5UX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdzZWxmLWFzc2lnbiBMSUJPTVBfSEFWRV9XTk9fU0VMRl9BU1NJR05fRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3ZsYS1leHRlbnNpb24gTElCT01QX0hBVkVfV05PX1ZMQV9FWFRFTlNJT05fRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV2Zvcm1hdC1wZWRhbnRpYyBMSUJPTVBfSEFWRV9XTk9fRk9STUFUX1BFREFOVElDX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLW1zc2UyIExJQk9NUF9IQVZFX01TU0UyX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLWZ0bHMtbW9kZWw9aW5pdGlhbC1leGVjIExJQk9NUF9IQVZFX0ZUTFNfTU9ERUxfRkxBRykKK2xpYm9tcF9jaGVja19hcmNoaXRlY3R1cmVfZmxhZygtbW1pYyBMSUJPTVBfSEFWRV9NTUlDX0ZMQUcpCitsaWJvbXBfY2hlY2tfYXJjaGl0ZWN0dXJlX2ZsYWcoLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKK2lmKFdJTjMyKQorICAjIENoZWNrIFdpbmRvd3MgTVNWQyBzdHlsZSBmbGFncy4KKyAgY2hlY2tfY19jb21waWxlcl9mbGFnKC9UUCBMSUJPTVBfSEFWRV9UUF9GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvRUhzYyBMSUJPTVBfSEFWRV9FSFNDX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9HUyBMSUJPTVBfSEFWRV9HU19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvT3ktIExJQk9NUF9IQVZFX095X19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvYXJjaDpTU0UyIExJQk9NUF9IQVZFX0FSQ0hfU1NFMl9GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvUXNhZmVzZWggTElCT01QX0hBVkVfUVNBRkVTRUhfRkxBRykKKyAgIyBJdCBpcyBkaWZmaWN1bHQgdG8gY3JlYXRlIGEgZHVtbXkgbWFzbSBhc3NlbWJseSBmaWxlCisgICMgYW5kIHRoZW4gY2hlY2sgdGhlIE1BU00gYXNzZW1ibGVyIHRvIHNlZSBpZiB0aGVzZSBmbGFncyBleGlzdCBhbmQgd29yaywKKyAgIyBzbyB3ZSBhc3N1bWUgdGhleSBkbyBmb3IgV2luZG93cy4KKyAgc2V0KExJQk9NUF9IQVZFX1NBRkVTRUhfTUFTTV9GTEFHIFRSVUUpCisgIHNldChMSUJPTVBfSEFWRV9DT0ZGX01BU01fRkxBRyBUUlVFKQorICAjIENoYW5nZSBXaW5kb3dzIGZsYWdzIC9NRHggdG8gL01UeAorICBmb3JlYWNoKGxpYm9tcF9sYW5nIElOIElURU1TIEMgQ1hYKQorICAgIGZvcmVhY2gobGlib21wX2J0eXBlIElOIElURU1TIERFQlVHIFJFTFdJVEhERUJJTkZPIFJFTEVBU0UgTUlOU0laRVJFTCkKKyAgICAgIHN0cmluZyhSRVBMQUNFICIvTUQiICIvTVQiCisgICAgICAgIENNQUtFXyR7bGlib21wX2xhbmd9X0ZMQUdTXyR7bGlib21wX2J0eXBlfQorICAgICAgICAiJHtDTUFLRV8ke2xpYm9tcF9sYW5nfV9GTEFHU18ke2xpYm9tcF9idHlwZX19IgorICAgICAgKQorICAgIGVuZGZvcmVhY2goKQorICBlbmRmb3JlYWNoKCkKK2Vsc2UoKQorICAjIEl0IGlzIGRpZmZpY3VsdCB0byBjcmVhdGUgYSBkdW1teSBhc3NlbWJseSBmaWxlIHRoYXQgY29tcGlsZXMgaW50byBhbgorICAjIGV4ZWN0dWFibGUgZm9yIGV2ZXJ5IGFyY2hpdGVjdHVyZSBhbmQgdGhlbiBjaGVjayB0aGUgQyBjb21waWxlciB0bworICAjIHNlZSBpZiAteCBhc3NlbWJsZXItd2l0aC1jcHAgZXhpc3RzIGFuZCB3b3Jrcywgc28gd2UgYXNzdW1lIGl0IGRvZXMgZm9yIG5vbi1XaW5kb3dzLgorICBzZXQoTElCT01QX0hBVkVfWF9BU1NFTUJMRVJfV0lUSF9DUFBfRkxBRyBUUlVFKQorZW5kaWYoKQoraWYoJHtMSUJPTVBfRk9SVFJBTl9NT0RVTEVTfSkKKyAgbGlib21wX2NoZWNrX2ZvcnRyYW5fZmxhZygtbTMyIExJQk9NUF9IQVZFX00zMl9GT1JUUkFOX0ZMQUcpCitlbmRpZigpCisKKyMgQ2hlY2sgbGlua2VyIGZsYWdzCitpZihXSU4zMikKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC9TQUZFU0VIIExJQk9NUF9IQVZFX1NBRkVTRUhfRkxBRykKK2Vsc2VpZihOT1QgQVBQTEUpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtV2wsLXggTElCT01QX0hBVkVfWF9GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLVdsLC0td2Fybi1zaGFyZWQtdGV4dHJlbCBMSUJPTVBfSEFWRV9XQVJOX1NIQVJFRF9URVhUUkVMX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtV2wsLS1hcy1uZWVkZWQgTElCT01QX0hBVkVfQVNfTkVFREVEX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtMSUJPTVBfU1JDX0RJUn0vZXhwb3J0c19zby50eHQiIExJQk9NUF9IQVZFX1ZFUlNJT05fU0NSSVBUX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtc3RhdGljLWxpYmdjYyBMSUJPTVBfSEFWRV9TVEFUSUNfTElCR0NDX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtV2wsLXosbm9leGVjc3RhY2sgTElCT01QX0hBVkVfWl9OT0VYRUNTVEFDS19GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLVdsLC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9maW5pIExJQk9NUF9IQVZFX0ZJTklfRkxBRykKK2VuZGlmKCkKKworIyBDaGVjayBJbnRlbChSKSBDIENvbXBpbGVyIHNwZWNpZmljIGZsYWdzCitpZihDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJJbnRlbCIpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9RbG9uZ19kb3VibGUgTElCT01QX0hBVkVfTE9OR19ET1VCTEVfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL1FkaWFnLWRpc2FibGU6MTc3IExJQk9NUF9IQVZFX0RJQUdfRElTQUJMRV8xNzdfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL1FpbmxpbmUtbWluLXNpemU9MSBMSUJPTVBfSEFWRV9JTkxJTkVfTUlOX1NJWkVfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLVFvcHRpb24sY3BwLC0tZXh0ZW5kZWRfZmxvYXRfdHlwZXMgTElCT01QX0hBVkVfRVhURU5ERURfRkxPQVRfVFlQRVNfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoLWZhbGlnbi1zdGFjaz1tYWludGFpbi0xNi1ieXRlIExJQk9NUF9IQVZFX0ZBTElHTl9TVEFDS19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygiLW9wdC1zdHJlYW1pbmctc3RvcmVzIG5ldmVyIiBMSUJPTVBfSEFWRV9PUFRfU1RSRUFNSU5HX1NUT1JFU19GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLXN0YXRpYy1pbnRlbCBMSUJPTVBfSEFWRV9TVEFUSUNfSU5URUxfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1uby1pbnRlbC1leHRlbnNpb25zIExJQk9NUF9IQVZFX05PX0lOVEVMX0VYVEVOU0lPTlNfRkxBRykKKyAgY2hlY2tfbGlicmFyeV9leGlzdHMoaXJjX3BpYyBfaW50ZWxfZmFzdF9tZW1jcHkgIiIgTElCT01QX0hBVkVfSVJDX1BJQ19MSUJSQVJZKQorZW5kaWYoKQorCisjIENoZWNraW5nIFRocmVhZGluZyByZXF1aXJlbWVudHMKK2ZpbmRfcGFja2FnZShUaHJlYWRzIFJFUVVJUkVEKQoraWYoV0lOMzIpCisgIGlmKE5PVCBDTUFLRV9VU0VfV0lOMzJfVEhSRUFEU19JTklUKQorICAgIGxpYm9tcF9lcnJvcl9zYXkoIk5lZWQgV2luMzIgdGhyZWFkIGludGVyZmFjZSBvbiBXaW5kb3dzLiIpCisgIGVuZGlmKCkKK2Vsc2UoKQorICBpZihOT1QgQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpCisgICAgbGlib21wX2Vycm9yX3NheSgiTmVlZCBwdGhyZWFkIGludGVyZmFjZSBvbiBVbml4LWxpa2Ugc3lzdGVtcy4iKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgRmluZCBwZXJsIGV4ZWN1dGFibGUKKyMgUGVybCBpcyB1c2VkIHRvIGNyZWF0ZSBvbXAuaCAoYW5kIG90aGVyIGhlYWRlcnMpIGFsb25nIHdpdGgga21wX2kxOG5faWQuaW5jIGFuZCBrbXBfaTE4bl9kZWZhdWx0LmluYworZmluZF9wYWNrYWdlKFBlcmwgUkVRVUlSRUQpCisjIFRoZSBwZXJsIHNjcmlwdHMgdGFrZSB0aGUgLS1vcz0vLS1hcmNoPSBmbGFncyB3aGljaCBleHBlY3QgYSBjZXJ0YWluIGZvcm1hdCBmb3Igb3BlcmF0aW5nIHN5c3RlbXMgYW5kIGFyY2gncy4KKyMgVW50aWwgdGhlIHBlcmwgc2NyaXB0cyBhcmUgcmVtb3ZlZCwgdGhlIG1vc3QgcG9ydGFibGUgd2F5IHRvIGhhbmRsZSB0aGlzIGlzIHRvIGhhdmUgYWxsIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQKKyMgYXJlIG5laXRoZXIgV2luZG93cyBub3IgTWFjIChNb3N0IFVuaXggZmxhdm9ycykgYmUgY29uc2lkZXJlZCBsaW4gdG8gdGhlIHBlcmwgc2NyaXB0cy4gIFRoaXMgaXMgcm9vdGVkCisjIGluIHRoYXQgYWxsIHRoZSBQZXJsIHNjcmlwdHMgY2hlY2sgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYW5kIHdpbGwgZmFpbCBpZiBpdCBpc24ndCAidmFsaWQiLiAgVGhpcworIyB0ZW1wb3Jhcnkgc29sdXRpb24gbGV0cyB1cyBhdm9pZCB0cnlpbmcgdG8gZW51bWVyYXRlIGFsbCB0aGUgcG9zc2libGUgT1MgdmFsdWVzIGluc2lkZSB0aGUgUGVybCBtb2R1bGVzLgoraWYoV0lOMzIpCisgIHNldChMSUJPTVBfUEVSTF9TQ1JJUFRfT1Mgd2luKQorZWxzZWlmKEFQUExFKQorICBzZXQoTElCT01QX1BFUkxfU0NSSVBUX09TIG1hYykKK2Vsc2UoKQorICBzZXQoTElCT01QX1BFUkxfU0NSSVBUX09TIGxpbikKK2VuZGlmKCkKK2lmKElBMzIpCisgIHNldChMSUJPTVBfUEVSTF9TQ1JJUFRfQVJDSCAzMikKK2Vsc2VpZihNSUMpCisgIHNldChMSUJPTVBfUEVSTF9TQ1JJUFRfQVJDSCBtaWMpCitlbHNlaWYoSU5URUw2NCkKKyAgc2V0KExJQk9NUF9QRVJMX1NDUklQVF9BUkNIIDMyZSkKK2Vsc2UoKQorICBzZXQoTElCT01QX1BFUkxfU0NSSVBUX0FSQ0ggJHtMSUJPTVBfQVJDSH0pCitlbmRpZigpCisKKyMgQ2hlY2tpbmcgZmVhdHVyZXMKKyMgQ2hlY2sgaWYgdmVyc2lvbiBzeW1ib2wgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgYXJlIHN1cHBvcnRlZAorbGlib21wX2NoZWNrX3ZlcnNpb25fc3ltYm9scyhMSUJPTVBfSEFWRV9WRVJTSU9OX1NZTUJPTFMpCisKKyMgQ2hlY2sgaWYgcXVhZCBwcmVjaXNpb24gdHlwZXMgYXJlIGF2YWlsYWJsZQoraWYoQ01BS0VfQ19DT01QSUxFUl9JRCBTVFJFUVVBTCAiR05VIikKKyAgc2V0KExJQk9NUF9IQVZFX1FVQURfUFJFQ0lTSU9OIFRSVUUpCitlbHNlaWYoQ01BS0VfQ19DT01QSUxFUl9JRCBTVFJFUVVBTCAiSW50ZWwiKQorICBpZihMSUJPTVBfSEFWRV9FWFRFTkRFRF9GTE9BVF9UWVBFU19GTEFHKQorICAgIHNldChMSUJPTVBfSEFWRV9RVUFEX1BSRUNJU0lPTiBUUlVFKQorICBlbHNlKCkKKyAgICBzZXQoTElCT01QX0hBVkVfUVVBRF9QUkVDSVNJT04gVFJVRSkKKyAgZW5kaWYoKQorZWxzZSgpCisgIHNldChMSUJPTVBfSEFWRV9RVUFEX1BSRUNJU0lPTiBGQUxTRSkKK2VuZGlmKCkKKworIyBDaGVjayBpZiBhZGFwdGl2ZSBsb2NrcyBhcmUgYXZhaWxhYmxlCitpZigoJHtJQTMyfSBPUiAke0lOVEVMNjR9KSBBTkQgTk9UIE1TVkMpCisgIHNldChMSUJPTVBfSEFWRV9BREFQVElWRV9MT0NLUyBUUlVFKQorZWxzZSgpCisgIHNldChMSUJPTVBfSEFWRV9BREFQVElWRV9MT0NLUyBGQUxTRSkKK2VuZGlmKCkKKworIyBDaGVjayBpZiBzdGF0cy1nYXRoZXJpbmcgaXMgYXZhaWxhYmxlCitpZigke0xJQk9NUF9TVEFUU30pCisgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKAorICAgICAiX190aHJlYWQgaW50IHg7CisgICAgIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKKyAgICAgeyB4ID0gYXJnYzsgcmV0dXJuIHg7IH0iCisgICAgIExJQk9NUF9IQVZFX19fVEhSRUFEKQorICBjaGVja19jX3NvdXJjZV9jb21waWxlcygKKyAgICAgImludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKKyAgICAgeyB1bnNpZ25lZCBsb25nIGxvbmcgdCA9IF9fYnVpbHRpbl9yZWFkY3ljbGVjb3VudGVyKCk7IHJldHVybiAwOyB9IgorICAgICBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUikKKyAgaWYoTk9UIExJQk9NUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSKQorICAgIGlmKCR7SUEzMn0gT1IgJHtJTlRFTDY0fSBPUiAke01JQ30pCisgICAgICBjaGVja19pbmNsdWRlX2ZpbGUoeDg2aW50cmluLmggTElCT01QX0hBVkVfWDg2SU5UUklOX0gpCisgICAgICBsaWJvbXBfYXBwZW5kKENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TIC1ETElCT01QX0hBVkVfWDg2SU5UUklOX0ggTElCT01QX0hBVkVfWDg2SU5UUklOX0gpCisgICAgICBjaGVja19jX3NvdXJjZV9jb21waWxlcygKKyAgICAgICAgIiNpZmRlZiBMSUJPTVBfSEFWRV9YODZJTlRSSU5fSAorICAgICAgICAgIyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4KKyAgICAgICAgICNlbmRpZgorICAgICAgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7IHVuc2lnbmVkIGxvbmcgbG9uZyB0ID0gX19yZHRzYygpOyByZXR1cm4gMDsgfSIgTElCT01QX0hBVkVfX19SRFRTQykKKyAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUykKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgaWYoTElCT01QX0hBVkVfX19USFJFQUQgQU5EIChMSUJPTVBfSEFWRV9fX1JEVFNDIE9SIExJQk9NUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSKSkKKyAgICBzZXQoTElCT01QX0hBVkVfU1RBVFMgVFJVRSkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9IQVZFX1NUQVRTIEZBTFNFKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgQ2hlY2sgaWYgT01QVCBzdXBwb3J0IGlzIGF2YWlsYWJsZQorIyBDdXJyZW50bHksIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKCkgaXMgcmVxdWlyZWQgZm9yIE9NUFQKKyMgV2VhayBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIFVuaWNlcywgTElCUFNBUEkgaXMgdXNlZCBmb3IgV2luZG93cworY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoImludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICB2b2lkKiBwID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgIHJldHVybiAwO30iIExJQk9NUF9IQVZFX19fQlVJTFRJTl9GUkFNRV9BRERSRVNTKQorY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIl9fYXR0cmlidXRlX18gKCh3ZWFrKSkgaW50IGZvbyhpbnQgYSkgeyByZXR1cm4gYSphOyB9CisgIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICByZXR1cm4gZm9vKGFyZ2MpO30iIExJQk9NUF9IQVZFX1dFQUtfQVRUUklCVVRFKQorY2hlY2tfaW5jbHVkZV9maWxlcygid2luZG93cy5oO3BzYXBpLmgiIExJQk9NUF9IQVZFX1BTQVBJX0gpCitjaGVja19saWJyYXJ5X2V4aXN0cyhwc2FwaSBFbnVtUHJvY2Vzc01vZHVsZXMgIiIgTElCT01QX0hBVkVfTElCUFNBUEkpCitpZihMSUJPTVBfSEFWRV9QU0FQSV9IIEFORCBMSUJPTVBfSEFWRV9MSUJQU0FQSSkKKyAgc2V0KExJQk9NUF9IQVZFX1BTQVBJIFRSVUUpCitlbmRpZigpCitpZihOT1QgTElCT01QX0hBVkVfX19CVUlMVElOX0ZSQU1FX0FERFJFU1MpCisgIHNldChMSUJPTVBfSEFWRV9PTVBUX1NVUFBPUlQgRkFMU0UpCitlbHNlKCkKKyAgaWYoTElCT01QX0hBVkVfV0VBS19BVFRSSUJVVEUgT1IgTElCT01QX0hBVkVfUFNBUEkpCisgICAgc2V0KExJQk9NUF9IQVZFX09NUFRfU1VQUE9SVCBUUlVFKQorICBlbHNlKCkKKyAgICBzZXQoTElCT01QX0hBVkVfT01QVF9TVVBQT1JUIEZBTFNFKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgQ2hlY2sgaWYgSFdMT0Mgc3VwcG9ydCBpcyBhdmFpbGFibGUKK2lmKCR7TElCT01QX1VTRV9IV0xPQ30pCisgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0xJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUn0vaW5jbHVkZSkKKyAgY2hlY2tfaW5jbHVkZV9maWxlKGh3bG9jLmggTElCT01QX0hBVkVfSFdMT0NfSCkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTKQorICBmaW5kX2xpYnJhcnkoTElCT01QX0hXTE9DX0xJQlJBUlkKKyAgICBOQU1FUyBod2xvYyBsaWJod2xvYworICAgIEhJTlRTICR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9saWIpCisgIGlmKExJQk9NUF9IV0xPQ19MSUJSQVJZKQorICAgIGNoZWNrX2xpYnJhcnlfZXhpc3RzKCR7TElCT01QX0hXTE9DX0xJQlJBUll9IGh3bG9jX3RvcG9sb2d5X2luaXQKKyAgICAgICR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9saWIgTElCT01QX0hBVkVfTElCSFdMT0MpCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChMSUJPTVBfSFdMT0NfTElCUkFSWV9ESVIgJHtMSUJPTVBfSFdMT0NfTElCUkFSWX0gUEFUSCkKKyAgZW5kaWYoKQorICBpZihMSUJPTVBfSEFWRV9IV0xPQ19IIEFORCBMSUJPTVBfSEFWRV9MSUJIV0xPQyBBTkQgTElCT01QX0hXTE9DX0xJQlJBUlkpCisgICAgc2V0KExJQk9NUF9IQVZFX0hXTE9DIFRSVUUpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfSEFWRV9IV0xPQyBGQUxTRSkKKyAgICBsaWJvbXBfc2F5KCJDb3VsZCBub3QgZmluZCBod2xvYyIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBDaGVjayBpZiBUaHJlYWRTYW5pdGl6ZXIgc3VwcG9ydCBpcyBhdmFpbGFibGUKK2lmKCIke0NNQUtFX1NZU1RFTV9OQU1FfSIgTUFUQ0hFUyAiTGludXgiIEFORCAke0lOVEVMNjR9KQorICBzZXQoTElCT01QX0hBVkVfVFNBTl9TVVBQT1JUIFRSVUUpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9IQVZFX1RTQU5fU1VQUE9SVCBGQUxTRSkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL2RvYy9SZWZlcmVuY2UucGRmIGIvcmMzL3J1bnRpbWUvZG9jL1JlZmVyZW5jZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3YzQwYwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2RvYy9SZWZlcmVuY2UucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZyBiL3JjMy9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDJmZGJkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvZG9jL2RveHlnZW4vY29uZmlnCkBAIC0wLDAgKzEsMTgyMiBAQAorIyBEb3h5ZmlsZSAxLm84LjINCisNCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtDQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuDQorIw0KKyMgQWxsIHRleHQgYWZ0ZXIgYSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLg0KKyMgVGhlIGZvcm1hdCBpczoNCisjICAgICAgIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQ0KKyMgRm9yIGxpc3RzIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOg0KKyMgICAgICAgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQ0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoIiAiKS4NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUNCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwNCisjIHRleHQgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZQ0KKyMgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUNCisjIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLg0KKw0KK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOA0KKw0KKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3Igc2VxdWVuY2Ugb2Ygd29yZHMpIHRoYXQgc2hvdWxkDQorIyBpZGVudGlmeSB0aGUgcHJvamVjdC4gTm90ZSB0aGF0IGlmIHlvdSBkbyBub3QgdXNlIERveHl3aXphcmQgeW91IG5lZWQNCisjIHRvIHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBwcm9qZWN0IG5hbWUgaWYgaXQgY29udGFpbnMgc3BhY2VzLg0KKw0KK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSAiTExWTSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSINCisNCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4NCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3INCisjIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLg0KKw0KK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPQ0KKw0KKyMgVXNpbmcgdGhlIFBST0pFQ1RfQlJJRUYgdGFnIG9uZSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbCBvbmUgbGluZSBkZXNjcmlwdGlvbg0KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlcg0KKyMgYSBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4NCisNCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0NCisNCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGFuIGxvZ28gb3IgaWNvbiB0aGF0IGlzDQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QNCisjIGV4Y2VlZCA1NSBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuDQorIyBEb3h5Z2VuIHdpbGwgY29weSB0aGUgbG9nbyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitQUk9KRUNUX0xPR08gICAgICAgICAgID0NCisNCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkNCisjIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24NCisjIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4NCisNCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG9jL2RveHlnZW4vZ2VuZXJhdGVkDQorDQorIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZQ0KKyMgNDA5NiBzdWItZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dA0KKyMgZm9ybWF0IGFuZCB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLg0KKyMgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mDQorIyBzb3VyY2UgZmlsZXMsIHdoZXJlIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQNCisjIG90aGVyd2lzZSBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLg0KKw0KK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwNCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzDQorIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuDQorIyBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLCBvdGhlciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZToNCisjIEFmcmlrYWFucywgQXJhYmljLCBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsIENoaW5lc2UtVHJhZGl0aW9uYWwsDQorIyBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVzcGVyYW50bywgRmFyc2ksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLA0KKyMgR3JlZWssIEh1bmdhcmlhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2gNCisjIG1lc3NhZ2VzKSwgS29yZWFuLCBLb3JlYW4tZW4sIExpdGh1YW5pYW4sIE5vcndlZ2lhbiwgTWFjZWRvbmlhbiwgUGVyc2lhbiwNCisjIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywNCisjIFNsb3ZlbmUsIFNwYW5pc2gsIFN3ZWRpc2gsIFVrcmFpbmlhbiwgYW5kIFZpZXRuYW1lc2UuDQorDQorT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gNCisNCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgaW5jbHVkZSBicmllZiBtZW1iZXIgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbg0KKyMgdGhlIGZpbGUgYW5kIGNsYXNzIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YURvYykuDQorIyBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLg0KKw0KK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgcHJlcGVuZA0KKyMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24uDQorIyBOb3RlOiBpZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlDQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuDQorDQorUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUw0KKw0KKyMgVGhpcyB0YWcgaW1wbGVtZW50cyBhIHF1YXNpLWludGVsbGlnZW50IGJyaWVmIGRlc2NyaXB0aW9uIGFiYnJldmlhdG9yDQorIyB0aGF0IGlzIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZw0KKyMgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZCBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZQ0KKyMgc3RyaXBwZWQgZnJvbSB0aGUgdGV4dCBhbmQgdGhlIHJlc3VsdCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcw0KKyMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuDQorIyBJZiBsZWZ0IGJsYW5rLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoIiRuYW1lIiBpcyBhdXRvbWF0aWNhbGx5DQorIyByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkpOiAiVGhlICRuYW1lIGNsYXNzIiAiVGhlICRuYW1lIHdpZGdldCINCisjICJUaGUgJG5hbWUgZmlsZSIgImlzIiAicHJvdmlkZXMiICJzcGVjaWZpZXMiICJjb250YWlucyINCisjICJyZXByZXNlbnRzIiAiYSIgImFuIiAidGhlIg0KKw0KK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEFMV0FZU19ERVRBSUxFRF9TRUMgYW5kIFJFUEVBVF9CUklFRiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbg0KKyMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZg0KKyMgZGVzY3JpcHRpb24uDQorDQorQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PDQorDQorIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwNCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQ0KKyMgbWVtYmVycyB3ZXJlIG9yZGluYXJ5IGNsYXNzIG1lbWJlcnMuIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQNCisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLg0KKw0KK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBOTw0KKw0KKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsDQorIyBwYXRoIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldA0KKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuDQorDQorRlVMTF9QQVRIX05BTUVTICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIFNUUklQX0ZST01fUEFUSCB0YWcNCisjIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguIFN0cmlwcGluZyBpcw0KKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YNCisjIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4NCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlDQorIyBwYXRoIHRvIHN0cmlwLiBOb3RlIHRoYXQgeW91IHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28NCisjIHJlbGF0aXZlIHBhdGhzLCB3aGljaCB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzDQorIyBzdGFydGVkLg0KKw0KK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQ0KKw0KKyMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YNCisjIHRoZSBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscw0KKyMgdGhlIHJlYWRlciB3aGljaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLg0KKyMgSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcw0KKyMgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZCBzcGVjaWZ5IHRoZSBpbmNsdWRlIHBhdGhzIHRoYXQNCisjIGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyIHVzaW5nIHRoZSAtSSBmbGFnLg0KKw0KK1NUUklQX0ZST01fSU5DX1BBVEggICAgPQ0KKw0KKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyDQorIyAoYnV0IGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3VyIGZpbGUgc3lzdGVtDQorIyBkb2Vzbid0IHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uDQorDQorU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhRG9jLXN0eWxlDQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YURvYw0KKyMgY29tbWVudHMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMNCisjICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pDQorDQorSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsDQorIyBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUNCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBjb21tZW50cw0KKyMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nDQorIyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pDQorDQorUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBEb3h5Z2VuDQorIyB0cmVhdCBhIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8NCisjIGNvbW1lbnRzKSBhcyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLg0KKyMgVGhlIG5ldyBkZWZhdWx0IGlzIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkDQorIyBkZXNjcmlwdGlvbi4gU2V0IHRoaXMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3VyIGluc3RlYWQuDQorDQorTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PDQorDQorIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhbiB1bmRvY3VtZW50ZWQNCisjIG1lbWJlciBpbmhlcml0cyB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0DQorIyByZS1pbXBsZW1lbnRzLg0KKw0KK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UNCisjIGEgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwNCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuDQorDQorU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PDQorDQorIyBUaGUgVEFCX1NJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpbiBhIHRhYi4NCisjIERveHlnZW4gdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuDQorDQorVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgNCisNCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMNCisjIGFzIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLg0KKyMgRm9yIGV4YW1wbGUgYWRkaW5nICJzaWRlZWZmZWN0PVxwYXIgU2lkZSBFZmZlY3RzOlxuIiB3aWxsIGFsbG93IHlvdSB0bw0KKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoDQorIyB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nICJTaWRlIEVmZmVjdHM6Ii4NCisjIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0IG5ld2xpbmVzLg0KKw0KK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAib3RoZXI9PHN1cD4qPC9zdXA+Ig0KKw0KKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiB3b3JkLWtleXdvcmQgbWFwcGluZ3MgKFRDTCBvbmx5KS4NCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcNCisjICJjbGFzcz1pdGNsOjpjbGFzcyIgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZQ0KKyMgaXRjbDo6Y2xhc3MgbWVhbmluZy4NCisNCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMNCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4NCisjIEZvciBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3QNCisjIG9mIGFsbCBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLg0KKw0KK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBOTw0KKw0KKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhDQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yDQorIyBKYXZhLiBGb3IgaW5zdGFuY2UsIG5hbWVzcGFjZXMgd2lsbCBiZSBwcmVzZW50ZWQgYXMgcGFja2FnZXMsIHF1YWxpZmllZA0KKyMgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4NCisNCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfRk9SX0ZPUlRSQU4gdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgRm9ydHJhbg0KKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvcg0KKyMgRm9ydHJhbi4NCisNCitPUFRJTUlaRV9GT1JfRk9SVFJBTiAgID0gTk8NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETA0KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yDQorIyBWSERMLg0KKw0KK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTw0KKw0KKyMgRG94eWdlbiBzZWxlY3RzIHRoZSBwYXJzZXIgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlcyBpdA0KKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4NCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQNCisjIHVzaW5nIHRoaXMgdGFnLiBUaGUgZm9ybWF0IGlzIGV4dD1sYW5ndWFnZSwgd2hlcmUgZXh0IGlzIGEgZmlsZSBleHRlbnNpb24sDQorIyBhbmQgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsDQorIyBKYXZhc2NyaXB0LCBDU2hhcnAsIEMsIEMrKywgRCwgUEhQLCBPYmplY3RpdmUtQywgUHl0aG9uLCBGb3J0cmFuLCBWSERMLCBDLA0KKyMgQysrLiBGb3IgaW5zdGFuY2UgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdA0KKyMgaXMgUEhQKSwgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLiBOb3RlDQorIyB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZSB0aGUNCisjIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLg0KKw0KK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPQ0KKw0KKyMgSWYgTUFSS0RPV05fU1VQUE9SVCBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsDQorIyBjb21tZW50cyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlDQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuDQorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91DQorIyBjYW4gbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLg0KKyMgRGlzYWJsZSBvbmx5IGluIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4NCisNCitNQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTDQorDQorIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkIGNsYXNzZXMsDQorIyBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuIGJlDQorIyBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkIG9yDQorIyBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uDQorDQorQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUw0KKw0KKyMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudA0KKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkDQorIyBzZXQgdGhpcyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kDQorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsgdi5zLg0KKyMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZXMgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uDQorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuDQorDQorQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PDQorDQorIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bw0KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4NCisNCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8NCisNCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIHNvdXJjZXMgb25seS4NCisjIERveHlnZW4gd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYw0KKyMgaW5zdGVhZCBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuDQorDQorU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PDQorDQorIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8NCisjIGluZGljYXRlIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcw0KKyMgb3B0aW9uIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgbWFrZSBkb3h5Z2VuIHJlcGxhY2UgdGhlIGdldCBhbmQNCisjIHNldCBtZXRob2RzIGJ5IGEgcHJvcGVydHkgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoaXMgd2lsbCBvbmx5IHdvcmsNCisjIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlIHR5cGUuIElmIHRoaXMNCisjIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdSBzaG91bGQNCisjIHNldCB0aGlzIG9wdGlvbiB0byBOTy4NCisNCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTDQorDQorIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DDQorIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0DQorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQNCisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuDQorDQorRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PDQorDQorIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mDQorIyB0aGUgc2FtZSB0eXBlIChmb3IgaW5zdGFuY2UgYSBncm91cCBvZiBwdWJsaWMgZnVuY3Rpb25zKSB0byBiZSBwdXQgYXMgYQ0KKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8NCisjIE5PIHRvIHByZXZlbnQgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nDQorIyB0aGUgXG5vc3ViZ3JvdXBpbmcgY29tbWFuZC4NCisNCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTDQorDQorIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZA0KKyMgdW5pb25zIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nDQorIyBAaW5ncm91cCkgaW5zdGVhZCBvZiBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4gcGFnZXMpIG9yDQorIyBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuDQorDQorSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PDQorDQorIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZA0KKyMgdW5pb25zIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4gdGhlIGRvY3VtZW50YXRpb24NCisjIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsIG5hbWVzcGFjZSwgb3IgZ3JvdXANCisjIGRvY3VtZW50YXRpb24pLCBwcm92aWRlZCB0aGlzIHNjb3BlIGlzIGRvY3VtZW50ZWQuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpLA0KKyMgc3RydWN0cywgY2xhc3NlcywgYW5kIHVuaW9ucyBhcmUgc2hvd24gb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuDQorIyBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLg0KKw0KK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTw0KKw0KKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtDQorIyBpcyBkb2N1bWVudGVkIGFzIHN0cnVjdCwgdW5pb24sIG9yIGVudW0gd2l0aCB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZi4gU28NCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdA0KKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwNCisjIG5hbWVzcGFjZSwgb3IgY2xhc3MuIEFuZCB0aGUgc3RydWN0IHdpbGwgYmUgbmFtZWQgVHlwZVMuIFRoaXMgY2FuIHR5cGljYWxseQ0KKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQNCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4NCisNCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8NCisNCisjIFRoZSBTWU1CT0xfQ0FDSEVfU0laRSBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBjYWNoZSB1c2UgdG8NCisjIGRldGVybWluZSB3aGljaCBzeW1ib2xzIHRvIGtlZXAgaW4gbWVtb3J5IGFuZCB3aGljaCB0byBmbHVzaCB0byBkaXNrLg0KKyMgV2hlbiB0aGUgY2FjaGUgaXMgZnVsbCwgbGVzcyBvZnRlbiB1c2VkIHN5bWJvbHMgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2suDQorIyBGb3Igc21hbGwgdG8gbWVkaXVtIHNpemUgcHJvamVjdHMgKDwxMDAwIGlucHV0IGZpbGVzKSB0aGUgZGVmYXVsdCB2YWx1ZSBpcw0KKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UNCisjIGRveHlnZW4gdG8gYmUgYnVzeSBzd2FwcGluZyBzeW1ib2xzIHRvIGFuZCBmcm9tIGRpc2sgbW9zdCBvZiB0aGUgdGltZQ0KKyMgY2F1c2luZyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHBlbmFsdHkuDQorIyBJZiB0aGUgc3lzdGVtIGhhcyBlbm91Z2ggcGh5c2ljYWwgbWVtb3J5IGluY3JlYXNpbmcgdGhlIGNhY2hlIHdpbGwgaW1wcm92ZSB0aGUNCisjIHBlcmZvcm1hbmNlIGJ5IGtlZXBpbmcgbW9yZSBzeW1ib2xzIGluIG1lbW9yeS4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB3b3JrcyBvbg0KKyMgYSBsb2dhcml0aG1pYyBzY2FsZSBzbyBpbmNyZWFzaW5nIHRoZSBzaXplIGJ5IG9uZSB3aWxsIHJvdWdobHkgZG91YmxlIHRoZQ0KKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6DQorIyAyXigxNitTWU1CT0xfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLA0KKyMgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNiA9IDY1NTM2IHN5bWJvbHMuDQorDQorU1lNQk9MX0NBQ0hFX1NJWkUgICAgICA9IDANCisNCisjIFNpbWlsYXIgdG8gdGhlIFNZTUJPTF9DQUNIRV9TSVpFIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgbG9va3VwIGNhY2hlIGNhbiBiZQ0KKyMgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuDQorIyB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZQ0KKyMgc2FtZSBzeW1ib2wgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIHRoZSBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YNCisjIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLg0KKyMgSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcw0KKyMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwNCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLg0KKw0KK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4NCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLg0KKyMgUHJpdmF0ZSBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcw0KKyMgdGhlIEVYVFJBQ1RfUFJJVkFURSBhbmQgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUw0KKw0KK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3MNCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorRVhUUkFDVF9QUklWQVRFICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwNCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZQ0KKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTIGNsYXNzZXMgKGFuZCBzdHJ1Y3RzKQ0KKyMgZGVmaW5lZCBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKyMgSWYgc2V0IHRvIE5PIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuDQorDQorRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUw0KKw0KKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwNCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4NCisjIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkLg0KKw0KK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTw0KKw0KKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUNCisjIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZA0KKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZQ0KKyMgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0DQorIyBhbm9ueW1vdXMgbmFtZXNwYWNlcyBhcmUgaGlkZGVuLg0KKw0KK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTw0KKw0KKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsDQorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlDQorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuDQorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuDQorDQorSElERV9VTkRPQ19NRU1CRVJTICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsDQorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMNCisjIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLg0KKw0KK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBISURFX0ZSSUVORF9DT01QT1VORFMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbA0KKyMgZnJpZW5kIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQ0KKyMgZG9jdW1lbnRhdGlvbi4NCisNCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8NCisNCisjIElmIHRoZSBISURFX0lOX0JPRFlfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYW55DQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQ0KKyMgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLg0KKw0KK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTw0KKw0KKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbg0KKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldA0KKyMgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIHRoZSBkb2N1bWVudGF0aW9uIHdpbGwgYmUgZXhjbHVkZWQuDQorIyBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uDQorDQorSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gRG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUNCisjIGZpbGUgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbw0KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcg0KKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzDQorIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4NCisNCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIHNob3cgbWVtYmVycyB3aXRoIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4NCisNCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8NCisNCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4NCisjIHdpbGwgcHV0IGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyBvZiB0aGF0IGZpbGUuDQorDQorU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBsaXN0IGluY2x1ZGUgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyByYXRoZXIgdGhhbiB3aXRoIHNoYXJwIGJyYWNrZXRzLg0KKw0KK0ZPUkNFX0xPQ0FMX0lOQ0xVREVTICAgPSBOTw0KKw0KKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXQ0KKyMgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLg0KKw0KK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIHNvcnQgdGhlIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzDQorIyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluDQorIyBkZWNsYXJhdGlvbiBvcmRlci4NCisNCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlDQorIyBicmllZiBkb2N1bWVudGF0aW9uIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseQ0KKyMgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluDQorIyBkZWNsYXJhdGlvbiBvcmRlci4NCisNCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBzb3J0IHRoZSAoYnJpZWYgYW5kIGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIG1lbWJlcnMgc28gdGhhdA0KKyMgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQ0KKyMgdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieQ0KKyMgU09SVF9NRU1CRVJfRE9DUyBhbmQgU09SVF9CUklFRl9ET0NTLg0KKyMgVGhpcyB0YWcgd2lsbCBiZSBpZ25vcmVkIGZvciBicmllZiBkb2NzIGlmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8NCisjIGFuZCBpZ25vcmVkIGZvciBkZXRhaWxlZCBkb2NzIGlmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PLg0KKw0KK1NPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTw0KKw0KKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUNCisjIGhpZXJhcmNoeSBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkNCisjIHRoZSBncm91cCBuYW1lcyB3aWxsIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLg0KKw0KK1NPUlRfR1JPVVBfTkFNRVMgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZQ0KKyMgc29ydGVkIGJ5IGZ1bGx5LXF1YWxpZmllZCBuYW1lcywgaW5jbHVkaW5nIG5hbWVzcGFjZXMuIElmIHNldCB0bw0KKyMgTk8gKHRoZSBkZWZhdWx0KSwgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLA0KKyMgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuDQorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLg0KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlDQorIyBhbHBoYWJldGljYWwgbGlzdC4NCisNCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8NCisNCisjIElmIHRoZSBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIGRveHlnZW4gZmFpbHMgdG8NCisjIGRvIHByb3BlciB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhDQorIyBtYXRjaCBiZXR3ZWVuIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuDQorIyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBjYW5kaWRhdGUgb3IgaXQgaXMgb2J2aW91cyB3aGljaCBjYW5kaWRhdGUgdG8gY2hvb3NlDQorIyBieSBkb2luZyBhIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbg0KKyMgd2lsbCBzdGlsbCBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4NCisNCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8NCisNCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbw0KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUw0KKw0KKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3INCisjIGRpc2FibGUgKE5PKSB0aGUgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0DQorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTDQorDQorIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIGJ1ZyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcNCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMNCisNCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZw0KKyMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUw0KKw0KKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbA0KKyMgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiBzZWN0aW9ubmFtZSAuLi4gXGVuZGlmLg0KKw0KK0VOQUJMRURfU0VDVElPTlMgICAgICAgPQ0KKw0KKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMNCisjIHRoZSBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gY29uc2lzdHMgb2YgZm9yIGl0IHRvIGFwcGVhciBpbg0KKyMgdGhlIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkDQorIyBoZXJlIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuDQorIyBUaGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyBpbiB0aGUNCisjIGRvY3VtZW50YXRpb24gY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyDQorIyBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLg0KKw0KK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMA0KKw0KKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkDQorIyBhdCB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlDQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uDQorDQorU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUw0KKw0KKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLg0KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgRmlsZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlDQorIyBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLiBUaGUgZGVmYXVsdCBpcyBZRVMuDQorDQorIyBXZSBwcm9iYWJseSB3aWxsIHdhbnQgdGhpcywgYnV0IHdlIGhhdmUgbm8gZmlsZSBkb2N1bWVudGF0aW9uIHlldCBzbyBpdCdzIHNpbXBsZXIgdG8gcmVtb3ZlDQorIyBpdCBmb3Igbm93Lg0KK1NIT1dfRklMRVMgICAgICAgICAgICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlDQorIyBOYW1lc3BhY2VzIHBhZ2UuDQorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBOYW1lc3BhY2VzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4DQorIyBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLg0KKw0KK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMNCisNCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdA0KKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tDQorIyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSkuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIHByb2dyYW0gYnkgZXhlY3V0aW5nICh2aWENCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxjb21tYW5kPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxjb21tYW5kPiBpcyB0aGUgdmFsdWUgb2YNCisjIHRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlDQorIyBwcm92aWRlZCBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0DQorIyBpcyB1c2VkIGFzIHRoZSBmaWxlIHZlcnNpb24uIFNlZSB0aGUgbWFudWFsIGZvciBleGFtcGxlcy4NCisNCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0NCisNCisjIFRoZSBMQVlPVVRfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxheW91dCBmaWxlIHdoaWNoIHdpbGwgYmUgcGFyc2VkDQorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZA0KKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlDQorIyB0aGF0IHJlcHJlc2VudHMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uDQorIyBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkDQorIyBEb3h5Z2VuTGF5b3V0LnhtbCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLg0KKw0KK0xBWU9VVF9GSUxFICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcw0KKyMgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyBkYXRhLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZQ0KKyMgLmJpYiBleHRlbnNpb24gaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiBvbWl0dGVkLiBVc2luZyB0aGlzIGNvbW1hbmQNCisjIHJlcXVpcmVzIHRoZSBiaWJ0ZXggdG9vbCB0byBiZSBpbnN0YWxsZWQuIFNlZSBhbHNvDQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLiBGb3IgTGFUZVggdGhlIHN0eWxlDQorIyBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMNCisjIGZlYXR1cmUgeW91IG5lZWQgYmlidGV4IGFuZCBwZXJsIGF2YWlsYWJsZSBpbiB0aGUgc2VhcmNoIHBhdGguDQorDQorQ0lURV9CSUJfRklMRVMgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQNCisjIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLg0KKw0KK1FVSUVUICAgICAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQ0KKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuaw0KKyMgTk8gaXMgdXNlZC4NCisNCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTDQorDQorIyBJZiBXQVJOX0lGX1VORE9DVU1FTlRFRCBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncw0KKyMgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnIHdpbGwNCisjIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuDQorDQorV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUw0KKw0KKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcg0KKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZQ0KKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdA0KKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuDQorDQorV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUw0KKw0KKyMgVGhlIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3INCisjIGZ1bmN0aW9ucyB0aGF0IGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzDQorIyBvciByZXR1cm4gdmFsdWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbCBvbmx5IHdhcm4gYWJvdXQNCisjIHdyb25nIG9yIGluY29tcGxldGUgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YNCisjIGRvY3VtZW50YXRpb24uDQorDQorV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PDQorDQorIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0DQorIyBkb3h5Z2VuIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dA0KKyMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUNCisjIHdhcm5pbmcgb3JpZ2luYXRlZCBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluDQorIyAkdmVyc2lvbiwgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmVyc2lvbiBvZiB0aGUgZmlsZSAoaWYgaXQgY291bGQNCisjIGJlIG9idGFpbmVkIHZpYSBGSUxFX1ZFUlNJT05fRklMVEVSKQ0KKw0KK1dBUk5fRk9STUFUICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZw0KKyMgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbg0KKyMgdG8gc3RkZXJyLg0KKw0KK1dBUk5fTE9HRklMRSAgICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoZSBJTlBVVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbg0KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlICJteWZpbGUuY3BwIiBvcg0KKyMgZGlyZWN0b3JpZXMgbGlrZSAiL3Vzci9zcmMvbXlwcm9qZWN0Ii4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzDQorIyB3aXRoIHNwYWNlcy4NCisNCitJTlBVVCAgICAgICAgICAgICAgICAgID0gc3JjICBkb2MvZG94eWdlbi9saWJvbXBfaW50ZXJmYWNlLmgNCisjIFRoZSBpdHRub3RpZnkgY29kZSBhbHNvIGhhcyBkb3h5Z2VuIGRvY3VtZW50YXRpb24sIGJ1dCBpZiB3ZSBpbmNsdWRlIGl0IGhlcmUNCisjIGl0IHRha2VzIG92ZXIgZnJvbSB1cyENCisjIHNyYy90aGlyZHBhcnR5L2l0dG5vdGlmeQ0KKw0KKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMNCisjIHRoYXQgZG94eWdlbiBwYXJzZXMuIEludGVybmFsbHkgZG94eWdlbiB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZywgd2hpY2ggaXMNCisjIGFsc28gdGhlIGRlZmF1bHQgaW5wdXQgZW5jb2RpbmcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0DQorIyBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yDQorIyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuDQorDQorSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04DQorDQorIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlDQorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHANCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQNCisjIGJsYW5rIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDoNCisjICouYyAqLmNjICouY3h4ICouY3BwICouYysrICouZCAqLmphdmEgKi5paSAqLml4eCAqLmlwcCAqLmkrKyAqLmlubCAqLmggKi5oaA0KKyMgKi5oeHggKi5ocHAgKi5oKysgKi5pZGwgKi5vZGwgKi5jcyAqLnBocCAqLnBocDMgKi5pbmMgKi5tICoubW0gKi5kb3ggKi5weQ0KKyMgKi5mOTAgKi5mICouZm9yICoudmhkICoudmhkbA0KKw0KK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPSAqLmMgKi5oICouY3BwDQorIyBXZSBtYXkgYWxzbyB3YW50IHRvIGluY2x1ZGUgdGhlIGFzbSBmaWxlcyB3aXRoIGFwcHJvcHJpYXRlIGlmZGVmIHRvIGVuc3VyZQ0KKyMgZG94eWdlbiBkb2Vzbid0IHNlZSB0aGUgY29udGVudCwganVzdCB0aGUgZG9jdW1lbnRhdGlvbi4uLg0KKw0KKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzDQorIyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4NCisjIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4NCisNCisjIE9ubHkgbG9vayBpbiB0aGUgb25lIGRpcmVjdG9yeS4NCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQ0KKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGENCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLg0KKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcw0KKyMgcnVuLg0KKw0KK0VYQ0xVREUgICAgICAgICAgICAgICAgPSBzcmMvdGVzdC10b3VjaC5jDQorDQorIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yDQorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZA0KKyMgZnJvbSB0aGUgaW5wdXQuDQorDQorRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlDQorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUNCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4gTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQNCisjIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0byBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzDQorIyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoNCisNCitFWENMVURFX1BBVFRFUk5TICAgICAgID0NCisNCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzDQorIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQ0KKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlDQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLA0KKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdA0KKw0KK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPQ0KKw0KKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcg0KKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZQ0KKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLg0KKw0KK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUNCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcA0KKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdA0KKyMgYmxhbmsgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZC4NCisNCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0NCisNCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUNCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZQ0KKyMgY29tbWFuZHMgaXJyZXNwZWN0aXZlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUkVDVVJTSVZFIHRhZy4NCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLg0KKw0KK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTw0KKw0KKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3INCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBpbWFnZSB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlDQorIyB0aGUgXGltYWdlIGNvbW1hbmQpLg0KKw0KK0lNQUdFX1BBVEggICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZA0KKyMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbQ0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPg0KKyMgaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuDQorIyBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIgcHJvZ3JhbSB3cml0ZXMNCisjIHRvIHN0YW5kYXJkIG91dHB1dC4NCisjIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnIHdpbGwgYmUNCisjIGlnbm9yZWQuDQorDQorSU5QVVRfRklMVEVSICAgICAgICAgICA9DQorDQorIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuDQorIyBiYXNpcy4NCisjIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQ0KKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guDQorIyBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOg0KKyMgcGF0dGVybj1maWx0ZXIgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXINCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSBvciBpZg0KKyMgbm9uIG9mIHRoZSBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4NCisNCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0NCisNCisjIElmIHRoZSBGSUxURVJfU09VUkNFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgaW5wdXQgZmlsdGVyIChpZiBzZXQgdXNpbmcNCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlDQorIyBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4NCisNCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8NCisNCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlDQorIyBwYXR0ZXJuLiBBIHBhdHRlcm4gd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBmb3IgRklMVEVSX1BBVFRFUk4gKGlmIGFueSkNCisjIGFuZCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuDQorIyB1c2luZyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4gVGhpcyBvcHRpb24gb25seSBoYXMgZWZmZWN0IHdoZW4NCisjIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgZW5hYmxlZC4NCisNCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwNCisjIGJlIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLg0KKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSBhbHNvDQorIyBWRVJCQVRJTV9IRUFERVJTIGlzIHNldCB0byBOTy4NCisNCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gWUVTDQorDQorIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keQ0KKyMgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTw0KKw0KKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTICh0aGUgZGVmYXVsdCkgd2lsbCBpbnN0cnVjdA0KKyMgZG94eWdlbiB0byBoaWRlIGFueSBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlDQorIyBmcmFnbWVudHMuIE5vcm1hbCBDLCBDKysgYW5kIEZvcnRyYW4gY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuDQorDQorU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMNCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZA0KKyMgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLg0KKw0KK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBZRVMNCisNCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTDQorIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgZW50aXRpZXMNCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuDQorDQorUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PDQorDQorIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpDQorIyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbQ0KKyMgZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbA0KKyMgbGluayB0byB0aGUgc291cmNlIGNvZGUuDQorIyBPdGhlcndpc2UgdGhleSB3aWxsIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uDQorDQorUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUw0KKw0KKyMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlDQorIyB3aWxsIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4NCisjIGJ1aWx0LWluIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UNCisjIHRhZ2dpbmcgc3lzdGVtIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdQ0KKyMgd2lsbCBuZWVkIHZlcnNpb24gNC44LjYgb3IgaGlnaGVyLg0KKw0KK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3INCisjIHdoaWNoIGFuIGluY2x1ZGUgaXMgc3BlY2lmaWVkLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLg0KKw0KK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMNCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEFMUEhBQkVUSUNBTF9JTkRFWCB0YWcgaXMgc2V0IHRvIFlFUywgYW4gYWxwaGFiZXRpY2FsIGluZGV4DQorIyBvZiBhbGwgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdA0KKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuDQorDQorQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIGFscGhhYmV0aWNhbCBpbmRleCBpcyBlbmFibGVkIChzZWUgQUxQSEFCRVRJQ0FMX0lOREVYKSB0aGVuDQorIyB0aGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMNCisjIGluIHdoaWNoIHRoaXMgbGlzdCB3aWxsIGJlIHNwbGl0IChjYW4gYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi4yMF0pDQorDQorQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUNCisNCisjIEluIGNhc2UgYWxsIGNsYXNzZXMgaW4gYSBwcm9qZWN0IHN0YXJ0IHdpdGggYSBjb21tb24gcHJlZml4LCBhbGwNCisjIGNsYXNzZXMgd2lsbCBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguDQorIyBUaGUgSUdOT1JFX1BSRUZJWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBwcmVmaXhlcyB0aGF0DQorIyBzaG91bGQgYmUgaWdub3JlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBpbmRleCBoZWFkZXJzLg0KKw0KK0lHTk9SRV9QUkVGSVggICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBIVE1MIG91dHB1dC4NCisNCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTDQorDQorIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBodG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitIVE1MX09VVFBVVCAgICAgICAgICAgID0NCisNCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3INCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sLnBocCwuYXNwKS4gSWYgaXQgaXMgbGVmdCBibGFuaw0KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGZpbGVzIHdpdGggLmh0bWwgZXh0ZW5zaW9uLg0KKw0KK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbA0KKw0KKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBoZWFkZXIgZm9yDQorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGhlYWRlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYSBjdXN0b20gaGVhZGVyIHlvdSBhcmUgcmVzcG9uc2libGUNCisjICBmb3IgdGhlIHByb3BlciBpbmNsdXNpb24gb2YgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cyB0aGF0IGRveHlnZW4NCisjIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkLg0KKyMgSXQgaXMgYWR2aXNlZCB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgaGVhZGVyIHVzaW5nICJkb3h5Z2VuIC13IGh0bWwNCisjIGhlYWRlci5odG1sIGZvb3Rlci5odG1sIHN0eWxlc2hlZXQuY3NzIFlvdXJDb25maWdGaWxlIiBhbmQgdGhlbiBtb2RpZnkNCisjIHRoYXQgaGVhZGVyLiBOb3RlIHRoYXQgdGhlIGhlYWRlciBpcyBzdWJqZWN0IHRvIGNoYW5nZSBzbyB5b3UgdHlwaWNhbGx5DQorIyBoYXZlIHRvIHJlZG8gdGhpcyB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbiBvciB3aGVuDQorIyBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBzdWNoIGFzIEdFTkVSQVRFX1RSRUVWSUVXIQ0KKw0KK0hUTUxfSEVBREVSICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yDQorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGENCisjIHN0YW5kYXJkIGZvb3Rlci4NCisNCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0NCisNCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nDQorIyBzdHlsZSBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvDQorIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LiBOb3RlIHRoYXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlDQorIyBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYXMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMNCisjIHRhZyB3aWxsIGluIHRoZSBmdXR1cmUgYmVjb21lIG9ic29sZXRlLg0KKw0KK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsDQorIyB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IHRoYXQgaXMgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkDQorIyBzdHlsZSBzaGVldHMgY3JlYXRlZCBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlDQorIyBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUDQorIyBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3IgbW9yZQ0KKyMgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvDQorIyB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0NCisNCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcg0KKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQ0KKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUNCisjICRyZWxwYXRoJCBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlDQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdA0KKyMgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuDQorDQorSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9DQorDQorIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4NCisjIERveHlnZW4gd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzDQorIyBhY2NvcmRpbmcgdG8gdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsDQorIyBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQorIyBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLA0KKyMgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4NCisjIFRoZSBhbGxvd2VkIHJhbmdlIGlzIDAgdG8gMzU5Lg0KKw0KK0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAyMjANCisNCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZg0KKyMgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBhIHZhbHVlIG9mIDAgdGhlIG91dHB1dCB3aWxsIHVzZQ0KKyMgZ3JheXNjYWxlcyBvbmx5LiBBIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLg0KKw0KK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDANCisNCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8NCisjIHRoZSBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cNCisjIDEwMCBncmFkdWFsbHkgbWFrZSB0aGUgb3V0cHV0IGxpZ2h0ZXIsIHdoZXJlYXMgdmFsdWVzIGFib3ZlIDEwMCBtYWtlDQorIyB0aGUgb3V0cHV0IGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwNCisjIHNvIDgwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwNCisjIGFuZCAxMDAgZG9lcyBub3QgY2hhbmdlIHRoZSBnYW1tYS4NCisNCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODANCisNCisjIElmIHRoZSBIVE1MX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQgSFRNTA0KKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nDQorIyB0aGlzIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4NCisNCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MDQorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQ0KKyMgcGFnZSBoYXMgbG9hZGVkLg0KKw0KK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTw0KKw0KKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZg0KKyMgZW50cmllcyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyDQorIyBjYW4gZXhwYW5kIGFuZCBjb2xsYXBzZSBlbnRyaWVzIGR5bmFtaWNhbGx5IGxhdGVyIG9uLiBEb3h5Z2VuIHdpbGwgZXhwYW5kDQorIyB0aGUgdHJlZSB0byBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlDQorIyB2aXNpYmxlICh1bmxlc3MgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLg0KKyMgU28gc2V0dGluZyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgMSB3aWxsIHByb2R1Y2UgYSBmdWxsIGNvbGxhcHNlZCB0cmVlIGJ5DQorIyBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMNCisjIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQgdHJlZSBieSBkZWZhdWx0Lg0KKw0KK0hUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDANCisNCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMNCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMw0KKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4NCisjIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBNYWtlZmlsZSBpbiB0aGUNCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluIHRoYXQNCisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbg0KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kDQorIyBpdCBhdCBzdGFydHVwLg0KKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwNCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KKw0KK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTw0KKw0KKyMgV2hlbiBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIHRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlDQorIyBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZQ0KKyMgZG9jdW1lbnRhdGlvbiBzZXRzIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIgKHN1Y2ggYXMgYSBjb21wYW55IG9yIHByb2R1Y3Qgc3VpdGUpDQorIyBjYW4gYmUgZ3JvdXBlZC4NCisNCitET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiDQorDQorIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQNCisjIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhDQorIyByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuDQorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLg0KKw0KK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0DQorDQorIyBXaGVuIEdFTkVSQVRFX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5DQorIyBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZQ0KKyMgc3R5bGUgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4NCisNCitET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyDQorDQorIyBUaGUgR0VORVJBVEVfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLg0KKw0KK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXINCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcw0KKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdG9vbHMgbGlrZSB0aGUNCisjIE1pY3Jvc29mdCBIVE1MIGhlbHAgd29ya3Nob3AgdG8gZ2VuZXJhdGUgYSBjb21waWxlZCBIVE1MIGhlbHAgZmlsZSAoLmNobSkNCisjIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0ZJTEUgdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htIGZpbGUuIFlvdQ0KKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlDQorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuDQorDQorQ0hNX0ZJTEUgICAgICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBISENfTE9DQVRJT04gdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZg0KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1bg0KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4NCisNCitISENfTE9DQVRJT04gICAgICAgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnDQorIyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgdGhhdA0KKyMgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuDQorDQorR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fSU5ERVhfRU5DT0RJTkcNCisjIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpIGFuZCBwcm9qZWN0IGZpbGUNCisjIGNvbnRlbnQuDQorDQorQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBCSU5BUllfVE9DIGZsYWcNCisjIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIGENCisjIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuDQorDQorQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycw0KKyMgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4NCisNCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQNCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQNCisjIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYQ0KKyMgUXQgQ29tcHJlc3NlZCBIZWxwICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4NCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLg0KKyMgVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuDQorDQorUUNIX0ZJTEUgICAgICAgICAgICAgICA9DQorDQorIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZw0KKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UNCisNCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdA0KKw0KKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZw0KKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLWZvbGRlcnMNCisNCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jDQorDQorIyBJZiBRSFBfQ1VTVF9GSUxURVJfTkFNRSBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBmaWx0ZXIgdG8NCisjIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycw0KKw0KK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPQ0KKw0KKyMgVGhlIFFIUF9DVVNUX0ZJTFRfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUNCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlDQorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzIj4NCisjIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbSBGaWx0ZXJzPC9hPi4NCisNCitRSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0NCisNCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzDQorIyBwcm9qZWN0J3MNCisjIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuDQorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzIj4NCisjIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzPC9hPi4NCisNCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbg0KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzIHFoZWxwZ2VuZXJhdG9yLg0KKyMgSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZSBnZW5lcmF0ZWQNCisjIC5xaHAgZmlsZS4NCisNCitRSEdfTE9DQVRJT04gICAgICAgICAgID0NCisNCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcw0KKyMgIHdpbGwgYmUgZ2VuZXJhdGVkLCB3aGljaCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCBmb3JtIGFuIEVjbGlwc2UgaGVscA0KKyMgcGx1Z2luLiBUbyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cw0KKyMgbWVudSBpbiBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwNCisjIGZpbGVzIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZg0KKyMgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcw0KKyMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLiBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZQ0KKyMgdGhlIGhlbHAgYXBwZWFycy4NCisNCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8NCisNCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbg0KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlDQorIyB0aGlzIG5hbWUuDQorDQorRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QNCisNCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKQ0KKyMgYXQgdG9wIG9mIGVhY2ggSFRNTCBwYWdlLiBUaGUgdmFsdWUgTk8gKHRoZSBkZWZhdWx0KSBlbmFibGVzIHRoZSBpbmRleCBhbmQNCisjIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMgaXQuIFNpbmNlIHRoZSB0YWJzIGhhdmUgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlDQorIyBuYXZpZ2F0aW9uIHRyZWUgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gTk8gaWYgeW91IGFscmVhZHkgc2V0DQorIyBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuDQorDQorRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PDQorDQorIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4DQorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4NCisjIElmIHRoZSB0YWcgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkDQorIyBjb250YWluaW5nIGEgdHJlZS1saWtlIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdA0KKyMgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzDQorIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4NCisjIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlIEhUTUwgaGVscCBmZWF0dXJlLg0KKyMgU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4IHlvdQ0KKyMgY291bGQgY29uc2lkZXIgdG8gc2V0IERJU0FCTEVfSU5ERVggdG8gTk8gd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4NCisNCitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8NCisNCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMNCisjIChyYW5nZSBbMCwxLi4yMF0pIHRoYXQgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTA0KKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0NCisjIHZhbHVlcyBmcm9tIGFwcGVhcmluZyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4NCisNCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNA0KKw0KKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUNCisjIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZQ0KKyMgaXMgc2hvd24uDQorDQorVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MA0KKw0KKyMgV2hlbiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgb3Blbg0KKyMgbGlua3MgdG8gZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93Lg0KKw0KK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTw0KKw0KKyMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhdGV4IGZvcm11bGFzIGluY2x1ZGVkDQorIyBhcyBpbWFnZXMgaW4gdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gVGhlIGRlZmF1bHQgaXMgMTAuIE5vdGUgdGhhdA0KKyMgd2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRveHlnZW4gcnVuIHlvdSBuZWVkDQorIyB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeQ0KKyMgdG8gZm9yY2UgdGhlbSB0byBiZSByZWdlbmVyYXRlZC4NCisNCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTANCisNCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcw0KKyMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUNCisjIG5vdCBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4NCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcw0KKyMgaW4gdGhlIEhUTUwgb3V0cHV0IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4NCisNCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTDQorDQorIyBFbmFibGUgdGhlIFVTRV9NQVRISkFYIG9wdGlvbiB0byByZW5kZXIgTGFUZVggZm9ybXVsYXMgdXNpbmcgTWF0aEpheA0KKyMgKHNlZSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZQ0KKyMgcmVuZGVyaW5nIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdA0KKyMgaGF2ZSBMYVRlWCBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTA0KKyMgb3V0cHV0LiBXaGVuIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kDQorIyBjb25maWd1cmUgdGhlIHBhdGggdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uDQorDQorVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PDQorDQorIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUNCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uDQorIyBkaXJlY3Rvcnkgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4DQorIyBkaXJlY3RvcnkgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuDQorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0bw0KKyMgdGhlIE1hdGhKYXggQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0DQorIyBpbnN0YWxsaW5nIE1hdGhKYXguDQorIyBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwNCisjIGNvcHkgb2YgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuDQorDQorTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QNCisNCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIE1hdGhKYXggZXh0ZW5zaW9uDQorIyBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4NCisNCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0NCisNCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94DQorIyBmb3IgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdA0KKyMgYW5kIERIVE1MIGFuZCBzaG91bGQgd29yayBvbiBhbnkgbW9kZXJuIGJyb3dzZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nDQorIyBIVE1MIGhlbHAgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cw0KKyMgKEdFTkVSQVRFX0RPQ1NFVCkgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQNCisjIHR5cGljYWxseSBiZSBkaXNhYmxlZC4gRm9yIGxhcmdlIHByb2plY3RzIHRoZSBqYXZhc2NyaXB0IGJhc2VkIHNlYXJjaCBlbmdpbmUNCisjIGNhbiBiZSBzbG93LCB0aGVuIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uDQorDQorU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUw0KKw0KKyMgV2hlbiB0aGUgU0VSVkVSX0JBU0VEX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCB0aGUgc2VhcmNoIGVuZ2luZSB3aWxsIGJlDQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIFBIUCBlbmFibGVkIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhdCB0aGUgd2ViIGNsaWVudA0KKyMgdXNpbmcgSmF2YXNjcmlwdC4gRG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBzZWFyY2ggUEhQIHNjcmlwdCBhbmQgaW5kZXgNCisjIGZpbGUgdG8gcHV0IG9uIHRoZSB3ZWIgc2VydmVyLiBUaGUgYWR2YW50YWdlIG9mIHRoZSBzZXJ2ZXINCisjIGJhc2VkIGFwcHJvYWNoIGlzIHRoYXQgaXQgc2NhbGVzIGJldHRlciB0byBsYXJnZSBwcm9qZWN0cyBhbmQgYWxsb3dzDQorIyBmdWxsIHRleHQgc2VhcmNoLiBUaGUgZGlzYWR2YW50YWdlcyBhcmUgdGhhdCBpdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBzZXR1cA0KKyMgYW5kIGRvZXMgbm90IGhhdmUgbGl2ZSBzZWFyY2hpbmcgY2FwYWJpbGl0aWVzLg0KKw0KK1NFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIExhdGV4IG91dHB1dC4NCisNCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gWUVTDQorDQorIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0NCisNCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlDQorIyBpbnZva2VkLiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGNvbW1hbmQgbmFtZS4NCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yDQorIyBnZW5lcmF0aW5nIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUNCisjIE1ha2VmaWxlIHRoYXQgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4NCisNCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgNCisNCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0bw0KKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUNCisjIGRlZmF1bHQgY29tbWFuZCBuYW1lLg0KKw0KK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgNCisNCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdA0KKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bw0KKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuDQorDQorQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PDQorDQorIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZA0KKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBsZXR0ZXIsIGxlZ2FsIGFuZA0KKyMgZXhlY3V0aXZlLiBJZiBsZWZ0IGJsYW5rIGE0d2lkZSB3aWxsIGJlIHVzZWQuDQorDQorUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQ0KKw0KKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBuYW1lcyBvZiBMYVRlWA0KKyMgcGFja2FnZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4NCisNCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0NCisNCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yDQorIyB0aGUgZ2VuZXJhdGVkIGxhdGV4IGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwNCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGljZTogb25seSB1c2UgdGhpcyB0YWcgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQ0KKw0KK0xBVEVYX0hFQURFUiAgICAgICAgICAgPSBkb2MvZG94eWdlbi9oZWFkZXIudGV4DQorDQorIyBUaGUgTEFURVhfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggZm9vdGVyIGZvcg0KKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGZvb3RlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIGFmdGVyDQorIyB0aGUgbGFzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBmb290ZXIuIE5vdGljZTogb25seSB1c2UgdGhpcyB0YWcgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQ0KKw0KK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIFBERl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgTGFUZVggdGhhdCBpcyBnZW5lcmF0ZWQNCisjIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwNCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzDQorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIHBkZiB2aWV3ZXIuDQorDQorUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgcGRmbGF0ZXggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YNCisjIHBsYWluIGxhdGV4IGluIHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8gZ2V0IGENCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLg0KKw0KK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLg0KKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcA0KKyMgcnVubmluZyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLg0KKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLg0KKw0KK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTw0KKw0KKyMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90DQorIyBpbmNsdWRlIHRoZSBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikNCisjIGluIHRoZSBvdXRwdXQuDQorDQorTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PDQorDQorIyBJZiBMQVRFWF9TT1VSQ0VfQ09ERSBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUNCisjIHNvdXJjZSBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0Lg0KKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncw0KKyMgc3VjaCBhcyBTT1VSQ0VfQlJPV1NFUi4NCisNCitMQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8NCisNCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlDQorIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gVGhlIGRlZmF1bHQgc3R5bGUgaXMgInBsYWluIi4gU2VlDQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLg0KKw0KK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbg0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dA0KKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aA0KKyMgb3RoZXIgUlRGIHJlYWRlcnMgb3IgZWRpdG9ycy4NCisNCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBydGYnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK1JURl9PVVRQVVQgICAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdA0KKyMgUlRGIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8NCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLg0KKw0KK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFJURl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUlRGIHRoYXQgaXMgZ2VuZXJhdGVkDQorIyB3aWxsIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwNCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLg0KKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgV09SRCBvciBvdGhlcg0KKyMgcHJvZ3JhbXMgd2hpY2ggc3VwcG9ydCB0aG9zZSBmaWVsZHMuDQorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4NCisNCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8NCisNCisjIExvYWQgc3R5bGUgc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MNCisjIGNvbmZpZyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbm1lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUNCisjIHJlcGxhY2VtZW50cywgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuDQorDQorUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9DQorDQorIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gcnRmIGRvY3VtZW50Lg0KKyMgU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLg0KKw0KK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfTUFOIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBtYW4gcGFnZXMNCisNCitHRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8NCisNCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbWFuJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitNQU5fT1VUUFVUICAgICAgICAgICAgID0NCisNCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0bw0KKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQ0KKw0KK01BTl9FWFRFTlNJT04gICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIE1BTl9MSU5LUyB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgRG94eWdlbiBnZW5lcmF0ZXMgbWFuIG91dHB1dCwNCisjIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkNCisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMNCisjIG9ubHkgc291cmNlIHRoZSByZWFsIG1hbiBwYWdlLCBidXQgd2l0aG91dCB0aGVtIHRoZSBtYW4gY29tbWFuZA0KKyMgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4gVGhlIGRlZmF1bHQgaXMgTk8uDQorDQorTUFOX0xJTktTICAgICAgICAgICAgICA9IE5PDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mDQorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgWE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBYTUwgcGFnZXMgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHhtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbA0KKw0KKyMgVGhlIFhNTF9TQ0hFTUEgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIHNjaGVtYSwNCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQ0KKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuDQorDQorWE1MX1NDSEVNQSAgICAgICAgICAgICA9DQorDQorIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgRFRELA0KKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlDQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4NCisNCitYTUxfRFREICAgICAgICAgICAgICAgID0NCisNCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZw0KKyMgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0byB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0DQorIyBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgWE1MIG91dHB1dC4NCisNCitYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfQVVUT0dFTl9ERUYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhbiBBdXRvR2VuIERlZmluaXRpb25zIChzZWUgYXV0b2dlbi5zZi5uZXQpIGZpbGUNCisjIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsDQorIyBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbA0KKyMgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4NCisNCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mDQorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzDQorIyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUNCisjIG1vbWVudC4NCisNCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8NCisNCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZQ0KKyMgdGhlIG5lY2Vzc2FyeSBNYWtlZmlsZSBydWxlcywgUGVybCBzY3JpcHRzIGFuZCBMYVRlWCBjb2RlIHRvIGJlIGFibGUNCisjIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuDQorDQorUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlDQorIyBuaWNlbHkgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuDQorIyBUaGlzIGlzIHVzZWZ1bA0KKyMgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLg0KKyMgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMNCisjIHRhZyBpcyBzZXQgdG8gTk8gdGhlIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlcg0KKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLg0KKw0KK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMNCisNCisjIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlDQorIyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLg0KKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lDQorIyBNYWtlZmlsZSBkb24ndCBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4NCisNCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBldmFsdWF0ZSBhbGwgQy1wcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBmb3VuZCBpbiB0aGUgc291cmNlcyBhbmQgaW5jbHVkZQ0KKyMgZmlsZXMuDQorDQorRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUw0KKw0KKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybw0KKyMgbmFtZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBvbmx5IGNvbmRpdGlvbmFsDQorIyBjb21waWxhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZA0KKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4NCisNCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRVhQQU5EX09OTFlfUFJFREVGIGFuZCBNQUNST19FWFBBTlNJT04gdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTDQorIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZQ0KKyMgUFJFREVGSU5FRCBhbmQgRVhQQU5EX0FTX0RFRklORUQgdGFncy4NCisNCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlIGluY2x1ZGVzIGZpbGVzDQorIyBwb2ludGVkIHRvIGJ5IElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIHdoZW4gYSAjaW5jbHVkZSBpcyBmb3VuZC4NCisNCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTDQorDQorIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQNCisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkNCisjIHRoZSBwcmVwcm9jZXNzb3IuDQorDQorSU5DTFVERV9QQVRIICAgICAgICAgICA9DQorDQorIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkDQorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlDQorIyBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuaywgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCB3aXRoIEZJTEVfUEFUVEVSTlMgd2lsbA0KKyMgYmUgdXNlZC4NCisNCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0NCisNCisjIFRoZSBQUkVERUZJTkVEIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hY3JvIG5hbWVzIHRoYXQNCisjIGFyZSBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZg0KKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZQ0KKyMgb3IgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlID0gYXJlDQorIyBvbWl0dGVkID0xIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcNCisjIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3INCisjIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuDQorDQorUFJFREVGSU5FRCAgICAgICAgICAgICA9IE9NUF8zMF9FTkFCTEVEPTEsIE9NUF80MF9FTkFCTEVEPTEsIEtNUF9TVEFUU19FTkFCTEVEPTENCisNCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4NCisjIHRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLg0KKyMgVGhlIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuDQorIyBVc2UgdGhlIFBSRURFRklORUQgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uIHRoYXQNCisjIG92ZXJydWxlcyB0aGUgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuDQorDQorRVhQQU5EX0FTX0RFRklORUQgICAgICA9DQorDQorIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuDQorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zDQorIyB0aGF0IGFyZSBhbG9uZSBvbiBhIGxpbmUsIGhhdmUgYW4gYWxsIHVwcGVyY2FzZSBuYW1lLCBhbmQgZG8gbm90IGVuZCB3aXRoIGENCisjIHNlbWljb2xvbiwgYmVjYXVzZSB0aGVzZSB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QgcmVtb3ZlZC4NCisNCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoZSBUQUdGSUxFUyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWdmaWxlcy4gRm9yIGVhY2gNCisjIHRhZyBmaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgYWRkZWQuIFRoZQ0KKyMgZm9ybWF0IG9mIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6DQorIw0KKyMgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4NCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6DQorIw0KKyMgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLg0KKyMgd2hlcmUgImxvYzEiIGFuZCAibG9jMiIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzDQorIyBvciBVUkxzLiBOb3RlIHRoYXQgZWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcw0KKyMgTk9UIGluY2x1ZGUgdGhlIHBhdGgpLiBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2gNCisjIGRveHlnZW4gaXMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4NCisNCitUQUdGSUxFUyAgICAgICAgICAgICAgID0NCisNCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUNCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuDQorDQorR0VORVJBVEVfVEFHRklMRSAgICAgICA9DQorDQorIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkDQorIyBpbiB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3Nlcw0KKyMgd2lsbCBiZSBsaXN0ZWQuDQorDQorQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQNCisjIGluIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsDQorIyBiZSBsaXN0ZWQuDQorDQorRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIFBFUkxfUEFUSCBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHBlcmwgc2NyaXB0DQorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mIGB3aGljaCBwZXJsJykuDQorDQorUEVSTF9QQVRIICAgICAgICAgICAgICA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIGluaGVyaXRhbmNlIGRpYWdyYW0gKGluIEhUTUwsIFJURiBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZQ0KKyMgb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdA0KKyMgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8NCisjIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlIHBvd2VyZnVsIGdyYXBocy4NCisNCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTDQorDQorIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYw0KKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlDQorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pIHRvIHByb2R1Y2UgdGhlIGNoYXJ0IGFuZCBpbnNlcnQgaXQgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlDQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQ0KKyMgZGVmYXVsdCBzZWFyY2ggcGF0aC4NCisNCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0NCisNCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlDQorIyBpbmhlcml0YW5jZSBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkDQorIyBvciBpcyBub3QgYSBjbGFzcy4NCisNCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTDQorDQorIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMNCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiwgYSBncmFwaCB2aXN1YWxpemF0aW9uDQorIyB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50IEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uDQorIyBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQ0KKw0KK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcw0KKyMgYWxsb3dlZCB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwNCisjIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0DQorIyBleHBsaWNpdGx5IHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlDQorIyBiZXR3ZWVuIENQVSBsb2FkIGFuZCBwcm9jZXNzaW5nIHNwZWVkLg0KKw0KK0RPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwDQorDQorIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB1c2UgdGhlIEhlbHZldGljYSBmb250IGZvciBhbGwgZG90IGZpbGVzIHRoYXQNCisjIGRveHlnZW4gZ2VuZXJhdGVzLiBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IHlvdSBjYW4gc3BlY2lmeQ0KKyMgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2Ugc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kDQorIyB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcNCisjIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUNCisjIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250Lg0KKw0KK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2ENCisNCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgZm9udCBvZiBkb3QgZ3JhcGhzLg0KKyMgVGhlIGRlZmF1bHQgc2l6ZSBpcyAxMHB0Lg0KKw0KK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMA0KKw0KKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBIZWx2ZXRpY2EgZm9udC4NCisjIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gdXNlIERPVF9GT05UUEFUSCB0bw0KKyMgc2V0IHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdC4NCisNCitET1RfRk9OVFBBVEggICAgICAgICAgID0NCisNCisjIElmIHRoZSBDTEFTU19HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQNCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUNCisjIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4NCisNCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQNCisjIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQNCisjIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuDQorDQorQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEdST1VQX0dSQVBIUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcw0KKw0KK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kDQorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZw0KKyMgTGFuZ3VhZ2UuDQorDQorVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZQ0KKyMgdGhlIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZQ0KKyMgZ3JhcGggbWF5IGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTDQorIyB0aHJlc2hvbGQgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUNCisjIG1hbmFnZWFibGUuIFNldCB0aGlzIHRvIDAgZm9yIG5vIGxpbWl0LiBOb3RlIHRoYXQgdGhlIHRocmVzaG9sZCBtYXkgYmUNCisjIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0IGlzIGVuZm9yY2VkLg0KKw0KK1VNTF9MSU1JVF9OVU1fRklFTERTICAgPSAxMA0KKw0KKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlDQorIyByZWxhdGlvbnMgYmV0d2VlbiB0ZW1wbGF0ZXMgYW5kIHRoZWlyIGluc3RhbmNlcy4NCisNCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERV9HUkFQSCwgYW5kIEhBVkVfRE9UDQorIyB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZA0KKyMgZmlsZSBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGgNCisjIG90aGVyIGRvY3VtZW50ZWQgZmlsZXMuDQorDQorSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVEX0JZX0dSQVBILCBhbmQNCisjIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaA0KKyMgZG9jdW1lbnRlZCBoZWFkZXIgZmlsZSBzaG93aW5nIHRoZSBkb2N1bWVudGVkIGZpbGVzIHRoYXQgZGlyZWN0bHkgb3INCisjIGluZGlyZWN0bHkgaW5jbHVkZSB0aGlzIGZpbGUuDQorDQorSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIENBTExfR1JBUEggYW5kIEhBVkVfRE9UIG9wdGlvbnMgYXJlIHNldCB0byBZRVMgdGhlbg0KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbCBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24NCisjIG9yIGNsYXNzIG1ldGhvZC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZQ0KKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzDQorIyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4NCisNCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBDQUxMRVJfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbg0KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbg0KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlDQorIyB0aGUgdGltZSBvZiBhIHJ1bi4gU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbGVyDQorIyBncmFwaHMgZm9yIHNlbGVjdGVkIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4NCisNCitDQUxMRVJfR1JBUEggICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoaWNhbCBoaWVyYXJjaHkgb2YgYWxsIGNsYXNzZXMgaW5zdGVhZCBvZiBhIHRleHR1YWwgb25lLg0KKw0KK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMNCisNCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMNCisjIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMNCisjIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZQ0KKyMgcmVsYXRpb25zIGJldHdlZW4gdGhlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4NCisNCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTDQorDQorIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcw0KKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gUG9zc2libGUgdmFsdWVzIGFyZSBzdmcsIHBuZywganBnLCBvciBnaWYuDQorIyBJZiBsZWZ0IGJsYW5rIHBuZyB3aWxsIGJlIHVzZWQuIElmIHlvdSBjaG9vc2Ugc3ZnIHlvdSBuZWVkIHRvIHNldA0KKyMgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlIHRoZSBTVkcgZmlsZXMNCisjIHZpc2libGUgaW4gSUUgOSsgKG90aGVyIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoaXMgcmVxdWlyZW1lbnQpLg0KKw0KK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcNCisNCisjIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bw0KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuDQorIyBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIG1vZGVybiBicm93c2VyIG90aGVyIHRoYW4gSW50ZXJuZXQgRXhwbG9yZXIuDQorIyBUZXN0ZWQgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuIEZvciBJRSA5KyB5b3UNCisjIG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzDQorIyB2aXNpYmxlLiBPbGRlciB2ZXJzaW9ucyBvZiBJRSBkbyBub3QgaGF2ZSBTVkcgc3VwcG9ydC4NCisNCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8NCisNCisjIFRoZSB0YWcgRE9UX1BBVEggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlDQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLg0KKw0KK0RPVF9QQVRIICAgICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIERPVEZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0DQorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQ0KKyMgXGRvdGZpbGUgY29tbWFuZCkuDQorDQorRE9URklMRV9ESVJTICAgICAgICAgICA9DQorDQorIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQNCisjIGNvbnRhaW4gbXNjIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlDQorIyBcbXNjZmlsZSBjb21tYW5kKS4NCisNCitNU0NGSUxFX0RJUlMgICAgICAgICAgID0NCisNCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mDQorIyBub2RlcyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGgNCisjIGJlY29tZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMNCisjIHZpc3VhbGl6ZWQgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZQ0KKyMgbnVtYmVyIG9mIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbg0KKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZQ0KKyMgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4NCisNCitET1RfR1JBUEhfTUFYX05PREVTICAgID0gNTANCisNCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlDQorIyBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUNCisjIGZyb20gdGhlIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzDQorIyB0aGF0IGxheSBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMNCisjIG9wdGlvbiB0byAxIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UNCisjIGNvZGUgYmFzZXMuIEFsc28gbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQ0KKyMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLg0KKw0KK01BWF9ET1RfR1JBUEhfREVQVEggICAgPSAwDQorDQorIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQNCisjIGJhY2tncm91bmQuIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBkb3Qgb24gV2luZG93cyBkb2VzIG5vdA0KKyMgc2VlbSB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwNCisjIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mDQorIyBhIGdyYXBoIChpLmUuIHRoZXkgYmVjb21lIGhhcmQgdG8gcmVhZCkuDQorDQorRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PDQorDQorIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dA0KKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcw0KKyMgbWFrZXMgZG90IHJ1biBmYXN0ZXIsIGJ1dCBzaW5jZSBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIGRvdCAoPjEuOC4xMCkNCisjIHN1cHBvcnQgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuDQorDQorRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kDQorIyBhcnJvd3MgaW4gdGhlIGRvdCBnZW5lcmF0ZWQgZ3JhcGhzLg0KKw0KK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90IGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUNCisjIHRoZSB2YXJpb3VzIGdyYXBocy4NCisNCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTDQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvZG9jL2RveHlnZW4vaGVhZGVyLnRleCBiL3JjMy9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5ZWE2NwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXgKQEAgLTAsMCArMSw3NyBAQAorJSBMYXRleCBoZWFkZXIgZm9yIGRveHlnZW4gMS44LjMuMQorXGRvY3VtZW50Y2xhc3N7Ym9va30KK1x1c2VwYWNrYWdlW2E0cGFwZXIsdG9wPTIuNWNtLGJvdHRvbT0yLjVjbSxsZWZ0PTIuNWNtLHJpZ2h0PTIuNWNtXXtnZW9tZXRyeX0KK1x1c2VwYWNrYWdle21ha2VpZHh9CitcdXNlcGFja2FnZXtuYXRiaWJ9CitcdXNlcGFja2FnZXtncmFwaGljeH0KK1x1c2VwYWNrYWdle211bHRpY29sfQorXHVzZXBhY2thZ2V7ZmxvYXR9CitcdXNlcGFja2FnZXtsaXN0aW5nc30KK1x1c2VwYWNrYWdle2NvbG9yfQorXHVzZXBhY2thZ2V7aWZ0aGVufQorXHVzZXBhY2thZ2VbdGFibGVde3hjb2xvcn0KK1x1c2VwYWNrYWdle3RleHRjb21wfQorXHVzZXBhY2thZ2V7YWxsdHR9CitcdXNlcGFja2FnZXtpZnBkZn0KK1xpZnBkZgorXHVzZXBhY2thZ2VbcGRmdGV4LAorICAgICAgICAgICAgcGFnZWJhY2tyZWY9dHJ1ZSwKKyAgICAgICAgICAgIGNvbG9ybGlua3M9dHJ1ZSwKKyAgICAgICAgICAgIGxpbmtjb2xvcj1ibHVlLAorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICAgICBde2h5cGVycmVmfQorXGVsc2UKK1x1c2VwYWNrYWdlW3BzMnBkZiwKKyAgICAgICAgICAgIHBhZ2ViYWNrcmVmPXRydWUsCisgICAgICAgICAgICBjb2xvcmxpbmtzPXRydWUsCisgICAgICAgICAgICBsaW5rY29sb3I9Ymx1ZSwKKyAgICAgICAgICAgIHVuaWNvZGUKKyAgICAgICAgICAgXXtoeXBlcnJlZn0KK1x1c2VwYWNrYWdle3BzcGljdHVyZX0KK1xmaQorXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9CitcdXNlcGFja2FnZXttYXRocHRteH0KK1x1c2VwYWNrYWdlW3NjYWxlZD0uOTBde2hlbHZldH0KK1x1c2VwYWNrYWdle2NvdXJpZXJ9CitcdXNlcGFja2FnZXtzZWN0c3R5fQorXHVzZXBhY2thZ2V7YW1zc3ltYn0KK1x1c2VwYWNrYWdlW3RpdGxlc117dG9jbG9mdH0KK1x1c2VwYWNrYWdle2RveHlnZW59CitcbHN0c2V0e2xhbmd1YWdlPUMrKyxpbnB1dGVuY29kaW5nPXV0ZjgsYmFzaWNzdHlsZT1cZm9vdG5vdGVzaXplLGJyZWFrbGluZXM9dHJ1ZSxicmVha2F0d2hpdGVzcGFjZT10cnVlLHRhYnNpemU9NCxudW1iZXJzPWxlZnQgfQorXG1ha2VpbmRleAorXHNldGNvdW50ZXJ7dG9jZGVwdGh9ezN9CitccmVuZXdjb21tYW5ke1xmb290cnVsZXdpZHRofXswLjRwdH0KK1xyZW5ld2NvbW1hbmR7XGZhbWlseWRlZmF1bHR9e1xzZmRlZmF1bHR9CitcaGZ1eno9MTVwdAorXHNldGxlbmd0aHtcZW1lcmdlbmN5c3RyZXRjaH17MTVwdH0KK1xoYmFkbmVzcz03NTAKK1x0b2xlcmFuY2U9NzUwCitcYmVnaW57ZG9jdW1lbnR9CitcaHlwZXJzZXR1cHtwYWdlYW5jaG9yPWZhbHNlLGNpdGVjb2xvcj1ibHVlfQorXGJlZ2lue3RpdGxlcGFnZX0KK1x2c3BhY2UqezdjbX0KK1xiZWdpbntjZW50ZXJ9Cit7XExhcmdlIExMVk0gT3Blbk1QXHRleHRzdXBlcnNjcmlwdHsqfSBSdW50aW1lIExpYnJhcnkgfVxcCitcdnNwYWNlKnsxY219Cit7XGxhcmdlIEdlbmVyYXRlZCBieSBEb3h5Z2VuICRkb3h5Z2VudmVyc2lvbiB9XFwKK1x2c3BhY2UqezAuNWNtfQore1xzbWFsbCAkZGF0ZXRpbWUgfVxcCitcZW5ke2NlbnRlcn0KK1xlbmR7dGl0bGVwYWdlfQorCit7XGJmIFRyYWRlbWFya3N9CitUaGUgT3Blbk1QIG5hbWUgYW5kIHRoZSBPcGVuTVAgbG9nbyBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIHRoZSBPcGVuTVAgQXJjaGl0ZWN0dXJlIFJldmlldyBCb2FyZC4KKworSW50ZWwsIFhlb24sIGFuZCBJbnRlbCBYZW9uIFBoaSBhcmUgdHJhZGVtYXJrcyBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIgY291bnRyaWVzLgorCitUaGlzIGRvY3VtZW50IGlzIENvcHlyaWdodCBcdGV4dGNvcHlyaWdodH5cdGhlXHllYXIgdGhlIExMVk0gUHJvamVjdC4gSXQgaXMKK3N1YmplY3QgdG8gdGhlIHNhbWUgbGljZW5zZSB0ZXJtcyBhcyB0aGUgTExWTSBPcGVuTVAgcnVudGltZS4KKworXHRleHRzdXBlcnNjcmlwdHsqfSBPdGhlciBuYW1lcyBhbmQgYnJhbmRzIG1heSBiZSBjbGFpbWVkIGFzIHRoZSBwcm9wZXJ0eSBvZiBvdGhlcnMuCisKK1xjbGVhcmVtcHR5ZG91YmxlcGFnZQorXHBhZ2VudW1iZXJpbmd7cm9tYW59CitcdGFibGVvZmNvbnRlbnRzCitcY2xlYXJlbXB0eWRvdWJsZXBhZ2UKK1xwYWdlbnVtYmVyaW5ne2FyYWJpY30KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9dHJ1ZSxjaXRlY29sb3I9Ymx1ZX0KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL2RvYy9kb3h5Z2VuL2xpYm9tcF9pbnRlcmZhY2UuaCBiL3JjMy9ydW50aW1lL2RvYy9kb3h5Z2VuL2xpYm9tcF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTFhZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzMzIEBACisvLyBUaGlzIGZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgY29kZTsgaXQganVzdCBjb250YWlucyBhZGRpdGlvbmFsIHRleHQgYW5kIGZvcm1hdHRpbmcNCisvLyBmb3IgZG94eWdlbi4NCisNCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKw0KKy8qISBAbWFpbnBhZ2UgTExWTSZuYnNwOyBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSBJbnRlcmZhY2UNCitAc2VjdGlvbiBzZWNfaW50cm8gSW50cm9kdWN0aW9uDQorDQorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBwcm92aWRlZCBieSB0aGUNCitMTFZNICZuYnNwO09wZW5NUFxvdGhlciBydW50aW1lIGxpYnJhcnkgdG8gdGhlIGNvbXBpbGVyLg0KK1JvdXRpbmVzIHRoYXQgYXJlIGRpcmVjdGx5IGNhbGxlZCBhcyBzaW1wbGUgZnVuY3Rpb25zIGJ5IHVzZXIgY29kZSBhcmUNCitub3QgY3VycmVudGx5IGRlc2NyaWJlZCBoZXJlLCBzaW5jZSB0aGVpciBkZWZpbml0aW9uIGlzIGluIHRoZSBPcGVuTVANCitzcGVjaWZpY2F0aW9uIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9vcGVubXAub3JnDQorDQorVGhlIGFpbSBoZXJlIGlzIHRvIGV4cGxhaW4gdGhlIGludGVyZmFjZSBmcm9tIHRoZSBjb21waWxlciB0byB0aGUgcnVudGltZS4NCisNCitUaGUgb3ZlcmFsbCBkZXNpZ24gaXMgZGVzY3JpYmVkLCBhbmQgZWFjaCBmdW5jdGlvbiBpbiB0aGUgaW50ZXJmYWNlDQoraGFzIGl0cyBvd24gZGVzY3JpcHRpb24uIChBdCBsZWFzdCwgdGhhdCdzIHRoZSBhbWJpdGlvbiwgd2UgbWF5IG5vdCBiZSB0aGVyZSB5ZXQpLg0KKw0KK0BzZWN0aW9uIHNlY19idWlsZGluZyBRdWlja2x5IEJ1aWxkaW5nIHRoZSBSdW50aW1lDQorRm9yIHRoZSBpbXBhdGllbnQsIHdlIGNvdmVyIGJ1aWxkaW5nIHRoZSBydW50aW1lIGFzIHRoZSBmaXJzdCB0b3BpYyBoZXJlLg0KKw0KK0NNYWtlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIE9wZW5NUCBydW50aW1lLiAgRm9yIGRldGFpbHMgYW5kIGEgZnVsbCBsaXN0IG9mIG9wdGlvbnMgZm9yIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0sDQorc2VlIDx0dD5CdWlsZF9XaXRoX0NNYWtlLnR4dDwvdHQ+IGluc2lkZSB0aGUgPHR0PnJ1bnRpbWUvPC90dD4gc3ViZGlyZWN0b3J5LiAgVGhlc2UNCitpbnN0cnVjdGlvbnMgd2lsbCBwcm92aWRlIHRoZSBtb3N0IHR5cGljYWwgYnVpbGQuDQorDQorSW4tTExWTS10cmVlIGJ1aWxkOi4NCitAY29kZQ0KKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQ0KK0NoZWNrIG91dCBvcGVubXAgaW50byBsbHZtL3Byb2plY3RzDQorJCBjZCB3aGVyZS15b3Utd2FudC10by1idWlsZA0KKyQgbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQNCiskIGNtYWtlIHBhdGgvdG8vbGx2bSAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+DQorJCBtYWtlIG9tcA0KK0BlbmRjb2RlDQorT3V0LW9mLUxMVk0tdHJlZSBidWlsZDoNCitAY29kZQ0KKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQ0KK0NoZWNrIG91dCBvcGVubXANCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUvb3Blbm1wL3J1bnRpbWUNCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkDQorJCBjbWFrZSBwYXRoL3RvL29wZW5tcCAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+DQorJCBtYWtlDQorQGVuZGNvZGUNCisNCitAc2VjdGlvbiBzZWNfc3VwcG9ydGVkIFN1cHBvcnRlZCBSVEwgQnVpbGQgQ29uZmlndXJhdGlvbnMNCisNCitUaGUgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0ZWQgYXJlIElBLTMyIGFyY2hpdGVjdHVyZSwgSW50ZWwmcmVnOyZuYnNwOyA2NCwgYW5kDQorSW50ZWwmcmVnOyZuYnNwOyBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuICBUaGUgYnVpbGQgY29uZmlndXJhdGlvbnMNCitzdXBwb3J0ZWQgYXJlIHNob3duIGluIHRoZSB0YWJsZSBiZWxvdy4NCisNCis8dGFibGUgYm9yZGVyPTE+DQorPHRyPjx0aD4gPHRoPmljYy9pY2w8dGg+Z2NjPHRoPmNsYW5nDQorPHRyPjx0ZD5MaW51eFxvdGhlciBPUzx0ZD5ZZXMoMSw1KTx0ZD5ZZXMoMiw0KTx0ZD5ZZXMoNCw2LDcpDQorPHRyPjx0ZD5GcmVlQlNEXG90aGVyPHRkPlllcygxLDUpPHRkPlllcygyLDQpPHRkPlllcyg0LDYsNyw4KQ0KKzx0cj48dGQ+T1MgWFxvdGhlcjx0ZD5ZZXMoMSwzLDQpPHRkPk5vPHRkPlllcyg0LDYsNykNCis8dHI+PHRkPldpbmRvd3Ncb3RoZXIgT1M8dGQ+WWVzKDEsNCk8dGQ+Tm88dGQ+Tm8NCis8L3RhYmxlPg0KKygxKSBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsJnJlZzsmbmJzcDsgNjQsIGljYy9pY2wgdmVyc2lvbnMgMTIueCANCisgICAgYXJlIHN1cHBvcnRlZCAoMTIuMSBpcyByZWNvbW1lbmRlZCkuPGJyPg0KKygyKSBnY2MgdmVyc2lvbiA0LjcgaXMgc3VwcG9ydGVkLjxicj4NCisoMykgRm9yIGljYyBvbiBPUyBYXG90aGVyLCBPUyBYXG90aGVyIHZlcnNpb24gMTAuNS44IGlzIHN1cHBvcnRlZC48YnI+DQorKDQpIEludGVsJnJlZzsmbmJzcDsgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIG5vdCBzdXBwb3J0ZWQuPGJyPg0KKyg1KSBPbiBJbnRlbCZyZWc7Jm5ic3A7IE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSwgaWNjL2ljbCB2ZXJzaW9ucyAxMy4wIG9yIGxhdGVyIGFyZSByZXF1aXJlZC48YnI+DQorKDYpIENsYW5nXG90aGVyIHZlcnNpb24gMy4zIGlzIHN1cHBvcnRlZC48YnI+DQorKDcpIENsYW5nXG90aGVyIGN1cnJlbnRseSBkb2VzIG5vdCBvZmZlciBhIHNvZnR3YXJlLWltcGxlbWVudGVkIDEyOCBiaXQgZXh0ZW5kZWQNCisgICAgcHJlY2lzaW9uIHR5cGUuICBUaHVzLCBhbGwgZW50cnkgcG9pbnRzIHJlbGlhbnQgb24gdGhpcyB0eXBlIGFyZSByZW1vdmVkDQorICAgIGZyb20gdGhlIGxpYnJhcnkgYW5kIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhlIHVzZXIgcHJvZ3JhbS4gIFRoZSBmb2xsb3dpbmcNCisgICAgZnVuY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlOg0KK0Bjb2RlDQorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl8qDQorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl8qDQorICAgIF9fa21wY19hdG9taWNfKl9mcA0KK0BlbmRjb2RlDQorKDgpIENvbW11bml0eSBjb250cmlidXRpb24gcHJvdmlkZWQgQVMgSVMsIG5vdCB0ZXN0ZWQgYnkgSW50ZWwuDQorDQorU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IElCTShSKSBQb3dlciA3IGFuZCBQb3dlciA4DQorPHRhYmxlIGJvcmRlcj0xPg0KKzx0cj48dGg+IDx0aD5nY2M8dGg+Y2xhbmcNCis8dHI+PHRkPkxpbnV4XG90aGVyIE9TPHRkPlllcygxLDIpPHRkPlllcygzLDQpDQorPC90YWJsZT4NCisoMSkgT24gUG93ZXIgNywgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLjxicj4NCisoMikgT24gUG93ZXIgOCwgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLjxicj4NCisoMykgT24gUG93ZXIgNywgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLjxicj4NCisoNCkgT24gUG93ZXIgOCwgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLjxicj4NCisNCitAc2VjdGlvbiBzZWNfZnJvbnRlbmQgRnJvbnQtZW5kIENvbXBpbGVycyB0aGF0IHdvcmsgd2l0aCB0aGlzIFJUTA0KKw0KK1RoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byBkbyBjb21wYXRpYmxlIGNvZGUgZ2VuZXJhdGlvbiBmb3INCit0aGlzIFJUTDogaWNjL2ljbCwgZ2NjLiAgQ29kZSBnZW5lcmF0aW9uIGlzIGRpc2N1c3NlZCBpbiBtb3JlIGRldGFpbA0KK2xhdGVyIGluIHRoaXMgZG9jdW1lbnQuDQorDQorQHNlY3Rpb24gc2VjX291dGxpbmluZyBPdXRsaW5pbmcNCisNCitUaGUgcnVudGltZSBpbnRlcmZhY2UgaXMgYmFzZWQgb24gdGhlIGlkZWEgdGhhdCB0aGUgY29tcGlsZXINCisib3V0bGluZXMiIHNlY3Rpb25zIG9mIGNvZGUgdGhhdCBhcmUgdG8gcnVuIGluIHBhcmFsbGVsIGludG8gc2VwYXJhdGUNCitmdW5jdGlvbnMgdGhhdCBjYW4gdGhlbiBiZSBpbnZva2VkIGluIG11bHRpcGxlIHRocmVhZHMuICBGb3IgaW5zdGFuY2UsDQorc2ltcGxlIGNvZGUgbGlrZSB0aGlzDQorDQorQGNvZGUNCit2b2lkIGZvbygpDQorew0KKyNwcmFnbWEgb21wIHBhcmFsbGVsDQorICAgIHsNCisgICAgICAgIC4uLiBkbyBzb21ldGhpbmcgLi4uDQorICAgIH0NCit9DQorQGVuZGNvZGUNCitpcyBjb252ZXJ0ZWQgaW50byBzb21ldGhpbmcgdGhhdCBsb29rcyBjb25jZXB0dWFsbHkgbGlrZSB0aGlzICh3aGVyZQ0KK3RoZSBuYW1lcyB1c2VkIGFyZSBtZXJlbHkgaWxsdXN0cmF0aXZlOyB0aGUgcmVhbCBsaWJyYXJ5IGZ1bmN0aW9uDQorbmFtZXMgd2lsbCBiZSB1c2VkIGxhdGVyIGFmdGVyIHdlJ3ZlIGRpc2N1c3NlZCBzb21lIG1vcmUgaXNzdWVzLi4uKQ0KKw0KK0Bjb2RlDQorc3RhdGljIHZvaWQgb3V0bGluZWRGb29Cb2R5KCkNCit7DQorICAgIC4uLiBkbyBzb21ldGhpbmcgLi4uDQorfQ0KKw0KK3ZvaWQgZm9vKCkNCit7DQorICAgIF9fT01QX3J1bnRpbWVfZm9yayhvdXRsaW5lZEZvb0JvZHksICh2b2lkKikwKTsgICAvLyBOb3QgdGhlIHJlYWwgZnVuY3Rpb24gbmFtZSENCit9DQorQGVuZGNvZGUNCisNCitAc3Vic2VjdGlvbiBTRUNfU0hBUkVEVkFSUyBBZGRyZXNzaW5nIHNoYXJlZCB2YXJpYWJsZXMNCisNCitJbiByZWFsIHVzZXMgb2YgdGhlIE9wZW5NUFxvdGhlciBBUEkgdGhlcmUgYXJlIG5vcm1hbGx5IHJlZmVyZW5jZXMgDQorZnJvbSB0aGUgb3V0bGluZWQgY29kZSAgdG8gc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBpbiBzY29wZSBpbiB0aGUgY29udGFpbmluZyBmdW5jdGlvbi4gDQorVGhlcmVmb3JlIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uIG11c3QgYmUgYWJsZSB0byBhZGRyZXNzIA0KK3RoZXNlIHZhcmlhYmxlcy4gVGhlIHJ1bnRpbWUgc3VwcG9ydHMgdHdvIGFsdGVybmF0ZSB3YXlzIG9mIGRvaW5nDQordGhpcy4NCisNCitAc3Vic3Vic2VjdGlvbiBTRUNfU0VDX09UIEN1cnJlbnQgVGVjaG5pcXVlDQorVGhlIHRlY2huaXF1ZSBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBydW50aW1lIGxpYnJhcnkgaXMgdG8gcmVjZWl2ZQ0KK2Egc2VwYXJhdGUgcG9pbnRlciB0byBlYWNoIHNoYXJlZCB2YXJpYWJsZSB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBmcm9tDQordGhlIG91dGxpbmVkIGZ1bmN0aW9uLiAgVGhpcyBpcyB3aGF0IGlzIHNob3duIGluIHRoZSBleGFtcGxlIGJlbG93Lg0KKw0KK1dlIGhvcGUgc29vbiB0byBwcm92aWRlIGFuIGFsdGVybmF0aXZlIGludGVyZmFjZSB0byBzdXBwb3J0IHRoZQ0KK2FsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gVGhlDQorYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gaGFzIHBlcmZvcm1hbmNlIGFkdmFudGFnZXMgZm9yIHNtYWxsDQorcGFyYWxsZWwgcmVnaW9ucyB0aGF0IGhhdmUgbWFueSBzaGFyZWQgdmFyaWFibGVzLg0KKw0KK0BzdWJzdWJzZWN0aW9uIFNFQ19TRUNfUFQgRnV0dXJlIFRlY2huaXF1ZQ0KK1RoZSBpZGVhIGlzIHRvIHRyZWF0IHRoZSBvdXRsaW5lZCBmdW5jdGlvbiBhcyB0aG91Z2ggaXQNCit3ZXJlIGEgbGV4aWNhbGx5IG5lc3RlZCBmdW5jdGlvbiwgYW5kIHBhc3MgaXQgYSBzaW5nbGUgYXJndW1lbnQgd2hpY2gNCitpcyB0aGUgcG9pbnRlciB0byB0aGUgcGFyZW50J3Mgc3RhY2sgZnJhbWUuIFByb3ZpZGVkIHRoYXQgdGhlIGNvbXBpbGVyDQora25vd3MgdGhlIGxheW91dCBvZiB0aGUgcGFyZW50IGZyYW1lIHdoZW4gaXQgaXMgZ2VuZXJhdGluZyB0aGUgb3V0bGluZWQNCitmdW5jdGlvbiBpdCBjYW4gdGhlbiBhY2Nlc3MgdGhlIHVwLWxldmVsIHZhcmlhYmxlcyBhdCBhcHByb3ByaWF0ZQ0KK29mZnNldHMgZnJvbSB0aGUgcGFyZW50IGZyYW1lLiAgVGhpcyBpcyBhIGNsYXNzaWNhbCBjb21waWxlciB0ZWNobmlxdWUNCitmcm9tIHRoZSAxOTYwcyB0byBzdXBwb3J0IGxhbmd1YWdlcyBsaWtlIEFsZ29sIChhbmQgaXRzIGRlc2NlbmRhbnRzKQ0KK3RoYXQgc3VwcG9ydCBsZXhpY2FsbHkgbmVzdGVkIGZ1bmN0aW9ucy4NCisNCitUaGUgbWFpbiBiZW5lZml0IG9mIHRoaXMgdGVjaG5pcXVlIGlzIHRoYXQgdGhlcmUgaXMgbm8gY29kZSByZXF1aXJlZA0KK2F0IHRoZSBmb3JrIHBvaW50IHRvIG1hcnNoYWwgdGhlIGFyZ3VtZW50cyB0byB0aGUgb3V0bGluZWQgZnVuY3Rpb24uDQorU2luY2UgdGhlIHJ1bnRpbWUga25vd3Mgc3RhdGljYWxseSBob3cgbWFueSBhcmd1bWVudHMgbXVzdCBiZSBwYXNzZWQgdG8gdGhlDQorb3V0bGluZWQgZnVuY3Rpb24sIGl0IGNhbiBlYXNpbHkgY29weSB0aGVtIHRvIHRoZSB0aHJlYWQncyBzdGFjaw0KK2ZyYW1lLiAgVGhlcmVmb3JlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgZm9yayBjb2RlIGlzIGluZGVwZW5kZW50IG9mDQordGhlIG51bWJlciBvZiBzaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlIGFjY2Vzc2VkIGJ5IHRoZSBvdXRsaW5lZA0KK2Z1bmN0aW9uLg0KKw0KK0lmIGl0IGlzIGhhcmQgdG8gZGV0ZXJtaW5lIHRoZSBzdGFjayBsYXlvdXQgb2YgdGhlIHBhcmVudCB3aGlsZSBnZW5lcmF0aW5nIHRoZQ0KK291dGxpbmVkIGNvZGUsIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIHVzZSB0aGlzIGFwcHJvYWNoIGJ5IGNvbGxlY3RpbmcgYWxsIG9mDQordGhlIHZhcmlhYmxlcyBpbiB0aGUgcGFyZW50IHRoYXQgYXJlIGFjY2Vzc2VkIGZyb20gb3V0bGluZWQgZnVuY3Rpb25zIGludG8NCithIHNpbmdsZSBgc3RydWN0YCB3aGljaCBpcyBwbGFjZWQgb24gdGhlIHN0YWNrLCBhbmQgd2hvc2UgYWRkcmVzcyBpcyBwYXNzZWQNCit0byB0aGUgb3V0bGluZWQgZnVuY3Rpb25zLiBJbiB0aGlzIHdheSB0aGUgb2Zmc2V0cyBvZiB0aGUgc2hhcmVkIHZhcmlhYmxlcw0KK2FyZSBrbm93biAoc2luY2UgdGhleSBhcmUgaW5zaWRlIHRoZSBzdHJ1Y3QpIHdpdGhvdXQgbmVlZGluZyB0byBrbm93DQordGhlIGNvbXBsZXRlIGxheW91dCBvZiB0aGUgcGFyZW50IHN0YWNrLWZyYW1lLiBGcm9tIHRoZSBwb2ludCBvZiB2aWV3DQorb2YgdGhlIHJ1bnRpbWUgZWl0aGVyIG9mIHRoZXNlIHRlY2huaXF1ZXMgaXMgZXF1aXZhbGVudCwgc2luY2UgaW4gZWl0aGVyDQorY2FzZSBpdCBvbmx5IGhhcyB0byBwYXNzIGEgc2luZ2xlIGFyZ3VtZW50IHRvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbiB0byBhbGxvdyANCitpdCB0byBhY2Nlc3Mgc2hhcmVkIHZhcmlhYmxlcy4NCisNCitBIHNjaGVtZSBsaWtlIHRoaXMgaXMgaG93IGdjY1xvdGhlciBnZW5lcmF0ZXMgb3V0bGluZWQgZnVuY3Rpb25zLg0KKw0KK0BzZWN0aW9uIFNFQ19JTlRFUkZBQ0VTIExpYnJhcnkgSW50ZXJmYWNlcw0KK1RoZSBsaWJyYXJ5IGZ1bmN0aW9ucyB1c2VkIGZvciBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgT3Blbk1QXG90aGVyIGxhbmd1YWdlIGltcGxlbWVudGF0aW9uDQorYXJlIGRvY3VtZW50ZWQgaW4gZGlmZmVyZW50IG1vZHVsZXMuDQorDQorIC0gQHJlZiBCQVNJQ19UWVBFUyBmdW5kYW1lbnRhbCB0eXBlcyB1c2VkIGJ5IHRoZSBydW50aW1lIGluIG1hbnkgcGxhY2VzDQorIC0gQHJlZiBERVBSRUNBVEVEICBmdW5jdGlvbnMgdGhhdCBhcmUgaW4gdGhlIGxpYnJhcnkgYnV0IGFyZSBubyBsb25nZXIgcmVxdWlyZWQNCisgLSBAcmVmIFNUQVJUVVBfU0hVVERPV04gZnVuY3Rpb25zIGZvciBpbml0aWFsaXppbmcgYW5kIGZpbmFsaXppbmcgdGhlIHJ1bnRpbWUNCisgLSBAcmVmIFBBUkFMTEVMIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIGBvbXAgcGFyYWxsZWxgDQorIC0gQHJlZiBUSFJFQURfU1RBVEVTIGZ1bmN0aW9ucyBmb3Igc3VwcG9ydGluZyB0aHJlYWQgc3RhdGUgaW5xdWlyaWVzDQorIC0gQHJlZiBXT1JLX1NIQVJJTkcgZnVuY3Rpb25zIGZvciB3b3JrIHNoYXJpbmcgY29uc3RydWN0cyBzdWNoIGFzIGBvbXAgZm9yYCwgYG9tcCBzZWN0aW9uc2ANCisgLSBAcmVmIFRIUkVBRFBSSVZBVEUgZnVuY3Rpb25zIHRvIHN1cHBvcnQgdGhyZWFkIHByaXZhdGUgZGF0YSwgY29weWluIGV0Yw0KKyAtIEByZWYgU1lOQ0hST05JWkFUSU9OIGZ1bmN0aW9ucyB0byBzdXBwb3J0IGBvbXAgY3JpdGljYWxgLCBgb21wIGJhcnJpZXJgLCBgb21wIG1hc3RlcmAsIHJlZHVjdGlvbnMgZXRjDQorIC0gQHJlZiBBVE9NSUNfT1BTIGZ1bmN0aW9ucyB0byBzdXBwb3J0IGF0b21pYyBvcGVyYXRpb25zDQorIC0gQHJlZiBTVEFUU19HQVRIRVJJTkcgbWFjcm9zIHRvIHN1cHBvcnQgZGV2ZWxvcGVyIHByb2ZpbGluZyBvZiBsaWJvbXANCisgLSBEb2N1bWVudGF0aW9uIG9uIHRhc2tpbmcgaGFzIHN0aWxsIHRvIGJlIHdyaXR0ZW4uLi4NCisNCitAc2VjdGlvbiBTRUNfRVhBTVBMRVMgRXhhbXBsZXMNCitAc3Vic2VjdGlvbiBTRUNfV09SS1NIQVJJTkdfRVhBTVBMRSBXb3JrIFNoYXJpbmcgRXhhbXBsZQ0KK1RoaXMgZXhhbXBsZSBzaG93cyB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIGEgcGFyYWxsZWwgZm9yIHdpdGggcmVkdWN0aW9uIGFuZCBkeW5hbWljIHNjaGVkdWxpbmcuDQorDQorQGNvZGUNCitleHRlcm4gZmxvYXQgZm9vKCB2b2lkICk7DQorDQoraW50IG1haW4gKCkgew0KKyAgICBpbnQgaTsgDQorICAgIGZsb2F0IHIgPSAwLjA7IA0KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYykgcmVkdWN0aW9uKCs6cikgDQorICAgIGZvciAoIGkgPSAwOyBpIDwgMTA7IGkgKysgKSB7DQorICAgICAgICByICs9IGZvbygpOyANCisgICAgfQ0KK30NCitAZW5kY29kZQ0KKw0KK1RoZSB0cmFuc2Zvcm1lZCBjb2RlIGxvb2tzIGxpa2UgdGhpcy4NCitAY29kZQ0KK2V4dGVybiBmbG9hdCBmb28oIHZvaWQgKTsgDQorDQoraW50IG1haW4gKCkgew0KKyAgICBzdGF0aWMgaW50IHplcm8gPSAwOyANCisgICAgYXV0byBpbnQgZ3RpZDsgDQorICAgIGF1dG8gZmxvYXQgciA9IDAuMDsgDQorICAgIF9fa21wY19iZWdpbiggJiBsb2MzLCAwICk7IA0KKyAgICAvLyBUaGUgZ3RpZCBpcyBub3QgYWN0dWFsbHkgcmVxdWlyZWQgaW4gdGhpcyBleGFtcGxlIHNvIGNvdWxkIGJlIG9taXR0ZWQ7DQorICAgIC8vIFdlIHNob3cgaXRzIGluaXRpYWxpemF0aW9uIGhlcmUgYmVjYXVzZSBpdCBpcyBvZnRlbiByZXF1aXJlZCBmb3IgY2FsbHMgaW50bw0KKyAgICAvLyB0aGUgcnVudGltZSBhbmQgc2hvdWxkIGJlIGxvY2FsbHkgY2FjaGVkIGxpa2UgdGhpcy4NCisgICAgZ3RpZCA9IF9fa21wY19nbG9iYWwgdGhyZWFkIG51bSggJiBsb2MzICk7IA0KKyAgICBfX2ttcGNfZm9yayBjYWxsKCAmIGxvYzcsIDEsIG1haW5fN19wYXJhbGxlbF8zLCAmIHIgKTsgDQorICAgIF9fa21wY19lbmQoICYgbG9jMCApOyANCisgICAgcmV0dXJuIDA7IA0KK30NCisNCitzdHJ1Y3QgbWFpbl8xMF9yZWR1Y3Rpb25fdF81IHsgZmxvYXQgcl8xMF9ycHI7IH07IA0KKw0KK3N0YXRpYyBrbXBfY3JpdGljYWxfbmFtZSBsY2sgPSB7IDAgfTsNCitzdGF0aWMgaWRlbnRfdCBsb2MxMDsgLy8gbG9jMTAuZmxhZ3Mgc2hvdWxkIGNvbnRhaW4gS01QX0lERU5UX0FUT01JQ19SRURVQ0UgYml0IHNldCANCisgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgY29tcGlsZXIgaGFzIGdlbmVyYXRlZCBhbiBhdG9taWMgcmVkdWN0aW9uLg0KKw0KK3ZvaWQgbWFpbl83X3BhcmFsbGVsXzMoIGludCAqZ3RpZCwgaW50ICpidGlkLCBmbG9hdCAqcl83X3NocCApIHsNCisgICAgYXV0byBpbnQgaV83X3ByOyANCisgICAgYXV0byBpbnQgbG93ZXIsIHVwcGVyLCBsaXRlciwgaW5jcjsgDQorICAgIGF1dG8gc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSByZWR1Y2U7IA0KKyAgICByZWR1Y2Uucl8xMF9ycHIgPSAwLkY7IA0KKyAgICBsaXRlciA9IDA7IA0KKyAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80KCAmIGxvYzcsKmd0aWQsIDM1LCAwLCA5LCAxLCAxICk7IA0KKyAgICB3aGlsZSAoIF9fa21wY19kaXNwYXRjaF9uZXh0XzQoICYgbG9jNywgKmd0aWQsICYgbGl0ZXIsICYgbG93ZXIsICYgdXBwZXIsICYgaW5jciApICkgew0KKyAgICAgICAgZm9yKCBpXzdfcHIgPSBsb3dlcjsgdXBwZXIgPj0gaV83X3ByOyBpXzdfcHIgKysgKSANCisgICAgICAgICAgcmVkdWNlLnJfMTBfcnByICs9IGZvbygpOyANCisgICAgfQ0KKyAgICBzd2l0Y2goIF9fa21wY19yZWR1Y2Vfbm93YWl0KCAmIGxvYzEwLCAqZ3RpZCwgMSwgNCwgJiByZWR1Y2UsIG1haW5fMTBfcmVkdWNlXzUsICYgbGNrICkgKSB7DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAqcl83X3NocCArPSByZWR1Y2Uucl8xMF9ycHI7DQorICAgICAgICAgICBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoICYgbG9jMTAsICpndGlkLCAmIGxjayApOw0KKyAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQoICYgbG9jMTAsICpndGlkLCByXzdfc2hwLCByZWR1Y2Uucl8xMF9ycHIgKTsNCisgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDo7DQorICAgIH0NCit9IA0KKw0KK3ZvaWQgbWFpbl8xMF9yZWR1Y2VfNSggc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSAqcmVkdWNlX2xocywgDQorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWFpbl8xMF9yZWR1Y3Rpb25fdF81ICpyZWR1Y2VfcmhzICkgDQoreyANCisgICAgcmVkdWNlX2xocy0+cl8xMF9ycHIgKz0gcmVkdWNlX3Jocy0+cl8xMF9ycHI7IA0KK30NCitAZW5kY29kZQ0KKw0KK0BkZWZncm91cCBCQVNJQ19UWVBFUyBCYXNpYyBUeXBlcw0KK1R5cGVzIHRoYXQgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgcnVudGltZS4NCisNCitAZGVmZ3JvdXAgREVQUkVDQVRFRCBEZXByZWNhdGVkIEZ1bmN0aW9ucw0KK0Z1bmN0aW9ucyBpbiB0aGlzIGdyb3VwIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSwgYW5kDQorc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlLg0KKw0KK0BkZWZncm91cCBTVEFSVFVQX1NIVVRET1dOIFN0YXJ0dXAgYW5kIFNodXRkb3duDQorVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3IgbGlicmFyeSBpbml0aWFsaXphdGlvbiBhbmQgc2h1dGRvd24uDQorDQorQGRlZmdyb3VwIFBBUkFMTEVMIFBhcmFsbGVsIChmb3JrL2pvaW4pDQorVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgPHR0PlwjcHJhZ21hIG9tcCBwYXJhbGxlbDwvdHQ+Lg0KKw0KK0BkZWZncm91cCBUSFJFQURfU1RBVEVTIFRocmVhZCBJbmZvcm1hdGlvbg0KK1RoZXNlIGZ1bmN0aW9ucyByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkLg0KKw0KK0BkZWZncm91cCBXT1JLX1NIQVJJTkcgV29yayBTaGFyaW5nDQorVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgDQorPHR0PlwjcHJhZ21hIG9tcCBmb3I8L3R0PiwgPHR0PlwjcHJhZ21hIG9tcCBzZWN0aW9uczwvdHQ+LCA8dHQ+XCNwcmFnbWEgb21wIHNpbmdsZTwvdHQ+IGFuZCANCis8dHQ+XCNwcmFnbWEgb21wIG1hc3RlcjwvdHQ+IGNvbnN0cnVjdHMuIA0KKw0KK1doZW4gaGFuZGxpbmcgbG9vcHMsIHRoZXJlIGFyZSBkaWZmZXJlbnQgZnVuY3Rpb25zIGZvciBlYWNoIG9mIHRoZSBzaWduZWQgYW5kIHVuc2lnbmVkIDMyIGFuZCA2NCBiaXQgaW50ZWdlciB0eXBlcw0KK3doaWNoIGhhdmUgdGhlIG5hbWUgc3VmZml4ZXMgYF80YCwgYF80dWAsIGBfOGAgYW5kIGBfOHVgLiBUaGUgc2VtYW50aWNzIG9mIGVhY2ggb2YgdGhlIGZ1bmN0aW9ucyBpcyB0aGUgc2FtZSwNCitzbyB0aGV5IGFyZSBvbmx5IGRlc2NyaWJlZCBvbmNlLg0KKw0KK1N0YXRpYyBsb29wIHNjaGVkdWxpbmcgaXMgaGFuZGxlZCBieSAgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQgYW5kIGZyaWVuZHMuIE9ubHkgYSBzaW5nbGUgY2FsbCBpcyBuZWVkZWQsDQorc2luY2UgdGhlIGl0ZXJhdGlvbnMgdG8gYmUgZXhlY3V0ZWQgYnkgYW55IGdpdmUgdGhyZWFkIGNhbiBiZSBkZXRlcm1pbmVkIGFzIHNvb24gYXMgdGhlIGxvb3AgcGFyYW1ldGVycyBhcmUga25vd24uDQorDQorRHluYW1pYyBzY2hlZHVsaW5nIGlzIGhhbmRsZWQgYnkgdGhlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCBhbmQgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80IGZ1bmN0aW9ucy4gDQorVGhlIGluaXQgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgaW4gZWFjaCB0aHJlYWQgb3V0c2lkZSB0aGUgbG9vcCwgd2hpbGUgdGhlIG5leHQgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2gNCit0aW1lIHRoYXQgdGhlIHByZXZpb3VzIGNodW5rIG9mIHdvcmsgaGFzIGJlZW4gZXhoYXVzdGVkLiANCisNCitAZGVmZ3JvdXAgU1lOQ0hST05JWkFUSU9OIFN5bmNocm9uaXphdGlvbg0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIGJhcnJpZXJzLg0KKw0KK0BkZWZncm91cCBUSFJFQURQUklWQVRFIFRocmVhZCBwcml2YXRlIGRhdGEgc3VwcG9ydA0KK1RoZXNlIGZ1bmN0aW9ucyBzdXBwb3J0IGNvcHlpbi9vdXQgYW5kIHRocmVhZCBwcml2YXRlIGRhdGEuDQorDQorQGRlZmdyb3VwIFNUQVRTX0dBVEhFUklORyBTdGF0aXN0aWNzIEdhdGhlcmluZyBmcm9tIE9NUFRCDQorVGhlc2UgbWFjcm9zIHN1cHBvcnQgcHJvZmlsaW5nIHRoZSBsaWJvbXAgbGlicmFyeS4gIFVzZSAtLXN0YXRzPW9uIHdoZW4gYnVpbGRpbmcgd2l0aCBidWlsZC5wbCB0byBlbmFibGUNCithbmQgdGhlbiB1c2UgdGhlIEtNUF8qIG1hY3JvcyB0byBwcm9maWxlICh0aHJvdWdoIGNvdW50cyBvciBjbG9jayB0aWNrcykgbGlib21wIGR1cmluZyBleGVjdXRpb24gb2YgYW4gT3Blbk1QIHByb2dyYW0uDQorDQorQHNlY3Rpb24gc2VjX3N0YXRzX2Vudl92YXJzIEVudmlyb25tZW50IFZhcmlhYmxlcw0KKw0KK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxldmFudCB0byBzdGF0cy1nYXRoZXJpbmcgaW4gbGlib21wDQorDQorQGNvZGUNCitLTVBfU1RBVFNfRklMRQ0KK0BlbmRjb2RlDQorVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdG8gYW4gb3V0cHV0IGZpbGVuYW1lIHRoYXQgd2lsbCBiZSBhcHBlbmRlZCAqTk9UIE9WRVJXUklUVEVOKiBpZiBpdCBleGlzdHMuICBJZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlIHN0YXRpc3RpY3Mgd2lsbCBiZSBvdXRwdXQgdG8gc3RkZXJyDQorDQorQGNvZGUNCitLTVBfU1RBVFNfVEhSRUFEUw0KK0BlbmRjb2RlDQorVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbmRpY2F0ZXMgdG8gcHJpbnQgdGhyZWFkLXNwZWNpZmljIHN0YXRpc3RpY3MgYXMgd2VsbCBhcyBhZ2dyZWdhdGUgc3RhdGlzdGljcy4gIEVhY2ggdGhyZWFkJ3Mgc3RhdGlzdGljcyB3aWxsIGJlIHNob3duIGFzIHdlbGwgYXMgdGhlIGNvbGxlY3RpdmUgc3VtIG9mIGFsbCB0aHJlYWRzLiAgVGhlIHZhbHVlcyAidHJ1ZSIsICJvbiIsICIxIiwgInllcyIgd2lsbCBhbGwgaW5kaWNhdGUgdG8gcHJpbnQgcGVyIHRocmVhZCBzdGF0aXN0aWNzLg0KKw0KK0BkZWZncm91cCBUQVNLSU5HIFRhc2tpbmcgc3VwcG9ydA0KK1RoZXNlIGZ1bmN0aW9ucyBzdXBwb3J0IHRhc2tpbmcgY29uc3RydWN0cy4NCisNCitAZGVmZ3JvdXAgVVNFUiBVc2VyIHZpc2libGUgZnVuY3Rpb25zDQorVGhlc2UgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXIsIGJ1dCBhcmUgcnVudGltZSBsaWJyYXJ5IHNwZWNpZmljLCByYXRoZXIgdGhhbiBiZWluZyBPcGVuTVAgaW50ZXJmYWNlcy4NCisNCisqLw0KKw0KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9DTWFrZUxpc3RzLnR4dCBiL3JjMy9ydW50aW1lL3NyYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFhNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzMyIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgQ29uZmlndXJlIG9tcC5oLCBrbXBfY29uZmlnLmggYW5kIG9tcHQuaCBpZiBuZWNlc3NhcnkKK2NvbmZpZ3VyZV9maWxlKCR7TElCT01QX0lOQ19ESVJ9L29tcC5oLnZhciBvbXAuaCBAT05MWSkKK2NvbmZpZ3VyZV9maWxlKGttcF9jb25maWcuaC5jbWFrZSBrbXBfY29uZmlnLmggQE9OTFkpCitpZigke0xJQk9NUF9PTVBUX1NVUFBPUlR9KQorICBjb25maWd1cmVfZmlsZSgke0xJQk9NUF9JTkNfRElSfS9vbXB0LmgudmFyIG9tcHQuaCBAT05MWSkKK2VuZGlmKCkKKworIyBHZW5lcmF0ZSBtZXNzYWdlIGNhdGFsb2cgZmlsZXM6IGttcF9pMThuX2lkLmluYyBhbmQga21wX2kxOG5fZGVmYXVsdC5pbmMKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUICBrbXBfaTE4bl9pZC5pbmMKKyAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9tZXNzYWdlLWNvbnZlcnRlci5wbCAtLW9zPSR7TElCT01QX1BFUkxfU0NSSVBUX09TfQorICAgIC0tcHJlZml4PWttcF9pMThuIC0tZW51bT1rbXBfaTE4bl9pZC5pbmMgJHtMSUJPTVBfU1JDX0RJUn0vaTE4bi9lbl9VUy50eHQKKyAgREVQRU5EUyAke0xJQk9NUF9TUkNfRElSfS9pMThuL2VuX1VTLnR4dCAke0xJQk9NUF9UT09MU19ESVJ9L21lc3NhZ2UtY29udmVydGVyLnBsCispCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCAga21wX2kxOG5fZGVmYXVsdC5pbmMKKyAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9tZXNzYWdlLWNvbnZlcnRlci5wbCAtLW9zPSR7TElCT01QX1BFUkxfU0NSSVBUX09TfQorICAgIC0tcHJlZml4PWttcF9pMThuIC0tZGVmYXVsdD1rbXBfaTE4bl9kZWZhdWx0LmluYyAke0xJQk9NUF9TUkNfRElSfS9pMThuL2VuX1VTLnR4dAorICBERVBFTkRTICR7TElCT01QX1NSQ19ESVJ9L2kxOG4vZW5fVVMudHh0ICR7TElCT01QX1RPT0xTX0RJUn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwKKykKKworIyBTZXQgdGhlIC1EIGRlZmluaXRpb25zIGZvciBhbGwgc291cmNlcworIyBVTklDT0RFIGFuZCBfVU5JQ09ERSBhcmUgc2V0IGluIExMVk0ncyBDTWFrZSBzeXN0ZW0uICBUaGV5IGFmZmVjdCB0aGUKKyMgaXR0bm90aWZ5IGNvZGUgYW5kIHNob3VsZCBvbmx5IGJlIHNldCB3aGVuIGNvbXBpbGluZyBpdHRub3RpZnlfc3RhdGljLmMKKyMgb24gV2luZG93cyAoZG9uZSBiZWxvdykuCisjIFRPRE86IEZpeCB0aGUgVU5JQ09ERSB1c2FnZSBpbiBpdHRub3RpZnkgY29kZSBmb3IgV2luZG93cy4KK3JlbW92ZV9kZWZpbml0aW9ucygtRFVOSUNPREUgLURfVU5JQ09ERSkKK2xpYm9tcF9nZXRfZGVmaW5pdGlvbnNfZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfREVGSU5JVElPTlNfRkxBR1MpCithZGRfZGVmaW5pdGlvbnMoJHtMSUJPTVBfQ09ORklHVVJFRF9ERUZJTklUSU9OU19GTEFHU30pCisKKyMgU2V0IHRoZSAtSSBpbmNsdWRlcyBmb3IgYWxsIHNvdXJjZXMKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAke0xJQk9NUF9TUkNfRElSfQorICAke0xJQk9NUF9TUkNfRElSfS9pMThuCisgICR7TElCT01QX0lOQ19ESVJ9CisgICR7TElCT01QX1NSQ19ESVJ9L3RoaXJkcGFydHkvaXR0bm90aWZ5CispCitpZigke0xJQk9NUF9VU0VfSFdMT0N9KQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9pbmNsdWRlKQorZW5kaWYoKQorCisjIEdldHRpbmcgY29ycmVjdCBzb3VyY2UgZmlsZXMgdG8gYnVpbGQgbGlicmFyeQorc2V0KExJQk9NUF9DRklMRVMpCitzZXQoTElCT01QX0NYWEZJTEVTKQorc2V0KExJQk9NUF9BU01GSUxFUykKK2lmKCR7U1RVQlNfTElCUkFSWX0pCisgIHNldChMSUJPTVBfQ0ZJTEVTIGttcF9zdHViLmNwcCkKK2Vsc2UoKQorICAjIEdldCBDKysgZmlsZXMKKyAgc2V0KExJQk9NUF9DWFhGSUxFUworICAgIGttcF9hbGxvYy5jcHAKKyAgICBrbXBfYXRvbWljLmNwcAorICAgIGttcF9jc3VwcG9ydC5jcHAKKyAgICBrbXBfZGVidWcuY3BwCisgICAga21wX2l0dC5jcHAKKyAgICBrbXBfZW52aXJvbm1lbnQuY3BwCisgICAga21wX2Vycm9yLmNwcAorICAgIGttcF9nbG9iYWwuY3BwCisgICAga21wX2kxOG4uY3BwCisgICAga21wX2lvLmNwcAorICAgIGttcF9ydW50aW1lLmNwcAorICAgIGttcF9zZXR0aW5ncy5jcHAKKyAgICBrbXBfc3RyLmNwcAorICAgIGttcF90YXNraW5nLmNwcAorICAgIGttcF90YXNrcS5jcHAKKyAgICBrbXBfdGhyZWFkcHJpdmF0ZS5jcHAKKyAgICBrbXBfdXRpbGl0eS5jcHAKKyAgICBrbXBfYmFycmllci5jcHAKKyAgICBrbXBfd2FpdF9yZWxlYXNlLmNwcAorICAgIGttcF9hZmZpbml0eS5jcHAKKyAgICBrbXBfZGlzcGF0Y2guY3BwCisgICAga21wX2xvY2suY3BwCisgICAga21wX3NjaGVkLmNwcAorICApCisgIGlmKFdJTjMyKQorICAgICMgV2luZG93cyBzcGVjaWZpYyBmaWxlcworICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIHpfV2luZG93c19OVF91dGlsLmNwcCkKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyB6X1dpbmRvd3NfTlQtNTg2X3V0aWwuY3BwKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0FTTUZJTEVTIHpfV2luZG93c19OVC01ODZfYXNtLmFzbSkgIyBXaW5kb3dzIGFzc2VtYmx5IGZpbGUKKyAgZWxzZSgpCisgICAgIyBVbml4IHNwZWNpZmljIGZpbGVzCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMgel9MaW51eF91dGlsLmNwcCkKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyBrbXBfZ3N1cHBvcnQuY3BwKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0FTTUZJTEVTIHpfTGludXhfYXNtLnMpICMgVW5peCBhc3NlbWJseSBmaWxlCisgIGVuZGlmKCkKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIHRoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYyBMSUJPTVBfVVNFX0lUVF9OT1RJRlkpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF9kZWJ1Z2dlci5jcHAgTElCT01QX1VTRV9ERUJVR0dFUikKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMga21wX3N0YXRzLmNwcCBMSUJPTVBfU1RBVFMpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF9zdGF0c190aW1pbmcuY3BwIExJQk9NUF9TVEFUUykKKyAgaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgNDAgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDQwKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF90YXNrZGVwcy5jcHApCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMga21wX2NhbmNlbC5jcHApCisgIGVuZGlmKCkKK2VuZGlmKCkKKyMgRmlsZXMgY29tbW9uIHRvIHN0dWJzIGFuZCBub3JtYWwgbGlicmFyeQorbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMga21wX2Z0bl9jZGVjbC5jcHApCitsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyBrbXBfZnRuX2V4dHJhLmNwcCkKK2xpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF92ZXJzaW9uLmNwcCkKK2xpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIG9tcHQtZ2VuZXJhbC5jcHAgSUZfVFJVRSBMSUJPTVBfT01QVF9TVVBQT1JUKQorbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMgdHNhbl9hbm5vdGF0aW9ucy5jcHAgSUZfVFJVRSBMSUJPTVBfVFNBTl9TVVBQT1JUKQorCitzZXQoTElCT01QX1NPVVJDRV9GSUxFUyAke0xJQk9NUF9DRklMRVN9ICR7TElCT01QX0NYWEZJTEVTfSAke0xJQk9NUF9BU01GSUxFU30pCisjIEZvciBXaW5kb3dzLCB0aGVyZSBpcyBhIHJlc291cmNlIGZpbGUgKC5yYyAtPiAucmVzKSB0aGF0IGlzIGFsc28gY29tcGlsZWQKK2xpYm9tcF9hcHBlbmQoTElCT01QX1NPVVJDRV9GSUxFUyBsaWJvbXAucmMgV0lOMzIpCisKKyMgR2V0IGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIgZmxhZ3MKK2xpYm9tcF9nZXRfY2ZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0NGTEFHUykKK2xpYm9tcF9nZXRfY3h4ZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfQ1hYRkxBR1MpCitsaWJvbXBfZ2V0X2FzbWZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0FTTUZMQUdTKQorIyBTZXQgdGhlIGNvbXBpbGVyIGZsYWdzIGZvciBlYWNoIHR5cGUgb2Ygc291cmNlCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtMSUJPTVBfQ0ZJTEVTfSBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIiR7TElCT01QX0NPTkZJR1VSRURfQ0ZMQUdTfSIpCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtMSUJPTVBfQ1hYRklMRVN9IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiJHtMSUJPTVBfQ09ORklHVVJFRF9DWFhGTEFHU30iKQorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7TElCT01QX0FTTUZJTEVTfSBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIiR7TElCT01QX0NPTkZJR1VSRURfQVNNRkxBR1N9IikKKyMgTGV0IHRoZSBjb21waWxlciBoYW5kbGUgdGhlIGFzc2VtYmx5IGZpbGVzIG9uIFVuaXgtbGlrZSBzeXN0ZW1zCitpZihOT1QgV0lOMzIpCisgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0xJQk9NUF9BU01GSUxFU30gUFJPUEVSVElFUyBMQU5HVUFHRSBDKQorZW5kaWYoKQorCisjIFJlbW92ZSBhbnkgY21ha2UtYXV0b21hdGljIGxpbmtpbmcgb2YgdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5LgorIyBXZSBuZWl0aGVyIG5lZWQgKG5vciB3YW50KSB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkgZGVwZW5kZW5jeSBldmVuIHRob3VnaCB3ZSBjb21waWxlIGMrKyBmaWxlcy4KK2lmKE5PVCAke0xJQk9NUF9VU0VfU1REQ1BQTElCfSkKKyAgc2V0KExJQk9NUF9MSU5LRVJfTEFOR1VBR0UgQykKKyAgc2V0KENNQUtFX0NYWF9JTVBMSUNJVF9MSU5LX0xJQlJBUklFUykKK2Vsc2UoKQorICBzZXQoTElCT01QX0xJTktFUl9MQU5HVUFHRSBDWFgpCitlbmRpZigpCisKKyMgQWRkIHRoZSBPcGVuTVAgbGlicmFyeQorbGlib21wX2dldF9sZGZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0xERkxBR1MpCisKK2FkZF9saWJyYXJ5KG9tcCAke0xJQk9NUF9MSUJSQVJZX0tJTkR9ICR7TElCT01QX1NPVVJDRV9GSUxFU30pCisKK3NldF90YXJnZXRfcHJvcGVydGllcyhvbXAgUFJPUEVSVElFUworICBQUkVGSVggIiIgU1VGRklYICIiIE9VVFBVVF9OQU1FICIke0xJQk9NUF9MSUJfRklMRX0iCisgIExJTktfRkxBR1MgIiR7TElCT01QX0NPTkZJR1VSRURfTERGTEFHU30iCisgIExJTktFUl9MQU5HVUFHRSAke0xJQk9NUF9MSU5LRVJfTEFOR1VBR0V9CispCisKKyMgR2V0IHRoZSBsaWJyYXJ5J3MgbG9jYXRpb24gd2l0aGluIHRoZSBidWlsZCB0cmVlIGZvciB0aGUgdW5pdCB0ZXN0ZXIKK2lmKE5PVCBXSU4zMikKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfTElCUkFSWV9ESVIgb21wIExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSkKK2Vsc2UoKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9MSUJSQVJZX0RJUiBvbXAgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZKQorZW5kaWYoKQoraWYoTk9UIExJQk9NUF9MSUJSQVJZX0RJUikKKyAgc2V0KExJQk9NUF9MSUJSQVJZX0RJUiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisgIHNldChMSUJPTVBfTElCUkFSWV9ESVIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IFBBUkVOVF9TQ09QRSkKK2Vsc2UoKQorICBzZXQoTElCT01QX0xJQlJBUllfRElSICR7TElCT01QX0xJQlJBUllfRElSfSBQQVJFTlRfU0NPUEUpCitlbmRpZigpCisKKyMgQWRkIHN5bWJvbGljIGxpbmtzIHRvIGxpYm9tcAoraWYoTk9UIFdJTjMyKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIG9tcCBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNyZWF0ZV9zeW1saW5rICR7TElCT01QX0xJQl9GSUxFfQorICAgICAgbGliZ29tcCR7TElCT01QX0xJQlJBUllfU1VGRklYfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjcmVhdGVfc3ltbGluayAke0xJQk9NUF9MSUJfRklMRX0KKyAgICAgIGxpYmlvbXA1JHtMSUJPTVBfTElCUkFSWV9TVUZGSVh9CisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtMSUJPTVBfTElCUkFSWV9ESVJ9CisgICkKK2VuZGlmKCkKKworIyBMaW5raW5nIGNvbW1hbmQgd2lsbCBpbmNsdWRlIGxpYnJhcmllcyBpbiBMSUJPTVBfQ09ORklHVVJFRF9MSUJGTEFHUworbGlib21wX2dldF9saWJmbGFncyhMSUJPTVBfQ09ORklHVVJFRF9MSUJGTEFHUykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhvbXAgJHtMSUJPTVBfQ09ORklHVVJFRF9MSUJGTEFHU30gJHtDTUFLRV9ETF9MSUJTfSkKKworIyBDcmVhdGUgKi5pbmMgYmVmb3JlIGNvbXBpbGluZyBhbnkgc291cmNlcworIyBvYmplY3RzIGRlcGVuZCBvbiA6IC5pbmMgZmlsZXMKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC1uZWVkZWQtaGVhZGVycyBERVBFTkRTIGttcF9pMThuX2lkLmluYyBrbXBfaTE4bl9kZWZhdWx0LmluYykKK2FkZF9kZXBlbmRlbmNpZXMob21wIGxpYm9tcC1uZWVkZWQtaGVhZGVycykKKworIyBXaW5kb3dzIHNwZWNpZmljIGJ1aWxkIHJ1bGVzCitpZihXSU4zMikKKyAgY29uZmlndXJlX2ZpbGUobGlib21wLnJjLnZhciBsaWJvbXAucmMgQE9OTFkpCisKKyAgIyBDcmVhdGUgLmRlZiBhbmQgLnJjIGZpbGUgYmVmb3JlIGNvbXBpbGluZyBhbnkgc291cmNlcworICBhZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtbmVlZGVkLXdpbmRvd3MtZmlsZXMgREVQRU5EUyAke0xJQk9NUF9MSUJfTkFNRX0uZGVmKQorICBhZGRfZGVwZW5kZW5jaWVzKG9tcCBsaWJvbXAtbmVlZGVkLXdpbmRvd3MtZmlsZXMpCisgICMgel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtIHJlcXVpcmVzIGRlZmluaXRpb25zIHRvIGJlIHNlbnQgdmlhIGNvbW1hbmQgbGluZQorICAjIEl0IG9ubHkgbmVlZHMgdGhlIGFyY2hpdGVjdXRyZSBtYWNybyBhbmQgT01QVF9TVVBQT1JUPTB8MQorICBsaWJvbXBfYXBwZW5kKExJQk9NUF9NQVNNX0RFRklOSVRJT05TICItRF9NX0lBMzIiIElGX1RSVUUgSUEzMikKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfTUFTTV9ERUZJTklUSU9OUyAiLURfTV9BTUQ2NCIgSUZfVFJVRSBJTlRFTDY0KQorICBsaWJvbXBfYXBwZW5kKExJQk9NUF9NQVNNX0RFRklOSVRJT05TICItRE9NUFRfU1VQUE9SVCIgSUZfVFJVRV8xXzAgTElCT01QX09NUFRfU1VQUE9SVCkKKyAgbGlib21wX2xpc3RfdG9fc3RyaW5nKCIke0xJQk9NUF9NQVNNX0RFRklOSVRJT05TfSIgTElCT01QX01BU01fREVGSU5JVElPTlMpCisgIHNldF9wcm9wZXJ0eShTT1VSQ0Ugel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtIEFQUEVORF9TVFJJTkcgUFJPUEVSVFkgQ09NUElMRV9GTEFHUyAiICR7TElCT01QX01BU01fREVGSU5JVElPTlN9IikKKyAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKHRoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYyBQUk9QRVJUSUVTIENPTVBJTEVfREVGSU5JVElPTlMgIlVOSUNPREUiKQorCisgICMgQ3JlYXRlIFdpbmRvd3MgaW1wb3J0IGxpYnJhcnkKKyAgIyB0aGUgaW1wb3J0IGxpYnJhcnkgaXMgInJlLWxpbmtlZCIgdG8gaW5jbHVkZSBrbXBfaW1wb3J0LmNwcCB3aGljaCBwcmV2ZW50cworICAjIGxpbmtpbmcgb2YgYm90aCBWaXN1YWwgU3R1ZGlvIE9wZW5NUCBhbmQgbmV3bHkgYnVpbHQgT3Blbk1QCisgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhrbXBfaW1wb3J0LmNwcCBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIiR7TElCT01QX0NPTkZJR1VSRURfQ0ZMQUdTfSIpCisgIHNldChMSUJPTVBfSU1QX0xJQl9GSUxFICR7TElCT01QX0xJQl9OQU1FfSR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfSkKKyAgc2V0KExJQk9NUF9HRU5FUkFURURfSU1QX0xJQl9GSUxFTkFNRSAke0xJQk9NUF9MSUJfRklMRX0ke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0pCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhvbXAgUFJPUEVSVElFUworICAgIFZFUlNJT04gJHtMSUJPTVBfVkVSU0lPTl9NQUpPUn0uJHtMSUJPTVBfVkVSU0lPTl9NSU5PUn0gIyB1c2VzIC92ZXJzaW9uIGZsYWcKKyAgICBJTVBPUlRfUFJFRklYICIiIElNUE9SVF9TVUZGSVggIiIgIyBjb250cm9sIGdlbmVyYXRlZCBpbXBvcnQgbGlicmFyeSBuYW1lIHdoZW4gYnVpbGRpbmcgb21wCisgICAgQVJDSElWRV9PVVRQVVRfTkFNRSAke0xJQk9NUF9HRU5FUkFURURfSU1QX0xJQl9GSUxFTkFNRX0KKyAgKQorICAjIEdldCBnZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkgZnJvbSBjcmVhdGluZyBvbXAKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfSU1QT1JUX0xJQl9ESVJFQ1RPUlkgb21wIEFSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSkKKyAgaWYoTElCT01QX0lNUE9SVF9MSUJfRElSRUNUT1JZKQorICAgIHNldChMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUIgJHtMSUJPTVBfSU1QT1JUX0xJQl9ESVJFQ1RPUll9LyR7TElCT01QX0dFTkVSQVRFRF9JTVBfTElCX0ZJTEVOQU1FfSkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9HRU5FUkFURURfSU1QX0xJQiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJfRklMRU5BTUV9KQorICBlbmRpZigpCisgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0xJQk9NUF9HRU5FUkFURURfSU1QX0xJQn0gUFJPUEVSVElFUyBHRU5FUkFURUQgVFJVRSBFWFRFUk5BTF9PQkpFQ1QgVFJVRSkKKyAgIyBDcmVhdGUgbmV3IGltcG9ydCBsaWJyYXJ5IHRoYXQgaXMganVzdCB0aGUgcHJldmlvdXNseSBjcmVhdGVkIG9uZSArIGttcF9pbXBvcnQuY3BwCisgIGFkZF9saWJyYXJ5KG9tcGltcCBTVEFUSUMgJHtMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJ9IGttcF9pbXBvcnQuY3BwKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMob21waW1wIFBST1BFUlRJRVMKKyAgICBQUkVGSVggIiIgU1VGRklYICIiIE9VVFBVVF9OQU1FICIke0xJQk9NUF9JTVBfTElCX0ZJTEV9IgorICAgIExJTktFUl9MQU5HVUFHRSBDCisgICkKKyAgYWRkX2RlcGVuZGVuY2llcyhvbXBpbXAgb21wKSAjIGVuc3VyZSBnZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkgaXMgY3JlYXRlZCBmaXJzdAorCisgICMgQ3JlYXRlIGRlZiBmaWxlIHRvIGRlc2lnbmF0ZSBleHBvcnRlZCBmdW5jdGlvbnMKKyAgbGlib21wX2dldF9nZGZsYWdzKExJQk9NUF9HREZMQUdTKSAjIGdlbmVyYXRlLWRlZi5wbCBmbGFncyAoV2luZG93cyBvbmx5KQorICBsaWJvbXBfc3RyaW5nX3RvX2xpc3QoIiR7TElCT01QX0dERkxBR1N9IiBMSUJPTVBfR0RGTEFHUykKKyAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAgJHtMSUJPTVBfTElCX05BTUV9LmRlZgorICAgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vZ2VuZXJhdGUtZGVmLnBsICR7TElCT01QX0dERkxBR1N9CisgICAgICAtbyAke0xJQk9NUF9MSUJfTkFNRX0uZGVmICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kbGxleHBvcnRzCisgICAgREVQRU5EUyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZGxsZXhwb3J0cyAke0xJQk9NUF9UT09MU19ESVJ9L2dlbmVyYXRlLWRlZi5wbAorICApCitlbmRpZigpCisKKyMgQnVpbGRpbmcgdGhlIEZvcnRyYW4gbW9kdWxlIGZpbGVzCisjIE9uZSBjb21waWxhdGlvbiBzdGVwIGNyZWF0ZXMgYm90aCBvbXBfbGliLm1vZCBhbmQgb21wX2xpYl9raW5kcy5tb2QKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGNvbmZpZ3VyZV9maWxlKCR7TElCT01QX0lOQ19ESVJ9L29tcF9saWIuaC52YXIgb21wX2xpYi5oIEBPTkxZKQorICBjb25maWd1cmVfZmlsZSgke0xJQk9NUF9JTkNfRElSfS9vbXBfbGliLmYudmFyIG9tcF9saWIuZiBAT05MWSkKKyAgY29uZmlndXJlX2ZpbGUoJHtMSUJPTVBfSU5DX0RJUn0vb21wX2xpYi5mOTAudmFyIG9tcF9saWIuZjkwIEBPTkxZKQorICBhZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtbW9kIEFMTCBERVBFTkRTIG9tcF9saWIubW9kIG9tcF9saWJfa2luZHMubW9kKQorICBsaWJvbXBfZ2V0X2ZmbGFncyhMSUJPTVBfQ09ORklHVVJFRF9GRkxBR1MpCisgIGlmKENNQUtFX0ZvcnRyYW5fQ09NUElMRVJfU1VQUE9SVFNfRjkwKQorICAgIHNldChMSUJPTVBfRk9SVFJBTl9TT1VSQ0VfRklMRSBvbXBfbGliLmY5MCkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9GT1JUUkFOX1NPVVJDRV9GSUxFIG9tcF9saWIuZikKKyAgZW5kaWYoKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUIG9tcF9saWIubW9kIG9tcF9saWJfa2luZHMubW9kCisgICAgQ09NTUFORCAke0NNQUtFX0ZvcnRyYW5fQ09NUElMRVJ9IC1jICR7TElCT01QX0NPTkZJR1VSRURfRkZMQUdTfSAke0xJQk9NUF9GT1JUUkFOX1NPVVJDRV9GSUxFfQorICAgIERFUEVORFMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7TElCT01QX0ZPUlRSQU5fU09VUkNFX0ZJTEV9CisgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vb21wX2xpYi5oCisgICkKKyAgc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIG9tcF9saWIke0NNQUtFX0NfT1VUUFVUX0VYVEVOU0lPTn0pCitlbmRpZigpCisKKyMgTW92ZSBmaWxlcyB0byBleHBvcnRzLyBkaXJlY3RvcnkgaWYgcmVxdWVzdGVkCitpZigke0xJQk9NUF9DT1BZX0VYUE9SVFN9KQorICBpbmNsdWRlKExpYm9tcEV4cG9ydHMpCitlbmRpZigpCisKKyMgTWljcm8gdGVzdCBydWxlcyBmb3IgYWZ0ZXIgbGlicmFyeSBoYXMgYmVlbiBidWlsdCAoY21ha2UvTGlib21wTWljcm9UZXN0cy5jbWFrZSkKK2luY2x1ZGUoTGlib21wTWljcm9UZXN0cykKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC1taWNyby10ZXN0cykKK2lmKE5PVCAke01JQ30gQU5EIE5PVCBDTUFLRV9DUk9TU0NPTVBJTElORykKKyAgYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtdG91Y2gpCitlbmRpZigpCitpZihOT1QgV0lOMzIgQU5EIE5PVCBBUFBMRSkKKyAgYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtcmVsbykKK2VuZGlmKCkKK2lmKE5PVCBXSU4zMiBBTkQgTk9UIEFQUExFKQorICBhZGRfZGVwZW5kZW5jaWVzKGxpYm9tcC1taWNyby10ZXN0cyBsaWJvbXAtdGVzdC1leGVjc3RhY2spCitlbmRpZigpCitpZigke01JQ30pCisgIGFkZF9kZXBlbmRlbmNpZXMobGlib21wLW1pY3JvLXRlc3RzIGxpYm9tcC10ZXN0LWluc3RyKQorZW5kaWYoKQorYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtZGVwcykKKworIyBJbnN0YWxsIHJ1bGVzCisjIFdlIHdhbnQgdG8gaW5zdGFsbCBsaWJvbXAgaW4gREVTVERJUi9DTUFLRV9JTlNUQUxMX1BSRUZJWC9saWIKKyMgV2Ugd2FudCB0byBpbnN0YWxsIGhlYWRlcnMgaW4gREVTVERJUi9DTUFLRV9JTlNUQUxMX1BSRUZJWC9pbmNsdWRlCitpZigke0xJQk9NUF9TVEFOREFMT05FX0JVSUxEfSkKKyAgc2V0KExJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSCBpbmNsdWRlKQorZWxzZSgpCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiWzAtOV0rXFwuWzAtOV0rKFxcLlswLTldKyk/IiBDTEFOR19WRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfSkKKyAgc2V0KExJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSCBsaWIke0xJQk9NUF9MSUJESVJfU1VGRklYfS9jbGFuZy8ke0NMQU5HX1ZFUlNJT059L2luY2x1ZGUpCitlbmRpZigpCitpZihXSU4zMikKKyAgaW5zdGFsbChUQVJHRVRTIG9tcCBSVU5USU1FIERFU1RJTkFUSU9OIGJpbikKKyAgaW5zdGFsbChUQVJHRVRTIG9tcGltcCBBUkNISVZFIERFU1RJTkFUSU9OIGxpYiR7TElCT01QX0xJQkRJUl9TVUZGSVh9KQorICAjIENyZWF0ZSBhbGlhc2VzIChyZWd1bGFyIGNvcGllcykgb2YgdGhlIGxpYnJhcnkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgIHNldChMSUJPTVBfQUxJQVNFUyAibGliaW9tcDVtZCIpCisgIGZvcmVhY2goYWxpYXMgSU4gTElTVFMgTElCT01QX0FMSUFTRVMpCisgICAgaW5zdGFsbChDT0RFICJleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCBcIlwke0NNQUtFX0NPTU1BTkR9XCIgLUUgY29weSBcIiR7TElCT01QX0xJQl9GSUxFfVwiCisgICAgICBcIiR7YWxpYXN9JHtMSUJPTVBfTElCUkFSWV9TVUZGSVh9XCIgV09SS0lOR19ESVJFQ1RPUlkgXCR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2JpbikiKQorICAgIGluc3RhbGwoQ09ERSAiZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgXCJcJHtDTUFLRV9DT01NQU5EfVwiIC1FIGNvcHkgXCIke0xJQk9NUF9JTVBfTElCX0ZJTEV9XCIKKyAgICAgIFwiJHthbGlhc30ke0xJQk9NUF9MSUJSQVJZX1NVRkZJWH1cIiBXT1JLSU5HX0RJUkVDVE9SWSBcJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliJHtMSUJPTVBfTElCRElSX1NVRkZJWH0pIikKKyAgZW5kZm9yZWFjaCgpCitlbHNlKCkKKworICBpbnN0YWxsKFRBUkdFVFMgb21wICR7TElCT01QX0lOU1RBTExfS0lORH0gREVTVElOQVRJT04gbGliJHtMSUJPTVBfTElCRElSX1NVRkZJWH0pCisKKyAgaWYoJHtMSUJPTVBfSU5TVEFMTF9BTElBU0VTfSkKKyAgICAjIENyZWF0ZSBhbGlhc2VzIChzeW1saW5rcykgb2YgdGhlIGxpYnJhcnkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgc2V0KExJQk9NUF9BTElBU0VTICJsaWJnb21wO2xpYmlvbXA1IikKKyAgICBmb3JlYWNoKGFsaWFzIElOIExJU1RTIExJQk9NUF9BTElBU0VTKQorICAgICAgaW5zdGFsbChDT0RFICJleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCBcIlwke0NNQUtFX0NPTU1BTkR9XCIgLUUgY3JlYXRlX3N5bWxpbmsgXCIke0xJQk9NUF9MSUJfRklMRX1cIgorICAgICAgICBcIiR7YWxpYXN9JHtMSUJPTVBfTElCUkFSWV9TVUZGSVh9XCIgV09SS0lOR19ESVJFQ1RPUlkKKyAgICAgICAgXCRFTlZ7REVTVERJUn1cJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliJHtMSUJPTVBfTElCRElSX1NVRkZJWH0pIikKKyAgICBlbmRmb3JlYWNoKCkKKyAgZW5kaWYoKQorZW5kaWYoKQoraW5zdGFsbCgKKyAgRklMRVMKKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcC5oCisgIERFU1RJTkFUSU9OICR7TElCT01QX0hFQURFUlNfSU5TVEFMTF9QQVRIfQorKQoraWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vb21wdC5oIERFU1RJTkFUSU9OICR7TElCT01QX0hFQURFUlNfSU5TVEFMTF9QQVRIfSkKK2VuZGlmKCkKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGluc3RhbGwoRklMRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vb21wX2xpYi5oCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcF9saWIubW9kCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcF9saWJfa2luZHMubW9kCisgICAgREVTVElOQVRJT04gJHtMSUJPTVBfSEVBREVSU19JTlNUQUxMX1BBVEh9CisgICkKK2VuZGlmKCkKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2RsbGV4cG9ydHMgYi9yYzMvcnVudGltZS9zcmMvZGxsZXhwb3J0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTVhOWVmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2RsbGV4cG9ydHMKQEAgLTAsMCArMSwxMTc0IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgRGVwcmVjYXRlZCBlbnRyeSBwb2ludHMgKG51bWJlcnMgYXJlIHJlc2VydmVkKToKKy0gX19rbXBjX2JhcnJpZXJfcmVkdWNlX21hc3RlciAgICAgICAgICAgICAgMTA5CistIF9fa21wY19lbmRfYmFycmllcl9yZWR1Y2VfbWFzdGVyICAgICAgICAgIDEyMgorLSBfX2ttcGNfZm9yX2luaXRfNCAgICAgICAgICAgICAgICAgICAgICAgICAxMzEKKy0gX19rbXBjX2Zvcl9pbml0XzggICAgICAgICAgICAgICAgICAgICAgICAgMTMyCistIF9fa21wY19mb3JfbmV4dF80ICAgICAgICAgICAgICAgICAgICAgICAgIDEzMworLSBfX2ttcGNfZm9yX25leHRfOCAgICAgICAgICAgICAgICAgICAgICAgICAxMzQKKy0gX19rbXBjX2ZvcmtfY2FsbF9ib3VuZCAgICAgICAgICAgICAgICAgICAgMTM5CistIF9fa21wY19yZWR1Y2VfbWFzdGVyX25vd2FpdCAgICAgICAgICAgICAgIDE0OQorLSBfX2ttcGNfb21wX3Rhc2tfYmVnaW4gICAgICAgICAgICAgICAgICAgICAxOTQKKy0gX19rbXBjX29tcF90YXNrX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgMTk1CistIGttcGNfc2hhcmFibGVfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgIDIxOAorLSBrbXBjX3NoYXJhYmxlX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAyMTkKKy0ga21wY19zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgMjIwCistIGttcGNfc2hhcmFibGVfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgIDIyMQorLSBrbXBjX2FsaWduZWRfc2hhcmFibGVfbWFsbG9jICAgICAgICAgICAgICAyMjMKKy0gbXBhaTRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAwCistIG1wYWk4YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMQorLSBtcGFyNGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDIKKy0gbXBhcjhhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAzCistIG1wYXg0eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNAorLSBtcGF4OHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDUKKy0gbXBvYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA2CistIG1wb2ViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNworLSBtcG9mb3JrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDgKKy0gbXBvZnJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA5CistIG1wb2pvaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMAorLSBtcG94YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTEKKy0gbXBwYWRqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyCistIG1wcGFmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMworLSBtcHBiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTQKKy0gbXBwYmVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE1CistIG1wcGRlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNgorLSBtcHBkbnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTcKKy0gbXBwZG54ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE4CistIG1wcGRvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxOQorLSBtcHBkeG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjAKKy0gbXBwZWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIxCistIG1wcGVjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMgorLSBtcHBlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjMKKy0gbXBwZW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI0CistIG1wcGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNQorLSBtcHBlcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjYKKy0gbXBwZXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI3CistIG1wcGZrZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyOAorLSBtcHBma3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjkKKy0gbXBwZm9yayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMwCistIG1wcGZyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMQorLSBtcHBpb2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzIKKy0gbXBwaXdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMzCistIG1wcGpvaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNAorLSBtcHBudGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzUKKy0gbXBwcHFhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM2CistIG1wcHBxYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNworLSBtcHBwcXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzgKKy0gbXBwdGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM5CistIG1wcHRwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MAorLSBtcHB0cGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDEKKy0gbXBwdHB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQyCistIG1wcHZzeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MworLSBtcHB4YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDQKKy0gbXBweGNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ1CistIG1wcHhtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NgorLSBtcHB4bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDcKKy0gbXBweHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ4CistIG1wcHhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0OQorLSBtcHB4c3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTAKKy0gbXBweHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUxCistIG1wc2JhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1MgorLSBtcHNjcHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTcKKy0gbXBzZWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUzCistIG1wc2VyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NAorLSBtcHNmZDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTUKKy0gbXBzZmQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU2CistIG1wc2lkNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NworLSBtcHNpZDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTgKKy0gbXBzbmQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU5CistIG1wc25kOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2MAorLSBtcHNvbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjEKKy0gbXBzcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYyCistIG1wc3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2MworLSBtcHN4YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjQKKy0gbXBzeHJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY1CistIG1wdGFkaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NgorLSBtcHRhZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjcKKy0gbXB0YmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY4CistIG1wdGRlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2OQorLSBtcHRkaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzAKKy0gbXB0ZGluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcxCistIG1wdGRueCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MgorLSBtcHRkbnhkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzMKKy0gbXB0ZG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc0CistIG1wdGR4byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NQorLSBtcHRlYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzYKKy0gbXB0ZWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc3CistIG1wdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3OAorLSBtcHRlbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzkKKy0gbXB0ZXBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgwCistIG1wdGVzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MQorLSBtcHRma2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODIKKy0gbXB0cHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgzCistIG1wdHBwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4NAorLSBtcHRwcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODUKKy0gbXB0dHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg2CistIG1wdHRwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4NworLSBtcHR0cHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODgKKy0gbXB0dnN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg5CistIG1wdHhiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5MAorLSBtcHR4Y3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTEKKy0gbXB0eG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkyCistIG1wdHhuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5MworLSBtcHR4cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTQKKy0gbXB0eHNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk1CistIG1wcGNwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NgorLSBmdG5fc2V0X2xpYnJhcnlfZ2FuZyAgICAgICAgICAgICAgICAgICAgICA3MzYKKy0ga21wX3NldF9saWJyYXJ5X2dhbmcKKy0ga21wX3NoYXJhYmxlX2NhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgNzYwCistIGttcF9zaGFyYWJsZV9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgIDc2MQorLSBrbXBfc2hhcmFibGVfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICA3NjIKKy0ga21wX3NoYXJhYmxlX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgNzYzCistIGttcF9hbGlnbmVkX3NoYXJhYmxlX21hbGxvYyAgICAgICAgICAgICAgIDc2NAorLSBrbXBfZGVmZXJyZWRfYXRvbWljX2FkZF9pNCAgICAgICAgICAgICAgICA3NjUKKy0ga21wX2RlZmVycmVkX2F0b21pY19hZGRfaTggICAgICAgICAgICAgICAgNzY2CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX3I0ICAgICAgICAgICAgICAgIDc2NworLSBrbXBfZGVmZXJyZWRfYXRvbWljX2FkZF9yOCAgICAgICAgICAgICAgICA3NjgKKy0ga21wX2xvY2tfY29uZF93YWl0ICAgICAgICAgICAgICAgICAgICAgICAgNzcwCistIGttcF9sb2NrX2NvbmRfc2lnbmFsICAgICAgICAgICAgICAgICAgICAgIDc3MQorLSBrbXBfbG9ja19jb25kX2Jyb2FkY2FzdCAgICAgICAgICAgICAgICAgICA3NzIKKy0ga21wX25lc3RfbG9ja19jb25kX3dhaXQgICAgICAgICAgICAgICAgICAgNzczCistIGttcF9uZXN0X2xvY2tfY29uZF9zaWduYWwgICAgICAgICAgICAgICAgIDc3NAorLSBrbXBfbmVzdF9sb2NrX2NvbmRfYnJvYWRjYXN0ICAgICAgICAgICAgICA3NzUKKy0ga21wX2dldF9wcm9jZXNzX251bSAgICAgICAgICAgICAgICAgICAgICAgNzgxCistIGttcF9nZXRfbnVtX3Byb2Nlc3NlcyAgICAgICAgICAgICAgICAgICAgIDc4MgorLSBrbXBfZ2V0X3Byb2Nlc3NfdGhyZWFkX251bSAgICAgICAgICAgICAgICA3ODMKKy0ga21wX3ByaXZhdGVfbW1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgNzg0ICAgIyBub3QgaW1wbGVtZW50ZWQ/CistIGttcF9zaGFyYWJsZV9tbWFwICAgICAgICAgICAgICAgICAgICAgICAgIDc4NSAgICMgbm90IGltcGxlbWVudGVkPworLSBrbXBfcHJpdmF0ZV9tdW5tYXAgICAgICAgICAgICAgICAgICAgICAgICA3ODYgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX3NoYXJhYmxlX211bm1hcCAgICAgICAgICAgICAgICAgICAgICAgNzg3ICAgIyBub3QgaW1wbGVtZW50ZWQ/CistIGttcF9pc19zaGFyYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4OCAgICMgbm90IGltcGxlbWVudGVkPworCislaWZuZGVmIHN0dWIKKworCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBlbnRyeSBwb2ludHMgYXJlIGFkZGVkIHNvIHRoYXQgdGhlIGJhY2t0cmFjZXMgZnJvbQorICAgICMgdGhlIHRvb2xzIGNvbnRhaW4gbWVhbmluZ2Z1bCBuYW1lcyBmb3IgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBtaWdodAorICAgICMgYXBwZWFyIGluIGEgYmFja3RyYWNlIG9mIGEgdGhyZWFkIHdoaWNoIGlzIGJsb2NrZWQgaW4gdGhlIFJUTC4KKyAgICAjCisKKyAgICAjIFJlZ3VsYXIgZW50cnkgcG9pbnRzCisgICAgICAgIF9fa21wX3dhaXRfeWllbGRfNAorICAgICAgICBfX2ttcF9mb3JrX2NhbGwKKyAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzaworICAgICVpZmRlZiBLTVBfVVNFX01PTklUT1IKKyAgICAgICAgX19rbXBfbGF1bmNoX21vbml0b3IKKyAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yCisgICAgJWVuZGlmCisgICAgICAgIF9fa21wX2xhdW5jaF93b3JrZXIKKyAgICAgICAgX19rbXBfcmVhcF93b3JrZXIKKyAgICAgICAgX19rbXBfYWNxdWlyZV90YXNfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jaworCisgICAgJWlmZGVmIEtNUF9ERUJVRworICAgICAgICAjIGFsbG93cyBjb25zb2xlIG91dHB1dCBjYXBhYmlsaXR5IGZvciBhcHBsaWNhdGlvbnMgdGhvc2UgZG9uJ3QgaGF2ZSBpdAorICAgICAgICBfX2ttcF9wcmludGYKKyAgICAlZW5kaWYKKworCisgICAgJWlmZGVmIFVTRV9ERUJVR0dFUgorICAgICAgICBfX2ttcF9kZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgREFUQQorICAgICAgICBfX2ttcF9vbXBfZGVidWdfc3RydWN0X2luZm8gICAgICAgICAgICAgREFUQQorICAgICVlbmRpZgorCisgICAgIyBTeW1ib2xzIGZvciBNUyBtdXR1YWwgZGV0ZWN0aW9uOgorICAgIF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnkgICAgREFUQQorICAgIF9Zb3VfbXVzdF9saW5rX3dpdGhfSW50ZWxfT3Blbk1QX2xpYnJhcnkgICAgICAgICAgREFUQQorICAgICVpZmRlZiBtc3ZjX2NvbXBhdAorICAgICAgICBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSAgREFUQQorICAgICVlbmRpZgorCisgICAgX19rbXBfd2FpdF82NAorICAgIF9fa21wX3JlbGVhc2VfNjQKKworCisjICAgIFZUX2dldHRoaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjICAgIHZ0Z3RoaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKyAgICBfX2ttcGNfYXRvbWljXzQgICAgICAgICAgICAgICAgICAgICAgICAgMTAwCisgICAgX19rbXBjX2F0b21pY184ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZCAgICAgICAgICAgICAgICAxMDIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQgICAgICAgICAgICAgICAgMTAzCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkICAgICAgICAgICAgICAgIDEwNAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZCAgICAgICAgICAgICAgICAxMDUKKyAgICBfX2ttcGNfYmFycmllciAgICAgICAgICAgICAgICAgICAgICAgICAgMTA2CisgICAgX19rbXBjX2JhcnJpZXJfbWFzdGVyICAgICAgICAgICAgICAgICAgIDEwNworICAgIF9fa21wY19iYXJyaWVyX21hc3Rlcl9ub3dhaXQgICAgICAgICAgICAxMDgKKyAgICBfX2ttcGNfYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwCisgICAgX19rbXBjX2JvdW5kX251bV90aHJlYWRzICAgICAgICAgICAgICAgIDExMQorICAgIF9fa21wY19ib3VuZF90aHJlYWRfbnVtICAgICAgICAgICAgICAgICAxMTIKKyAgICBfX2ttcGNfY3JpdGljYWwgICAgICAgICAgICAgICAgICAgICAgICAgMTEzCisgICAgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNCAgICAgICAgICAgICAgICAgIDExNAorICAgIF9fa21wY19kaXNwYXRjaF9maW5pXzggICAgICAgICAgICAgICAgICAxMTUKKyAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80ICAgICAgICAgICAgICAgICAgMTE2CisgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfOCAgICAgICAgICAgICAgICAgIDExNworICAgIF9fa21wY19kaXNwYXRjaF9uZXh0XzQgICAgICAgICAgICAgICAgICAxMTgKKyAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84ICAgICAgICAgICAgICAgICAgMTE5CisgICAgX19rbXBjX2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMAorICAgIF9fa21wY19lbmRfYmFycmllcl9tYXN0ZXIgICAgICAgICAgICAgICAxMjEKKyAgICBfX2ttcGNfZW5kX2NyaXRpY2FsICAgICAgICAgICAgICAgICAgICAgMTIzCisgICAgX19rbXBjX2VuZF9tYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgIDEyNAorICAgIF9fa21wY19lbmRfb3JkZXJlZCAgICAgICAgICAgICAgICAgICAgICAxMjUKKyAgICBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwgICAgICAgICAgMTI2CisgICAgX19rbXBjX2VuZF9zaW5nbGUgICAgICAgICAgICAgICAgICAgICAgIDEyNworICAgIF9fa21wY19lbmRfdGFza3EgICAgICAgICAgICAgICAgICAgICAgICAxMjgKKyAgICBfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgICAgICAgICAgICAgICAgICAgMTI5CisgICAgX19rbXBjX2ZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMAorICAgIF9fa21wY19mb3Jfc3RhdGljX2ZpbmkgICAgICAgICAgICAgICAgICAxMzUKKyAgICBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQgICAgICAgICAgICAgICAgMTM2CisgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF84ICAgICAgICAgICAgICAgIDEzNworICAgIF9fa21wY19mb3JrX2NhbGwgICAgICAgICAgICAgICAgICAgICAgICAxMzgKKyAgICBfX2ttcGNfZ2xvYmFsX251bV90aHJlYWRzICAgICAgICAgICAgICAgMTQwCisgICAgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtICAgICAgICAgICAgICAgIDE0MQorICAgIF9fa21wY19pbl9wYXJhbGxlbCAgICAgICAgICAgICAgICAgICAgICAxNDIKKyAgICBfX2ttcGNfaW52b2tlX3Rhc2tfZnVuYyAgICAgICAgICAgICAgICAgMTQzCisgICAgX19rbXBjX21hc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NAorICAgIF9fa21wY19va190b19mb3JrICAgICAgICAgICAgICAgICAgICAgICAxNDUKKyAgICBfX2ttcGNfb3JkZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ2CisgICAgX19rbXBjX3BvcF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgIDE0NworICAgIF9fa21wY19wdXNoX251bV90aHJlYWRzICAgICAgICAgICAgICAgICAxNDgKKyAgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCAgICAgICAgICAgICAgMTUwCisgICAgX19rbXBjX3NpbmdsZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MQorICAgIF9fa21wY190YXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTIKKyAgICBfX2ttcGNfdGFza19idWZmZXIgICAgICAgICAgICAgICAgICAgICAgMTUzCisgICAgX19rbXBjX3Rhc2txICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NAorICAgIF9fa21wY190YXNrcV90YXNrICAgICAgICAgICAgICAgICAgICAgICAxNTUKKyAgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgMTU2CisgICAgX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkICAgICAgICAgICAgIDE1NworICAgIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyICAgICAgICAgICAxNTgKKyAgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMgICAgICAgMTU5CisjICAgIF9fa21wY19zc3BfYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAxNjAKKyMgICAgX19rbXBjX3NzcF9mb3JrICAgICAgICAgICAgICAgICAgICAgICAgIDE2MQorIyAgICBfX2ttcGNfc3NwX2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYyCisjICAgIF9fa21wY19zc3BfcG9zdF80ICAgICAgICAgICAgICAgICAgICAgICAxNjMKKyMgICAgX19rbXBjX3NzcF9wb3N0XzggICAgICAgICAgICAgICAgICAgICAgIDE2NAorIyAgICBfX2ttcGNfc3NwX3dhaXRfNCAgICAgICAgICAgICAgICAgICAgICAgMTY1CisjICAgIF9fa21wY19zc3Bfd2FpdF84ICAgICAgICAgICAgICAgICAgICAgICAxNjYKKyMgICAgX19rbXBjX3NzcF9kaXN0YW5jZV80ICAgICAgICAgICAgICAgICAgIDE2NworIyAgICBfX2ttcGNfc3NwX2Rpc3RhbmNlXzggICAgICAgICAgICAgICAgICAgMTY4CisjICAgIF9fa21wY19pbl9zc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjkKKyMgICAgX19rbXBjX3NzcF90aHJlYWRfbnVtICAgICAgICAgICAgICAgICAgIDE3MAorIyAgICBfX2ttcGNfc3NwX251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgMTcxCisgICAgX19rbXBjX2NvcHlwcml2YXRlICAgICAgICAgICAgICAgICAgICAgIDE3MgorIyAgICBfX2ttcGNfc3NwX2dldF9tYXhfdGhyZWFkcyAgICAgICAgICAgICAgMTczCisjICAgIF9fa21wY19zc3Bfc2V0X21heF90aHJlYWRzICAgICAgICAgICAgICAxNzQKKyAgICBfX2ttcGNfaW5pdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgMTc1CisgICAgX19rbXBjX2Rlc3Ryb3lfbG9jayAgICAgICAgICAgICAgICAgICAgIDE3NgorICAgIF9fa21wY19zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAxNzcKKyAgICBfX2ttcGNfdW5zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgMTc4CisgICAgX19rbXBjX3Rlc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgIDE3OQorICAgIF9fa21wY19pbml0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAxODAKKyAgICBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2sgICAgICAgICAgICAgICAgMTgxCisgICAgX19rbXBjX3NldF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgIDE4MgorICAgIF9fa21wY191bnNldF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAxODMKKyAgICBfX2ttcGNfdGVzdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgMTg0CisjICAgIF9fa21wY19zc3BfaW5pdF90aHJlYWQgICAgICAgICAgICAgICAgICAxODUKKyMgICAgX19rbXBjX3NzcF9zZXRfZXZlbnQgICAgICAgICAgICAgICAgICAgIDE4NgorICAgIF9fa21wY19yZWR1Y2Vfbm93YWl0ICAgICAgICAgICAgICAgICAgICAxODcKKyAgICBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQgICAgICAgICAgICAgICAgMTg4CisgICAgX19rbXBjX3JlZHVjZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OQorICAgIF9fa21wY19lbmRfcmVkdWNlICAgICAgICAgICAgICAgICAgICAgICAxOTAKKworIyBPcGVuTVAgMy4wCisKKyVpZmRlZiBPTVBfMzAKKyAgICBfX2ttcGNfb21wX3Rhc2tfYWxsb2MgICAgICAgICAgICAgICAgICAgMTkxCisgICAgX19rbXBjX29tcF90YXNrICAgICAgICAgICAgICAgICAgICAgICAgIDE5MgorICAgIF9fa21wY19vbXBfdGFza3dhaXQgICAgICAgICAgICAgICAgICAgICAxOTMKKyAgICBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwICAgICAgICAgICAgICAgMTk2CisgICAgX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMCAgICAgICAgICAgIDE5NworICAgIF9fa21wY19vbXBfdGFza19wYXJ0cyAgICAgICAgICAgICAgICAgICAxOTgKKyVlbmRpZiAjIE9NUF8zMAorCisjICAgX19vbXBfY29sbGVjdG9yX2FwaSAgICAgICAgICAgICAgICAgIDE5OQorCisgICAgIyBUaGVzZSBmdW5jdGlvbnMgYXJlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBUaGVyZSBpcyBubyBuZWVkIGluIHN0YWJsZSBvcmRpbmFsIG51bWJlcjoKKyAgICBfX2ttcF9nZXRfcmVkdWNlX21ldGhvZAorCislZW5kaWYgICMgbm90IGRlZmluZWQgc3R1YgorCitrbXBjX2NhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMAora21wY19mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDEKKyVpZm5kZWYgc3R1YgorICAgICMgVGhlc2UgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIGxpYmd1aWRlLCBidXQgZGVjbGFyZWQgbmVpdGhlciBpbiBvbXAuaCBub3QgaW4gb21wX2xpYi5oLgorIyAgICBrbXBjX2dldF9iYW5uZXIgICAgICAgICAgICAgICAgICAgICAgICAgMjAyCisjICAgIGttcGNfZ2V0X3Bvb2xtb2RlICAgICAgICAgICAgICAgICAgICAgICAyMDMKKyMgICAga21wY19nZXRfcG9vbHNpemUgICAgICAgICAgICAgICAgICAgICAgIDIwNAorIyAgICBrbXBjX2dldF9wb29sc3RhdCAgICAgICAgICAgICAgICAgICAgICAgMjA1CisjICAgIGttcGNfcG9vbHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAyMDcKKyMgICAga21wY19wcmludF9iYW5uZXIgICAgICAgICAgICAgICAgICAgICAgIDIwOAorIyAgICBrbXBjX3NldF9wb29sbW9kZSAgICAgICAgICAgICAgICAgICAgICAgMjE0CisjICAgIGttcGNfc2V0X3Bvb2xzaXplICAgICAgICAgICAgICAgICAgICAgICAyMTUKKyVlbmRpZgora21wY19tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDYKK2ttcGNfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA5CitrbXBjX3NldF9ibG9ja3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMQora21wY19zZXRfbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTIKKyMga21wY19zZXRfcGFyYWxsZWxfbmFtZSAgICAgICAgICAgICAgICAgICAgICAyMTMKK2ttcGNfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgMjE2CitrbXBjX3NldF9zdGFja3NpemVfcyAgICAgICAgICAgICAgICAgICAgICAgIDIyMgorIyBrbXBjX3NldF9zdGF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNwora21wY19zZXRfZGVmYXVsdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjQKKworIyBPTVAgMy4wIGVudHJ5IHBvaW50cyBmb3IgdW5zaWduZWQgbG9vcCBpdGVyYXRpb24gdmFyaWFibGVzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzMwCisgICAgICAgIF9fa21wY19mb3Jfc3RhdGljX2luaXRfOHUgICAgICAgICAgIDIyNQorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84dSAgICAgICAgICAgICAyMjYKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOHUgICAgICAgICAgICAgMjI3CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9maW5pXzh1ICAgICAgICAgICAgIDIyOAorICAgICAgICBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzR1ICAgICAgICAgICAyMjkKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfNHUgICAgICAgICAgICAgMjMwCisgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0XzR1ICAgICAgICAgICAgIDIzMQorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV80dSAgICAgICAgICAgICAyMzIKKyAgICAlZW5kaWYgIyBPTVBfMzAKKyVlbmRpZgorCislaWZuZGVmIHN0dWIKKyAgICBfX2ttcGNfZ2V0X3Rhc2tpZCAgICAgICAgICAgICAgICAgICAgICAgMjMzCisgICAgX19rbXBjX2dldF9wYXJlbnRfdGFza2lkICAgICAgICAgICAgICAgIDIzNAorJWVuZGlmCisKKyMgT3Blbk1QIDMuMSBlbnRyeSBwb2ludHMKKyVpZm5kZWYgc3R1YgorICAgICVpZmRlZiBPTVBfMzAKKyAgICAgICAgX19rbXBjX29tcF90YXNreWllbGQgICAgICAgICAgICAgICAgMjM1CisgICAgJWVuZGlmICMgT01QXzMwCisgICAgX19rbXBjX3BsYWNlX3RocmVhZHMgICAgICAgICAgICAgICAgICAgIDIzNgorJWVuZGlmCisKKyMgT3Blbk1QIDQuMCBlbnRyeSBwb2ludHMKKyVpZm5kZWYgc3R1YgorICAgICVpZmRlZiBPTVBfNDAKKyAgICAgICAgX19rbXBjX3B1c2hfcHJvY19iaW5kICAgICAgICAgICAgICAgMjM3CisgICAgICAgIF9fa21wY190YXNrZ3JvdXAgICAgICAgICAgICAgICAgICAgIDIzOAorICAgICAgICBfX2ttcGNfZW5kX3Rhc2tncm91cCAgICAgICAgICAgICAgICAyMzkKKyAgICAgICAgX19rbXBjX3B1c2hfbnVtX3RlYW1zICAgICAgICAgICAgICAgMjQwCisgICAgICAgIF9fa21wY19mb3JrX3RlYW1zICAgICAgICAgICAgICAgICAgIDI0MQorICAgICAgICBfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzICAgICAgICAgICAyNDIKKyAgICAgICAgX19rbXBjX29tcF93YWl0X2RlcHMgICAgICAgICAgICAgICAgMjQzCisgICAgICAgIF9fa21wY19jYW5jZWwgICAgICAgICAgICAgICAgICAgICAgIDI0NAorICAgICAgICBfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQgICAgICAgICAgICAyNDUKKyAgICAgICAgX19rbXBjX2NhbmNlbF9iYXJyaWVyICAgICAgICAgICAgICAgMjQ2CisgICAgICAgIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80ICAgICAgIDI0NworICAgICAgICBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNHUgICAgICAyNDgKKyAgICAgICAgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzggICAgICAgMjQ5CisgICAgICAgIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF84dSAgICAgIDI1MAorICAgICAgICBfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0XzQgICAgICAgICAyNTEKKyAgICAgICAgX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF80dSAgICAgICAgMjUyCisgICAgICAgIF9fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfOCAgICAgICAgIDI1MworICAgICAgICBfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0Xzh1ICAgICAgICAyNTQKKyAgICAgICAgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNCAgICAgICAgICAgMjU1CisgICAgICAgIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzR1ICAgICAgICAgIDI1NgorICAgICAgICBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF84ICAgICAgICAgICAyNTcKKyAgICAgICAgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfOHUgICAgICAgICAgMjU4CisgICAgJWVuZGlmICMgT01QXzQwCislZW5kaWYKKworIyBPcGVuTVAgNC41IGVudHJ5IHBvaW50cworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF80NQorICAgICAgICBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWQgICAgICAgICAyNTkKKyAgICAgICAgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbyAgICAgMjYwCisgICAgICAgIF9fa21wY19kb2Fjcm9zc19pbml0ICAgICAgICAgICAgICAgIDI2MQorICAgICAgICBfX2ttcGNfZG9hY3Jvc3Nfd2FpdCAgICAgICAgICAgICAgICAyNjIKKyAgICAgICAgX19rbXBjX2RvYWNyb3NzX3Bvc3QgICAgICAgICAgICAgICAgMjYzCisgICAgICAgIF9fa21wY19kb2Fjcm9zc19maW5pICAgICAgICAgICAgICAgIDI2NAorICAgICAgICBfX2ttcGNfdGFza2xvb3AgICAgICAgICAgICAgICAgICAgICAyNjYKKyAgICAlZW5kaWYKKyVlbmRpZgora21wY19hbGlnbmVkX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAyNjUKK2ttcGNfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMgICAgICAgICAgICAgICAgICAgMjY3CisKKyMgVXNlciBBUEkgZW50cnkgcG9pbnRzIHRoYXQgaGF2ZSBib3RoIGxvd2VyLSBhbmQgdXBwZXItIGNhc2UgdmVyc2lvbnMgZm9yIEZvcnRyYW4uCisjIE51bWJlciBmb3IgbG93ZXJjYXNlIHZlcnNpb24gaXMgaW5kaWNhdGVkLiAgTnVtYmVyIGZvciB1cHBlcmNhc2UgaXMgb2J0YWluZWQgYnkgYWRkaW5nIDEwMDAuCisjIFVzZXIgQVBJIGVudHJ5IHBvaW50cyBhcmUgZW50cnkgcG9pbnRzIHRoYXQgc3RhcnQgd2l0aCAna21wXycgb3IgJ29tcF8nLgorCitvbXBfZGVzdHJveV9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMAorb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICA3MDEKK29tcF9nZXRfZHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzAyCitvbXBfZ2V0X21heF90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcwMworb21wX2dldF9uZXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDQKK29tcF9nZXRfbnVtX3Byb2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA1CitvbXBfZ2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcwNgorb21wX2dldF90aHJlYWRfbnVtICAgICAgICAgICAgICAgICAgICAgICAgICA3MDcKK29tcF9nZXRfd3RpY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA4CitvbXBfZ2V0X3d0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwOQorb21wX2luX3BhcmFsbGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTAKK29tcF9pbml0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzExCitvbXBfaW5pdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMgorb21wX3NldF9keW5hbWljICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTMKK29tcF9zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE0CitvbXBfc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNQorb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTYKK29tcF9zZXRfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAgICAgICAgNzE3CitvbXBfdGVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxOAorb21wX3Rlc3RfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICA3MTkKK29tcF91bnNldF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIwCitvbXBfdW5zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgIDcyMQorCitvbXBjX3NldF9keW5hbWljICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMgorb21wY19zZXRfbmVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjMKK29tcGNfc2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgNzI0CisKK2ttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI1CitrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNgora21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjcKK2ttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI4CitrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyOQora21wX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzAKKyNrbXBfcHJpbnRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczMQora21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzIKK2ttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgNzM0CitrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczNQora21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgICAgICAgICAgICAgICAgICA3MzcKK2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICAgICAgICAgICAgICAgICAgNzM4CitrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAgICAgICAgICAgICAgICAgIDczOQorIyBrbXBfc2V0X3BhcmFsbGVsX25hbWUgICAgICAgICAgICAgICAgICAgICAgIDc0MAora21wX3NldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDEKKyMga21wX3NldF9zdGF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDIKK2ttcF9nZXRfbnVtX2tub3duX3RocmVhZHMgICAgICAgICAgICAgICAgICAgNzQzCitrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAgICAgICAgICAgICAgICAgIDc0NAora21wX2dldF9zdGFja3NpemVfcyAgICAgICAgICAgICAgICAgICAgICAgICA3NDUKK2ttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ2CitrbXBfYWxpZ25lZF9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgIDc0Nwora21wX3NldF93YXJuaW5nc19vbiAgICAgICAgICAgICAgICAgICAgICAgICA3NzkKK2ttcF9zZXRfd2FybmluZ3Nfb2ZmICAgICAgICAgICAgICAgICAgICAgICAgNzgwCisKKyVpZmRlZiBPTVBfMzAKKyAgICBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCAgICAgICAgICAgICAgICAgICAgNzg5CisgICAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDc5MAorICAgIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAgICAgICAgICAgICA3OTEKKyAgICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgNzkyCisgICAgb21wX2dldF90aHJlYWRfbGltaXQgICAgICAgICAgICAgICAgICAgIDc5MworICAgIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgICAgICAgICAgICA3OTQKKyAgICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgICAgICAgICAgICAgNzk1CisgICAgb21wX2dldF9zY2hlZHVsZSAgICAgICAgICAgICAgICAgICAgICAgIDc5NgorICAgIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgICAgICAgICAgICA3OTcKKyAgICBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyAgICAgICAgICAgICAgNzk4CisgICAgb21wY19zZXRfc2NoZWR1bGUgICAgICAgICAgICAgICAgICAgICAgIDc5OQorICAgIG9tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gICAgICAgICAgICA4MDAKKyAgICBvbXBjX2dldF90ZWFtX3NpemUgICAgICAgICAgICAgICAgICAgICAgODAxCisgICAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAgIDg1MAorICAgIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgICAgICAgICAgICA4NTEKKyAgICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICAgICAgICAgICAgODUyCisgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAgICAgICAgICAgIDg1MworICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgICAgICAgICAgICA4NTQKKyAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICAgODU1CisgICAga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgIDg1NgorICAgIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICA4NTcKKyAgICBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgODU4CisgICAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICAgIDg1OQorICAgIGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICA4NjAKKyVlbmRpZiAjIE9NUF8zMAorCisjIE9wZW5NUCAzLjEKKworJWlmZGVmIE9NUF8zMAorICAgIG9tcF9pbl9maW5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NjEKKyVlbmRpZiAjIE9NUF8zMAorCisjIE9wZW5NUCA0MAorCislaWZkZWYgT01QXzQwCisgICAgb21wX2dldF9wcm9jX2JpbmQgICAgICAgICAgICAgICAgICAgICAgIDg2MgorICAgI29tcF9zZXRfcHJvY19iaW5kICAgICAgICAgICAgICAgICAgICAgICA4NjMKKyAgICNvbXBfY3Vycl9wcm9jX2JpbmQgICAgICAgICAgICAgICAgICAgICAgODY0CisgICAgb21wX2dldF9udW1fdGVhbXMgICAgICAgICAgICAgICAgICAgICAgIDg2NQorICAgIG9tcF9nZXRfdGVhbV9udW0gICAgICAgICAgICAgICAgICAgICAgICA4NjYKKyAgICBvbXBfZ2V0X2NhbmNlbGxhdGlvbiAgICAgICAgICAgICAgICAgICAgODY3CisgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzICAgICAgICAgICAgIDg2OAorICAgIG9tcF9pc19pbml0aWFsX2RldmljZSAgICAgICAgICAgICAgICAgICA4NjkKKyAgICBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlICAgICAgICAgICAgICAgICAgODc5CisgICAgb21wX2dldF9kZWZhdWx0X2RldmljZSAgICAgICAgICAgICAgICAgIDg4MAorICAgICVpZmRlZiBzdHViCisgICAgICAgIG9tcF9nZXRfbnVtX2RldmljZXMgICAgICAgICAgICAgICAgIDg4MQorICAgICVlbmRpZgorJWVuZGlmICMgT01QXzQwCisKKyMgT3Blbk1QIDQ1CisKKyVpZmRlZiBPTVBfNDUKKyAgICBvbXBfaW5pdF9sb2NrX3dpdGhfaGludCAgICAgICAgICAgICAgICAgODcwCisgICAgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCAgICAgICAgICAgIDg3MQorICAgIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkgICAgICAgICAgICAgICA4NzIKKyAgICBvbXBfZ2V0X251bV9wbGFjZXMgICAgICAgICAgICAgICAgICAgICAgODczCisgICAgb21wX2dldF9wbGFjZV9udW1fcHJvY3MgICAgICAgICAgICAgICAgIDg3NAorICAgIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMgICAgICAgICAgICAgICAgICA4NzUKKyAgICBvbXBfZ2V0X3BsYWNlX251bSAgICAgICAgICAgICAgICAgICAgICAgODc2CisgICAgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcyAgICAgICAgICAgIDg3NworICAgIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMgICAgICAgICAgICA4NzgKKyAgICAlaWZkZWYgc3R1YgorICAgICAgICBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlICAgICAgICAgICAgICA4ODIKKyAgICAgICAgb21wX3RhcmdldF9hbGxvYyAgICAgICAgICAgICAgICAgICAgODgzCisgICAgICAgIG9tcF90YXJnZXRfZnJlZSAgICAgICAgICAgICAgICAgICAgIDg4NAorICAgICAgICBvbXBfdGFyZ2V0X2lzX3ByZXNlbnQgICAgICAgICAgICAgICA4ODUKKyAgICAgICAgb21wX3RhcmdldF9tZW1jcHkgICAgICAgICAgICAgICAgICAgODg2CisgICAgICAgIG9tcF90YXJnZXRfbWVtY3B5X3JlY3QgICAgICAgICAgICAgIDg4NworICAgICAgICBvbXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHIgICAgICAgICAgICA4ODgKKyAgICAgICAgb21wX3RhcmdldF9kaXNhc3NvY2lhdGVfcHRyICAgICAgICAgODg5CisgICAgJWVuZGlmCislZW5kaWYgIyBPTVBfNDUKKwora21wX3NldF9kaXNwX251bV9idWZmZXJzICAgICAgICAgICAgICAgICAgICA4OTAKKworJWlmbmRlZiBzdHViCisgICAgIyBPcmRpbmFscyBiZXR3ZWVuIDkwMCBhbmQgOTk5IGFyZSByZXNlcnZlZAorCisgICAgIyBPcmRpbmFscyBiZXR3ZWVuIDEwMDAgYW5kIDE5OTkgYXJlIHJlc2VydmVkCisgICAgIyBmb3IgdXNlci1jYWxsYWJsZSB1cHBlcmNhc2UgRm9ydHJhbiBlbnRyaWVzLgorCisKKyAgICAjIEFUT01JQyBlbnRyaWVzCisKKyAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMAorICAgICVlbmRpZgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkICAgICAgICAgICAgICAgMjAwMQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIgICAgICAgICAgICAgIDIwMDIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYgICAgICAgICAgICAgICAyMDAzCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdiAgICAgICAgICAgICAgMjAwNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bCAgICAgICAgICAgICAgIDIwMDUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIgICAgICAgICAgICAgICAyMDA2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsICAgICAgICAgICAgICAgMjAwNworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NociAgICAgICAgICAgICAgIDIwMDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyICAgICAgICAgICAgICAyMDA5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViICAgICAgICAgICAgICAgMjAxMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvciAgICAgICAgICAgICAgIDIwMTEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZCAgICAgICAgICAgICAgIDIwMTIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiICAgICAgICAgICAgICAyMDEzCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2ICAgICAgICAgICAgICAgMjAxNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYgICAgICAgICAgICAgIDIwMTUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwgICAgICAgICAgICAgICAyMDE2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JiICAgICAgICAgICAgICAgMjAxNworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobCAgICAgICAgICAgICAgIDIwMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHIgICAgICAgICAgICAgICAyMDE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3NociAgICAgICAgICAgICAgMjAyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YiAgICAgICAgICAgICAgIDIwMjEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IgICAgICAgICAgICAgICAyMDIyCisKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YiAgICAgICAgICAgICAgIDIwMjQKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YiAgICAgICAgICAgICAgIDIwMjYKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YiAgICAgICAgICAgICAgIDIwMjgKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YiAgICAgICAgICAgICAgIDIwMzAKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIgICAgICAgICAgICAgIDIwMzEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYgICAgICAgICAgICAgICAyMDMyCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2RpdiAgICAgICAgICAgICAgMjAzMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bCAgICAgICAgICAgICAgIDIwMzQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIgICAgICAgICAgICAgICAyMDM1CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsICAgICAgICAgICAgICAgMjAzNgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NociAgICAgICAgICAgICAgIDIwMzcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyICAgICAgICAgICAgICAyMDM4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yICAgICAgICAgICAgICAgMjAzOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIgICAgICAgICAgICAgIDIwNDAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYgICAgICAgICAgICAgICAyMDQxCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdiAgICAgICAgICAgICAgMjA0MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bCAgICAgICAgICAgICAgIDIwNDMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIgICAgICAgICAgICAgICAyMDQ0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsICAgICAgICAgICAgICAgMjA0NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NociAgICAgICAgICAgICAgIDIwNDYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyICAgICAgICAgICAgICAyMDQ3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yICAgICAgICAgICAgICAgMjA0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdiAgICAgICAgICAgICAgIDIwNDkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwgICAgICAgICAgICAgICAyMDUwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2ICAgICAgICAgICAgICAgMjA1MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bCAgICAgICAgICAgICAgIDIwNTIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwgICAgICAgICAgICAgIDIwNTMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwgICAgICAgICAgICAgICAyMDU0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbCAgICAgICAgICAgICAgMjA1NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybCAgICAgICAgICAgICAgIDIwNTYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsICAgICAgICAgICAgICAyMDU3CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JsICAgICAgICAgICAgICAgMjA1OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwgICAgICAgICAgICAgIDIwNTkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwgICAgICAgICAgICAgICAyMDYwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXggICAgICAgICAgICAgICAyMDYxCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluICAgICAgICAgICAgICAgMjA2MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heCAgICAgICAgICAgICAgIDIwNjMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4gICAgICAgICAgICAgICAyMDY0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4ICAgICAgICAgICAgICAgMjA2NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbiAgICAgICAgICAgICAgIDIwNjYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXggICAgICAgICAgICAgICAyMDY3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluICAgICAgICAgICAgICAgMjA2OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heCAgICAgICAgICAgICAgIDIwNjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4gICAgICAgICAgICAgICAyMDcwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4ICAgICAgICAgICAgICAgMjA3MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbiAgICAgICAgICAgICAgIDIwNzIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYgICAgICAgICAgICAgIDIwNzMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2ICAgICAgICAgICAgICAyMDc0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdiAgICAgICAgICAgICAgMjA3NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYgICAgICAgICAgICAgIDIwNzYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYgICAgICAgICAgICAgICAyMDc3CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2ICAgICAgICAgICAgICAgMjA3OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdiAgICAgICAgICAgICAgIDIwNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYgICAgICAgICAgICAgICAyMDgwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkICAgICAgICAgICAgICAyMDgxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YiAgICAgICAgICAgICAgMjA4MgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwgICAgICAgICAgICAgIDIwODMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2ICAgICAgICAgICAgICAyMDg0CisKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQgICAgICAgICAgICAgICAyMDg1CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViICAgICAgICAgICAgICAgMjA4NgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bCAgICAgICAgICAgICAgIDIwODcKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYgICAgICAgICAgICAgICAyMDg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkICAgICAgICAgICAgICAgMjA4OQorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1YiAgICAgICAgICAgICAgIDIwOTAKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwgICAgICAgICAgICAgICAyMDkxCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2ICAgICAgICAgICAgICAgMjA5MgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQgICAgICAgICAgICAgIDIwOTMKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViICAgICAgICAgICAgICAyMDk0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bCAgICAgICAgICAgICAgMjA5NQorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYgICAgICAgICAgICAgIDIwOTYKKyAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZCAgICAgICAgICAgICAgMjA5NworICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWIgICAgICAgICAgICAgIDIwOTgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsICAgICAgICAgICAgICAyMDk5CisgICAjX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMCAjIG1vdmVkIHVwIGJlY2F1c2Ugb2YgbWlzdGFrZSBpbiBudW1iZXIgKHN1cHBvc2VkIHRvIGJlIDIxMDApCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkICAgICAgICAgICAgICAyMTAxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YiAgICAgICAgICAgICAgMjEwMgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwgICAgICAgICAgICAgIDIxMDMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2ICAgICAgICAgICAgICAyMTA0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heCAgICAgICAgICAgICAgMjEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4gICAgICAgICAgICAgIDIxMDYKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcCAgICAgICAgICAgIDIxMDcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAgICAgICAgICAgICAyMTA4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwICAgICAgICAgICAgMjEwOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcCAgICAgICAgICAgIDIxMTAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwICAgICAgICAgICAyMTExCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAgICAgICAgICAgICAyMTEyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwICAgICAgICAgICAgMjExMworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcCAgICAgICAgICAgIDIxMTQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAgICAgICAgICAgICAyMTE1CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcCAgICAgICAgICAgMjExNgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwICAgICAgICAgICAgMjExNworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcCAgICAgICAgICAgIDIxMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAgICAgICAgICAgICAyMTE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwICAgICAgICAgICAgMjEyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAgICAgICAgICAgIDIxMjEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcCAgICAgICAgICAgIDIxMjIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAgICAgICAgICAgICAyMTIzCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2ZwICAgICAgICAgICAgMjEyNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mcCAgICAgICAgICAgIDIxMjUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwICAgICAgICAgICAyMTI2CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAgICAgICAgICAgICAyMTI3CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwICAgICAgICAgICAgMjEyOAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcCAgICAgICAgICAgIDIxMjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAgICAgICAgICAgICAyMTMwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAgICAgICAgICAgICAyMTMxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwICAgICAgICAgICAgMjEzMgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcCAgICAgICAgICAgIDIxMzMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAgICAgICAgICAgICAyMTM0CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwICAgICAgICAgICAyMTM1CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9mcCAgICAgICAgICAgMjEzNgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfZnAgICAgICAgICAgIDIxMzcKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwICAgICAgICAgICAyMTM4CisgICAgJWVuZGlmCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4ICAgICAgICAyMTY5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2Zsb2F0OCAgICAgICAgMjE3MAorCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OCAgICAgICAgMjE3NAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDggICAgICAgIDIxNzUKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDggICAgICAgIDIxNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4ICAgICAgICAyMTgwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4ICAgICAgICAyMTg0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OCAgICAgICAgMjE4NQorCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OCAgICAgICAgMjE4NworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDggICAgICAgIDIxODgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4ICAgICAgICAyMTg5CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2Zsb2F0OCAgICAgICAgMjE5MAorCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OCAgICAgICAgMjIzMQorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jbXBseDggICAgICAgIDIyMzIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4ICAgICAgICAyMjMzCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OCAgICAgICAgMjIzNAorCisgICAgX19rbXBjX2F0b21pY18xICAgICAgICAgICAgICAgICAgICAgICAgMjI0NworICAgIF9fa21wY19hdG9taWNfMiAgICAgICAgICAgICAgICAgICAgICAgIDIyNDgKKyAgICNfX2ttcGNfYXRvbWljXzQgICAgICAgICAgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMAorICAgI19fa21wY19hdG9taWNfOCAgICAgICAgICAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTAxCisgICAgX19rbXBjX2F0b21pY18xMCAgICAgICAgICAgICAgICAgICAgICAgMjI1MQorICAgIF9fa21wY19hdG9taWNfMTYgICAgICAgICAgICAgICAgICAgICAgIDIyNTIKKyAgICBfX2ttcGNfYXRvbWljXzIwICAgICAgICAgICAgICAgICAgICAgICAyMjUzCisgICAgX19rbXBjX2F0b21pY18zMiAgICAgICAgICAgICAgICAgICAgICAgMjI1NAorCisgICAgJWlmZGVmIGFyY2hfMzIKKworICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2ICAgICAgMjI1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNiAgICAgIDIyNTYKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTYgICAgICAyMjU3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2ICAgICAgMjI1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNiAgICAgIDIyNTkKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTYgICAgICAyMjYwCisKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYgICAgICAyMjYxCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2ICAgICAgMjI2MgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNiAgICAgIDIyNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYgICAgICAyMjY0CisgICAgICAgICVlbmRpZgorCisgICAgJWVuZGlmCisKKyAgICAlaWZuZGVmIGFyY2hfNjQKKworICAgICAgICAjIEFUT01JQyBleHRlbnNpb25zIGZvciBPcGVuTVAgMy4xIHNwZWMgKHg4NiBhbmQgeDY0IG9ubHkpCisKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfcmQgICAgICAgICAgICAgICAgMjI2NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZCAgICAgICAgICAgICAgICAyMjY2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3JkICAgICAgICAgICAgICAgIDIyNjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfcmQgICAgICAgICAgICAgICAgMjI2OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZCAgICAgICAgICAgICAgICAyMjY5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3JkICAgICAgICAgICAgICAgIDIyNzAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3JkICAgICAgICAgICAgICAgMjI3MQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZCAgICAgICAgICAgICAgIDIyNzIKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3JkICAgICAgICAgICAgICAgIDIyNzMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfcmQgICAgICAgICAgICAgICAgMjI3NAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfcmQgICAgICAgICAgICAgICAyMjc1CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkICAgICAgICAgICAgICAgMjI3NgorICAgICAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkICAgICAgIDIyNzcKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3JkICAgICAgIDIyNzgKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfd3IgICAgICAgICAgICAgICAgMjI3OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl93ciAgICAgICAgICAgICAgICAyMjgwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyICAgICAgICAgICAgICAgIDIyODEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfd3IgICAgICAgICAgICAgICAgMjI4MgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF93ciAgICAgICAgICAgICAgICAyMjgzCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyICAgICAgICAgICAgICAgIDIyODQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyICAgICAgICAgICAgICAgMjI4NQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl93ciAgICAgICAgICAgICAgIDIyODYKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3dyICAgICAgICAgICAgICAgIDIyODcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfd3IgICAgICAgICAgICAgICAgMjI4OAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfd3IgICAgICAgICAgICAgICAyMjg5CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3dyICAgICAgICAgICAgICAgMjI5MAorICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl93ciAgICAgICAyMjkxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyICAgICAgIDIyOTIKKyAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0ICAgICAgICAgICAyMjkzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0ICAgICAgICAgIDIyOTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdCAgICAgICAgICAgMjI5NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdCAgICAgICAgICAyMjk2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQgICAgICAgICAgIDIyOTcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiX2NwdCAgICAgICAgICAgMjI5OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0ICAgICAgICAgICAyMjk5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQgICAgICAgICAgIDIzMDAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHQgICAgICAgICAgMjMwMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0ICAgICAgICAgICAyMzAyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQgICAgICAgICAgIDIzMDMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdCAgICAgICAgICAgMjMwNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdCAgICAgICAgICAyMzA1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQgICAgICAgICAgIDIzMDYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQgICAgICAgICAgMjMwNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0ICAgICAgICAgICAyMzA4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQgICAgICAgICAgIDIzMDkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdCAgICAgICAgICAgMjMxMAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0ICAgICAgICAgICAyMzExCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0ICAgICAgICAgIDIzMTIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdCAgICAgICAgICAgMjMxMworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0ICAgICAgICAgICAyMzE0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQgICAgICAgICAgIDIzMTUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdCAgICAgICAgICAgMjMxNgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0ICAgICAgICAgICAyMzE3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQgICAgICAgICAgIDIzMTgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdCAgICAgICAgICAgMjMxOQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0ICAgICAgICAgICAyMzIwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQgICAgICAgICAgIDIzMjEKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdCAgICAgICAgICAgMjMyMgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdCAgICAgICAgICAyMzIzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQgICAgICAgICAgIDIzMjQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQgICAgICAgICAgMjMyNQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0ICAgICAgICAgICAyMzI2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQgICAgICAgICAgIDIzMjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdCAgICAgICAgICAgMjMyOAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0ICAgICAgICAgICAyMzI5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0ICAgICAgICAgIDIzMzAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdCAgICAgICAgICAgMjMzMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdCAgICAgICAgICAyMzMyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQgICAgICAgICAgIDIzMzMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQgICAgICAgICAgMjMzNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0ICAgICAgICAgICAyMzM1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYl9jcHQgICAgICAgICAgIDIzMzYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdCAgICAgICAgICAgMjMzNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0ICAgICAgICAgICAyMzM4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0ICAgICAgICAgIDIzMzkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdCAgICAgICAgICAgMjM0MAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0ICAgICAgICAgICAyMzQxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQgICAgICAgICAgIDIzNDIKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdCAgICAgICAgICAgMjM0MworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0ICAgICAgICAgICAyMzQ0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0ICAgICAgICAgIDIzNDUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdCAgICAgICAgICAgMjM0NgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdCAgICAgICAgICAyMzQ3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQgICAgICAgICAgIDIzNDgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQgICAgICAgICAgMjM0OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0ICAgICAgICAgICAyMzUwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0ICAgICAgICAgIDIzNTEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdCAgICAgICAgICAgMjM1MgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0ICAgICAgICAgICAyMzUzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQgICAgICAgICAgIDIzNTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdCAgICAgICAgICAgMjM1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0ICAgICAgICAgICAyMzU2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQgICAgICAgICAgIDIzNTcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdCAgICAgICAgICAgMjM1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0ICAgICAgICAgICAyMzU5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQgICAgICAgICAgIDIzNjAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdCAgICAgICAgICAgMjM2MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0ICAgICAgICAgICAyMzYyCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQgICAgICAgICAgIDIzNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdCAgICAgICAgICAgMjM2NAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0ICAgICAgICAgIDIzNjUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQgICAgICAgICAgMjM2NgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQgICAgICAgICAgMjM2NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdCAgICAgICAgICAyMzY4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0ICAgICAgICAgIDIzNjkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQgICAgICAgICAgMjM3MAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0ICAgICAgICAgICAyMzcxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQgICAgICAgICAgIDIzNzIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZXF2X2NwdCAgICAgICAgICAgMjM3MworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0ICAgICAgICAgICAyMzc0CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0ICAgICAgICAgIDIzNzUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQgICAgICAgICAgMjM3NgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdCAgICAgICAgICAyMzc3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0ICAgICAgICAgIDIzNzgKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdCAgICAgICAgICAyMzc5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0ICAgICAgICAgIDIzODAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQgICAgICAgICAgMjM4MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdCAgICAgICAgICAyMzgyCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0ICAgICAgICAgICAyMzgzCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQgICAgICAgICAgIDIzODQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NwdCAgICAgICAgICAgMjM4NQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0ICAgICAgICAgICAyMzg2CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQgICAgICAgICAgIDIzODcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdCAgICAgICAgICAgMjM4OAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0ICAgICAgICAgICAyMzg5CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQgICAgICAgICAgIDIzOTAKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQgICAgICAgICAgMjM5MQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdCAgICAgICAgICAyMzkyCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0ICAgICAgICAgIDIzOTMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQgICAgICAgICAgMjM5NAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0ICAgICAgICAgIDIzOTUKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQgICAgICAgICAgMjM5NgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdCAgICAgICAgICAyMzk3CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0ICAgICAgICAgIDIzOTgKKyAgICAgICAgJWVuZGlmCisgICAgICAgI19fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHRfdG1wICAgICAgICAgICAgMjQwOQorCisgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2X2NwdCAgMjM5OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0ICAyNDAwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNl9jcHQgIDI0MDEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdCAgMjQwMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0ICAyNDAzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2ExNl9jcHQgIDI0MDQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdCAgMjQwNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0ICAyNDA2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQgIDI0MDcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdCAgMjQwOAorICAgICAgICAlZW5kaWYKKyAgICAgICAgJWVuZGlmCisKKyAgICAgICAgX19rbXBjX2F0b21pY19zdGFydCAgICAgICAgICAgICAgICAgICAgMjQxMAorICAgICAgICBfX2ttcGNfYXRvbWljX2VuZCAgICAgICAgICAgICAgICAgICAgICAyNDExCisKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9hZGRfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zdWJfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9tdWxfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X2ZwCisKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfYWRkX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc3ViX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfbXVsX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9mcAorCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2FkZF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3N1Yl9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X211bF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfZnAKKworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9hZGRfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9tdWxfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X2ZwCisKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9mcAorCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfZnAKKworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9mcAorICAgICAgICAlZW5kaWYKKworICAgICAgICAlaWZkZWYgT01QXzQwCisKKyAgICAgICAgICAgICMgQVRPTUlDIGV4dGVuc2lvbnMgZm9yIE9wZW5NUCA0LjAgc3BlYyAoeDg2IGFuZCB4NjQgb25seSkKKworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3dwICAgICAgICAgICAyNDEyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zd3AgICAgICAgICAgIDI0MTMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cCAgICAgICAgICAgMjQxNAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3dwICAgICAgICAgICAyNDE1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AgICAgICAgICAgIDI0MTYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cCAgICAgICAgICAgMjQxNworICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N3cCAgICAgICAgICAyNDE4CisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AgICAgICAgIDI0MTkKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3dwICAgICAgICAgICAyNDIwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AgICAgICAgICAgIDI0MjEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zd3AgICAgICAgICAgMjQyMgorICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N3cCAgICAgICAgICAyNDIzCisKKyAgICAgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AgIDI0MjQKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cCAgMjQyNQorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAlZW5kaWYKKworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYgICAyNDI2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldiAgIDI0MjcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3JldiAgMjQyOAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdF9yZXYgICAyNDI5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldiAgIDI0MzAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldiAgMjQzMQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYgICAyNDMyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldiAgIDI0MzMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3JldiAgMjQzNAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYgICAyNDM1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldiAgIDI0MzYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0X3JldiAgMjQzNworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9yZXYgICAyNDM4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldiAgIDI0MzkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3JldiAgMjQ0MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYgICAyNDQxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0X3JldiAgIDI0NDIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldiAgMjQ0MworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYgICAyNDQ0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3JldiAgIDI0NDUKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3JldiAgMjQ0NgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYgICAyNDQ3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldiAgIDI0NDgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldiAgMjQ0OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdF9yZXYgICAyNDUwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3JldiAgIDI0NTEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2ICAgMjQ1MgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYgICAyNDUzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYgIDI0NTQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldiAgMjQ1NQorICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHRfcmV2ICAyNDU2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYgIDI0NTcKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYgICAyNDU4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldiAgIDI0NTkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2ICAgMjQ2MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYgICAyNDYxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdF9yZXYgIDI0NjIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldiAgMjQ2MworICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2ICAyNDY0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdF9yZXYgIDI0NjUKKworICAgICAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHRfcmV2ICAyNDY2CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0X3JldiAgMjQ2NworICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdF9yZXYgIDI0NjgKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHRfcmV2ICAyNDY5CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgICVlbmRpZgorCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2ICAgMjQ3MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3JldiAgIDI0NzEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2ICAyNDcyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfcmV2ICAgMjQ3MworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX3JldiAgIDI0NzQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfcmV2ICAyNDc1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfcmV2ICAgMjQ3NgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X3JldiAgIDI0NzcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2ICAyNDc4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2ICAgMjQ3OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldiAgIDI0ODAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2ICAyNDgxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfcmV2ICAgMjQ4MgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldiAgIDI0ODMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2ICAyNDg0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfcmV2ICAgMjQ4NQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX3JldiAgIDI0ODYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2ICAyNDg3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2ICAgMjQ4OAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3JldiAgIDI0ODkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2ICAyNDkwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfcmV2ICAgMjQ5MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX3JldiAgIDI0OTIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfcmV2ICAyNDkzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2ICAgMjQ5NAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldiAgIDI0OTUKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9yZXYgICAyNDk2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2ICAgMjQ5NworICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXYgIDI0OTgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2ICAyNDk5CisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldiAgMjUwMAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9yZXYgIDI1MDEKKwkgICAgJWVuZGlmCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfcmV2ICAgMjUwMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldiAgIDI1MDMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYgICAyNTA0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfcmV2ICAgMjUwNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9yZXYgIDI1MDYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2ICAyNTA3CisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX3JldiAgMjUwOAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9yZXYgIDI1MDkKKyAgICAgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfcmV2ICAyNTEwCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfcmV2ICAyNTExCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfcmV2ICAyNTEyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfcmV2ICAyNTEzCisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgICVlbmRpZgorCisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2X2ZwCisKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc3ViX2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc3ViX2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc3ViX2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc3ViX2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3Jldl9mcAorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZiAgICMgT01QXzQwCisKKworICAgICVlbmRpZiAgICMgYXJjaF82NAorCisgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X211bF9mcAorICAgICVlbmRpZgorCislZW5kaWYKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQgYi9yYzMvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwZGI4YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9leHBvcnRzX3NvLnR4dApAQCAtMCwwICsxLDEzNCBAQAorIyBleHBvcnRzX3NvLnR4dCAjCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBUaGlzIGlzIHZlcnNpb24gc2NyaXB0IGZvciBPTVAgUlRMIHNoYXJlZCBsaWJyYXJ5IChsaWJvbXAqLnNvKQorCitWRVJTSU9OIHsKKworICAgIGdsb2JhbDogIyBFeHBvcnRlZCBzeW1ib2xzLgorCisgICAgICAgICMKKyAgICAgICAgIyAiTm9ybWFsIiBzeW1ib2xzLgorICAgICAgICAjCisgICAgICAgIG9tcF8qOyAgICAgIyBTdGFuZGFyZCBPcGVuTVAgZnVuY3Rpb25zLgorCisgICAgICAgICMKKyAgICAgICAgIyBPTVBUIEFQSQorICAgICAgICAjCisgICAgICAgIG9tcHRfdG9vbDsgICAgICAgICAgICMgT01QVCBpbml0aWFsaXphdGlvbiBpbnRlcmZhY2UKKyAgICAgICAgb21wdF9jb250cm9sOyAgICAgICAgIyBPTVBUIGNvbnRyb2wgaW50ZXJmYWNlCisKKyAgICAgICAgIyBpY2MgZHJvcHMgd2VhayBhdHRyaWJ1dGUgYXQgbGlua2luZyBzdGVwIHdpdGhvdXQgdGhlIGZvbGxvd2luZyBsaW5lOgorICAgICAgICBBbm5vdGF0ZSo7ICAgICAgICAgICAjIFRTQU4gYW5ub3RhdGlvbgorCisgICAgICAgICMKKyAgICAgICAgIyBPTVBUIHN0YXRlIHBsYWNlaG9sZGVycworICAgICAgICAjCisgICAgICAgIG9tcHRfaWRsZTsKKyAgICAgICAgb21wdF9vdmVyaGVhZDsKKyAgICAgICAgb21wdF9iYXJyaWVyX3dhaXQ7CisgICAgICAgIG9tcHRfdGFza193YWl0OworICAgICAgICBvbXB0X211dGV4X3dhaXQ7CisKKyAgICAgICAgb21wY18qOyAgICAjIG9tcC5oIHJlbmFtZXMgc29tZSBzdGFuZGFyZCBmdW5jdGlvbnMgdG8gb21wY18qLgorICAgICAgICBrbXBfKjsgICAgICMgSW50ZWwgZXh0ZW5zaW9ucy4KKyAgICAgICAga21wY18qOyAgICAjIEludGVsIGV4dGVuc2lvbnMuCisgICAgICAgIF9fa21wY18qOyAgIyBGdW5jdGlvbnMgY2FsbGVkIGJ5IGNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlLgorICAgICAgICBHT01QXyo7ICAgICMgR05VIEMgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMuCisKKyAgICAgICAgX1lvdV9tdXN0X2xpbmtfd2l0aF8qOyAgICAgIyBNdXR1YWwgZGV0ZWN0aW9uL01TIGNvbXBhdGliaWxpdHkgc3ltYm9scy4KKworCisgICAgICAgICMKKyAgICAgICAgIyBEZWJ1Z2dlciBzdXBwb3J0LgorICAgICAgICAjCisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgIF9fa21wX2RlYnVnZ2luZzsKKyAgICAgICAgX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvOworI2VuZGlmIC8qIFVTRV9ERUJVR0dFUiAqLworCisgICAgICAgICMKKyAgICAgICAgIyBJbnRlcm5hbCBmdW5jdGlvbnMgZXhwb3J0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgICAgICAgICMKKyAgICAgICAgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2Q7CisgICAgICAgIF9fX2ttcF9hbGxvY2F0ZTsKKyAgICAgICAgX19fa21wX2ZyZWU7CisgICAgICAgIF9fa21wX3RocmVhZF9wb29sOworICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9udGg7CisKKwlfX2ttcF9yZXNldF9zdGF0czsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgIworICAgICAgICAjIElUVCBzdXBwb3J0LgorICAgICAgICAjCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBlbnRyeSBwb2ludHMgYXJlIGFkZGVkIHNvIHRoYXQgdGhlIGJhY2t0cmFjZXMgZnJvbQorICAgICAgICAjIHRoZSB0b29scyBjb250YWluIG1lYW5pbmdmdWwgbmFtZXMgZm9yIGFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgbWlnaHQKKyAgICAgICAgIyBhcHBlYXIgaW4gYSBiYWNrdHJhY2Ugb2YgYSB0aHJlYWQgd2hpY2ggaXMgYmxvY2tlZCBpbiB0aGUgUlRMLgorICAgICAgICBfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV90YXNfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jazsKKyAgICAgICAgX19rbXBfZm9ya19jYWxsOworICAgICAgICBfX2ttcF9nZXRfcmVkdWNlX21ldGhvZDsKKyAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzazsKKyAgICAgICAgX19rbXBfaXR0X2ZpbmlfaXR0bGliOworICAgICAgICBfX2ttcF9pdHRfaW5pdF9pdHRsaWI7CisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgICAgIF9fa21wX2xhdW5jaF9tb25pdG9yOworICAgICAgICBfX2ttcF9yZWFwX21vbml0b3I7CisjZW5kaWYKKyAgICAgICAgX19rbXBfbGF1bmNoX3dvcmtlcjsKKyAgICAgICAgX19rbXBfcmVhcF93b3JrZXI7CisgICAgICAgIF9fa21wX3JlbGVhc2VfNjQ7CisgICAgICAgIF9fa21wX3dhaXRfNjQ7CisgICAgICAgIF9fa21wX3dhaXRfeWllbGRfNDsKKworICAgICAgICAjIGl0dG5vdGlmeSBzeW1ib2xzIHRvIGJlIHVzZWQgYnkgZGVidWdnZXIKKyAgICAgICAgX19rbXBfaXR0X2ZpbmlfaXR0bGliOworICAgICAgICBfX2ttcF9pdHRfaW5pdF9pdHRsaWI7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgbG9jYWw6ICMgTm9uLWV4cG9ydGVkIHN5bWJvbHMuCisKKyAgICAgICAgKjsgICAgICAgICAjIEFsbCBvdGhlciBzeW1ib2xzIGFyZSBub3QgZXhwb3J0ZWQuCisKK307ICMgVkVSU0lPTgorCisjIHNldHMgdXAgR0NDIE9NUF8gdmVyc2lvbiBkZXBlbmRlbmN5IGNoYWluCitPTVBfMS4wIHsKK307CitPTVBfMi4wIHsKK30gT01QXzEuMDsKK09NUF8zLjAgeworfSBPTVBfMi4wOworT01QXzMuMSB7Cit9IE9NUF8zLjA7CitPTVBfNC4wIHsKK30gT01QXzMuMTsKKworIyBzZXRzIHVwIEdDQyBHT01QXyB2ZXJzaW9uIGRlcGVuZGVuY3kgY2hhaW4KK0dPTVBfMS4wIHsKK307CitHT01QXzIuMCB7Cit9IEdPTVBfMS4wOworR09NUF8zLjAgeworfSBHT01QXzIuMDsKK0dPTVBfNC4wIHsKK30gR09NUF8zLjA7CisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2V4dHJhY3RFeHRlcm5hbC5jcHAgYi9yYzMvcnVudGltZS9zcmMvZXh0cmFjdEV4dGVybmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZmZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2V4dHJhY3RFeHRlcm5hbC5jcHAKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBleHRyYWN0RXh0ZXJuYWwuY3BwCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJzdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKworLyogR2l2ZW4gYSBzZXQgb2YgbiBvYmplY3QgZmlsZXMgaCAoJ2V4dGVybmFsJyBvYmplY3QgZmlsZXMpIGFuZCBhIHNldCBvZiBtCisgICBvYmplY3QgZmlsZXMgbyAoJ2ludGVybmFsJyBvYmplY3QgZmlsZXMpLAorICAgMS4gRGV0ZXJtaW5lcyByLCB0aGUgc3Vic2V0IG9mIGggdGhhdCBvIGRlcGVuZHMgb24sIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKKyAgIDIuIFJlbW92ZXMgdGhlIGZpbGVzIGluIGggLSByIGZyb20gdGhlIGZpbGUgc3lzdGVtCisgICAzLiBGb3IgZWFjaCBleHRlcm5hbCBzeW1ib2wgZGVmaW5lZCBpbiBzb21lIGZpbGUgaW4gciwgcmVuYW1lIGl0IGluIHIgVSBvCisgICAgICBieSBwcmVmaXhpbmcgaXQgd2l0aCAiX19rbXBfZXh0ZXJuYWxfIgorICAgVXNhZ2U6CisgICBoaWRlLmV4ZSA8bj4gPGZpbGVuYW1lcyBmb3IgaD4gPGZpbGVuYW1lcyBmb3Igbz4KKworICAgVGh1cywgdGhlIHByZWZpeGVkIHN5bWJvbHMgYmVjb21lIGhpZGRlbiBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IG5vdyBoYXZlIGEgc3BlY2lhbAorICAgcHJlZml4LgorKi8KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordm9pZCBzdG9wKGNoYXIqIGVycm9yTXNnKSB7CisgICAgcHJpbnRmKCIlc1xuIiwgZXJyb3JNc2cpOworICAgIGV4aXQoMSk7Cit9CisKKy8vIGFuIGVudHJ5IGluIHRoZSBzeW1ib2wgdGFibGUgb2YgYSAuT0JKIGZpbGUKK2NsYXNzIFN5bWJvbCB7CitwdWJsaWM6CisgICAgX19pbnQ2NCBuYW1lOworICAgIHVuc2lnbmVkIHZhbHVlOworICAgIHVuc2lnbmVkIHNob3J0IHNlY3Rpb25OdW0sIHR5cGU7CisgICAgY2hhciBzdG9yYWdlQ2xhc3MsIG5BdXg7Cit9OworCitjbGFzcyBfcnN0cmVhbSA6IHB1YmxpYyBpc3Ryc3RyZWFtIHsKK3ByaXZhdGU6CisgICAgY29uc3QgY2hhciAqYnVmOworcHJvdGVjdGVkOgorICAgIF9yc3RyZWFtKHBhaXI8Y29uc3QgY2hhciosIHN0cmVhbXNpemU+IHApOmlzdHJzdHJlYW0ocC5maXJzdCxwLnNlY29uZCksYnVmKHAuZmlyc3Qpe30KKyAgICB+X3JzdHJlYW0oKSB7CisJZGVsZXRlW11idWY7CisgICAgfQorfTsKKworLyogQSBzdHJlYW0gZW5jYXB1c2xhdGluZyB0aGUgY29udGVudCBvZiBhIGZpbGUgb3IgdGhlIGNvbnRlbnQgb2YgYSBzdHJpbmcsIG92ZXJyaWRpbmcgdGhlCisgICA+PiBvcGVyYXRvciB0byByZWFkIHZhcmlvdXMgaW50ZWdlciB0eXBlcyBpbiBiaW5hcnkgZm9ybSwgYXMgd2VsbCBhcyBhIHN5bWJvbCB0YWJsZQorICAgZW50cnkuCisqLworY2xhc3MgcnN0cmVhbSA6IHB1YmxpYyBfcnN0cmVhbSB7Citwcml2YXRlOgorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgaW5saW5lIHJzdHJlYW0mIGRvUmVhZChUICZ4KSB7CisJcmVhZCgoY2hhciopJngsIHNpemVvZihUKSk7CisJcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBzdGF0aWMgcGFpcjxjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZT4gZ2V0QnVmKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB7CisJaWZzdHJlYW0gcmF3KGZpbGVOYW1lLGlvczo6YmluYXJ5IHwgaW9zOjppbik7CisJaWYoIXJhdy5pc19vcGVuKCkpCisJICAgIHN0b3AoInJzdHJlYW0uZ2V0QnVmOiBFcnJvciBvcGVuaW5nIGZpbGUiKTsKKwlyYXcuc2Vla2coMCxpb3M6OmVuZCk7CisJc3RyZWFtcG9zIGZpbGVTaXplID0gcmF3LnRlbGxnKCk7CisJaWYoZmlsZVNpemUgPCAwKQorCSAgICBzdG9wKCJyc3RyZWFtLmdldEJ1ZjogRXJyb3IgcmVhZGluZyBmaWxlIik7CisJY2hhciAqYnVmID0gbmV3IGNoYXJbZmlsZVNpemVdOworCXJhdy5zZWVrZygwLGlvczo6YmVnKTsKKwlyYXcucmVhZChidWYsIGZpbGVTaXplKTsKKwlyZXR1cm4gcGFpcjxjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZT4oYnVmLGZpbGVTaXplKTsKKyAgICB9CitwdWJsaWM6CisgICAgLy8gY29uc3RydWN0IGZyb20gYSBzdHJpbmcKKyAgICByc3RyZWFtKGNvbnN0IGNoYXIgKmJ1ZixzdHJlYW1zaXplIHNpemUpOl9yc3RyZWFtKHBhaXI8Y29uc3QgY2hhciosc3RyZWFtc2l6ZT4oYnVmLCBzaXplKSl7fQorICAgIC8qIGNvbnN0cnVjdCBmcm9tIGEgZmlsZSB3aG9sZSBjb250ZW50IGlzIGZ1bGx5IHJlYWQgb25jZSB0byBpbml0aWFsaXplIHRoZSBjb250ZW50IG9mCisgICAgICAgdGhpcyBzdHJlYW0KKyAgICAqLworICAgIHJzdHJlYW0oY29uc3QgY2hhciAqZmlsZU5hbWUpOl9yc3RyZWFtKGdldEJ1ZihmaWxlTmFtZSkpe30KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KGludCAmeCkgeworCXJldHVybiBkb1JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4odW5zaWduZWQgJngpIHsKKwlyZXR1cm4gZG9SZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KHNob3J0ICZ4KSB7CisJcmV0dXJuIGRvUmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBzaG9ydCAmeCkgeworCXJldHVybiBkb1JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4oU3ltYm9sICZlKSB7CisJcmVhZCgoY2hhciopJmUsIDE4KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgfQorfTsKKworLy8gc3RyaW5nIHRhYmxlIGluIGEgLk9CSiBmaWxlCitjbGFzcyBTdHJpbmdUYWJsZSB7Citwcml2YXRlOgorICAgIG1hcDxzdHJpbmcsIHVuc2lnbmVkPiBkaXJlY3Rvcnk7CisgICAgc2l6ZV90IGxlbmd0aDsKKyAgICBjaGFyICpkYXRhOworCisgICAgLy8gbWFrZSA8ZGlyZWN0b3J5PiBmcm9tIDxsZW5ndGg+IGJ5dGVzIGluIDxkYXRhPgorICAgIHZvaWQgbWFrZURpcmVjdG9yeSh2b2lkKSB7CisJdW5zaWduZWQgaSA9IDQ7CisJd2hpbGUoaSA8IGxlbmd0aCkgeworCSAgICBzdHJpbmcgcyA9IHN0cmluZyhkYXRhICsgaSk7CisJICAgIGRpcmVjdG9yeS5pbnNlcnQobWFrZV9wYWlyKHMsIGkpKTsKKwkgICAgaSArPSBzLnNpemUoKSArIDE7CisJfQorICAgIH0KKyAgICAvLyBpbml0aWFsaXplIDxsZW5ndGg+IGFuZCA8ZGF0YT4gd2l0aCBjb250ZW50cyBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50cworICAgIHZvaWQgaW5pdChjb25zdCBjaGFyICpfZGF0YSkgeworCXVuc2lnbmVkIF9sZW5ndGggPSAqKHVuc2lnbmVkKilfZGF0YTsKKworCWlmKF9sZW5ndGggPCBzaXplb2YodW5zaWduZWQpIHx8IF9sZW5ndGggIT0gKih1bnNpZ25lZCopX2RhdGEpCisJICAgIHN0b3AoIlN0cmluZ1RhYmxlLmluaXQ6IEludmFsaWQgc3ltYm9sIHRhYmxlIik7CisJaWYoX2RhdGFbX2xlbmd0aCAtIDFdKSB7CisJICAgIC8vIHRvIHByZXZlbnQgcnVuYXdheSBzdHJpbmdzLCBtYWtlIHN1cmUgdGhlIGRhdGEgZW5kcyB3aXRoIGEgemVybworCSAgICBkYXRhID0gbmV3IGNoYXJbbGVuZ3RoID0gX2xlbmd0aCArIDFdOworCSAgICBkYXRhW19sZW5ndGhdID0gMDsKKwl9IGVsc2UgeworCSAgICBkYXRhID0gbmV3IGNoYXJbbGVuZ3RoID0gX2xlbmd0aF07CisJfQorCSoodW5zaWduZWQqKWRhdGEgPSBsZW5ndGg7CisJS01QX01FTUNQWShkYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwgX2RhdGEgKyBzaXplb2YodW5zaWduZWQpLAorCSAgICAgICAgICAgbGVuZ3RoIC0gc2l6ZW9mKHVuc2lnbmVkKSk7CisJbWFrZURpcmVjdG9yeSgpOworICAgIH0KK3B1YmxpYzoKKyAgICBTdHJpbmdUYWJsZShyc3RyZWFtICZmKSB7CisJLyogQ29uc3RydWN0IHN0cmluZyB0YWJsZSBieSByZWFkaW5nIGZyb20gZi4KKwkgKi8KKwlzdHJlYW1wb3MgczsKKwl1bnNpZ25lZCBzdHJTaXplOworCWNoYXIgKnN0ckRhdGE7CisKKwlzID0gZi50ZWxsZygpOworCWY+PnN0clNpemU7CisJaWYoc3RyU2l6ZSA8IHNpemVvZih1bnNpZ25lZCkpCisJICAgIHN0b3AoIlN0cmluZ1RhYmxlOiBJbnZhbGlkIHN0cmluZyB0YWJsZSIpOworCXN0ckRhdGEgPSBuZXcgY2hhcltzdHJTaXplXTsKKwkqKHVuc2lnbmVkKilzdHJEYXRhID0gc3RyU2l6ZTsKKwkvLyByZWFkIHRoZSByYXcgZGF0YSBpbnRvIDxzdHJEYXRhPgorCWYucmVhZChzdHJEYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwgc3RyU2l6ZSAtIHNpemVvZih1bnNpZ25lZCkpOworCXMgPSBmLnRlbGxnKCkgLSBzOworCWlmKHMgPCBzdHJTaXplKQorCSAgICBzdG9wKCJTdHJpbmdUYWJsZTogVW5leHBlY3RlZCBFT0YiKTsKKwlpbml0KHN0ckRhdGEpOworCWRlbGV0ZVtdc3RyRGF0YTsKKyAgICB9CisgICAgU3RyaW5nVGFibGUoY29uc3Qgc2V0PHN0cmluZz4gJnN0cmluZ3MpIHsKKwkvKiBDb25zdHJ1Y3Qgc3RyaW5nIHRhYmxlIGZyb20gZ2l2ZW4gc3RyaW5ncy4KKwkgKi8KKwljaGFyICpwOworCXNldDxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdDsKKwlzaXplX3QgczsKKworCS8vIGNvdW50IHJlcXVpcmVkIHNpemUgZm9yIGRhdGEKKwlmb3IobGVuZ3RoID0gc2l6ZW9mKHVuc2lnbmVkKSwgaXQgPSBzdHJpbmdzLmJlZ2luKCk7IGl0ICE9IHN0cmluZ3MuZW5kKCk7ICsraXQpIHsKKwkgICAgc2l6ZV90IGwgPSAoKml0KS5zaXplKCk7CisKKwkgICAgaWYobCA+ICh1bnNpZ25lZCkgMHhGRkZGRkZGRikKKwkJc3RvcCgiU3RyaW5nVGFibGU6IFN0cmluZyB0b28gbG9uZyIpOworCSAgICBpZihsID4gOCkgeworCQlsZW5ndGggKz0gbCArIDE7CisJCWlmKGxlbmd0aCA+ICh1bnNpZ25lZCkgMHhGRkZGRkZGRikKKwkJICAgIHN0b3AoIlN0cmluZ1RhYmxlOiBTeW1ib2wgdGFibGUgdG9vIGxvbmciKTsKKwkgICAgfQorCX0KKwlkYXRhID0gbmV3IGNoYXJbbGVuZ3RoXTsKKwkqKHVuc2lnbmVkKilkYXRhID0gbGVuZ3RoOworCS8vIHBvcHVsYXRlIGRhdGEgYW5kIGRpcmVjdG9yeQorCWZvcihwID0gZGF0YSArIHNpemVvZih1bnNpZ25lZCksIGl0ID0gc3RyaW5ncy5iZWdpbigpOyBpdCAhPSBzdHJpbmdzLmVuZCgpOyArK2l0KSB7CisJICAgIGNvbnN0IHN0cmluZyAmc3RyID0gKml0OworCSAgICBzaXplX3QgbCA9IHN0ci5zaXplKCk7CisJICAgIGlmKGwgPiA4KSB7CisJCWRpcmVjdG9yeS5pbnNlcnQobWFrZV9wYWlyKHN0ciwgcCAtIGRhdGEpKTsKKwkJS01QX01FTUNQWShwLCBzdHIuY19zdHIoKSwgbCk7CisJCXBbbF0gPSAwOworCQlwICs9IGwgKyAxOworCSAgICB9CisJfQorICAgIH0KKyAgICB+U3RyaW5nVGFibGUoKSB7CisJZGVsZXRlW10gZGF0YTsKKyAgICB9CisgICAgLyogUmV0dXJucyBlbmNvZGluZyBmb3IgZ2l2ZW4gc3RyaW5nIGJhc2VkIG9uIHRoaXMgc3RyaW5nIHRhYmxlLgorICAgICAgIEVycm9yIGlmIHN0cmluZyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDggYnV0IHN0cmluZyBpcyBub3QgaW4KKyAgICAgICB0aGUgc3RyaW5nIHRhYmxlLS1yZXR1cm5zIDAuCisgICAgKi8KKyAgICBfX2ludDY0IGVuY29kZShjb25zdCBzdHJpbmcgJnN0cikgeworCV9faW50NjQgcjsKKworCWlmKHN0ci5zaXplKCkgPD0gOCkgeworCSAgICAvLyBlbmNvZGVkIGRpcmVjdGx5CisJICAgICgoY2hhciopJnIpWzddID0gMDsKKwkgICAgS01QX1NUUk5DUFlfUygoY2hhciopJnIsIHNpemVvZihyKSwgc3RyLmNfc3RyKCksIDgpOworCSAgICByZXR1cm4gcjsKKwl9IGVsc2UgeworCSAgICAvLyByZXByZXNlbnRlZCBhcyBpbmRleCBpbnRvIHRhYmxlCisJICAgIG1hcDxzdHJpbmcsdW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGRpcmVjdG9yeS5maW5kKHN0cik7CisJICAgIGlmKGl0ID09IGRpcmVjdG9yeS5lbmQoKSkKKwkJc3RvcCgiU3RyaW5nVGFibGU6OmVuY29kZTogU3RyaW5nIG5vdyBmb3VuZCBpbiBzdHJpbmcgdGFibGUiKTsKKwkgICAgKCh1bnNpZ25lZCopJnIpWzBdID0gMDsKKwkgICAgKCh1bnNpZ25lZCopJnIpWzFdID0gKCppdCkuc2Vjb25kOworCSAgICByZXR1cm4gcjsKKwl9CisgICAgfQorICAgIC8qIFJldHVybnMgc3RyaW5nIHJlcHJlc2VudGVkIGJ5IHggYmFzZWQgb24gdGhpcyBzdHJpbmcgdGFibGUuCisgICAgICAgRXJyb3IgaWYgeCByZWZlcmVuY2VzIGFuIGludmFsaWQgcG9zaXRpb24gaW4gdGhlIHRhYmxlLS1yZXR1cm5zCisgICAgICAgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAqLworICAgIHN0cmluZyBkZWNvZGUoX19pbnQ2NCB4KSBjb25zdCB7CisJaWYoKih1bnNpZ25lZCopJnggPT0gMCkgeworCSAgICAvLyByZXByZXNlbnRlZCBhcyBpbmRleCBpbnRvIHRhYmxlCisJICAgIHVuc2lnbmVkICZwID0gKCh1bnNpZ25lZCopJngpWzFdOworCSAgICBpZihwID49IGxlbmd0aCkKKwkJc3RvcCgiU3RyaW5nVGFibGU6OmRlY29kZTogSW52YWxpZCBzdHJpbmcgdGFibGUgbG9va3VwIik7CisJICAgIHJldHVybiBzdHJpbmcoZGF0YSArIHApOworCX0gZWxzZSB7CisJICAgIC8vIGVuY29kZWQgZGlyZWN0bHkKKwkgICAgY2hhciAqcCA9IChjaGFyKikmeDsKKwkgICAgaW50IGk7CisKKwkgICAgZm9yKGkgPSAwOyBpIDwgOCAmJiBwW2ldOyArK2kpOworCSAgICByZXR1cm4gc3RyaW5nKHAsIGkpOworCX0KKyAgICB9CisgICAgdm9pZCB3cml0ZShvc3RyZWFtICZvcykgeworCW9zLndyaXRlKGRhdGEsIGxlbmd0aCk7CisgICAgfQorfTsKKworLyogZm9yIHRoZSBuYW1lZCBvYmplY3QgZmlsZSwgZGV0ZXJtaW5lcyB0aGUgc2V0IG9mIGRlZmluZWQgc3ltYm9scyBhbmQgdGhlIHNldCBvZiB1bmRlZmluZWQgZXh0ZXJuYWwgc3ltYm9scworICAgYW5kIHdyaXRlcyB0aGVtIHRvIDxkZWZpbmVkPiBhbmQgPHVuZGVmaW5lZD4gcmVzcGVjdGl2ZWx5CisqLwordm9pZCBjb21wdXRlRXh0ZXJuYWxTeW1ib2xzKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBzZXQ8c3RyaW5nPiAqZGVmaW5lZCwgc2V0PHN0cmluZz4gKnVuZGVmaW5lZCl7CisgICAgc3RyZWFtcG9zIGZpbGVTaXplOworICAgIHNpemVfdCBzdHJUYWJTdGFydDsKKyAgICB1bnNpZ25lZCBzeW1UYWJTdGFydCwgc3ltTkVudHJpZXM7CisgICAgcnN0cmVhbSBmKGZpbGVOYW1lKTsKKworICAgIGYuc2Vla2coMCxpb3M6OmVuZCk7CisgICAgZmlsZVNpemUgPSBmLnRlbGxnKCk7CisKKyAgICBmLnNlZWtnKDgpOworICAgIGYgPj4gc3ltVGFiU3RhcnQgPj4gc3ltTkVudHJpZXM7CisgICAgLy8gc2VlayB0byB0aGUgc3RyaW5nIHRhYmxlCisgICAgZi5zZWVrZyhzdHJUYWJTdGFydCA9IHN5bVRhYlN0YXJ0ICsgMTggKiAoc2l6ZV90KXN5bU5FbnRyaWVzKTsKKyAgICBpZihmLmVvZigpKSB7CisJcHJpbnRmKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBmaWxlTmFtZT0nJXMnLCBmaWxlU2l6ZSA9ICVsdSwgc3ltVGFiU3RhcnQgPSAldSwgc3ltTkVudHJpZXMgPSAldVxuIiwKKwkgICAgICAgZmlsZU5hbWUsICh1bnNpZ25lZCBsb25nKSBmaWxlU2l6ZSwgc3ltVGFiU3RhcnQsIHN5bU5FbnRyaWVzKTsKKwlzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiAxIik7CisgICAgfQorICAgIFN0cmluZ1RhYmxlIHN0cmluZ1RhYmxlKGYpOyAvLyByZWFkIHRoZSBzdHJpbmcgdGFibGUKKyAgICBpZihmLnRlbGxnKCkgIT0gZmlsZVNpemUpCisJc3RvcCgiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogVW5leHBlY3RlZCBkYXRhIGFmdGVyIHN0cmluZyB0YWJsZSIpOworCisgICAgZi5jbGVhcigpOworICAgIGYuc2Vla2coc3ltVGFiU3RhcnQpOyAvLyBzZWVrIHRvIHRoZSBzeW1ib2wgdGFibGUKKworICAgIGRlZmluZWQtPmNsZWFyKCk7IHVuZGVmaW5lZC0+Y2xlYXIoKTsKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgc3ltTkVudHJpZXM7ICsraSkgeworCS8vIHByb2Nlc3MgZWFjaCBlbnRyeQorCVN5bWJvbCBlOworCisJaWYoZi5lb2YoKSkKKwkgICAgc3RvcCgiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogVW5leHBlY3RlZCBFT0YgMiIpOworCWY+PmU7CisJaWYoZi5mYWlsKCkpCisJICAgIHN0b3AoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IEZpbGUgcmVhZCBlcnJvciIpOworCWlmKGUubkF1eCkgeyAvLyBhdXhpbGlhcnkgZW50cnk6IHNraXAKKwkgICAgZi5zZWVrZyhlLm5BdXggKiAxOCwgaW9zOjpjdXIpOworCSAgICBpICs9IGUubkF1eDsKKwl9CisJLy8gaWYgc3ltYm9sIGlzIGV4dGVybiBhbmQgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBmaWxlLCBpbnNlcnQgaXQKKwlpZihlLnN0b3JhZ2VDbGFzcyA9PSAyKQorCSAgICBpZihlLnNlY3Rpb25OdW0pCisJCWRlZmluZWQtPmluc2VydChzdHJpbmdUYWJsZS5kZWNvZGUoZS5uYW1lKSk7CisJICAgIGVsc2UKKwkJdW5kZWZpbmVkLT5pbnNlcnQoc3RyaW5nVGFibGUuZGVjb2RlKGUubmFtZSkpOworICAgIH0KK30KKworLyogRm9yIGVhY2ggb2NjdXJyZW5jZSBvZiBhbiBleHRlcm5hbCBzeW1ib2wgaW4gdGhlIG9iamVjdCBmaWxlIG5hbWVkIGJ5CisgICBieSA8ZmlsZU5hbWU+IHRoYXQgaXMgYSBtZW1iZXIgb2YgPGhpZGU+LCByZW5hbWVzIGl0IGJ5IHByZWZpeGluZworICAgd2l0aCAiX19rbXBfZXh0ZXJuYWxfIiwgd3JpdGluZyBiYWNrIHRoZSBmaWxlIGluLXBsYWNlCisqLwordm9pZCBoaWRlU3ltYm9scyhjaGFyICpmaWxlTmFtZSwgY29uc3Qgc2V0PHN0cmluZz4gJmhpZGUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RyaW5nIHByZWZpeCgiX19rbXBfZXh0ZXJuYWxfIik7CisgICAgc2V0PHN0cmluZz4gc3RyaW5nczsgLy8gc2V0IG9mIGFsbCBvY2N1cnJpbmcgc3ltYm9scywgYXBwcm9wcmlhdGVseSBwcmVmaXhlZAorICAgIHN0cmVhbXBvcyBmaWxlU2l6ZTsKKyAgICBzaXplX3Qgc3RyVGFiU3RhcnQ7CisgICAgdW5zaWduZWQgc3ltVGFiU3RhcnQsIHN5bU5FbnRyaWVzOworICAgIGludCBpOworICAgIHJzdHJlYW0gaW4oZmlsZU5hbWUpOworCisgICAgaW4uc2Vla2coMCxpb3M6OmVuZCk7CisgICAgZmlsZVNpemUgPSBpbi50ZWxsZygpOworCisgICAgaW4uc2Vla2coOCk7CisgICAgaW4gPj4gc3ltVGFiU3RhcnQgPj4gc3ltTkVudHJpZXM7CisgICAgaW4uc2Vla2coc3RyVGFiU3RhcnQgPSBzeW1UYWJTdGFydCArIDE4ICogKHNpemVfdClzeW1ORW50cmllcyk7CisgICAgaWYoaW4uZW9mKCkpCisJc3RvcCgiaGlkZVN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIik7CisgICAgU3RyaW5nVGFibGUgc3RyaW5nVGFibGVPbGQoaW4pOyAvLyByZWFkIG9yaWdpbmFsIHN0cmluZyB0YWJsZQorCisgICAgaWYoaW4udGVsbGcoKSAhPSBmaWxlU2l6ZSkKKwlzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBkYXRhIGFmdGVyIHN0cmluZyB0YWJsZSIpOworCisgICAgLy8gY29tcHV0ZSBzZXQgb2Ygb2NjdXJyaW5nIHN0cmluZ3Mgd2l0aCBwcmVmaXggYWRkZWQKKyAgICBmb3IoaSA9IDA7IGkgPCBzeW1ORW50cmllczsgKytpKSB7CisJU3ltYm9sIGU7CisKKwlpbi5zZWVrZyhzeW1UYWJTdGFydCArIGkgKiAxOCk7CisJaWYoaW4uZW9mKCkpCisJICAgIHN0b3AoImhpZGVTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiIpOworCWluID4+IGU7CisJaWYoaW4uZmFpbCgpKQorCSAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisJaWYoZS5uQXV4KQorCSAgICBpICs9IGUubkF1eDsKKwljb25zdCBzdHJpbmcgJnMgPSBzdHJpbmdUYWJsZU9sZC5kZWNvZGUoZS5uYW1lKTsKKwkvLyBpZiBzeW1ib2wgaXMgZXh0ZXJuIGFuZCBmb3VuZCBpbiA8aGlkZT4sIHByZWZpeCBhbmQgaW5zZXJ0IGludG8gc3RyaW5ncywKKwkvLyBvdGhlcndpc2UsIGp1c3QgaW5zZXJ0IGludG8gc3RyaW5ncyB3aXRob3V0IHByZWZpeAorCXN0cmluZ3MuaW5zZXJ0KCAoZS5zdG9yYWdlQ2xhc3MgPT0gMiAmJiBoaWRlLmZpbmQocykgIT0gaGlkZS5lbmQoKSkgPworCQkJcHJlZml4ICsgcyA6IHMpOworICAgIH0KKworICAgIG9mc3RyZWFtIG91dChmaWxlTmFtZSwgaW9zOjp0cnVuYyB8IGlvczo6b3V0IHwgaW9zOjpiaW5hcnkpOworICAgIGlmKCFvdXQuaXNfb3BlbigpKQorCXN0b3AoImhpZGVTeW1ib2xzOiBFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlIik7CisKKyAgICAvLyBtYWtlIG5ldyBzdHJpbmcgdGFibGUgZnJvbSBzdHJpbmcgc2V0CisgICAgU3RyaW5nVGFibGUgc3RyaW5nVGFibGVOZXcgPSBTdHJpbmdUYWJsZShzdHJpbmdzKTsKKworICAgIC8vIGNvcHkgaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZSB1cCB0byBqdXN0IGJlZm9yZSB0aGUgc3ltYm9sIHRhYmxlCisgICAgaW4uc2Vla2coMCk7CisgICAgY2hhciAqYnVmID0gbmV3IGNoYXJbc3ltVGFiU3RhcnRdOworICAgIGluLnJlYWQoYnVmLCBzeW1UYWJTdGFydCk7CisgICAgb3V0LndyaXRlKGJ1Ziwgc3ltVGFiU3RhcnQpOworICAgIGRlbGV0ZSBbXWJ1ZjsKKworICAgIC8vIGNvcHkgaW5wdXQgc3ltYm9sIHRhYmxlIHRvIG91dHB1dCBzeW1ib2wgdGFibGUgd2l0aCBuYW1lIHRyYW5zbGF0aW9uCisgICAgZm9yKGkgPSAwOyBpIDwgc3ltTkVudHJpZXM7ICsraSkgeworCVN5bWJvbCBlOworCisJaW4uc2Vla2coc3ltVGFiU3RhcnQgKyBpKjE4KTsKKwlpZihpbi5lb2YoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIik7CisJaW4gPj4gZTsKKwlpZihpbi5mYWlsKCkpCisJICAgIHN0b3AoImhpZGVTeW1ib2xzOiBGaWxlIHJlYWQgZXJyb3IiKTsKKwljb25zdCBzdHJpbmcgJnMgPSBzdHJpbmdUYWJsZU9sZC5kZWNvZGUoZS5uYW1lKTsKKwlvdXQuc2Vla3Aoc3ltVGFiU3RhcnQgKyBpKjE4KTsKKwllLm5hbWUgPSBzdHJpbmdUYWJsZU5ldy5lbmNvZGUoIChlLnN0b3JhZ2VDbGFzcyA9PSAyICYmIGhpZGUuZmluZChzKSAhPSBoaWRlLmVuZCgpKSA/CisJCQkJCXByZWZpeCArIHMgOiBzKTsKKwlvdXQud3JpdGUoKGNoYXIqKSZlLCAxOCk7CisJaWYob3V0LmZhaWwoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IEZpbGUgd3JpdGUgZXJyb3IiKTsKKwlpZihlLm5BdXgpIHsKKwkgICAgLy8gY29weSBhdXhpbGlhcnkgc3ltYm9sIHRhYmxlIGVudHJpZXMKKwkgICAgaW50IG5BdXggPSBlLm5BdXg7CisJICAgIGZvcihpbnQgaiA9IDE7IGogPD0gbkF1eDsgKytqKSB7CisJCWluID4+IGU7CisJCW91dC5zZWVrcChzeW1UYWJTdGFydCArIChpICsgaikgKiAxOCk7CisJCW91dC53cml0ZSgoY2hhciopJmUsIDE4KTsKKwkgICAgfQorCSAgICBpICs9IG5BdXg7CisJfQorICAgIH0KKyAgICAvLyBvdXRwdXQgc3RyaW5nIHRhYmxlCisgICAgc3RyaW5nVGFibGVOZXcud3JpdGUob3V0KTsKK30KKworLy8gcmV0dXJucyB0cnVlIGlmZiA8YT4gYW5kIDxiPiBoYXZlIG5vIGNvbW1vbiBlbGVtZW50Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgaXNEaXNqb2ludChjb25zdCBzZXQ8VD4gJmEsIGNvbnN0IHNldDxUPiAmYikgeworICAgIHNldDxUPjo6Y29uc3RfaXRlcmF0b3IgaXRhLCBpdGI7CisKKyAgICBmb3IoaXRhID0gYS5iZWdpbigpLCBpdGIgPSBiLmJlZ2luKCk7IGl0YSAhPSBhLmVuZCgpICYmIGl0YiAhPSBiLmVuZCgpOykgeworCWNvbnN0IFQgJnRhID0gKml0YSwgJnRiID0gKml0YjsKKwlpZih0YSA8IHRiKQorCSAgICArK2l0YTsKKwllbHNlIGlmICh0YiA8IHRhKQorCSAgICArK2l0YjsKKwllbHNlCisJICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qIHByZWNvbmRpdGlvbjogPGRlZmluZWQ+IGFuZCA8dW5kZWZpbmVkPiBhcmUgYXJyYXlzIHdpdGggPG5Ub3RhbD4gZWxlbWVudHMgd2hlcmUKKyAgIDxuVG90YWw+ID49IDxuRXh0ZXJuYWw+LiAgVGhlIGZpcnN0IDxuRXh0ZXJuYWw+IGVsZW1lbnRzIGNvcnJlc3BvbmQgdG8gdGhlIGV4dGVybmFsIG9iamVjdAorICAgZmlsZXMgYW5kIHRoZSByZXN0IGNvcnJlc3BvbmQgdG8gdGhlIGludGVybmFsIG9iamVjdCBmaWxlcy4KKyAgIHBvc3Rjb25kaXRpb246IGZpbGUgeCBpcyBzYWlkIHRvIGRlcGVuZCBvbiBmaWxlIHkgaWYgdW5kZWZpbmVkW3hdIGFuZCBkZWZpbmVkW3ldIGFyZSBub3QKKyAgIGRpc2pvaW50LiAgUmV0dXJucyB0aGUgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIHRoZSBzZXQgb2YgaW50ZXJuYWwgb2JqZWN0IGZpbGVzLCBhcyBhIHNldCBvZgorICAgZmlsZSBpbmRleGVzLCB1bmRlciB0aGUgJ2RlcGVuZHMgb24nIHJlbGF0aW9uLCBtaW51cyB0aGUgc2V0IG9mIGludGVybmFsIG9iamVjdCBmaWxlcy4KKyovCitzZXQ8aW50PiAqZmluZFJlcXVpcmVkRXh0ZXJuYWwoaW50IG5FeHRlcm5hbCwgaW50IG5Ub3RhbCwgc2V0PHN0cmluZz4gKmRlZmluZWQsIHNldDxzdHJpbmc+ICp1bmRlZmluZWQpIHsKKyAgICBzZXQ8aW50PiAqcmVxdWlyZWQgPSBuZXcgc2V0PGludD47CisgICAgc2V0PGludD4gZnJlc2hbMl07CisgICAgaW50IGksIGN1ciA9IDA7CisgICAgYm9vbCBjaGFuZ2VkOworCisgICAgZm9yKGkgPSBuVG90YWwgLSAxOyBpID49IG5FeHRlcm5hbDsgLS1pKQorCWZyZXNoW2N1cl0uaW5zZXJ0KGkpOworICAgIGRvIHsKKwljaGFuZ2VkID0gZmFsc2U7CisJZm9yKHNldDxpbnQ+OjppdGVyYXRvciBpdCA9IGZyZXNoW2N1cl0uYmVnaW4oKTsgaXQgIT0gZnJlc2hbY3VyXS5lbmQoKTsgKytpdCkgeworCSAgICBzZXQ8c3RyaW5nPiAmcyA9IHVuZGVmaW5lZFsqaXRdOworCisJICAgIGZvcihpID0gMDsgaSA8IG5FeHRlcm5hbDsgKytpKSB7CisJCWlmKHJlcXVpcmVkLT5maW5kKGkpID09IHJlcXVpcmVkLT5lbmQoKSkgeworCQkgICAgaWYoIWlzRGlzam9pbnQoZGVmaW5lZFtpXSwgcykpIHsKKwkJCS8vIGZvdW5kIGEgbmV3IHF1YWxpZnlpbmcgZWxlbWVudAorCQkJcmVxdWlyZWQtPmluc2VydChpKTsKKwkJCWZyZXNoWzEgLSBjdXJdLmluc2VydChpKTsKKwkJCWNoYW5nZWQgPSB0cnVlOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJZnJlc2hbY3VyXS5jbGVhcigpOworCWN1ciA9IDEgLSBjdXI7CisgICAgfSB3aGlsZShjaGFuZ2VkKTsKKyAgICByZXR1cm4gcmVxdWlyZWQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGludCBuRXh0ZXJuYWwsIG5JbnRlcm5hbCwgaTsKKyAgICBzZXQ8c3RyaW5nPiAqZGVmaW5lZCwgKnVuZGVmaW5lZDsKKyAgICBzZXQ8aW50Pjo6aXRlcmF0b3IgaXQ7CisKKyAgICBpZihhcmdjIDwgMykKKwlzdG9wKCJQbGVhc2Ugc3BlY2lmeSBhIHBvc2l0aXZlIGludGVnZXIgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIG9iamVjdCBmaWxlbmFtZXMiKTsKKyAgICBuRXh0ZXJuYWwgPSBhdG9pKGFyZ3ZbMV0pOworICAgIGlmKG5FeHRlcm5hbCA8PSAwKQorCXN0b3AoIlBsZWFzZSBzcGVjaWZ5IGEgcG9zaXRpdmUgaW50ZWdlciBmb2xsb3dlZCBieSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVuYW1lcyIpOworICAgIGlmKG5FeHRlcm5hbCArICAyID4gYXJnYykKKwlzdG9wKCJUb28gZmV3IGV4dGVybmFsIG9iamVjdHMiKTsKKyAgICBuSW50ZXJuYWwgPSBhcmdjIC0gbkV4dGVybmFsIC0gMjsKKyAgICBkZWZpbmVkID0gbmV3IHNldDxzdHJpbmc+W2FyZ2MgLSAyXTsKKyAgICB1bmRlZmluZWQgPSBuZXcgc2V0PHN0cmluZz5bYXJnYyAtIDJdOworCisgICAgLy8gZGV0ZXJtaW5lIHRoZSBzZXQgb2YgZGVmaW5lZCBhbmQgdW5kZWZpbmVkIGV4dGVybmFsIHN5bWJvbHMKKyAgICBmb3IoaSA9IDI7IGkgPCBhcmdjOyArK2kpCisJY29tcHV0ZUV4dGVybmFsU3ltYm9scyhhcmd2W2ldLCBkZWZpbmVkICsgaSAtIDIsIHVuZGVmaW5lZCArIGkgLSAyKTsKKworICAgIC8vIGRldGVybWluZSB0aGUgc2V0IG9mIHJlcXVpcmVkIGV4dGVybmFsIGZpbGVzCisgICAgc2V0PGludD4gKnJlcXVpcmVkRXh0ZXJuYWwgPSBmaW5kUmVxdWlyZWRFeHRlcm5hbChuRXh0ZXJuYWwsIGFyZ2MgLSAyLCBkZWZpbmVkLCB1bmRlZmluZWQpOworICAgIHNldDxzdHJpbmc+IGhpZGU7CisKKyAgICAvKiBkZXRlcm1pbmUgdGhlIHNldCBvZiBzeW1ib2xzIHRvIGhpZGUtLW5hbWVseSBkZWZpbmVkIGV4dGVybmFsIHN5bWJvbHMgb2YgdGhlCisgICAgICAgcmVxdWlyZWQgZXh0ZXJuYWwgZmlsZXMKKyAgICAqLworICAgIGZvcihpdCA9IHJlcXVpcmVkRXh0ZXJuYWwtPmJlZ2luKCk7IGl0ICE9IHJlcXVpcmVkRXh0ZXJuYWwtPmVuZCgpOyArK2l0KSB7CisJaW50IGlkeCA9ICppdDsKKwlzZXQ8c3RyaW5nPjo6aXRlcmF0b3IgaXQyOworCS8qIFdlIGhhdmUgdG8gaW5zZXJ0IG9uZSBlbGVtZW50IGF0IGEgdGltZSBpbnN0ZWFkIG9mIGluc2VydGluZyBhIHJhbmdlIGJlY2F1c2UKKwkgICB0aGUgaW5zZXJ0IG1lbWJlciBmdW5jdGlvbiB0YWtpbmcgYSByYW5nZSBkb2Vzbid0IGV4aXN0IG9uIFdpbmRvd3MqIE9TLCBhdCBsZWFzdAorCSAgIGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4KKwkqLworCWZvcihpdDIgPSBkZWZpbmVkW2lkeF0uYmVnaW4oKTsgaXQyICE9IGRlZmluZWRbaWR4XS5lbmQoKTsgKytpdDIpCisJICAgIGhpZGUuaW5zZXJ0KCppdDIpOworICAgIH0KKworICAgIC8qIHByb2Nlc3MgdGhlIGV4dGVybmFsIGZpbGVzLS1yZW1vdmluZyB0aG9zZSB0aGF0IGFyZSBub3QgcmVxdWlyZWQgYW5kIGhpZGluZworICAgICAgIHRoZSBhcHByb3ByaWF0ZSBzeW1ib2xzIGluIHRoZSBvdGhlcnMKKyAgICAqLworICAgIGZvcihpID0gMDsgaSA8IG5FeHRlcm5hbDsgKytpKQorCWlmKHJlcXVpcmVkRXh0ZXJuYWwtPmZpbmQoaSkgIT0gcmVxdWlyZWRFeHRlcm5hbC0+ZW5kKCkpCisJICAgIGhpZGVTeW1ib2xzKGFyZ3ZbMiArIGldLCBoaWRlKTsKKwllbHNlCisJICAgIHJlbW92ZShhcmd2WzIgKyBpXSk7CisgICAgLy8gaGlkZSB0aGUgYXBwcm9wcmlhdGUgc3ltYm9scyBpbiB0aGUgaW50ZXJuYWwgZmlsZXMKKyAgICBmb3IoaSA9IG5FeHRlcm5hbCArIDI7IGkgPCBhcmdjOyArK2kpCisJaGlkZVN5bWJvbHMoYXJndltpXSwgaGlkZSk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvaTE4bi9lbl9VUy50eHQgYi9yYzMvcnVudGltZS9zcmMvaTE4bi9lbl9VUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwOWUxNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dApAQCAtMCwwICsxLDQ3OCBAQAorIyBlbl9VUy50eHQgIworCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgRGVmYXVsdCBtZXNzYWdlcywgZW1iZWRkZWQgaW50byB0aGUgT3Blbk1QIFJUTCwgYW5kIHNvdXJjZSBmb3IgRW5nbGlzaCBjYXRhbG9nLgorCisKKyMgQ29tcGF0aWJsZSBjaGFuZ2VzICh3aGljaCBkb2VzIG5vdCByZXF1aXJlIHZlcnNpb24gYnVtcGluZyk6CisjICAgICAqIEVkaXRpbmcgbWVzc2FnZSAobnVtYmVyIGFuZCB0eXBlIG9mIHBsYWNlaG9sZGVycyBtdXN0IHJlbWFpbiwgcmVsYXRpdmUgb3JkZXIgb2YKKyMgICAgICAgcGxhY2Vob2xkZXJzIG1heSBiZSBjaGFuZ2VkLCBlLmcuICJGaWxlICUxJHMgbGluZSAlMiRkIiBtYXkgYmUgc2FmZWx5IGVkaXRlZCB0bworIyAgICAgICAiTGluZSAlMiRkIGZpbGUgJTEkcyIpLgorIyAgICAgKiBBZGRpbmcgbmV3IG1lc3NhZ2UgdG8gdGhlIGVuZCBvZiBzZWN0aW9uLgorIyBJbmNvbXBhdGlibGUgY2hhbmdlcyAodmVyc2lvbiBtdXN0IGJlIGJ1bWJlZCBieSAxKToKKyMgICAgICogSW50cm9kdWNpbmcgbmV3IHBsYWNlaG9sZGVycyB0byBleGlzdGluZyBtZXNzYWdlcy4KKyMgICAgICogQ2hhbmdpbmcgdHlwZSBvZiBwbGFjZWhvbGRlcnMgKGUuZy4gImxpbmUgJTEkZCIgLT4gImxpbmUgJTEkcyIpLgorIyAgICAgKiBSZWFycmFuZ2luZyBvcmRlciBvZiBtZXNzYWdlcy4KKyMgICAgICogRGVsZXRpbmcgbWVzc2FnZXMuCisjIFVzZSBzcGVjaWFsICJPQlNPTEVURSIgcHNldWRvaWRlbnRpZmllciBmb3Igb2Jzb2xldGUgZW50cmllcywgd2hpY2ggaXMga2VwdCBvbmx5IGZvciBiYWNrd2FyZAorIyBjb21wYXRpYmlsaXR5LiBXaGVuIHZlcnNpb24gaXMgYnVtcGVkLCBkbyBub3QgZm9yZ2V0IHRvIGRlbGV0ZSBhbGwgb2Jzb2xldGUgZW50cmllcy4KKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gTUVUQSAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBNZXRhIGluZm9ybWF0aW9uIGFib3V0IG1lc3NhZ2UgY2F0YWxvZy4KKworTGFuZ3VhZ2UgIkVuZ2xpc2giCitDb3VudHJ5ICAiVVNBIgorTGFuZ0lkICAgIjEwMzMiCitWZXJzaW9uICAiMiIKK1JldmlzaW9uICIyMDE2MDcxNCIKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBTVFJJTkdTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFN0cmluZ3MgYXJlIG5vdCBjb21wbGV0ZSBtZXNzYWdlcywganVzdCBmcmFnbWVudHMuIFdlIG5lZWQgdG8gd29yayBvbiBpdCBhbmQgcmVkdWNlIG51bWJlciBvZgorIyBzdHJpbmdzICh0byB6ZXJvPykuCisKK0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIgorVW5rbm93bkZpbGUgICAgICAgICAgICAgICAgICAiKHVua25vd24gZmlsZSkiCitOb3RBTnVtYmVyICAgICAgICAgICAgICAgICAgICJub3QgYSBudW1iZXIiCitCYWRVbml0ICAgICAgICAgICAgICAgICAgICAgICJiYWQgdW5pdCIKK0lsbGVnYWxDaGFyYWN0ZXJzICAgICAgICAgICAgImlsbGVnYWwgY2hhcmFjdGVycyIKK1ZhbHVlVG9vTGFyZ2UgICAgICAgICAgICAgICAgInZhbHVlIHRvbyBsYXJnZSIKK1ZhbHVlVG9vU21hbGwgICAgICAgICAgICAgICAgInZhbHVlIHRvbyBzbWFsbCIKK05vdE11bHRpcGxlNEsgICAgICAgICAgICAgICAgInZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIDRrIgorVW5rbm93blRvcG9sb2d5ICAgICAgICAgICAgICAiVW5rbm93biBwcm9jZXNzb3IgdG9wb2xvZ3kiCitDYW50T3BlbkNwdWluZm8gICAgICAgICAgICAgICJDYW5ub3Qgb3BlbiAvcHJvYy9jcHVpbmZvIgorUHJvY0NwdWluZm8gICAgICAgICAgICAgICAgICAiL3Byb2MvY3B1aW5mbyIKK05vUHJvY1JlY29yZHMgICAgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChObyBwcm9jZXNzb3IgcmVjb3JkcykiCitUb29NYW55UHJvY1JlY29yZHMgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAoVG9vIG1hbnkgcHJvY2Vzc29yIHJlY29yZHMpIgorQ2FudFJld2luZENwdWluZm8gICAgICAgICAgICAiQ2Fubm90IHJld2luZCBjcHVpbmZvIGZpbGUiCitMb25nTGluZUNwdWluZm8gICAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAobG9uZyBsaW5lKSIKK1Rvb01hbnlFbnRyaWVzICAgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBjb250YWlucyB0b28gbWFueSBlbnRyaWVzIgorTWlzc2luZ1Byb2NGaWVsZCAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIG1pc3NpbmcgcHJvY2Vzc29yIGZpZWxkIgorTWlzc2luZ1BoeXNpY2FsSURGaWVsZCAgICAgICAiY3B1aW5mbyBmaWxlIG1pc3NpbmcgcGh5c2ljYWwgaWQgZmllbGQiCitNaXNzaW5nVmFsQ3B1aW5mbyAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAobWlzc2luZyB2YWwpIgorRHVwbGljYXRlRmllbGRDcHVpbmZvICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKGR1cGxpY2F0ZSBmaWVsZCkiCitQaHlzaWNhbElEc05vdFVuaXF1ZSAgICAgICAgICJQaHlzaWNhbCBub2RlL3BrZy9jb3JlL3RocmVhZCBpZHMgbm90IHVuaXF1ZSIKK0FwaWNOb3RQcmVzZW50ICAgICAgICAgICAgICAgIkFQSUMgbm90IHByZXNlbnQiCitJbnZhbGlkQ3B1aWRJbmZvICAgICAgICAgICAgICJJbnZhbGlkIGNwdWlkIGluZm8iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJBUElDIGlkcyBub3QgdW5pcXVlIgorSW5jb25zaXN0ZW50Q3B1aWRJbmZvICAgICAgICAiSW5jb25zaXN0ZW50IGNwdWlkIGluZm8iCitPdXRPZkhlYXBNZW1vcnkgICAgICAgICAgICAgICJPdXQgb2YgaGVhcCBtZW1vcnkiCitNZW1vcnlBbGxvY0ZhaWxlZCAgICAgICAgICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiCitDb3JlICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JlIgorVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkIgorUGFja2FnZSAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSIKK05vZGUgICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGUiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICI8dW5kZWY+IgorRGVjb2RpbmdMZWdhY3lBUElDICAgICAgICAgICAiZGVjb2RpbmcgbGVnYWN5IEFQSUMgaWRzIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAicGFyc2luZyAvcHJvYy9jcHVpbmZvIgorTm90RGVmaW5lZCAgICAgICAgICAgICAgICAgICAidmFsdWUgaXMgbm90IGRlZmluZWQiCitFZmZlY3RpdmVTZXR0aW5ncyAgICAgICAgICAgICJFZmZlY3RpdmUgc2V0dGluZ3M6IgorVXNlclNldHRpbmdzICAgICAgICAgICAgICAgICAiVXNlciBzZXR0aW5nczoiCitTdG9yYWdlTWFwV2FybmluZyAgICAgICAgICAgICJ3YXJuaW5nOiBwb2ludGVycyBvciBzaXplIGRvbid0IG1ha2Ugc2Vuc2UiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJDUFUiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJUUFUiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJUUFVzIHBlciBwYWNrYWdlIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiSFQgZW5hYmxlZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkhUIGRpc2FibGVkIgorRGVjb2Rpbmd4MkFQSUMgICAgICAgICAgICAgICAiZGVjb2RpbmcgeDJBUElDIGlkcyIKK05vTGVhZjExU3VwcG9ydCAgICAgICAgICAgICAgImNwdWlkIGxlYWYgMTEgbm90IHN1cHBvcnRlZCIKK05vTGVhZjRTdXBwb3J0ICAgICAgICAgICAgICAgImNwdWlkIGxlYWYgNCBub3Qgc3VwcG9ydGVkIgorVGhyZWFkSURzTm90VW5pcXVlICAgICAgICAgICAidGhyZWFkIGlkcyBub3QgdW5pcXVlIgorVXNpbmdQdGhyZWFkICAgICAgICAgICAgICAgICAidXNpbmcgcHRocmVhZCBpbmZvIgorTGVnYWN5QXBpY0lEc05vdFVuaXF1ZSAgICAgICAibGVnYWN5IEFQSUMgaWRzIG5vdCB1bmlxdWUiCit4MkFwaWNJRHNOb3RVbmlxdWUgICAgICAgICAgICJ4MkFQSUMgaWRzIG5vdCB1bmlxdWUiCitEaXNwbGF5RW52QmVnaW4JCSAgICAgIk9QRU5NUCBESVNQTEFZIEVOVklST05NRU5UIEJFR0lOIgorRGlzcGxheUVudkVuZAkJICAgICAiT1BFTk1QIERJU1BMQVkgRU5WSVJPTk1FTlQgRU5EIgorRGV2aWNlCQkJICAgICAiW2RldmljZV0iCitIb3N0CQkJICAgICAiW2hvc3RdIgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIEZPUk1BVFMgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogSW5mbyAjJTEkZDogJTIkc1xuIgorV2FybmluZyAgICAgICAgICAgICAgICAgICAgICAiT01QOiBXYXJuaW5nICMlMSRkOiAlMiRzXG4iCitGYXRhbCAgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IEVycm9yICMlMSRkOiAlMiRzXG4iCitTeXNFcnIgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IFN5c3RlbSBlcnJvciAjJTEkZDogJTIkc1xuIgorSGludCAgICAgICAgICAgICAgICAgICAgICAgICAiT01QOiBIaW50OiAlMiRzXG4iCisKK1ByYWdtYSAgICAgICAgICAgICAgICAgICAgICAgIiUxJHMgcHJhZ21hIChhdCAlMiRzOiUzJHMoKTolNCRzKSIKKyAgICAjICUxIGlzIHByYWdtYSBuYW1lIChsaWtlICJwYXJhbGxlbCIgb3IgIm1hc3RlciIsCisgICAgIyAlMiBpcyBmaWxlIG5hbWUsCisgICAgIyAlMyBpcyBmdW5jdGlvbiAocm91dGluZSkgbmFtZSwKKyAgICAjICU0IGlzIHRoZSBsaW5lIG51bWJlciAoYXMgc3RyaW5nLCBzbyAicyIgdHlwZSBzcGVjaWZpZXIgc2hvdWxkIGJlIHVzZWQpLgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIE1FU1NBR0VTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIE1lc3NhZ2VzIG9mIGFueSBzZXZlcml0eTogaW5mb3JtYXRpb25hbCwgd2FybmluZywgb3IgZmF0YWwuCisjIFRvIG1haW50YWluIG1lc3NhZ2UgbnVtYmVycyAodGhleSBhcmUgdmlzaWJsZSB0byBjdXN0b21lcnMpLCBhZGQgbmV3IG1lc3NhZ2VzIHRvIHRoZSBlbmQuCisKKyMgVXNlIGZvbGxvd2luZyBwcmVmaXhlcyBmb3IgbWVzc2FnZXMgYW5kIGhpbnRzIHdoZW4gYXBwcm9wcmlhdGU6CisjICAgIEFmZiAtLSBBZmZpbml0eSBtZXNzYWdlcy4KKyMgICAgQ25zIC0tIENvbnNpc3RlbmN5IGNoZWNrIGZhaWx1cmVzIChLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0spLgorIyAgICBJdHQgLS0gSVRUIE5vdGlmeS1yZWxhdGVkIG1lc3NhZ2VzLgorCitMaWJyYXJ5SXNTZXJpYWwgICAgICAgICAgICAgICJMaWJyYXJ5IGlzIFwic2VyaWFsXCIuIgorQ2FudE9wZW5NZXNzYWdlQ2F0YWxvZyAgICAgICAiQ2Fubm90IG9wZW4gbWVzc2FnZSBjYXRhbG9nIFwiJTEkc1wiOiIKK1dpbGxVc2VEZWZhdWx0TWVzc2FnZXMgICAgICAgIkRlZmF1bHQgbWVzc2FnZXMgd2lsbCBiZSB1c2VkLiIKK0xvY2tJc1VuaW5pdGlhbGl6ZWQgICAgICAgICAgIiUxJHM6IExvY2sgaXMgdW5pbml0aWFsaXplZCIKK0xvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSAgICAgIiUxJHM6IExvY2sgd2FzIGluaXRpYWxpemVkIGFzIHNpbXBsZSwgYnV0IHVzZWQgYXMgbmVzdGFibGUiCitMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUgICAgICIlMSRzOiBMb2NrIHdhcyBpbml0aWFsaXplZCBhcyBuZXN0YWJsZSwgYnV0IHVzZWQgYXMgc2ltcGxlIgorTG9ja0lzQWxyZWFkeU93bmVkICAgICAgICAgICAiJTEkczogTG9jayBpcyBhbHJlYWR5IG93bmVkIGJ5IHJlcXVlc3RpbmcgdGhyZWFkIgorTG9ja1N0aWxsT3duZWQgICAgICAgICAgICAgICAiJTEkczogTG9jayBpcyBzdGlsbCBvd25lZCBieSBhIHRocmVhZCIKK0xvY2tVbnNldHRpbmdGcmVlICAgICAgICAgICAgIiUxJHM6IEF0dGVtcHQgdG8gcmVsZWFzZSBhIGxvY2sgbm90IG93bmVkIGJ5IGFueSB0aHJlYWQiCitMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyICAgICIlMSRzOiBBdHRlbXB0IHRvIHJlbGVhc2UgYSBsb2NrIG93bmVkIGJ5IGFub3RoZXIgdGhyZWFkIgorU3RhY2tPdmVyZmxvdyAgICAgICAgICAgICAgICAiU3RhY2sgb3ZlcmZsb3cgZGV0ZWN0ZWQgZm9yIE9wZW5NUCB0aHJlYWQgIyUxJGQiCitTdGFja092ZXJsYXAgICAgICAgICAgICAgICAgICJTdGFjayBvdmVybGFwIGRldGVjdGVkLiAiCitBc3NlcnRpb25GYWlsdXJlICAgICAgICAgICAgICJBc3NlcnRpb24gZmFpbHVyZSBhdCAlMSRzKCUyJGQpLiIKK0NhbnRSZWdpc3Rlck5ld1RocmVhZCAgICAgICAgIlVuYWJsZSB0byByZWdpc3RlciBhIG5ldyB1c2VyIHRocmVhZC4iCitEdXBsaWNhdGVMaWJyYXJ5ICAgICAgICAgICAgICJJbml0aWFsaXppbmcgJTEkcywgYnV0IGZvdW5kICUyJHMgYWxyZWFkeSBpbml0aWFsaXplZC4iCitDYW50T3BlbkZpbGVGb3JSZWFkaW5nICAgICAgICJDYW5ub3Qgb3BlbiBmaWxlIFwiJTEkc1wiIGZvciByZWFkaW5nOiIKK0NhbnRHZXRFbnZWYXIgICAgICAgICAgICAgICAgIkdldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIgZmFpbGVkOiIKK0NhbnRTZXRFbnZWYXIgICAgICAgICAgICAgICAgIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIgZmFpbGVkOiIKK0NhbnRHZXRFbnZpcm9ubWVudCAgICAgICAgICAgIkdldHRpbmcgZW52aXJvbm1lbnQgZmFpbGVkOiIKK0JhZEJvb2xWYWx1ZSAgICAgICAgICAgICAgICAgIiUxJHM9XCIlMiRzXCI6IFdyb25nIHZhbHVlLCBib29sZWFuIGV4cGVjdGVkLiIKK1NTUE5vdEJ1aWx0SW4gICAgICAgICAgICAgICAgIk5vIEhlbHBlciBUaHJlYWQgc3VwcG9ydCBidWlsdCBpbiB0aGlzIE9NUCBsaWJyYXJ5LiIKK1NQUFNvdGZUZXJtaW5hdGVGYWlsZWQgICAgICAgIkhlbHBlciB0aHJlYWQgZmFpbGVkIHRvIHNvZnQgdGVybWluYXRlLiIKK0J1ZmZlck92ZXJmbG93ICAgICAgICAgICAgICAgIkJ1ZmZlciBvdmVyZmxvdyBkZXRlY3RlZC4iCitSZWFsVGltZVNjaGVkTm90U3VwcG9ydGVkICAgICJSZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kgaXMgbm90IHN1cHBvcnRlZC4iCitSdW5uaW5nQXRNYXhQcmlvcml0eSAgICAgICAgICJPTVAgYXBwbGljYXRpb24gaXMgcnVubmluZyBhdCBtYXhpbXVtIHByaW9yaXR5IHdpdGggcmVhbC10aW1lIHNjaGVkdWxpbmcgcG9saWN5LiAiCitDYW50Q2hhbmdlTW9uaXRvclByaW9yaXR5ICAgICJDaGFuZ2luZyBwcmlvcml0eSBvZiB0aGUgbW9uaXRvciB0aHJlYWQgZmFpbGVkOiIKK01vbml0b3JXaWxsU3RhcnZlICAgICAgICAgICAgIkRlYWRsb2NrcyBhcmUgaGlnaGx5IHBvc3NpYmxlIGR1ZSB0byBtb25pdG9yIHRocmVhZCBzdGFydmF0aW9uLiIKK0NhbnRTZXRNb25pdG9yU3RhY2tTaXplICAgICAgIlVuYWJsZSB0byBzZXQgbW9uaXRvciB0aHJlYWQgc3RhY2sgc2l6ZSB0byAlMSRsdSBieXRlczoiCitDYW50U2V0V29ya2VyU3RhY2tTaXplICAgICAgICJVbmFibGUgdG8gc2V0IE9NUCB0aHJlYWQgc3RhY2sgc2l6ZSB0byAlMSRsdSBieXRlczoiCitDYW50SW5pdFRocmVhZEF0dHJzICAgICAgICAgICJUaHJlYWQgYXR0cmlidXRlIGluaXRpYWxpemF0aW9uIGZhaWxlZDoiCitDYW50RGVzdHJveVRocmVhZEF0dHJzICAgICAgICJUaHJlYWQgYXR0cmlidXRlIGRlc3Ryb3lpbmcgZmFpbGVkOiIKK0NhbnRTZXRXb3JrZXJTdGF0ZSAgICAgICAgICAgIk9NUCB0aHJlYWQgam9pbmFibGUgc3RhdGUgc2V0dGluZyBmYWlsZWQ6IgorQ2FudFNldE1vbml0b3JTdGF0ZSAgICAgICAgICAiTW9uaXRvciB0aHJlYWQgam9pbmFibGUgc3RhdGUgc2V0dGluZyBmYWlsZWQ6IgorTm9SZXNvdXJjZXNGb3JXb3JrZXJUaHJlYWQgICAiU3lzdGVtIHVuYWJsZSB0byBhbGxvY2F0ZSBuZWNlc3NhcnkgcmVzb3VyY2VzIGZvciBPTVAgdGhyZWFkOiIKK05vUmVzb3VyY2VzRm9yTW9uaXRvclRocmVhZCAgIlN5c3RlbSB1bmFibGUgdG8gYWxsb2NhdGUgbmVjZXNzYXJ5IHJlc291cmNlcyBmb3IgdGhlIG1vbml0b3IgdGhyZWFkOiIKK0NhbnRUZXJtaW5hdGVXb3JrZXJUaHJlYWQgICAgIlVuYWJsZSB0byB0ZXJtaW5hdGUgT01QIHRocmVhZDoiCitTY2hlZHVsZUtpbmRPdXRPZlJhbmdlICAgICAgICJXcm9uZyBzY2hlZHVsZSB0eXBlICUxJGQsIHNlZSA8b21wLmg+IG9yIDxvbXBfbGliLmg+IGZpbGUgZm9yIHRoZSBsaXN0IG9mIHZhbHVlcyBzdXBwb3J0ZWQuIgorVW5rbm93blNjaGVkdWxpbmdUeXBlICAgICAgICAiVW5rbm93biBzY2hlZHVsaW5nIHR5cGUgXCIlMSRkXCIuIgorSW52YWxpZFZhbHVlICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkLiIKK1NtYWxsVmFsdWUgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgdG9vIHNtYWxsLiIKK0xhcmdlVmFsdWUgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgdG9vIGxhcmdlLiIKK1N0Z0ludmFsaWRWYWx1ZSAgICAgICAgICAgICAgIiUxJHM6IFwiJTIkc1wiIGlzIGFuIGludmFsaWQgdmFsdWU7IGlnbm9yZWQuIgorQmFyclJlbGVhc2VWYWx1ZUludmFsaWQgICAgICAiJTEkcyByZWxlYXNlIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIgorQmFyckdhdGhlclZhbHVlSW52YWxpZCAgICAgICAiJTEkcyBnYXRoZXIgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzIHN1cHBvcnRlZCBvbmx5IG9uIGRlYnVnIGJ1aWxkczsgaWdub3JlZC4iCitQYXJSYW5nZVN5bnRheCAgICAgICAgICAgICAgICJTeW50YXggZXJyb3I6IFVzYWdlOiAlMSRzPVsgcm91dGluZT08ZnVuYz4gfCBmaWxlbmFtZT08ZmlsZT4gfCByYW5nZT08bGI+Ojx1Yj4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifCBleGNsX3JhbmdlPTxsYj46PHViPiBdLC4uLiIKK1VuYmFsYW5jZWRRdW90ZXMgICAgICAgICAgICAgIlVuYmFsYW5jZWQgcXVvdGVzIGluICUxJHMuIgorRW1wdHlTdHJpbmcgICAgICAgICAgICAgICAgICAiRW1wdHkgc3RyaW5nIHNwZWNpZmllZCBmb3IgJTEkczsgaWdub3JlZC4iCitMb25nVmFsdWUgICAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIGlzIHRvbyBsb25nOyBpZ25vcmVkLiIKK0ludmFsaWRDbGF1c2UgICAgICAgICAgICAgICAgIiUxJHM6IEludmFsaWQgY2xhdXNlIGluIFwiJTIkc1wiLiIKK0VtcHR5Q2xhdXNlICAgICAgICAgICAgICAgICAgIkVtcHR5IGNsYXVzZSBpbiAlMSRzLiIKK0ludmFsaWRDaHVuayAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZCBjaHVuayBzaXplLiIKK0xhcmdlQ2h1bmsgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgdG8gbGFyZ2UgY2h1bmsgc2l6ZS4iCitJZ25vcmVDaHVuayAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGlnbm9yZWQuIgorQ2FudEdldFByb2NGcmVxICAgICAgICAgICAgICAiQ2Fubm90IGdldCBwcm9jZXNzb3IgZnJlcXVlbmN5LCB1c2luZyB6ZXJvIEtNUF9JVFRfUFJFUEFSRV9ERUxBWS4iCitFbnZQYXJhbGxlbFdhcm4gICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgc2V0IHByaW9yIHRvIGZpcnN0IHBhcmFsbGVsIHJlZ2lvbjsgaWdub3JlZC4iCitBZmZQYXJhbURlZmluZWQgICAgICAgICAgICAgICIlMSRzOiBwYXJhbWV0ZXIgaGFzIGJlZW4gc3BlY2lmaWVkIGFscmVhZHksIGlnbm9yaW5nIFwiJTIkc1wiLiIKK0FmZkludmFsaWRQYXJhbSAgICAgICAgICAgICAgIiUxJHM6IHBhcmFtZXRlciBpbnZhbGlkLCBpZ25vcmluZyBcIiUyJHNcIi4iCitBZmZNYW55UGFyYW1zICAgICAgICAgICAgICAgICIlMSRzOiB0b28gbWFueSBpbnRlZ2VyIHBhcmFtZXRlcnMgc3BlY2lmaWVkLCBpZ25vcmluZyBcIiUyJHNcIi4iCitBZmZNYW55UGFyYW1zRm9yTG9naWMgICAgICAgICIlMSRzOiB0b28gbWFueSBpbnRlZ2VyIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGZvciBsb2dpY2FsIG9yIHBoeXNpY2FsIHR5cGUsIGlnbm9yaW5nIFwiJTIkZFwiLiIKK0FmZk5vUGFyYW0gICAgICAgICAgICAgICAgICAgIiUxJHM6ICclMiRzJyB0eXBlIGRvZXMgbm90IHRha2UgYW55IGludGVnZXIgcGFyYW1ldGVycywgaWdub3JpbmcgdGhlbS4iCitBZmZOb1Byb2NMaXN0ICAgICAgICAgICAgICAgICIlMSRzOiBwcm9jbGlzdCBub3Qgc3BlY2lmaWVkIHdpdGggZXhwbGljaXQgYWZmaW5pdHkgdHlwZSwgdXNpbmcgXCJub25lXCIuIgorQWZmUHJvY0xpc3ROb1R5cGUgICAgICAgICAgICAiJTEkczogcHJvY2xpc3Qgc3BlY2lmaWVkLCBzZXR0aW5nIGFmZmluaXR5IHR5cGUgdG8gXCJleHBsaWNpdFwiLiIKK0FmZlByb2NMaXN0Tm90RXhwbGljaXQgICAgICAgIiUxJHM6IHByb2NsaXN0IHNwZWNpZmllZCB3aXRob3V0IFwiZXhwbGljaXRcIiBhZmZpbml0eSB0eXBlLCBwcm9jbGlzdCBpZ25vcmVkLiIKK0FmZlN5bnRheEVycm9yICAgICAgICAgICAgICAgIiUxJHM6IHN5bnRheCBlcnJvciwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlplcm9TdHJpZGUgICAgICAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICh6ZXJvIHN0cmlkZSksIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZTdGFydEdyZWF0ZXJFbmQgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoJTIkZCA+ICUzJGQpLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmU3RyaWRlTGVzc1plcm8gICAgICAgICAgICAiJTEkczogcmFuZ2UgZXJyb3IgKCUyJGQgPCAlMyRkICYgc3RyaWRlIDwgMCksIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZSYW5nZVRvb0JpZyAgICAgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoKCUyJGQtJTMkZCkvJTQkZCB0b28gYmlnKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgaXMgZGVmaW5lZC4gJTMkcyB3aWxsIGJlIGlnbm9yZWQuIgorQWZmTm90U3VwcG9ydGVkICAgICAgICAgICAgICAiJTEkczogYWZmaW5pdHkgbm90IHN1cHBvcnRlZCwgdXNpbmcgXCJkaXNhYmxlZFwiLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IGFmZmluaXR5IG9ubHkgc3VwcG9ydGVkIGZvciBJbnRlbChSKSBwcm9jZXNzb3JzLiIKK0dldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQgICAgIiUxJHM6IGdldGFmZmluaXR5IHN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQuIgorU2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCAgICAiJTEkczogc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwgbm90IHN1cHBvcnRlZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBwdGhyZWFkX2FmZl9zZXRfbnAgY2FsbCBub3QgZm91bmQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogcHRocmVhZF9nZXRfbnVtX3Jlc291cmNlc19ucCBjYWxsIG5vdCBmb3VuZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiB0aGUgT1Mga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgYWZmaW5pdHkuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogcHRocmVhZF9nZXRfbnVtX3Jlc291cmNlc19ucCByZXR1cm5lZCAlMiRkLiIKK0FmZkNhbnRHZXRNYXNrU2l6ZSAgICAgICAgICAgIiUxJHM6IGNhbm5vdCBkZXRlcm1pbmUgcHJvcGVyIGFmZmluaXR5IG1hc2sgc2l6ZS4iCitQYXJzZVNpemVJbnRXYXJuICAgICAgICAgICAgICIlMSRzPVwiJTIkc1wiOiAlMyRzLiIKK1BhcnNlRXh0cmFDaGFyc1dhcm4gICAgICAgICAgIiUxJHM6IGV4dHJhIHRyYWlsaW5nIGNoYXJhY3RlcnMgaWdub3JlZDogXCIlMiRzXCIuIgorVW5rbm93bkZvcmNlUmVkdWN0aW9uICAgICAgICAiJTEkczogdW5rbm93biBtZXRob2QgXCIlMiRzXCIuIgorVGltZXJVc2VHZXR0aW1lb2ZkYXkgICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBjbG9ja19nZXR0aW1lIGlzIHVuZGVmaW5lZCwgdXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVyTmVlZE1vcmVQYXJhbSAgICAgICAgICAgIktNUF9TVEFUU19USU1FUjogXCIlMSRzXCIgbmVlZHMgYWRkaXRpb25hbCBwYXJhbWV0ZXIsIGUuZy4gJ2Nsb2NrX2dldHRpbWUsMicuIFVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lckludmFsaWRQYXJhbSAgICAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrX2dldHRpbWUgcGFyYW1ldGVyIFwiJTEkc1wiIGlzIGludmFsaWQsIHVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lckdldHRpbWVGYWlsZWQgICAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrX2dldHRpbWUgZmFpbGVkLCB1c2luZyBnZXR0aW1lb2ZkYXkuIgorVGltZXJVbmtub3duRnVuY3Rpb24gICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBjbG9jayBmdW5jdGlvbiB1bmtub3duIChpZ25vcmluZyB2YWx1ZSBcIiUxJHNcIikuIgorVW5rbm93blNjaGVkVHlwZURldGVjdGVkICAgICAiVW5rbm93biBzY2hlZHVsaW5nIHR5cGUgZGV0ZWN0ZWQuIgorRGlzcGF0Y2hNYW55VGhyZWFkcyAgICAgICAgICAiVG9vIG1hbnkgdGhyZWFkcyB0byB1c2UgYW5hbHl0aWNhbCBndWlkZWQgc2NoZWR1bGluZyAtIHN3aXRjaGluZyB0byBpdGVyYXRpdmUgZ3VpZGVkIHNjaGVkdWxpbmcuIgorSXR0TG9va3VwRmFpbGVkICAgICAgICAgICAgICAiaXR0bm90aWZ5OiBMb29rdXAgb2YgXCIlMSRzXCIgZnVuY3Rpb24gaW4gXCIlMiRzXCIgbGlicmFyeSBmYWlsZWQuIgorSXR0TG9hZExpYkZhaWxlZCAgICAgICAgICAgICAiaXR0bm90aWZ5OiBMb2FkaW5nIFwiJTEkc1wiIGxpYnJhcnkgZmFpbGVkLiIKK0l0dEFsbE5vdGlmRGlzYWJsZWQgICAgICAgICAgIml0dG5vdGlmeTogQWxsIGl0dCBub3RpZmljYXRpb25zIGRpc2FibGVkLiIKK0l0dE9iak5vdGlmRGlzYWJsZWQgICAgICAgICAgIml0dG5vdGlmeTogT2JqZWN0IHN0YXRlIGl0dCBub3RpZmljYXRpb25zIGRpc2FibGVkLiIKK0l0dE1hcmtOb3RpZkRpc2FibGVkICAgICAgICAgIml0dG5vdGlmeTogTWFyayBpdHQgbm90aWZpY2F0aW9ucyBkaXNhYmxlZC4iCitJdHRVbmxvYWRMaWJGYWlsZWQgICAgICAgICAgICJpdHRub3RpZnk6IFVubG9hZGluZyBcIiUxJHNcIiBsaWJyYXJ5IGZhaWxlZC4iCitDYW50Rm9ybVRoclRlYW0gICAgICAgICAgICAgICJDYW5ub3QgZm9ybSBhIHRlYW0gd2l0aCAlMSRkIHRocmVhZHMsIHVzaW5nICUyJGQgaW5zdGVhZC4iCitBY3RpdmVMZXZlbHNOZWdhdGl2ZSAgICAgICAgICJSZXF1ZXN0ZWQgbnVtYmVyIG9mIGFjdGl2ZSBwYXJhbGxlbCBsZXZlbHMgXCIlMSRkXCIgaXMgbmVnYXRpdmU7IGlnbm9yZWQuIgorQWN0aXZlTGV2ZWxzRXhjZWVkTGltaXQgICAgICAiUmVxdWVzdGVkIG51bWJlciBvZiBhY3RpdmUgcGFyYWxsZWwgbGV2ZWxzIFwiJTEkZFwiIGV4Y2VlZHMgc3VwcG9ydGVkIGxpbWl0OyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZm9sbG93aW5nIGxpbWl0IHZhbHVlIHdpbGwgYmUgdXNlZDogXCIlMSRkXCIuIgorU2V0TGlicmFyeUluY29ycmVjdENhbGwgICAgICAia21wX3NldF9saWJyYXJ5IG11c3Qgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgdG9wIGxldmVsIHNlcmlhbCB0aHJlYWQ7IGlnbm9yZWQuIgorRmF0YWxTeXNFcnJvciAgICAgICAgICAgICAgICAiRmF0YWwgc3lzdGVtIGVycm9yIGRldGVjdGVkLiIKK091dE9mSGVhcE1lbW9yeSAgICAgICAgICAgICAgIk91dCBvZiBoZWFwIG1lbW9yeS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJDbGVhcmluZyBfX0tNUF9SRUdJU1RFUkVEX0xJQiBlbnYgdmFyIGZhaWxlZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJSZWdpc3RlcmluZyBsaWJyYXJ5IHdpdGggZW52IHZhciBmYWlsZWQuIgorVXNpbmdfaW50X1ZhbHVlICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJGRcIiB3aWxsIGJlIHVzZWQuIgorVXNpbmdfdWludF9WYWx1ZSAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHVcIiB3aWxsIGJlIHVzZWQuIgorVXNpbmdfdWludDY0X1ZhbHVlICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiB3aWxsIGJlIHVzZWQuIgorVXNpbmdfc3RyX1ZhbHVlICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiB3aWxsIGJlIHVzZWQuIgorTWF4VmFsdWVVc2luZyAgICAgICAgICAgICAgICAiJTEkcyBtYXhpbXVtIHZhbHVlIFwiJTIkZFwiIHdpbGwgYmUgdXNlZC4iCitNaW5WYWx1ZVVzaW5nICAgICAgICAgICAgICAgICIlMSRzIG1pbmltdW0gdmFsdWUgXCIlMiRkXCIgd2lsbCBiZSB1c2VkLiIKK01lbW9yeUFsbG9jRmFpbGVkICAgICAgICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4iCitGaWxlTmFtZVRvb0xvbmcgICAgICAgICAgICAgICJGaWxlIG5hbWUgdG9vIGxvbmcuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiTG9jayB0YWJsZSBvdmVyZmxvdy4iCitNYW55VGhyZWFkc0ZvclRQRGlyZWN0aXZlICAgICJUb28gbWFueSB0aHJlYWRzIHRvIHVzZSB0aHJlYWRwcml2YXRlIGRpcmVjdGl2ZS4iCitBZmZpbml0eUludmFsaWRNYXNrICAgICAgICAgICIlMSRzOiBpbnZhbGlkIG1hc2suIgorV3JvbmdEZWZpbml0aW9uICAgICAgICAgICAgICAiV3JvbmcgZGVmaW5pdGlvbi4iCitUTFNTZXRWYWx1ZUZhaWxlZCAgICAgICAgICAgICJXaW5kb3dzKiBPUzogVExTIFNldCBWYWx1ZSBmYWlsZWQuIgorVExTT3V0T2ZJbmRleGVzICAgICAgICAgICAgICAiV2luZG93cyogT1M6IFRMUyBvdXQgb2YgaW5kZXhlcy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJQRE9ORSBkaXJlY3RpdmUgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgRE8gZGlyZWN0aXZlLiIKK0NhbnRHZXROdW1BdmFpbENQVSAgICAgICAgICAgIkNhbm5vdCBnZXQgbnVtYmVyIG9mIGF2YWlsYWJsZSBDUFVzLiIKK0Fzc3VtZWROdW1DUFUgICAgICAgICAgICAgICAgIkFzc3VtZWQgbnVtYmVyIG9mIENQVXMgaXMgMi4iCitFcnJvckluaXRpYWxpemVBZmZpbml0eSAgICAgICJFcnJvciBpbml0aWFsaXppbmcgYWZmaW5pdHkgLSBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmVGhyZWFkc01heU1pZ3JhdGUgICAgICAgICAiVGhyZWFkcyBtYXkgbWlncmF0ZSBhY3Jvc3MgYWxsIGF2YWlsYWJsZSBPUyBwcm9jcyAoZ3JhbnVsYXJpdHkgc2V0dGluZyB0b28gY29hcnNlKS4iCitBZmZJZ25vcmVJbnZhbGlkUHJvY0lEICAgICAgICJJZ25vcmluZyBpbnZhbGlkIE9TIHByb2MgSUQgJTEkZC4iCitBZmZOb1ZhbGlkUHJvY0lEICAgICAgICAgICAgICJObyB2YWxpZCBPUyBwcm9jIElEcyBzcGVjaWZpZWQgLSBub3QgdXNpbmcgYWZmaW5pdHkuIgorVXNpbmdGbGF0T1MgICAgICAgICAgICAgICAgICAiJTEkcyAtIHVzaW5nIFwiZmxhdFwiIE9TIDwtPiBwaHlzaWNhbCBwcm9jIG1hcHBpbmcuIgorVXNpbmdGbGF0T1NGaWxlICAgICAgICAgICAgICAiJTEkczogJTIkcyAtIHVzaW5nIFwiZmxhdFwiIE9TIDwtPiBwaHlzaWNhbCBwcm9jIG1hcHBpbmcuIgorVXNpbmdGbGF0T1NGaWxlTGluZSAgICAgICAgICAiJTEkcywgbGluZSAlMiRkOiAlMyRzIC0gdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitGaWxlTXNnRXhpdGluZyAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIC0gZXhpdGluZy4iCitGaWxlTGluZU1zZ0V4aXRpbmcgICAgICAgICAgICIlMSRzLCBsaW5lICUyJGQ6ICUzJHMgLSBleGl0aW5nLiIKK0NvbnN0cnVjdElkZW50SW52YWxpZCAgICAgICAgIkNvbnN0cnVjdCBpZGVudGlmaWVyIGludmFsaWQuIgorVGhyZWFkSWRlbnRJbnZhbGlkICAgICAgICAgICAiVGhyZWFkIGlkZW50aWZpZXIgaW52YWxpZC4iCitSVExOb3RJbml0aWFsaXplZCAgICAgICAgICAgICJydW50aW1lIGxpYnJhcnkgbm90IGluaXRpYWxpemVkLiIKK1RQQ29tbW9uQmxvY2tzSW5jb25zaXN0ICAgICAgIkluY29uc2lzdGVudCBUSFJFQURQUklWQVRFIGNvbW1vbiBibG9jayBkZWNsYXJhdGlvbnMgYXJlIG5vbi1jb25mb3JtaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBhcmUgdW5zdXBwb3J0ZWQuIEVpdGhlciBhbGwgdGhyZWFkcHJpdmF0ZSBjb21tb24gYmxvY2tzIG11c3QgYmUgZGVjbGFyZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWRlbnRpY2FsbHksIG9yIHRoZSBsYXJnZXN0IGluc3RhbmNlIG9mIGVhY2ggdGhyZWFkcHJpdmF0ZSBjb21tb24gYmxvY2sgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSByZWZlcmVuY2VkIGZpcnN0IGR1cmluZyB0aGUgcnVuLiIKK0NhbnRTZXRUaHJlYWRBZmZNYXNrICAgICAgICAgIkNhbm5vdCBzZXQgdGhyZWFkIGFmZmluaXR5IG1hc2suIgorQ2FudFNldFRocmVhZFByaW9yaXR5ICAgICAgICAiQ2Fubm90IHNldCB0aHJlYWQgcHJpb3JpdHkuIgorQ2FudENyZWF0ZVRocmVhZCAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSB0aHJlYWQuIgorQ2FudENyZWF0ZUV2ZW50ICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBldmVudC4iCitDYW50U2V0RXZlbnQgICAgICAgICAgICAgICAgICJDYW5ub3Qgc2V0IGV2ZW50LiIKK0NhbnRDbG9zZUhhbmRsZSAgICAgICAgICAgICAgIkNhbm5vdCBjbG9zZSBoYW5kbGUuIgorVW5rbm93bkxpYnJhcnlUeXBlICAgICAgICAgICAiVW5rbm93biBsaWJyYXJ5IHR5cGU6ICUxJGQuIgorUmVhcE1vbml0b3JFcnJvciAgICAgICAgICAgICAiTW9uaXRvciBkaWQgbm90IHJlYXAgcHJvcGVybHkuIgorUmVhcFdvcmtlckVycm9yICAgICAgICAgICAgICAiV29ya2VyIHRocmVhZCBmYWlsZWQgdG8gam9pbi4iCitDaGFuZ2VUaHJlYWRBZmZNYXNrRXJyb3IgICAgICJDYW5ub3QgY2hhbmdlIHRocmVhZCBhZmZpbml0eSBtYXNrLiIKK1RocmVhZHNNaWdyYXRlICAgICAgICAgICAgICAgIiUxJHM6IFRocmVhZHMgbWF5IG1pZ3JhdGUgYWNyb3NzICUyJGQgaW5uZXJtb3N0IGxldmVscyBvZiBtYWNoaW5lIgorRGVjcmVhc2VUb1RocmVhZHMgICAgICAgICAgICAiJTEkczogZGVjcmVhc2UgdG8gJTIkZCB0aHJlYWRzIgorSW5jcmVhc2VUb1RocmVhZHMgICAgICAgICAgICAiJTEkczogaW5jcmVhc2UgdG8gJTIkZCB0aHJlYWRzIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogSW50ZXJuYWwgdGhyZWFkICUyJGQgYm91bmQgdG8gT1MgcHJvYyBzZXQgJTMkcyIKK0FmZkNhcGFibGVVc2VDcHVpbmZvICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGNwdWluZm8gZmlsZSIKK0FmZlVzZUdsb2JDcHVpZCAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGdsb2JhbCBjcHVpZCBpbmZvIgorQWZmQ2FwYWJsZVVzZUZsYXQgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgZGVmYXVsdCBcImZsYXRcIiB0b3BvbG9neSIKK0FmZk5vdENhcGFibGVVc2VMb2NDcHVpZCAgICAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCB1c2luZyBsb2NhbCBjcHVpZCBpbmZvIgorQWZmTm90Q2FwYWJsZVVzZUNwdWluZm8gICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIGNwdWluZm8gZmlsZSIKK0FmZkZsYXRUb3BvbG9neSAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCBhc3N1bW1pbmcgXCJmbGF0XCIgdG9wb2xvZ3kiCitJbml0T1NQcm9jU2V0UmVzcGVjdCAgICAgICAgICIlMSRzOiBJbml0aWFsIE9TIHByb2Mgc2V0IHJlc3BlY3RlZDogJTIkcyIKK0luaXRPU1Byb2NTZXROb3RSZXNwZWN0ICAgICAgIiUxJHM6IEluaXRpYWwgT1MgcHJvYyBzZXQgbm90IHJlc3BlY3RlZDogJTIkcyIKK0F2YWlsYWJsZU9TUHJvYyAgICAgICAgICAgICAgIiUxJHM6ICUyJGQgYXZhaWxhYmxlIE9TIHByb2NzIgorVW5pZm9ybSAgICAgICAgICAgICAgICAgICAgICAiJTEkczogVW5pZm9ybSB0b3BvbG9neSIKK05vblVuaWZvcm0gICAgICAgICAgICAgICAgICAgIiUxJHM6IE5vbnVuaWZvcm0gdG9wb2xvZ3kiCitUb3BvbG9neSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiAlMiRkIHBhY2thZ2VzIHggJTMkZCBjb3Jlcy9wa2cgeCAlNCRkIHRocmVhZHMvY29yZSAoJTUkZCB0b3RhbCBjb3JlcykiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jIHRvIHBoeXNpY2FsIHRocmVhZCBtYXAgKFtdID0+IGxldmVsIG5vdCBpbiBtYXApOiIKK09TUHJvY1RvUGFja2FnZSAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgPG4+IG1hcHMgdG8gPG4+dGggcGFja2FnZSBjb3JlIDAiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgW2NvcmUgJTQkZF0gW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIFtjb3JlICU0JGRdIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBbcGFja2FnZSAlMyRkXSBbY29yZSAlNCRkXSB0aHJlYWQgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIGNvcmUgJTQkZCBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIFtjb3JlICU0JGRdIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBbcGFja2FnZSAlMyRkXSBjb3JlICU0JGQgdGhyZWFkICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgY29yZSAlNCRkIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgW2NvcmUgJTQkZF0gdGhyZWFkICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgY29yZSAlNCRkIHRocmVhZCAlNSRkIgorT1NQcm9jTWFwVG9QYWNrICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gJTMkcyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IEludGVybmFsIHRocmVhZCAlMiRkIGNoYW5nZWQgYWZmaW5pdHkgbWFzayBmcm9tICUzJHMgdG8gJTQkcyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCwgQ1BVICU0JGQsIFRQVSAlNSRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkLCBDUFUgJTQkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IEhUIGVuYWJsZWQ7ICUyJGQgcGFja2FnZXM7ICUzJGQgVFBVOyAlNCRkIFRQVXMgcGVyIHBhY2thZ2UiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBIVCBkaXNhYmxlZDsgJTIkZCBwYWNrYWdlcyIKK0JhcnJpZXJzSW5EaWZmZXJlbnRPcmRlciAgICAgIlRocmVhZHMgZW5jb3VudGVyZWQgYmFycmllcnMgaW4gZGlmZmVyZW50IG9yZGVyLiAiCitGdW5jdGlvbkVycm9yICAgICAgICAgICAgICAgICJGdW5jdGlvbiAlMSRzIGZhaWxlZDoiCitUb3BvbG9neUV4dHJhICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIHBhY2thZ2VzIHggJTMkZCBjb3Jlcy9wa2cgeCAlNCRkIHRocmVhZHMvY29yZSAoJTUkZCB0b3RhbCBjb3JlcykiCitXcm9uZ01lc3NhZ2VDYXRhbG9nICAgICAgICAgICJJbmNvbXBhdGlibGUgbWVzc2FnZSBjYXRhbG9nIFwiJTEkc1wiOiBWZXJzaW9uIFwiJTIkc1wiIGZvdW5kLCB2ZXJzaW9uIFwiJTMkc1wiIGV4cGVjdGVkLiIKK1N0Z0lnbm9yZWQgICAgICAgICAgICAgICAgICAgIiUxJHM6IGlnbm9yZWQgYmVjYXVzZSAlMiRzIGhhcyBiZWVuIGRlZmluZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICUxLCAtLSBuYW1lIG9mIGlnbm9yZWQgdmFyaWFibGUsICUyIC0tIG5hbWUgb2YgdmFyaWFibGUgd2l0aCBoaWdoZXIgcHJpb3JpdHkuCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBvdmVycmlkZXMgJTMkcyBzcGVjaWZpZWQgYmVmb3JlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlMSwgJTIgLS0gbmFtZSBhbmQgdmFsdWUgb2YgdGhlIG92ZXJyaWRpbmcgdmFyaWFibGUsICUzIC0tIG5hbWUgb2Ygb3ZlcnJpZGVuIHZhcmlhYmxlLgorCisjIC0tLSBPcGVuTVAgZXJyb3JzIGRldGVjdGVkIGF0IHJ1bnRpbWUgLS0tCisjCisjICAgICUxIGlzIHRoZSBuYW1lIG9mIE9wZW5NUCBjb25zdHJ1Y3QgKGZvcm1hdHRlZCB3aXRoICJQcmFnbWEiIGZvcm1hdCkuCisjCitDbnNCb3VuZFRvV29ya3NoYXJpbmcgICAgICAgICIlMSRzIG11c3QgYmUgYm91bmQgdG8gYSB3b3JrLXNoYXJpbmcgb3Igd29yay1xdWV1aW5nIGNvbnN0cnVjdCB3aXRoIGFuIFwib3JkZXJlZFwiIGNsYXVzZSIKK0Nuc0RldGVjdGVkRW5kICAgICAgICAgICAgICAgIkRldGVjdGVkIGVuZCBvZiAlMSRzIHdpdGhvdXQgZmlyc3QgZXhlY3V0aW5nIGEgY29ycmVzcG9uZGluZyBiZWdpbm5pbmcuIgorQ25zSXRlcmF0aW9uUmFuZ2VUb29MYXJnZSAgICAiSXRlcmF0aW9uIHJhbmdlIHRvbyBsYXJnZSBpbiAlMSRzLiIKK0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQgICAgIiUxJHMgbXVzdCBub3QgaGF2ZSBhIGxvb3AgaW5jcmVtZW50IHRoYXQgZXZhbHVhdGVzIHRvIHplcm8uIgorIworIyAgICAlMSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgT3Blbk1QIGNvbnN0cnVjdCwgJTIgLS0gdGhlIG5hbWUgb2YgdGhlIHNlY29uZCBvbmUgKGJvdGggZm9ybWF0dGVkIHdpdGggIlByYWdtYSIgZm9ybWF0KS4KKyMKK0Nuc0V4cGVjdGVkRW5kICAgICAgICAgICAgICAgIkV4cGVjdGVkIGVuZCBvZiAlMSRzOyAlMiRzLCBob3dldmVyLCBoYXMgbW9zdCByZWNlbnRseSBiZWd1biBleGVjdXRpb24uIgorQ25zSW52YWxpZE5lc3RpbmcgICAgICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMiCitDbnNNdWx0aXBsZU5lc3RpbmcgICAgICAgICAgICIlMSRzIGNhbm5vdCBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgZXhlY3V0aW9uIG9mIG9uZSBwYXJhbGxlbCBpdGVyYXRpb24vc2VjdGlvbiBvZiAlMiRzIgorQ25zTmVzdGluZ1NhbWVOYW1lICAgICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMgb2YgdGhlIHNhbWUgbmFtZSIKK0Nuc05vT3JkZXJlZENsYXVzZSAgICAgICAgICAgIiUxJHMgaXMgaW5jb3JyZWN0bHkgbmVzdGVkIHdpdGhpbiAlMiRzIHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBcIm9yZGVyZWRcIiBjbGF1c2UiCitDbnNOb3RJblRhc2tDb25zdHJ1Y3QgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyBidXQgbm90IHdpdGhpbiBhbnkgb2YgaXRzIFwidGFza1wiIGNvbnN0cnVjdHMiCitDbnNUaHJlYWRzQXRCYXJyaWVyICAgICAgICAgICJPbmUgdGhyZWFkIGF0ICUxJHMgd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXQgJTIkcy4iCisKKyMgTmV3IGVycm9ycworQ2FudENvbm5lY3QgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbm5lY3QgdG8gJTEkcyIKK0NhbnRDb25uZWN0VXNpbmcgICAgICAgICAgICAgIkNhbm5vdCBjb25uZWN0IHRvICUxJHMgLSBVc2luZyAlMiRzIgorTGliTm90U3VwcG9ydCAgICAgICAgICAgICAgICAiJTEkcyBkb2VzIG5vdCBzdXBwb3J0ICUyJHMuIENvbnRpbnVpbmcgd2l0aG91dCB1c2luZyAlMiRzLiIKK0xpYk5vdFN1cHBvcnRGb3IgICAgICAgICAgICAgIiUxJHMgZG9lcyBub3Qgc3VwcG9ydCAlMiRzIGZvciAlMyRzLiBDb250aW51aW5nIHdpdGhvdXQgdXNpbmcgJTIkcy4iCitTdGF0aWNMaWJOb3RTdXBwb3J0ICAgICAgICAgICJTdGF0aWMgJTEkcyBkb2VzIG5vdCBzdXBwb3J0ICUyJHMuIENvbnRpbnVpbmcgd2l0aG91dCB1c2luZyAlMiRzLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIktNUF9EWU5BTUlDX01PREU9aXJtbCBjYW5ub3QgYmUgdXNlZCB3aXRoIEtNUF9VU0VfSVJNTD0wIgorSXR0VW5rbm93bkdyb3VwICAgICAgICAgICAgICAiaXR0bm90aWZ5OiBVbmtub3duIGdyb3VwIFwiJTIkc1wiIHNwZWNpZmllZCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIi4iCitJdHRFbnZWYXJUb29Mb25nICAgICAgICAgICAgICJpdHRub3RpZnk6IEVudmlyb25tZW50IHZhcmlhYmxlIFwiJTEkc1wiIHRvbyBsb25nOiBBY3R1YWwgbGVuZ3RocyBpcyAlMiRsdSwgbWF4IGFsbG93ZWQgbGVuZ3RoIGlzICUzJGx1LiIKK0FmZlVzZUdsb2JDcHVpZEwxMSAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGdsb2JhbCBjcHVpZCBsZWFmIDExIGluZm8iCitBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWRMMTEgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgbG9jYWwgY3B1aWQgbGVhZiAxMSBpbmZvIgorQWZmSW5mb1N0ciAgICAgICAgICAgICAgICAgICAiJTEkczogJTIkcy4iCitBZmZJbmZvU3RyU3RyICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIC0gJTMkcy4iCitPU1Byb2NUb1BoeXNpY2FsVGhyZWFkTWFwICAgICIlMSRzOiBPUyBwcm9jIHRvIHBoeXNpY2FsIHRocmVhZCBtYXA6IgorQWZmVXNpbmdGbGF0T1MgICAgICAgICAgICAgICAiJTEkczogdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitBZmZQYXJzZUZpbGVuYW1lICAgICAgICAgICAgICIlMSRzOiBwYXJzaW5nICUyJHMuIgorTXNnRXhpdGluZyAgICAgICAgICAgICAgICAgICAiJTEkcyAtIGV4aXRpbmcuIgorSW5jb21wYXRpYmxlTGlicmFyeSAgICAgICAgICAiSW5jb21wYXRpYmxlICUxJHMgbGlicmFyeSB3aXRoIHZlcnNpb24gJTIkcyBmb3VuZC4iCitJdHRGdW5jdGlvbkVycm9yICAgICAgICAgICAgICJpdHRub3RpZnk6IEZ1bmN0aW9uICUxJHMgZmFpbGVkOiIKK0l0dFVua25vd25FcnJvciAgICAgICAgICAgICAgIml0dG5vZmlmeTogRXJyb3IgIyUxJGQuIgorRW52TWlkZGxlV2FybiAgICAgICAgICAgICAgICAiJTEkcyBtdXN0IGJlIHNldCBwcmlvciB0byBmaXJzdCBwYXJhbGxlbCByZWdpb24gb3IgY2VydGFpbiBBUEkgY2FsbHM7IGlnbm9yZWQuIgorQ25zTG9ja05vdERlc3Ryb3llZCAgICAgICAgICAiTG9jayBpbml0aWFsaXplZCBhdCAlMSRzKCUyJGQpIHdhcyBub3QgZGVzdHJveWVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlMSwgJTIsICUzLCAlNCAtLSBmaWxlLCBsaW5lLCBmdW5jLCBjb2wKK0NhbnRMb2FkQmFsVXNpbmcgICAgICAgICAgICAgIkNhbm5vdCBkZXRlcm1pbmUgbWFjaGluZSBsb2FkIGJhbGFuY2UgLSBVc2luZyAlMSRzIgorQWZmTm90Q2FwYWJsZVVzZVB0aHJlYWQgICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIHB0aHJlYWQgaW5mbyIKK0FmZlVzZVB0aHJlYWQgICAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIHB0aHJlYWQgaW5mbyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkxvYWRpbmcgXCIlMSRzXCIgbGlicmFyeSBmYWlsZWQ6IgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiTG9va3VwIG9mIFwiJTEkc1wiIGZ1bmN0aW9uIGZhaWxlZDoiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIgdG9vIHNtYWxsLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkVycm9yICMlMSRkLiIKK050aFN5bnRheEVycm9yICAgICAgICAgICAgICAgIiUxJHM6IEludmFsaWQgc3ltYm9scyBmb3VuZC4gQ2hlY2sgdGhlIHZhbHVlIFwiJTIkc1wiLiIKK050aFNwYWNlc05vdEFsbG93ZWQgICAgICAgICAgIiUxJHM6IFNwYWNlcyBiZXR3ZWVuIGRpZ2l0cyBhcmUgbm90IGFsbG93ZWQgXCIlMiRzXCIuIgorQWZmU3RyUGFyc2VGaWxlbmFtZSAgICAgICAgICAiJTEkczogJTIkcyAtIHBhcnNpbmcgJTMkcy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzIGNhbm5vdCBiZSBzcGVjaWZpZWQgdmlhIGttcF9zZXRfZGVmYXVsdHMoKSBvbiB0aGlzIG1hY2hpbmUgYmVjYXVzZSBpdCBoYXMgbW9yZSB0aGFuIG9uZSBwcm9jZXNzb3IgZ3JvdXAuIgorQWZmVHlwZUNhbnRVc2VNdWx0R3JvdXBzICAgICAiQ2Fubm90IHVzZSBhZmZpbml0eSB0eXBlIFwiJTEkc1wiIHdpdGggbXVsdGlwbGUgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwcywgdXNpbmcgXCIlMiRzXCIuIgorQWZmR3JhbkNhbnRVc2VNdWx0R3JvdXBzICAgICAiQ2Fubm90IHVzZSBhZmZpbml0eSBncmFudWxhcml0eSBcIiUxJHNcIiB3aXRoIG11bHRpcGxlIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cHMsIHVzaW5nIFwiJTIkc1wiLiIKK0FmZldpbmRvd3NQcm9jR3JvdXBNYXAgICAgICAgIiUxJHM6IE1hcHBpbmcgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwIDxpPiBwcm9jIDxqPiB0byBPUyBwcm9jIDY0KjxpPis8aj4uIgorQWZmT1NQcm9jVG9Hcm91cCAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwICUzJGQgcHJvYyAlNCRkIgorQWZmQmFsYW5jZWROb3RBdmFpbCAgICAgICAgICAiJTEkczogQWZmaW5pdHkgYmFsYW5jZWQgaXMgbm90IGF2YWlsYWJsZS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBncmFudWxhcml0eT1jb3JlIHdpbGwgYmUgdXNlZC4iCitFbnZMb2NrV2FybiAgICAgICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgc2V0IHByaW9yIHRvIGZpcnN0IE9NUCBsb2NrIGNhbGwgb3IgY3JpdGljYWwgc2VjdGlvbjsgaWdub3JlZC4iCitGdXRleE5vdFN1cHBvcnRlZCAgICAgICAgICAgICJmdXRleCBzeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkOyAlMSRzPSUyJHMgaWdub3JlZC4iCitBZmZHcmFuVXNpbmcgICAgICAgICAgICAgICAgICIlMSRzOiBncmFudWxhcml0eT0lMiRzIHdpbGwgYmUgdXNlZC4iCitBZmZIV1N1YnNldEludmFsaWQgICAgICAgICAgICIlMSRzOiBpbnZhbGlkIHZhbHVlIFwiJTIkc1wiLCB2YWxpZCBmb3JtYXQgaXMgXCJOc1tATl0sTmNbQE5dLE50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihuU29ja2V0c0BvZmZzZXQsIG5Db3Jlc0BvZmZzZXQsIG5UdGhyZWFkcyBwZXIgY29yZSlcIi4iCitBZmZIV1N1YnNldFVuc3VwcG9ydGVkICAgICAgICJLTVBfSFdfU1VCU0VUIGlnbm9yZWQ6IHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4iCitBZmZIV1N1YnNldE1hbnlDb3JlcyAgICAgICAgICJLTVBfSFdfU1VCU0VUIGlnbm9yZWQ6IHRvbyBtYW55IGNvcmVzIHJlcXVlc3RlZC4iCitTeW50YXhFcnJvclVzaW5nICAgICAgICAgICAgICIlMSRzOiBzeW50YXggZXJyb3IsIHVzaW5nICUyJHMuIgorQWRhcHRpdmVOb3RTdXBwb3J0ZWQgICAgICAgICAiJTEkczogQWRhcHRpdmUgbG9ja3MgYXJlIG5vdCBzdXBwb3J0ZWQ7IHVzaW5nIHF1ZXVpbmcuIgorRW52U3ludGF4RXJyb3IgICAgICAgICAgICAgICAiJTEkczogSW52YWxpZCBzeW1ib2xzIGZvdW5kLiBDaGVjayB0aGUgdmFsdWUgXCIlMiRzXCIuIgorRW52U3BhY2VzTm90QWxsb3dlZCAgICAgICAgICAiJTEkczogU3BhY2VzIGJldHdlZW4gZGlnaXRzIGFyZSBub3QgYWxsb3dlZCBcIiUyJHNcIi4iCitCb3VuZFRvT1NQcm9jU2V0ICAgICAgICAgICAgICIlMSRzOiBwaWQgJTIkZCB0aHJlYWQgJTMkZCBib3VuZCB0byBPUyBwcm9jIHNldCAlNCRzIgorQ25zTG9vcEluY3JJbGxlZ2FsICAgICAgICAgICAiJTEkcyBlcnJvcjogcGFyYWxsZWwgbG9vcCBpbmNyZW1lbnQgYW5kIGNvbmRpdGlvbiBhcmUgaW5jb25zaXN0ZW50LiIKK05vR29tcENhbmNlbGxhdGlvbiAgICAgICAgICAgImxpYmdvbXAgY2FuY2VsbGF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiIKK0FmZkhXU3Vic2V0Tm9uVW5pZm9ybSAgICAgICAgIktNUF9IV19TVUJTRVQgaWdub3JlZDogbm9uLXVuaWZvcm0gdG9wb2xvZ3kuIgorQWZmSFdTdWJzZXROb25UaHJlZUxldmVsICAgICAiS01QX0hXX1NVQlNFVCBpZ25vcmVkOiBvbmx5IHRocmVlLWxldmVsIHRvcG9sb2d5IGlzIHN1cHBvcnRlZC4iCitBZmZHcmFuVG9wR3JvdXAgICAgICAgICAgICAgICIlMSRzOiBncmFudWxhcml0eT0lMiRzIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBLTVBfVE9QT0xPR1lfTUVUSE9EPWdyb3VwLiBVc2luZyBcImdyYW51bGFyaXR5PWZpbmVcIi4iCitBZmZHcmFuR3JvdXBUeXBlICAgICAgICAgICAgICIlMSRzOiBncmFudWxhcml0eT1ncm91cCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggS01QX0FGRklOSVRZPSUyJHMuIFVzaW5nIFwiZ3JhbnVsYXJpdHk9Y29yZVwiLiIKK0FmZkhXU3Vic2V0TWFueVNvY2tldHMgICAgICAgIktNUF9IV19TVUJTRVQgaWdub3JlZDogdG9vIG1hbnkgc29ja2V0cyByZXF1ZXN0ZWQuIgorQWZmSFdTdWJzZXREZXByZWNhdGVkICAgICAgICAiS01QX0hXX1NVQlNFVCBcIm9cIiBvZmZzZXQgZGVzaWduYXRvciBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIEAgcHJlZml4IGZvciBvZmZzZXQgdmFsdWUuIgorQWZmVXNpbmdId2xvYyAgICAgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgaHdsb2MuIgorQWZmSWdub3JpbmdId2xvYyAgICAgICAgICAgICAiJTEkczogSWdub3JpbmcgaHdsb2MgbWVjaGFuaXNtLiIKK0FmZkh3bG9jRXJyb3JPY2N1cnJlZCAgICAgICAgIiUxJHM6IEh3bG9jIGZhaWxlZCBpbiAlMiRzLiBSZWx5aW5nIG9uIGludGVybmFsIGFmZmluaXR5IG1lY2hhbmlzbXMuIgorRW52U2VyaWFsV2FybiAgICAgICAgICAgICAgICAiJTEkcyBtdXN0IGJlIHNldCBwcmlvciB0byBPcGVuTVAgcnVudGltZSBsaWJyYXJ5IGluaXRpYWxpemF0aW9uOyBpZ25vcmVkLiIKK0VudlZhckRlcHJlY2F0ZWQgICAgICAgICAgICAgIiUxJHMgdmFyaWFibGUgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSAlMiRzIGluc3RlYWQuIgorUmVkTWV0aG9kTm90U3VwcG9ydGVkICAgICAgICAiS01QX0ZPUkNFX1JFRFVDVElPTjogJTEkcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZDsgdXNpbmcgY3JpdGljYWwuIgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBISU5UUyAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBIaW50cy4gSGludCBtYXkgYmUgcHJpbnRlZCBhZnRlciBhIG1lc3NhZ2UuIFVzdWFsbHkgaXQgaXMgbG9uZ2VyIGV4cGxhbmF0aW9uIHRleHQgb3Igc3VnZ2VzdGlvbi4KKyMgVG8gbWFpbnRhaW4gaGludCBudW1iZXJzICh0aGV5IGFyZSB2aXNpYmxlIHRvIGN1c3RvbWVycyksIGFkZCBuZXcgaGludHMgdG8gdGhlIGVuZC4KKworU3VibWl0QnVnUmVwb3J0ICAgICAgICAgICAgICAiUGxlYXNlIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgd2l0aCB0aGlzIG1lc3NhZ2UsIGNvbXBpbGUgYW5kIHJ1biAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kcyB1c2VkLCBhbmQgbWFjaGluZSBjb25maWd1cmF0aW9uIGluZm8gaW5jbHVkaW5nIG5hdGl2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlciBhbmQgb3BlcmF0aW5nIHN5c3RlbSB2ZXJzaW9ucy4gRmFzdGVyIHJlc3BvbnNlIHdpbGwgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2J0YWluZWQgYnkgaW5jbHVkaW5nIGFsbCBwcm9ncmFtIHNvdXJjZXMuIEZvciBpbmZvcm1hdGlvbiBvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJtaXR0aW5nIHRoaXMgaXNzdWUsIHBsZWFzZSBzZWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5pbnRlbC5jb20vc29mdHdhcmUvcHJvZHVjdHMvc3VwcG9ydC8uIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiQ2hlY2sgTkxTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaXRzIHZhbHVlIGlzIFwiJTEkc1wiLiIKK0NoYW5nZVN0YWNrTGltaXQgICAgICAgICAgICAgIlBsZWFzZSB0cnkgY2hhbmdpbmcgdGhlIHNoZWxsIHN0YWNrIGxpbWl0IG9yIGFkanVzdGluZyB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT01QX1NUQUNLU0laRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4iCitVbnNldF9BTExfVEhSRUFEUyAgICAgICAgICAgICJDb25zaWRlciB1bnNldHRpbmcgS01QX0FMTF9USFJFQURTIGFuZCBPTVBfVEhSRUFEX0xJTUlUIChpZiBlaXRoZXIgaXMgc2V0KS4iCitTZXRfQUxMX1RIUkVBRFBSSVZBVEUgICAgICAgICJDb25zaWRlciBzZXR0aW5nIEtNUF9BTExfVEhSRUFEUFJJVkFURSB0byBhIHZhbHVlIGxhcmdlciB0aGFuICUxJGQuIgorUG9zc2libGVTeXN0ZW1MaW1pdE9uVGhyZWFkcyAiVGhpcyBjb3VsZCBhbHNvIGJlIGR1ZSB0byBhIHN5c3RlbS1yZWxhdGVkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4iCitEdXBsaWNhdGVMaWJyYXJ5ICAgICAgICAgICAgICJUaGlzIG1lYW5zIHRoYXQgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBPcGVuTVAgcnVudGltZSBoYXZlIGJlZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlua2VkIGludG8gdGhlIHByb2dyYW0uIFRoYXQgaXMgZGFuZ2Vyb3VzLCBzaW5jZSBpdCBjYW4gZGVncmFkZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJmb3JtYW5jZSBvciBjYXVzZSBpbmNvcnJlY3QgcmVzdWx0cy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGJlc3QgdGhpbmcgdG8gZG8gaXMgdG8gZW5zdXJlIHRoYXQgb25seSBhIHNpbmdsZSBPcGVuTVAgcnVudGltZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rZWQgaW50byB0aGUgcHJvY2VzcywgZS5nLiBieSBhdm9pZGluZyBzdGF0aWMgbGlua2luZyBvZiB0aGUgT3Blbk1QICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bnRpbWUgaW4gYW55IGxpYnJhcnkuIEFzIGFuIHVuc2FmZSwgdW5zdXBwb3J0ZWQsIHVuZG9jdW1lbnRlZCB3b3JrYXJvdW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlvdSBjYW4gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBLTVBfRFVQTElDQVRFX0xJQl9PSz1UUlVFIHRvIGFsbG93ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBwcm9ncmFtIHRvIGNvbnRpbnVlIHRvIGV4ZWN1dGUsIGJ1dCB0aGF0IG1heSBjYXVzZSBjcmFzaGVzIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbGVudGx5IHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIGh0dHA6Ly93d3cuaW50ZWwuY29tL3NvZnR3YXJlL3Byb2R1Y3RzL3N1cHBvcnQvLiIKK05hbWVDb21lc0Zyb21fQ1BVSU5GT19GSUxFICAgIlRoaXMgbmFtZSBpcyBzcGVjaWZpZWQgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgS01QX0NQVUlORk9fRklMRS4iCitOb3RFbm91Z2hNZW1vcnkgICAgICAgICAgICAgICJTZWVtcyBhcHBsaWNhdGlvbiByZXF1aXJlZCB0b28gbXVjaCBtZW1vcnkuIgorVmFsaWRCb29sVmFsdWVzICAgICAgICAgICAgICAiVXNlIFwiMFwiLCBcIkZBTFNFXCIuIFwiLkYuXCIsIFwib2ZmXCIsIFwibm9cIiBhcyBmYWxzZSB2YWx1ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiMVwiLCBcIlRSVUVcIiwgXCIuVC5cIiwgXCJvblwiLCBcInllc1wiIGFzIHRydWUgdmFsdWVzLiIKK0J1ZmZlck92ZXJmbG93ICAgICAgICAgICAgICAgIlBlcmhhcHMgdG9vIG1hbnkgdGhyZWFkcy4iCitSdW5uaW5nQXRNYXhQcmlvcml0eSAgICAgICAgICJEZWNyZWFzZSBwcmlvcml0eSBvZiBhcHBsaWNhdGlvbi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyB3aWxsIGFsbG93IHRoZSBtb25pdG9yIHRocmVhZCBydW4gYXQgaGlnaGVyIHByaW9yaXR5IHRoYW4gb3RoZXIgdGhyZWFkcy4iCitDaGFuZ2VNb25pdG9yU3RhY2tTaXplICAgICAgICJUcnkgY2hhbmdpbmcgS01QX01PTklUT1JfU1RBQ0tTSVpFIG9yIHRoZSBzaGVsbCBzdGFjayBsaW1pdC4iCitDaGFuZ2VXb3JrZXJTdGFja1NpemUgICAgICAgICJUcnkgY2hhbmdpbmcgT01QX1NUQUNLU0laRSBhbmQvb3IgdGhlIHNoZWxsIHN0YWNrIGxpbWl0LiIKK0luY3JlYXNlV29ya2VyU3RhY2tTaXplICAgICAgIlRyeSBpbmNyZWFzaW5nIE9NUF9TVEFDS1NJWkUgb3IgdGhlIHNoZWxsIHN0YWNrIGxpbWl0LiIKK0RlY3JlYXNlV29ya2VyU3RhY2tTaXplICAgICAgIlRyeSBkZWNyZWFzaW5nIE9NUF9TVEFDS1NJWkUuIgorRGVjcmVhc2VfTlVNX1RIUkVBRFMgICAgICAgICAiVHJ5IGRlY3JlYXNpbmcgdGhlIHZhbHVlIG9mIE9NUF9OVU1fVEhSRUFEUy4iCitJbmNyZWFzZU1vbml0b3JTdGFja1NpemUgICAgICJUcnkgaW5jcmVhc2luZyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUuIgorRGVjcmVhc2VNb25pdG9yU3RhY2tTaXplICAgICAiVHJ5IGRlY3JlYXNpbmcgS01QX01PTklUT1JfU1RBQ0tTSVpFLiIKK0RlY3JlYXNlTnVtYmVyT2ZUaHJlYWRzSW5Vc2UgIlRyeSBkZWNyZWFzaW5nIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiB1c2Ugc2ltdWx0YW5lb3VzbHkuIgorRGVmYXVsdFNjaGVkdWxlS2luZFVzZWQgICAgICAiV2lsbCB1c2UgZGVmYXVsdCBzY2hlZHVsZSB0eXBlICglMSRzKS4iCitHZXROZXdlckxpYnJhcnkgICAgICAgICAgICAgICJJdCBjb3VsZCBiZSBhIHJlc3VsdCBvZiB1c2luZyBhbiBvbGRlciBPTVAgbGlicmFyeSB3aXRoIGEgbmV3ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZXIgb3IgbWVtb3J5IGNvcnJ1cHRpb24uIFlvdSBtYXkgY2hlY2sgdGhlIHByb3BlciBPTVAgbGlicmFyeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBsaW5rZWQgdG8gdGhlIGFwcGxpY2F0aW9uLiIKK0NoZWNrRW52VmFyICAgICAgICAgICAgICAgICAgIkNoZWNrICUxJHMgZW52aXJvbm1lbnQgdmFyaWFibGUsIGl0cyB2YWx1ZSBpcyBcIiUyJHNcIi4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJZb3UgbWF5IHdhbnQgdG8gdXNlIGFuICUxJHMgbGlicmFyeSB0aGF0IHN1cHBvcnRzICUyJHMgaW50ZXJmYWNlIHdpdGggdmVyc2lvbiAlMyRzLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIllvdSBtYXkgd2FudCB0byB1c2UgYW4gJTEkcyBsaWJyYXJ5IHdpdGggdmVyc2lvbiAlMiRzLiIKK0JhZEV4ZUZvcm1hdCAgICAgICAgICAgICAgICAgIlN5c3RlbSBlcnJvciAjMTkzIGlzIFwiQmFkIGZvcm1hdCBvZiBFWEUgb3IgRExMIGZpbGVcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXN1YWxseSBpdCBtZWFucyB0aGUgZmlsZSBpcyBmb3VuZCwgYnV0IGl0IGlzIGNvcnJ1cHRlZCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIGZpbGUgZm9yIGFub3RoZXIgYXJjaGl0ZWN0dXJlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGVjayB3aGV0aGVyIFwiJTEkc1wiIGlzIGEgZmlsZSBmb3IgJTIkcyBhcmNoaXRlY3R1cmUuIgorU3lzdGVtTGltaXRPblRocmVhZHMgICAgICAgICAiU3lzdGVtLXJlbGF0ZWQgbGltaXQgb24gdGhlIG51bWJlciBvZiB0aHJlYWRzLiIKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZW5kIG9mIGZpbGUgIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiZDg5MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcC5oLnZhcgpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIGluY2x1ZGUvMzAvb21wLmgudmFyCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgX19PTVBfSAorIyAgIGRlZmluZSBfX09NUF9ICisKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgICAgQExJQk9NUF9WRVJTSU9OX01BSk9SQAorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICBATElCT01QX1ZFUlNJT05fTUlOT1JACisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgIEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyMgICBkZWZpbmUgS01QX0JVSUxEX0RBVEUgICAgICAgIkBMSUJPTVBfQlVJTERfREFURUAiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworIyAgIGVuZGlmCisKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbnVtX3RocmVhZHMgICAgICAgICAgb21wY19zZXRfbnVtX3RocmVhZHMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfZHluYW1pYyAgICAgICAgICAgICAgb21wY19zZXRfZHluYW1pYworIyAgICAgICBkZWZpbmUgb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICBvbXBjX3NldF9uZXN0ZWQKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgb21wY19zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgb21wY19zZXRfc2NoZWR1bGUKKyMgICAgICAgZGVmaW5lIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAgb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIyAgICAgICBkZWZpbmUgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgICBvbXBjX2dldF90ZWFtX3NpemUKKworCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZQorIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworIyAgICAgICBkZWZpbmUga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgICAga21wY19zZXRfbGlicmFyeQorIyAgICAgICBkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworIyAgICAgICBkZWZpbmUga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2Mga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyMgICAgICAgZGVmaW5lIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyMgICAgICAgZGVmaW5lIGttcF9tYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19tYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAga21wY19jYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAga21wY19yZWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgIGttcGNfZnJlZQorCisKKyMgICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OCisjICAgZW5kaWYKKworICAgIC8qIHNjaGVkdWxlIGtpbmQgY29uc3RhbnRzICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9zY2hlZF90IHsKKwlvbXBfc2NoZWRfc3RhdGljICA9IDEsCisJb21wX3NjaGVkX2R5bmFtaWMgPSAyLAorCW9tcF9zY2hlZF9ndWlkZWQgID0gMywKKwlvbXBfc2NoZWRfYXV0byAgICA9IDQKKyAgICB9IG9tcF9zY2hlZF90OworCisgICAgLyogc2V0IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9udW1fdGhyZWFkcyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9keW5hbWljICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0ZWQgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAob21wX3NjaGVkX3QsIGludCk7CisKKyAgICAvKiBxdWVyeSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9keW5hbWljICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X25lc3RlZCAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbnVtICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9wcm9jcyAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9wYXJhbGxlbCAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX2ZpbmFsICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2xldmVsICAgICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbGltaXQgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscyAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9zY2hlZHVsZSAgICAgICAgICAgIChvbXBfc2NoZWRfdCAqLCBpbnQgKik7CisKKyAgICAvKiBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBvbXBfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbG9jayAgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9sb2NrICAgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Vuc2V0X2xvY2sgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbG9jayAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbG9jayAgICAob21wX2xvY2tfdCAqKTsKKworICAgIC8qIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBvbXBfbmVzdF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX25lc3RfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RfbG9jayAgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Vuc2V0X25lc3RfbG9jayAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X25lc3RfbG9jayAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKworICAgIC8qIHRpbWUgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aW1lICh2b2lkKTsKKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGljayAodm9pZCk7CisKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKworICAgIC8qIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfYWxpZ25lZF9tYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZi52YXIgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OGRmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsNjQ0IEBACishIGluY2x1ZGUvMzAvb21wX2xpYi5mLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBhbGlnbm1lbnQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQUxJR05FRF9NQUxMT0MnOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbmRpZgorIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX2xpbnV4KQorCishKioqCishKioqIFRoZSBMaW51eCogT1MgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gdW5kZXJzY29yZSBhcHBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2FsaWduZWRfbWFsbG9jXyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzUzOWExCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsMzY1IEBACishIGluY2x1ZGUvMzAvb21wX2xpYi5mOTAudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gY19zaXplX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBjX2ludHB0cl90CisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9maW5hbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9maW5hbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSA6OiBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpICAgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSA6OiBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisgICAgICAgICAgICBjaGFyYWN0ZXIgKGtpbmQ9Y19jaGFyKSA6OiBzdHJpbmcoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2FsaWduZWRfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogYWxpZ25tZW50CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5oLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwMDYwMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuaC52YXIKQEAgLTAsMCArMSw2NDkgQEAKKyEgaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFkZWMkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSBATElCT01QX1ZFUlNJT05fQlVJTERACisgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorCisgICAgICBpbnRlcmZhY2UKKworISAgICAgICAqKioKKyEgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9maW5hbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX2ZpbmFsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2FsaWduZWRfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgYWxpZ25tZW50CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lOX0ZJTkFMJzo6b21wX2luX2ZpbmFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX0xJTUlUJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9MRVZFTCc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9URUFNX1NJWkUnOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRSc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfU0NIRURVTEUnOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElDSyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jayc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2snOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2snOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jayc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2snOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jayc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jayc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9ERUZBVUxUUyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTSc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fRklOQUwnOjpvbXBfaW5fZmluYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTElNSVQnOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0xFVkVMJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQUNUSVZFX0xFVkVMJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fU0laRSc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9TQ0hFRFVMRSc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1NDSEVEVUxFJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jayc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jayc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jayc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jayc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9jayc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9ERUZBVUxUUyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQUxJR05FRF9NQUxMT0MnOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbmRpZgorIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX2xpbnV4KQorCishKioqCishKioqIFRoZSBMaW51eCogT1MgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gdW5kZXJzY29yZSBhcHBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5fZmluYWxfJzo6b21wX2luX2ZpbmFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9kZWZhdWx0c18nOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fZmluYWxfJzo6b21wX2luX2ZpbmFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfZGVmYXVsdHNfJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXB0LmgudmFyIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wdC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjA1MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wdC5oLnZhcgpAQCAtMCwwICsxLDQ4OCBAQAorLyoKKyAqIGluY2x1ZGUvMzAvb21wdC5oLnZhcgorICovCisKKyNpZm5kZWYgX19PTVBUX18KKyNkZWZpbmUgX19PTVBUX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzeXN0ZW0gaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGl0ZXJhdGlvbiBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGT1JFQUNIX09NUFRfSU5RVUlSWV9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9lbnVtZXJhdGVfc3RhdGUpICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3NldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfY2FsbGJhY2spICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9pZGxlX2ZyYW1lKSAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGFza19mcmFtZSkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9zdGF0ZSkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX2lkKSAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUpIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGFza19pZCkgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3RocmVhZF9pZCkKKworI2RlZmluZSBGT1JFQUNIX09NUFRfUExBQ0VIT0xERVJfRk4obWFjcm8pICBcCisgICAgbWFjcm8gKG9tcHRfaWRsZSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9vdmVyaGVhZCkgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2JhcnJpZXJfd2FpdCkgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfdGFza193YWl0KSAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9tdXRleF93YWl0KQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9TVEFURShtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogZmlyc3QgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfZmlyc3QsIDB4NzEpICAgICAgICAgIC8qIGluaXRpYWwgZW51bWVyYXRpb24gc3RhdGUgKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogd29yayBzdGF0ZXMgKDAuLjE1KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd29ya19zZXJpYWwsIDB4MDApICAgIC8qIHdvcmtpbmcgb3V0c2lkZSBwYXJhbGxlbCAqLyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbCwgMHgwMSkgIC8qIHdvcmtpbmcgd2l0aGluIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd29ya19yZWR1Y3Rpb24sIDB4MDIpIC8qIHBlcmZvcm1pbmcgYSByZWR1Y3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogaWRsZSAoMTYuLjMxKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfaWRsZSwgMHgxMCkgICAgICAgICAgICAvKiB3YWl0aW5nIGZvciB3b3JrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogb3ZlcmhlYWQgc3RhdGVzICgzMi4uNjMpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfb3ZlcmhlYWQsIDB4MjApICAgICAgICAvKiBvdmVyaGVhZCBleGNsdWRpbmcgd2FpdCBzdGF0ZXMgKi8gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogYmFycmllciB3YWl0IHN0YXRlcyAoNjQuLjc5KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyLCAweDQwKSAgICAvKiB3YWl0aW5nIGF0IGEgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2ltcGxpY2l0LCAweDQxKSAgICAvKiBpbXBsaWNpdCBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2V4cGxpY2l0LCAweDQyKSAgICAvKiBleHBsaWNpdCBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogdGFzayB3YWl0IHN0YXRlcyAoODAuLjk1KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF90YXNrd2FpdCwgMHg1MCkgICAvKiB3YWl0aW5nIGF0IGEgdGFza3dhaXQgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF90YXNrZ3JvdXAsIDB4NTEpICAvKiB3YWl0aW5nIGF0IGEgdGFza2dyb3VwICovICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbXV0ZXggd2FpdCBzdGF0ZXMgKDk2Li4xMTEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9sb2NrLCAweDYwKSAgICAgICAvKiB3YWl0aW5nIGZvciBsb2NrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9uZXN0X2xvY2ssIDB4NjEpICAvKiB3YWl0aW5nIGZvciBuZXN0IGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9jcml0aWNhbCwgMHg2MikgICAvKiB3YWl0aW5nIGZvciBjcml0aWNhbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9hdG9taWMsIDB4NjMpICAgICAvKiB3YWl0aW5nIGZvciBhdG9taWMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9vcmRlcmVkLCAweDY0KSAgICAvKiB3YWl0aW5nIGZvciBvcmRlcmVkICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfd2FpdF9zaW5nbGUsIDB4NkYpICAgICAvKiB3YWl0aW5nIGZvciBzaW5nbGUgcmVnaW9uIChub24tc3RhbmRhcmQhKSAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbWlzYyAoMTEyLi4xMjcpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc3RhdGVfdW5kZWZpbmVkLCAweDcwKSAgICAgICAvKiB1bmRlZmluZWQgdGhyZWFkIHN0YXRlICovCisKKworI2RlZmluZSBGT1JFQUNIX09NUFRfRVZFTlQobWFjcm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gTWFuZGF0b3J5IEV2ZW50cyAtLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAxKSAvKiBwYXJhbGxlbCBiZWdpbiAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9wYXJhbGxlbF9lbmQsICAgICAgICAgICAgIG9tcHRfZW5kX3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgMikgLyogcGFyYWxsZWwgZW5kICovICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfdGFza19jYWxsYmFja190LCAgICAgICAzKSAvKiB0YXNrIGJlZ2luICovICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfdGFza19jYWxsYmFja190LCAgICAgICAgICAgNCkgLyogdGFzayBkZXN0cm95ICovICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9iZWdpbiwgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA1KSAvKiB0aHJlYWQgYmVnaW4gKi8gICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90aHJlYWRfZW5kLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCwgICAgNikgLyogdGhyZWFkIGVuZCAqLyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2NvbnRyb2wsICAgICAgICAgICAgICAgICAgb21wdF9jb250cm9sX2NhbGxiYWNrX3QsICAgICAgICA3KSAvKiBzdXBwb3J0IGNvbnRyb2wgY2FsbHMgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcnVudGltZV9zaHV0ZG93biwgICAgICAgICBvbXB0X2NhbGxiYWNrX3QsICAgICAgICAgICAgICAgIDgpIC8qIHJ1bnRpbWUgc2h1dGRvd24gKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBPcHRpb25hbCBFdmVudHMgKGJsYW1lIHNoaWZ0aW5nLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9iZWdpbiwgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgIDkpIC8qIGJlZ2luIGlkbGUgc3RhdGUgKi8gICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2lkbGVfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90aHJlYWRfY2FsbGJhY2tfdCwgICAgICAgIDEwKSAvKiBlbmQgaWRsZSBzdGF0ZSAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2JlZ2luLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTEpIC8qIGJlZ2luIHdhaXQgYXQgYmFycmllciAqLyAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9lbmQsICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDEyKSAvKiBlbmQgd2FpdCBhdCBiYXJyaWVyICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTMpIC8qIGJlZ2luIHdhaXQgYXQgdGFza3dhaXQgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE0KSAvKiBlbmQgd2FpdCBhdCB0YXNrd2FpdCAqLyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfYmVnaW4sICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTUpIC8qIGJlZ2luIHdhaXQgYXQgdGFza2dyb3VwICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza2dyb3VwX2VuZCwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE2KSAvKiBlbmQgd2FpdCBhdCB0YXNrZ3JvdXAgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9sb2NrLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTcpIC8qIGxvY2sgcmVsZWFzZSAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX2xhc3QsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE4KSAvKiBsYXN0IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2NyaXRpY2FsLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxOSkgLyogY3JpdGljYWwgcmVsZWFzZSAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfYXRvbWljLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDIwKSAvKiBhdG9taWMgcmVsZWFzZSAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkLCAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjEpIC8qIG9yZGVyZWQgcmVsZWFzZSAqLyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBPcHRpb25hbCBFdmVudHMgKHN5bmNocm9ub3VzIGV2ZW50cywgb21wdF9ldmVudF91bmltcGxlbWVudGVkKSAtLS0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjIpIC8qIGltcGxpY2l0IHRhc2sgYmVnaW4gICAqLyAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDIzKSAvKiBpbXBsaWNpdCB0YXNrIGVuZCAgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2JlZ2luLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjQpIC8qIGluaXRpYWwgdGFzayBiZWdpbiAgICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRpYWxfdGFza19lbmQsICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI1KSAvKiBpbml0aWFsIHRhc2sgZW5kICAqLyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19zd2l0Y2gsICAgICAgICAgICAgICBvbXB0X3Rhc2tfcGFpcl9jYWxsYmFja190LCAgICAgMjYpIC8qIHRhc2sgc3dpdGNoICovICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAyNykgLyogdGFzayBhdCBsb29wIGJlZ2luICovICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbG9vcF9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjgpIC8qIHRhc2sgYXQgbG9vcCBlbmQgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19iZWdpbiwgICAgICAgICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAyOSkgLyogdGFzayBhdCBzZWN0aW9ucyBiZWdpbiAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2VjdGlvbnNfZW5kLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzApIC8qIHRhc2sgYXQgc2VjdGlvbnMgZW5kICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfYmVnaW4sICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAzMSkgLyogdGFzayBhdCBzaW5nbGUgYmVnaW4qLyAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2VuZCwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzIpIC8qIHRhc2sgYXQgc2luZ2xlIGVuZCAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMykgLyogdGFzayBhdCBzaW5nbGUgYmVnaW4gKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzQpIC8qIHRhc2sgYXQgc2luZ2xlIGVuZCAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfYmVnaW4sICAgICAgICAgIG9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190LCAzNSkgLyogdGFzayBhdCB3b3Jrc2hhcmUgYmVnaW4gKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd29ya3NoYXJlX2VuZCwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzYpIC8qIHRhc2sgYXQgd29ya3NoYXJlIGVuZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfYmVnaW4sICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNykgLyogdGFzayBhdCBtYXN0ZXIgYmVnaW4gKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbWFzdGVyX2VuZCwgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzgpIC8qIHRhc2sgYXQgbWFzdGVyIGVuZCAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2JlZ2luLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOSkgLyogdGFzayBhdCBiYXJyaWVyIGJlZ2luICAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYmFycmllcl9lbmQsICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDApIC8qIHRhc2sgYXQgYmFycmllciBlbmQgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9iZWdpbiwgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MSkgLyogdGFzayBhdCB0YXNrd2FpdCBiZWdpbiAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza3dhaXRfZW5kLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDIpIC8qIHRhc2sgYXQgdGFzayB3YWl0IGVuZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfYmVnaW4sICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MykgLyogdGFzayBhdCB0YXNrZ3JvdXAgYmVnaW4gKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza2dyb3VwX2VuZCwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDQpIC8qIHRhc2sgYXQgdGFza2dyb3VwIGVuZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2LCAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NSkgLyogcHJldiBuZXN0IGxvY2sgcmVsZWFzZSAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ2KSAvKiBsb2NrIHdhaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NykgLyogbmVzdCBsb2NrIHdhaXQgKi8gICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9jcml0aWNhbCwgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDgpIC8qIGNyaXRpY2FsIHdhaXQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYXRvbWljLCAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ5KSAvKiBhdG9taWMgd2FpdCAqLyAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X29yZGVyZWQsICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MCkgLyogb3JkZXJlZCB3YWl0ICovICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2ssICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUxKSAvKiBsb2NrIGFjcXVpcmVkICovICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfZmlyc3QsIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MikgLyogMXN0IG5lc3QgbG9jayBhY3F1aXJlZCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQsICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTMpIC8qIG5leHQgbmVzdCBsb2NrIGFjcXVpcmVkKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2NyaXRpY2FsLCAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU0KSAvKiBjcml0aWNhbCBhY3F1aXJlZCAqLyAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9hdG9taWMsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NSkgLyogYXRvbWljIGFjcXVpcmVkICovICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfb3JkZXJlZCwgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTYpIC8qIG9yZGVyZWQgYWNxdWlyZWQgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X2xvY2ssICAgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NykgLyogbG9jayBpbml0ICovICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdF9uZXN0X2xvY2ssICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTgpIC8qIG5lc3QgbG9jayBpbml0ICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OSkgLyogbG9jayBkZXN0cnVjdGlvbiAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZGVzdHJveV9uZXN0X2xvY2ssICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNjApIC8qIG5lc3QgbG9jayBkZXN0cnVjdGlvbiAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9mbHVzaCwgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICA2MSkgLyogYWZ0ZXIgZXhlY3V0aW5nIGZsdXNoICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRhdGEgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlkZW50aWZpZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90aHJlYWRfaWRfdDsKKyNkZWZpbmUgb21wdF90aHJlYWRfaWRfbm9uZSAoKG9tcHRfdGhyZWFkX2lkX3QpIDApICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3Rhc2tfaWRfdDsKKyNkZWZpbmUgb21wdF90YXNrX2lkX25vbmUgKChvbXB0X3Rhc2tfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3BhcmFsbGVsX2lkX3Q7CisjZGVmaW5lIG9tcHRfcGFyYWxsZWxfaWRfbm9uZSAoKG9tcHRfcGFyYWxsZWxfaWRfdCkgMCkgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF93YWl0X2lkX3Q7CisjZGVmaW5lIG9tcHRfd2FpdF9pZF9ub25lICgob21wdF93YWl0X2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9tcHRfZnJhbWVfdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2ZyYW1lX3MgeworICAgIHZvaWQgKmV4aXRfcnVudGltZV9mcmFtZTsgICAgLyogbmV4dCBmcmFtZSBpcyB1c2VyIGNvZGUgICAgICovCisgICAgdm9pZCAqcmVlbnRlcl9ydW50aW1lX2ZyYW1lOyAvKiBwcmV2aW91cyBmcmFtZSBpcyB1c2VyIGNvZGUgKi8KK30gb21wdF9mcmFtZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZW51bWVyYXRpb25zIGZvciB0aHJlYWQgc3RhdGVzIGFuZCBydW50aW1lIGV2ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBzdGF0ZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgc3RhdGUgPSBjb2RlLAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK30gb21wdF9zdGF0ZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIGV2ZW50cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50LCBjYWxsYmFjaywgZXZlbnRpZCkgZXZlbnQgPSBldmVudGlkLAorICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorI3VuZGVmIG9tcHRfZXZlbnRfbWFjcm8KK30gb21wdF9ldmVudF90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXQgY2FsbGJhY2sgcmVzdWx0cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3NldF9yZXN1bHRfcmVnaXN0cmF0aW9uX2Vycm9yICAgICAgICAgICAgICA9IDAsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9ub19jYWxsYmFjayAgICAgPSAxLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMgICAgICAgICAgICAgID0gMiwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX3NvbWUgICA9IDMsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMgPSA0LAorfSBvbXB0X3NldF9yZXN1bHRfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2sgc2lnbmF0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpbml0aWFsaXphdGlvbiAqLwordHlwZWRlZiB2b2lkICgqb21wdF9pbnRlcmZhY2VfZm5fdCkodm9pZCk7CisKK3R5cGVkZWYgb21wdF9pbnRlcmZhY2VfZm5fdCAoKm9tcHRfZnVuY3Rpb25fbG9va3VwX3QpKAorICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBwb2ludCB0byBsb29rIHVwICAgICAgICovCispOworCisvKiB0aHJlYWRzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF90aHJlYWRfaW5pdGlhbCA9IDEsIC8vIHN0YXJ0IHRoZSBlbnVtZXJhdGlvbiBhdCAxCisgICAgb21wdF90aHJlYWRfd29ya2VyICA9IDIsCisgICAgb21wdF90aHJlYWRfb3RoZXIgICA9IDMKK30gb21wdF90aHJlYWRfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfaW52b2tlcl9wcm9ncmFtID0gMCwgICAgICAgICAvKiBwcm9ncmFtIGludm9rZXMgbWFzdGVyIHRhc2sgICovCisgICAgb21wdF9pbnZva2VyX3J1bnRpbWUgPSAxICAgICAgICAgIC8qIHJ1bnRpbWUgaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KK30gb21wdF9pbnZva2VyX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgICAvKiB0eXBlIG9mIHRocmVhZCAgICAgICAgICAgICAgICovCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfd2FpdF9jYWxsYmFja190KSAoCisgICAgb21wdF93YWl0X2lkX3Qgd2FpdF9pZCAgICAgICAgICAgIC8qIHdhaXQgaWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKKy8qIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmVzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICB2b2lkICp3b3Jrc2hhcmVfZnVuY3Rpb24gICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgb2YgcGFyZW50IHRhc2sgICAgKi8KKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIHVpbnQzMl90IHJlcXVlc3RlZF90ZWFtX3NpemUsICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtICAgICovCisgICAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb24sICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAqLworKTsKKworLyogdGFza3MgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBmaXJzdF90YXNrX2lkLAorICAgIG9tcHRfdGFza19pZF90IHNlY29uZF90YXNrX2lkCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld190YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIGZvciBwYXJlbnQgdGFzayAgICovCisgICAgb21wdF90YXNrX2lkX3QgIG5ld190YXNrX2lkLCAgICAgIC8qIGlkIG9mIGNyZWF0ZWQgdGFzayAgICAgICAgICAgKi8KKyAgICB2b2lkICp0YXNrX2Z1bmN0aW9uICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKworLyogcHJvZ3JhbSAqLwordHlwZWRlZiB2b2lkICgqb21wdF9jb250cm9sX2NhbGxiYWNrX3QpICgKKyAgICB1aW50NjRfdCBjb21tYW5kLCAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBvZiBjb250cm9sIGNhbGwgICAgICAqLworICAgIHVpbnQ2NF90IG1vZGlmaWVyICAgICAgICAgICAgICAgICAvKiBtb2RpZmllciBvZiBjb250cm9sIGNhbGwgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2NhbGxiYWNrX3QpKHZvaWQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvbXB0IEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBPTVBUX0FQSV9GTlRZUEUoZm4pIGZuIyNfdAorCisjZGVmaW5lIE9NUFRfQVBJX0ZVTkNUSU9OKHJldHVybl90eXBlLCBmbiwgYXJncykgIFwKKyAgICB0eXBlZGVmIHJldHVybl90eXBlICgqT01QVF9BUElfRk5UWVBFKGZuKSkgYXJncworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOUVVJUlkgRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzdGF0ZSAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF9zdGF0ZV90LCBvbXB0X2dldF9zdGF0ZSwgKAorICAgIG9tcHRfd2FpdF9pZF90ICpvbXB0X3dhaXRfaWQKKykpOworCisvKiB0aHJlYWQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfdGhyZWFkX2lkX3QsIG9tcHRfZ2V0X3RocmVhZF9pZCwgKHZvaWQpKTsKKworT01QVF9BUElfRlVOQ1RJT04odm9pZCAqLCBvbXB0X2dldF9pZGxlX2ZyYW1lLCAodm9pZCkpOworCisvKiBwYXJhbGxlbCByZWdpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfcGFyYWxsZWxfaWRfdCwgb21wdF9nZXRfcGFyYWxsZWxfaWQsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSwgKAorICAgIGludCBhbmNlc3Rvcl9sZXZlbAorKSk7CisKKy8qIHRhc2sgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfdGFza19pZF90LCBvbXB0X2dldF90YXNrX2lkLCAoCisgICAgaW50IGRlcHRoCispKTsKKworT01QVF9BUElfRlVOQ1RJT04ob21wdF9mcmFtZV90ICosIG9tcHRfZ2V0X3Rhc2tfZnJhbWUsICgKKyAgICBpbnQgZGVwdGgKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBMQUNFSE9MREVSUyBGT1IgUEVSRk9STUFOQ0UgUkVQT1JUSU5HCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpZGxlICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2lkbGUsICgKKyAgICB2b2lkCispKTsKKworLyogb3ZlcmhlYWQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfb3ZlcmhlYWQsICgKKyAgICB2b2lkCispKTsKKworLyogYmFycmllciB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2JhcnJpZXJfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiB0YXNrIHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfdGFza193YWl0LCAoCisgICAgdm9pZAorKSk7CisKKy8qIG11dGV4IHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfbXV0ZXhfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRJQUxJWkFUSU9OIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pbml0aWFsaXplLCAoCisgICAgb21wdF9mdW5jdGlvbl9sb29rdXBfdCBvbXB0X2ZuX2xvb2t1cCwKKyAgICBjb25zdCBjaGFyICpydW50aW1lX3ZlcnNpb24sCisgICAgdW5zaWduZWQgaW50IG9tcHRfdmVyc2lvbgorKSk7CisKKworLyogaW5pdGlhbGl6YXRpb24gaW50ZXJmYWNlIHRvIGJlIGRlZmluZWQgYnkgdG9vbCAqLworb21wdF9pbml0aWFsaXplX3Qgb21wdF90b29sKHZvaWQpOworCit0eXBlZGVmIGVudW0gb3B0X2luaXRfbW9kZV9lIHsKKyAgICBvbXB0X2luaXRfbW9kZV9uZXZlciAgPSAwLAorICAgIG9tcHRfaW5pdF9tb2RlX2ZhbHNlICA9IDEsCisgICAgb21wdF9pbml0X21vZGVfdHJ1ZSAgID0gMiwKKyAgICBvbXB0X2luaXRfbW9kZV9hbHdheXMgPSAzCit9IG9tcHRfaW5pdF9tb2RlX3Q7CisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9zZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190IGNhbGxiYWNrCispKTsKKwordHlwZWRlZiBlbnVtIG9tcHRfc2V0X2NhbGxiYWNrX3JjX2UgeyAgLyogbm9uLXN0YW5kYXJkICovCisgICAgb21wdF9zZXRfY2FsbGJhY2tfZXJyb3IgICAgICA9IDAsCisgICAgb21wdF9oYXNfZXZlbnRfbm9fY2FsbGJhY2sgICA9IDEsCisgICAgb21wdF9ub19ldmVudF9ub19jYWxsYmFjayAgICA9IDIsCisgICAgb21wdF9oYXNfZXZlbnRfbWF5X2NhbGxiYWNrICA9IDMsCisgICAgb21wdF9oYXNfZXZlbnRfbXVzdF9jYWxsYmFjayA9IDQsCit9IG9tcHRfc2V0X2NhbGxiYWNrX3JjX3Q7CisKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9jYWxsYmFjaywgKAorICAgIG9tcHRfZXZlbnRfdCBldmVudCwKKyAgICBvbXB0X2NhbGxiYWNrX3QgKmNhbGxiYWNrCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNSVNDRUxMQU5FT1VTIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY29udHJvbCAqLworLy8gRklYTUU6IHJlbW92ZSB3b3JrYXJvdW5kIGZvciBjbGFuZworI2lmICFkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfT1BFTk1QKSAmJiAoX09QRU5NUCA+PSAyMDEzMDcpCisjcHJhZ21hIG9tcCBkZWNsYXJlIHRhcmdldAorI2VuZGlmCit2b2lkIG9tcHRfY29udHJvbCgKKyAgICB1aW50NjRfdCBjb21tYW5kLAorICAgIHVpbnQ2NF90IG1vZGlmaWVyCispOworI2lmICFkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfT1BFTk1QKSAmJiAoX09QRU5NUCA+PSAyMDEzMDcpCisjcHJhZ21hIG9tcCBlbmQgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgorCisvKiBzdGF0ZSBlbnVtZXJhdGlvbiAqLworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2VudW1lcmF0ZV9zdGF0ZSwgKAorICAgIGludCBjdXJyZW50X3N0YXRlLAorICAgIGludCAqbmV4dF9zdGF0ZSwKKyAgICBjb25zdCBjaGFyICoqbmV4dF9zdGF0ZV9uYW1lCispKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzBkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXAuaC52YXIKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBpbmNsdWRlLzQwL29tcC5oLnZhcgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fT01QX0gKKyMgICBkZWZpbmUgX19PTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgQExJQk9NUF9WRVJTSU9OX01JTk9SQAorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICBATElCT01QX1ZFUlNJT05fQlVJTERACisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICJATElCT01QX0JVSUxEX0RBVEVAIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyAgICAvKiBzY2hlZHVsZSBraW5kIGNvbnN0YW50cyAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfc2NoZWRfdCB7CisJb21wX3NjaGVkX3N0YXRpYyAgPSAxLAorCW9tcF9zY2hlZF9keW5hbWljID0gMiwKKwlvbXBfc2NoZWRfZ3VpZGVkICA9IDMsCisJb21wX3NjaGVkX2F1dG8gICAgPSA0CisgICAgfSBvbXBfc2NoZWRfdDsKKworICAgIC8qIHNldCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbnVtX3RocmVhZHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZHluYW1pYyAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdGVkICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgKG9tcF9zY2hlZF90LCBpbnQpOworCisgICAgLyogcXVlcnkgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZHluYW1pYyAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9uZXN0ZWQgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX251bSAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fcHJvY3MgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fcGFyYWxsZWwgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9maW5hbCAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAob21wX3NjaGVkX3QgKiwgaW50ICopOworCisgICAgLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbG9jayAgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9sb2NrICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X2xvY2sgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisKKyAgICAvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX25lc3RfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9uZXN0X2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0X2xvY2sgICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9uZXN0X2xvY2sgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisKKyAgICAvKiB0aW1lIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGltZSAodm9pZCk7CisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpY2sgKHZvaWQpOworCisgICAgLyogT3Blbk1QIDQuMCAqLworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9kZWZhdWx0X2RldmljZSAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlIChpbnQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2lzX2luaXRpYWxfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX2RldmljZXMgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGVhbXMgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX251bSAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2NhbmNlbGxhdGlvbiAodm9pZCk7CisKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKworICAgIC8qIEludGVsIGFmZmluaXR5IEFQSSAqLworICAgIHR5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKKyAgICAvKiBPcGVuTVAgNC4wIGFmZmluaXR5IEFQSSAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfcHJvY19iaW5kX3QgeworICAgICAgICBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMCwKKyAgICAgICAgb21wX3Byb2NfYmluZF90cnVlID0gMSwKKyAgICAgICAgb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyLAorICAgICAgICBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMywKKyAgICAgICAgb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisgICAgfSBvbXBfcHJvY19iaW5kX3Q7CisKKyAgICBleHRlcm4gb21wX3Byb2NfYmluZF90IF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3Byb2NfYmluZCAodm9pZCk7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9hbGlnbmVkX21hbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NhbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3JlYWxsb2MgKHZvaWQgKiwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2ZyZWUgICAgKHZvaWQgKik7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vbih2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vZmYodm9pZCk7CisKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fT01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzNzFkOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZi52YXIKQEAgLTAsMCArMSw3NzQgQEAKKyEgaW5jbHVkZS80MC9vbXBfbGliLmYudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFkZWMkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2tpbmQgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgbW9kdWxlIG9tcF9saWIKKworICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSBATElCT01QX1ZFUlNJT05fQlVJTERACisgICAgICAgIGNoYXJhY3RlcigqKSwgcGFyYW1ldGVyIDo6IGttcF9idWlsZF9kYXRlICAgID0gJ0BMSUJPTVBfQlVJTERfREFURUAnCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IEBMSUJPTVBfT01QX1lFQVJfTU9OVEhACisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfcGFyYWxsZWwgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfbG9vcCA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9zZWN0aW9ucyA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF90YXNrZ3JvdXAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudW1fdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGR5bmFtaWNfdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChuZXN0ZWQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBuZXN0ZWQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlX251bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGRldmljZV9udW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhzdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2soc3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2soc3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2soc3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKG52YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKG52YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobnZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhudmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhudmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpCisgICAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2FsaWduZWRfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGFsaWdubWVudAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCkgY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1BST0NfQklORCcgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX0RFVklDRVMnIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RFQU1TJyA6OiBvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9URUFNX05VTScgOjogb21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9DQU5DRUxMQVRJT04nIDo6IG9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSVNfSU5JVElBTF9ERVZJQ0UnIDo6IG9tcF9pc19pbml0aWFsX2RldmljZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX0RFVklDRVMnIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fTlVNJyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9DQU5DRUxMQVRJT04nIDo6IG9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQUxJR05FRF9NQUxMT0MnOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUycgOjoga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3Byb2NfYmluZF8nIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2RlZmF1bHRfZGV2aWNlXyc6Om9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX2RldmljZXNfJzo6b21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGVhbXNfJzo6b21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9udW1fJzo6b21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pc19pbml0aWFsX2RldmljZV8nOjpvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXNfJzo6a21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX251bV8nOjpvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9hbGlnbmVkX21hbGxvY18nOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXyc6OmttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCBlbmRpZgorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNWEyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmY5MC52YXIKQEAgLTAsMCArMSw0NTUgQEAKKyEgaW5jbHVkZS80MC9vbXBfbGliLmY5MC52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IGNfaW50CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IGNfZmxvYXQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9kb3VibGVfa2luZCAgICAgICAgPSBjX2RvdWJsZQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gY19zaXplX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2tpbmQgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgbW9kdWxlIG9tcF9saWIKKworICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IEBMSUJPTVBfT01QX1lFQVJfTU9OVEhACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSBATElCT01QX1ZFUlNJT05fQlVJTERACisgICAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcgKQorCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfcGFyYWxsZWwgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfbG9vcCA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9zZWN0aW9ucyA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF90YXNrZ3JvdXAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudW1fdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGR5bmFtaWNfdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChuZXN0ZWQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBuZXN0ZWQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogY2h1bmtfc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRldmljZV9udW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBkZXZpY2VfbnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2lzX2luaXRpYWxfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisgICAgICAgICAgICBjaGFyYWN0ZXIgKGtpbmQ9Y19jaGFyKSA6OiBzdHJpbmcoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2FsaWduZWRfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogYWxpZ25tZW50CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhjYW5jZWxraW5kKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCB2YWx1ZSA6OiBjYW5jZWxraW5kCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5oLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0NjFhOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuaC52YXIKQEAgLTAsMCArMSw1NjcgQEAKKyEgaW5jbHVkZS80MC9vbXBfbGliLmgudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFESVIkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcgKQorCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG51bV90aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnVtX3RocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGR5bmFtaWNfdGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKG5lc3RlZCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IG5lc3RlZAorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGNodW5rX3NpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgY2h1bmtfc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZXZpY2VfbnVtKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGV2aWNlX251bQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2lzX2luaXRpYWxfZGV2aWNlCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAqKioKKyEgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGlibnVtCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICBjaGFyYWN0ZXIgc3RyaW5nKCopCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfYWxpZ25lZF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGFsaWdubWVudAorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgIGVuZCBpbnRlcmZhY2UKKworIURJUiQgSUYgREVGSU5FRCAoX19JTlRFTF9PRkZMT0FEKQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90aHJlYWRfbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbl9wYXJhbGxlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5fZmluYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9keW5hbWljCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbmVzdGVkCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9wcm9jX2JpbmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3d0aWNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fZGV2aWNlcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90ZWFtcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfc3RhY2tzaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfc3RhY2tzaXplX3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9ibG9ja3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3NlcmlhbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9kZWZhdWx0cworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X3N0YWNrc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYmxvY2t0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfbGlicmFyeQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9tYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2FsaWduZWRfbWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9jYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3JlYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2ZyZWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vbgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3dhcm5pbmdzX29mZgorCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X251bV90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfZHluYW1pYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X25lc3RlZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbWF4X3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90aHJlYWRfbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3Byb2NzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbl9wYXJhbGxlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5fZmluYWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9keW5hbWljICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbmVzdGVkICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGhyZWFkX2xpbWl0ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfYWN0aXZlX2xldmVscyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2xldmVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfYWN0aXZlX2xldmVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RlYW1fc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X3NjaGVkdWxlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfc2NoZWR1bGUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9wcm9jX2JpbmQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF93dGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3d0aWNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9kZWZhdWx0X2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaXNfaW5pdGlhbF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fZGV2aWNlcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV90ZWFtcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RlYW1fbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2Rlc3Ryb3lfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Vuc2V0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Rlc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5pdF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2Rlc3Ryb3lfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF91bnNldF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Rlc3RfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfc3RhY2tzaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfc3RhY2tzaXplX3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9ibG9ja3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3NlcmlhbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9kZWZhdWx0cyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfbGlicmFyeSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2FmZmluaXR5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9tYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2FsaWduZWRfbWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9jYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3JlYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2ZyZWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF93YXJuaW5nc19vbiApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3dhcm5pbmdzX29mZiApCishRElSJCBFTkRJRgorIURJUiQgRU5ESUYKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wdC5oLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcHQuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlMGRkMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcHQuaC52YXIKQEAgLTAsMCArMSw1MTUgQEAKKy8qCisgKiBpbmNsdWRlLzQwL29tcHQuaC52YXIKKyAqLworCisjaWZuZGVmIF9fT01QVF9fCisjZGVmaW5lIF9fT01QVF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3lzdGVtIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpdGVyYXRpb24gbWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX0lOUVVJUllfRk4obWFjcm8pICBcCisgICAgbWFjcm8gKG9tcHRfZW51bWVyYXRlX3N0YXRlKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zZXRfY2FsbGJhY2spICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfaWRsZV9mcmFtZSkgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3Rhc2tfZnJhbWUpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfc3RhdGUpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9wYXJhbGxlbF9pZCkgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplKSBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3Rhc2tfaWQpICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90aHJlYWRfaWQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1BMQUNFSE9MREVSX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2lkbGUpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfb3ZlcmhlYWQpICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9iYXJyaWVyX3dhaXQpICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3Rhc2tfd2FpdCkgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfbXV0ZXhfd2FpdCkKKworI2RlZmluZSBGT1JFQUNIX09NUFRfU1RBVEUobWFjcm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGZpcnN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX2ZpcnN0LCAweDcxKSAgICAgICAgICAvKiBpbml0aWFsIGVudW1lcmF0aW9uIHN0YXRlICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHdvcmsgc3RhdGVzICgwLi4xNSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfc2VyaWFsLCAweDAwKSAgICAvKiB3b3JraW5nIG91dHNpZGUgcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwsIDB4MDEpICAvKiB3b3JraW5nIHdpdGhpbiBwYXJhbGxlbCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfcmVkdWN0aW9uLCAweDAyKSAvKiBwZXJmb3JtaW5nIGEgcmVkdWN0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGlkbGUgKDE2Li4zMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX2lkbGUsIDB4MTApICAgICAgICAgICAgLyogd2FpdGluZyBmb3Igd29yayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG92ZXJoZWFkIHN0YXRlcyAoMzIuLjYzKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX292ZXJoZWFkLCAweDIwKSAgICAgICAgLyogb3ZlcmhlYWQgZXhjbHVkaW5nIHdhaXQgc3RhdGVzICovICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGJhcnJpZXIgd2FpdCBzdGF0ZXMgKDY0Li43OSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllciwgMHg0MCkgICAgLyogd2FpdGluZyBhdCBhIGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9pbXBsaWNpdCwgMHg0MSkgICAgLyogaW1wbGljaXQgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9leHBsaWNpdCwgMHg0MikgICAgLyogZXhwbGljaXQgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRhc2sgd2FpdCBzdGF0ZXMgKDgwLi45NSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfdGFza3dhaXQsIDB4NTApICAgLyogd2FpdGluZyBhdCBhIHRhc2t3YWl0ICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfdGFza2dyb3VwLCAweDUxKSAgLyogd2FpdGluZyBhdCBhIHRhc2tncm91cCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG11dGV4IHdhaXQgc3RhdGVzICg5Ni4uMTExKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfbG9jaywgMHg2MCkgICAgICAgLyogd2FpdGluZyBmb3IgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfbmVzdF9sb2NrLCAweDYxKSAgLyogd2FpdGluZyBmb3IgbmVzdCBsb2NrICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfY3JpdGljYWwsIDB4NjIpICAgLyogd2FpdGluZyBmb3IgY3JpdGljYWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYXRvbWljLCAweDYzKSAgICAgLyogd2FpdGluZyBmb3IgYXRvbWljICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfb3JkZXJlZCwgMHg2NCkgICAgLyogd2FpdGluZyBmb3Igb3JkZXJlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfc2luZ2xlLCAweDZGKSAgICAgLyogd2FpdGluZyBmb3Igc2luZ2xlIHJlZ2lvbiAobm9uLXN0YW5kYXJkISkgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG1pc2MgKDExMi4uMTI3KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3VuZGVmaW5lZCwgMHg3MCkgICAgICAgLyogdW5kZWZpbmVkIHRocmVhZCBzdGF0ZSAqLworCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX0VWRU5UKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE1hbmRhdG9yeSBFdmVudHMgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbiwgICAgICAgICAgIG9tcHRfbmV3X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgMSkgLyogcGFyYWxsZWwgYmVnaW4gKi8gICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kLCAgICAgICAgICAgICBvbXB0X2VuZF9wYXJhbGxlbF9jYWxsYmFja190LCAgIDIpIC8qIHBhcmFsbGVsIGVuZCAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfbmV3X3Rhc2tfY2FsbGJhY2tfdCwgICAgICAgMykgLyogdGFzayBiZWdpbiAqLyAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19lbmQsICAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfY2FsbGJhY2tfdCwgICAgICAgICAgIDQpIC8qIHRhc2sgZGVzdHJveSAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90aHJlYWRfYmVnaW4sICAgICAgICAgICAgIG9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCwgICAgNSkgLyogdGhyZWFkIGJlZ2luICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2VuZCwgICAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDYpIC8qIHRocmVhZCBlbmQgKi8gICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9jb250cm9sLCAgICAgICAgICAgICAgICAgIG9tcHRfY29udHJvbF9jYWxsYmFja190LCAgICAgICAgNykgLyogc3VwcG9ydCBjb250cm9sIGNhbGxzICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3J1bnRpbWVfc2h1dGRvd24sICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgICA4KSAvKiBydW50aW1lIHNodXRkb3duICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gT3B0aW9uYWwgRXZlbnRzIChibGFtZSBzaGlmdGluZywgb21wdF9ldmVudF91bmltcGxlbWVudGVkKSAtLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2lkbGVfYmVnaW4sICAgICAgICAgICAgICAgb21wdF90aHJlYWRfY2FsbGJhY2tfdCwgICAgICAgICA5KSAvKiBiZWdpbiBpZGxlIHN0YXRlICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAxMCkgLyogZW5kIGlkbGUgc3RhdGUgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9iZWdpbiwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDExKSAvKiBiZWdpbiB3YWl0IGF0IGJhcnJpZXIgKi8gIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfZW5kLCAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMikgLyogZW5kIHdhaXQgYXQgYmFycmllciAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDEzKSAvKiBiZWdpbiB3YWl0IGF0IHRhc2t3YWl0ICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNCkgLyogZW5kIHdhaXQgYXQgdGFza3dhaXQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza2dyb3VwX2JlZ2luLCAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE1KSAvKiBiZWdpbiB3YWl0IGF0IHRhc2tncm91cCAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9lbmQsICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNikgLyogZW5kIHdhaXQgYXQgdGFza2dyb3VwICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE3KSAvKiBsb2NrIHJlbGVhc2UgKi8gICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0LCAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxOCkgLyogbGFzdCBuZXN0IGxvY2sgcmVsZWFzZSAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9jcml0aWNhbCwgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTkpIC8qIGNyaXRpY2FsIHJlbGVhc2UgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2F0b21pYywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMCkgLyogYXRvbWljIHJlbGVhc2UgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZCwgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDIxKSAvKiBvcmRlcmVkIHJlbGVhc2UgKi8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gT3B0aW9uYWwgRXZlbnRzIChzeW5jaHJvbm91cyBldmVudHMsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDIyKSAvKiBpbXBsaWNpdCB0YXNrIGJlZ2luICAgKi8gIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMykgLyogaW1wbGljaXQgdGFzayBlbmQgICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRpYWxfdGFza19iZWdpbiwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI0KSAvKiBpbml0aWFsIHRhc2sgYmVnaW4gICAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfZW5kLCAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNSkgLyogaW5pdGlhbCB0YXNrIGVuZCAgKi8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoLCAgICAgICAgICAgICAgb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCwgICAgIDI2KSAvKiB0YXNrIHN3aXRjaCAqLyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbG9vcF9iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMjcpIC8qIHRhc2sgYXQgbG9vcCBiZWdpbiAqLyAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfZW5kLCAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI4KSAvKiB0YXNrIGF0IGxvb3AgZW5kICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2VjdGlvbnNfYmVnaW4sICAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMjkpIC8qIHRhc2sgYXQgc2VjdGlvbnMgYmVnaW4gICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2VuZCwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMwKSAvKiB0YXNrIGF0IHNlY3Rpb25zIGVuZCAqLyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luLCAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMzEpIC8qIHRhc2sgYXQgc2luZ2xlIGJlZ2luKi8gICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19lbmQsICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMyKSAvKiB0YXNrIGF0IHNpbmdsZSBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzMpIC8qIHRhc2sgYXQgc2luZ2xlIGJlZ2luICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM0KSAvKiB0YXNrIGF0IHNpbmdsZSBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd29ya3NoYXJlX2JlZ2luLCAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMzUpIC8qIHRhc2sgYXQgd29ya3NoYXJlIGJlZ2luICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9lbmQsICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM2KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbWFzdGVyX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzcpIC8qIHRhc2sgYXQgbWFzdGVyIGJlZ2luICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9lbmQsICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM4KSAvKiB0YXNrIGF0IG1hc3RlciBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbiwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzkpIC8qIHRhc2sgYXQgYmFycmllciBiZWdpbiAgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfZW5kLCAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQwKSAvKiB0YXNrIGF0IGJhcnJpZXIgZW5kICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW4sICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDEpIC8qIHRhc2sgYXQgdGFza3dhaXQgYmVnaW4gKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZCwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQyKSAvKiB0YXNrIGF0IHRhc2sgd2FpdCBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza2dyb3VwX2JlZ2luLCAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDMpIC8qIHRhc2sgYXQgdGFza2dyb3VwIGJlZ2luICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9lbmQsICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQ0KSAvKiB0YXNrIGF0IHRhc2tncm91cCBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfcHJldiwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDUpIC8qIHByZXYgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2xvY2ssICAgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NikgLyogbG9jayB3YWl0ICovICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9uZXN0X2xvY2ssICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDcpIC8qIG5lc3QgbG9jayB3YWl0ICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfY3JpdGljYWwsICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ4KSAvKiBjcml0aWNhbCB3YWl0ICovICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2F0b21pYywgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OSkgLyogYXRvbWljIHdhaXQgKi8gICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9vcmRlcmVkLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTApIC8qIG9yZGVyZWQgd2FpdCAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9sb2NrLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MSkgLyogbG9jayBhY3F1aXJlZCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX2ZpcnN0LCBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTIpIC8qIDFzdCBuZXN0IGxvY2sgYWNxdWlyZWQgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19uZXh0LCAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUzKSAvKiBuZXh0IG5lc3QgbG9jayBhY3F1aXJlZCovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9jcml0aWNhbCwgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NCkgLyogY3JpdGljYWwgYWNxdWlyZWQgKi8gICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfYXRvbWljLCAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTUpIC8qIGF0b21pYyBhY3F1aXJlZCAqLyAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX29yZGVyZWQsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU2KSAvKiBvcmRlcmVkIGFjcXVpcmVkICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTcpIC8qIGxvY2sgaW5pdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU4KSAvKiBuZXN0IGxvY2sgaW5pdCAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTkpIC8qIGxvY2sgZGVzdHJ1Y3Rpb24gKi8gICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrLCAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDYwKSAvKiBuZXN0IGxvY2sgZGVzdHJ1Y3Rpb24gKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZmx1c2gsICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrX3QsICAgICAgICAgICAgICAgNjEpIC8qIGFmdGVyIGV4ZWN1dGluZyBmbHVzaCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VzLCAgICAgICAgIG9tcHRfdGFza19kZXBlbmRlbmNlc19jYWxsYmFja190LCA2OSkgLyogcmVwb3J0IHRhc2sgZGVwZW5kZW5jZXMgICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZV9wYWlyLCAgICAgb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCwgICAgIDcwKSAvKiByZXBvcnQgdGFzayBkZXBlbmRlbmNlIHBhaXIgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZGF0YSB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaWRlbnRpZmllcnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3RocmVhZF9pZF90OworI2RlZmluZSBvbXB0X3RocmVhZF9pZF9ub25lICgob21wdF90aHJlYWRfaWRfdCkgMCkgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfdGFza19pZF90OworI2RlZmluZSBvbXB0X3Rhc2tfaWRfbm9uZSAoKG9tcHRfdGFza19pZF90KSAwKSAgICAgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfcGFyYWxsZWxfaWRfdDsKKyNkZWZpbmUgb21wdF9wYXJhbGxlbF9pZF9ub25lICgob21wdF9wYXJhbGxlbF9pZF90KSAwKSAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3dhaXRfaWRfdDsKKyNkZWZpbmUgb21wdF93YWl0X2lkX25vbmUgKChvbXB0X3dhaXRfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb21wdF9mcmFtZV90CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IG9tcHRfZnJhbWVfcyB7CisgICAgdm9pZCAqZXhpdF9ydW50aW1lX2ZyYW1lOyAgICAvKiBuZXh0IGZyYW1lIGlzIHVzZXIgY29kZSAgICAgKi8KKyAgICB2b2lkICpyZWVudGVyX3J1bnRpbWVfZnJhbWU7IC8qIHByZXZpb3VzIGZyYW1lIGlzIHVzZXIgY29kZSAqLworfSBvbXB0X2ZyYW1lX3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRlcGVuZGVuY2VzIHR5cGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSBvbXB0X3Rhc2tfZGVwZW5kZW5jZV9mbGFnX2UgeworICAgIC8vIGEgdHdvIGJpdCBmaWVsZCBmb3IgdGhlIGRlcGVuZGVuY2UgdHlwZQorICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfb3V0ICAgPSAxLAorICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfaW4gICAgPSAyLAorICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfaW5vdXQgPSAzLAorfSBvbXB0X3Rhc2tfZGVwZW5kZW5jZV9mbGFnX3Q7CisKK3R5cGVkZWYgc3RydWN0IG9tcHRfdGFza19kZXBlbmRlbmNlX3MgeworICAgIHZvaWQgKnZhcmlhYmxlX2FkZHI7CisgICAgdWludDMyX3QgIGRlcGVuZGVuY2VfZmxhZ3M7Cit9IG9tcHRfdGFza19kZXBlbmRlbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBlbnVtZXJhdGlvbnMgZm9yIHRocmVhZCBzdGF0ZXMgYW5kIHJ1bnRpbWUgZXZlbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIHN0YXRlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X3N0YXRlX21hY3JvKHN0YXRlLCBjb2RlKSBzdGF0ZSA9IGNvZGUsCisgICAgRk9SRUFDSF9PTVBUX1NUQVRFKG9tcHRfc3RhdGVfbWFjcm8pCisjdW5kZWYgb21wdF9zdGF0ZV9tYWNybworfSBvbXB0X3N0YXRlX3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJ1bnRpbWUgZXZlbnRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnQsIGNhbGxiYWNrLCBldmVudGlkKSBldmVudCA9IGV2ZW50aWQsCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisjdW5kZWYgb21wdF9ldmVudF9tYWNybworfSBvbXB0X2V2ZW50X3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNldCBjYWxsYmFjayByZXN1bHRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfc2V0X3Jlc3VsdF9yZWdpc3RyYXRpb25fZXJyb3IgICAgICAgICAgICAgID0gMCwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX25vX2NhbGxiYWNrICAgICA9IDEsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X25ldmVyX29jY3VycyAgICAgICAgICAgICAgPSAyLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfY2FsbGJhY2tfc29tZSAgID0gMywKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX2Fsd2F5cyA9IDQsCit9IG9tcHRfc2V0X3Jlc3VsdF90OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYWxsYmFjayBzaWduYXR1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGluaXRpYWxpemF0aW9uICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X2ludGVyZmFjZV9mbl90KSh2b2lkKTsKKwordHlwZWRlZiBvbXB0X2ludGVyZmFjZV9mbl90ICgqb21wdF9mdW5jdGlvbl9sb29rdXBfdCkoCisgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIC8qIGVudHJ5IHBvaW50IHRvIGxvb2sgdXAgICAgICAgKi8KKyk7CisKKy8qIHRocmVhZHMgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3RocmVhZF9pZF90IHRocmVhZF9pZCAgICAgICAgLyogSUQgb2YgdGhyZWFkICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3RocmVhZF9pbml0aWFsID0gMSwgLy8gc3RhcnQgdGhlIGVudW1lcmF0aW9uIGF0IDEKKyAgICBvbXB0X3RocmVhZF93b3JrZXIgID0gMiwKKyAgICBvbXB0X3RocmVhZF9vdGhlciAgID0gMworfSBvbXB0X3RocmVhZF90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF9pbnZva2VyX3Byb2dyYW0gPSAwLCAgICAgICAgIC8qIHByb2dyYW0gaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KKyAgICBvbXB0X2ludm9rZXJfcnVudGltZSA9IDEgICAgICAgICAgLyogcnVudGltZSBpbnZva2VzIG1hc3RlciB0YXNrICAqLworfSBvbXB0X2ludm9rZXJfdDsKKwordHlwZWRlZiB2b2lkICgqb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCAgIC8qIHR5cGUgb2YgdGhyZWFkICAgICAgICAgICAgICAgKi8KKyAgICBvbXB0X3RocmVhZF9pZF90IHRocmVhZF9pZCAgICAgICAgLyogSUQgb2YgdGhyZWFkICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF93YWl0X2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3dhaXRfaWRfdCB3YWl0X2lkICAgICAgICAgICAgLyogd2FpdCBpZCAgICAgICAgICAgICAgICAgICAgICAqLworKTsKKworLyogcGFyYWxsZWwgYW5kIHdvcmtzaGFyZXMgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIHZvaWQgKndvcmtzaGFyZV9mdW5jdGlvbiAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF90YXNrX2ZyYW1lLCAgLyogZnJhbWUgZGF0YSBvZiBwYXJlbnQgdGFzayAgICAqLworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgdWludDMyX3QgcmVxdWVzdGVkX3RlYW1fc2l6ZSwgICAgIC8qIG51bWJlciBvZiB0aHJlYWRzIGluIHRlYW0gICAgKi8KKyAgICB2b2lkICpwYXJhbGxlbF9mdW5jdGlvbiwgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworICAgIG9tcHRfaW52b2tlcl90IGludm9rZXIgICAgICAgICAgICAvKiB3aG8gaW52b2tlcyBtYXN0ZXIgdGFzaz8gICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2VuZF9wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQsICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICovCispOworCisvKiB0YXNrcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IGZpcnN0X3Rhc2tfaWQsCisgICAgb21wdF90YXNrX2lkX3Qgc2Vjb25kX3Rhc2tfaWQKKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3Rhc2tfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgZm9yIHBhcmVudCB0YXNrICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCAgbmV3X3Rhc2tfaWQsICAgICAgLyogaWQgb2YgY3JlYXRlZCB0YXNrICAgICAgICAgICAqLworICAgIHZvaWQgKnRhc2tfZnVuY3Rpb24gICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCispOworCisvKiB0YXNrIGRlcGVuZGVuY2VzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3Rhc2tfZGVwZW5kZW5jZXNfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQsICAgICAgICAgICAgLyogSUQgb2YgdGFzayB3aXRoIGRlcGVuZGVuY2VzICovCisgICAgY29uc3Qgb21wdF90YXNrX2RlcGVuZGVuY2VfdCAqZGVwcywvKiB2ZWN0b3Igb2YgdGFzayBkZXBlbmRlbmNlcyAgKi8KKyAgICBpbnQgbmRlcHMgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkZXBlbmRlbmNlcyAgICAgICAqLworKTsKKworLyogcHJvZ3JhbSAqLwordHlwZWRlZiB2b2lkICgqb21wdF9jb250cm9sX2NhbGxiYWNrX3QpICgKKyAgICB1aW50NjRfdCBjb21tYW5kLCAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBvZiBjb250cm9sIGNhbGwgICAgICAqLworICAgIHVpbnQ2NF90IG1vZGlmaWVyICAgICAgICAgICAgICAgICAvKiBtb2RpZmllciBvZiBjb250cm9sIGNhbGwgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2NhbGxiYWNrX3QpKHZvaWQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvbXB0IEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBPTVBUX0FQSV9GTlRZUEUoZm4pIGZuIyNfdAorCisjZGVmaW5lIE9NUFRfQVBJX0ZVTkNUSU9OKHJldHVybl90eXBlLCBmbiwgYXJncykgIFwKKyAgICB0eXBlZGVmIHJldHVybl90eXBlICgqT01QVF9BUElfRk5UWVBFKGZuKSkgYXJncworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOUVVJUlkgRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzdGF0ZSAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF9zdGF0ZV90LCBvbXB0X2dldF9zdGF0ZSwgKAorICAgIG9tcHRfd2FpdF9pZF90ICpvbXB0X3dhaXRfaWQKKykpOworCisvKiB0aHJlYWQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfdGhyZWFkX2lkX3QsIG9tcHRfZ2V0X3RocmVhZF9pZCwgKHZvaWQpKTsKKworT01QVF9BUElfRlVOQ1RJT04odm9pZCAqLCBvbXB0X2dldF9pZGxlX2ZyYW1lLCAodm9pZCkpOworCisvKiBwYXJhbGxlbCByZWdpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfcGFyYWxsZWxfaWRfdCwgb21wdF9nZXRfcGFyYWxsZWxfaWQsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSwgKAorICAgIGludCBhbmNlc3Rvcl9sZXZlbAorKSk7CisKKy8qIHRhc2sgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfdGFza19pZF90LCBvbXB0X2dldF90YXNrX2lkLCAoCisgICAgaW50IGRlcHRoCispKTsKKworT01QVF9BUElfRlVOQ1RJT04ob21wdF9mcmFtZV90ICosIG9tcHRfZ2V0X3Rhc2tfZnJhbWUsICgKKyAgICBpbnQgZGVwdGgKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBMQUNFSE9MREVSUyBGT1IgUEVSRk9STUFOQ0UgUkVQT1JUSU5HCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpZGxlICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2lkbGUsICgKKyAgICB2b2lkCispKTsKKworLyogb3ZlcmhlYWQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfb3ZlcmhlYWQsICgKKyAgICB2b2lkCispKTsKKworLyogYmFycmllciB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2JhcnJpZXJfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiB0YXNrIHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfdGFza193YWl0LCAoCisgICAgdm9pZAorKSk7CisKKy8qIG11dGV4IHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfbXV0ZXhfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRJQUxJWkFUSU9OIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pbml0aWFsaXplLCAoCisgICAgb21wdF9mdW5jdGlvbl9sb29rdXBfdCBvbXB0X2ZuX2xvb2t1cCwKKyAgICBjb25zdCBjaGFyICpydW50aW1lX3ZlcnNpb24sCisgICAgdW5zaWduZWQgaW50IG9tcHRfdmVyc2lvbgorKSk7CisKKworLyogaW5pdGlhbGl6YXRpb24gaW50ZXJmYWNlIHRvIGJlIGRlZmluZWQgYnkgdG9vbCAqLworb21wdF9pbml0aWFsaXplX3Qgb21wdF90b29sKHZvaWQpOworCit0eXBlZGVmIGVudW0gb3B0X2luaXRfbW9kZV9lIHsKKyAgICBvbXB0X2luaXRfbW9kZV9uZXZlciAgPSAwLAorICAgIG9tcHRfaW5pdF9tb2RlX2ZhbHNlICA9IDEsCisgICAgb21wdF9pbml0X21vZGVfdHJ1ZSAgID0gMiwKKyAgICBvbXB0X2luaXRfbW9kZV9hbHdheXMgPSAzCit9IG9tcHRfaW5pdF9tb2RlX3Q7CisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9zZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190IGNhbGxiYWNrCispKTsKKwordHlwZWRlZiBlbnVtIG9tcHRfc2V0X2NhbGxiYWNrX3JjX2UgeyAgLyogbm9uLXN0YW5kYXJkICovCisgICAgb21wdF9zZXRfY2FsbGJhY2tfZXJyb3IgICAgICA9IDAsCisgICAgb21wdF9oYXNfZXZlbnRfbm9fY2FsbGJhY2sgICA9IDEsCisgICAgb21wdF9ub19ldmVudF9ub19jYWxsYmFjayAgICA9IDIsCisgICAgb21wdF9oYXNfZXZlbnRfbWF5X2NhbGxiYWNrICA9IDMsCisgICAgb21wdF9oYXNfZXZlbnRfbXVzdF9jYWxsYmFjayA9IDQsCit9IG9tcHRfc2V0X2NhbGxiYWNrX3JjX3Q7CisKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9jYWxsYmFjaywgKAorICAgIG9tcHRfZXZlbnRfdCBldmVudCwKKyAgICBvbXB0X2NhbGxiYWNrX3QgKmNhbGxiYWNrCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNSVNDRUxMQU5FT1VTIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY29udHJvbCAqLworLy8gRklYTUU6IHJlbW92ZSB3b3JrYXJvdW5kIGZvciBjbGFuZworI2lmICFkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfT1BFTk1QKSAmJiAoX09QRU5NUCA+PSAyMDEzMDcpCisjcHJhZ21hIG9tcCBkZWNsYXJlIHRhcmdldAorI2VuZGlmCit2b2lkIG9tcHRfY29udHJvbCgKKyAgICB1aW50NjRfdCBjb21tYW5kLAorICAgIHVpbnQ2NF90IG1vZGlmaWVyCispOworI2lmICFkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfT1BFTk1QKSAmJiAoX09QRU5NUCA+PSAyMDEzMDcpCisjcHJhZ21hIG9tcCBlbmQgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgorCisvKiBzdGF0ZSBlbnVtZXJhdGlvbiAqLworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2VudW1lcmF0ZV9zdGF0ZSwgKAorICAgIGludCBjdXJyZW50X3N0YXRlLAorICAgIGludCAqbmV4dF9zdGF0ZSwKKyAgICBjb25zdCBjaGFyICoqbmV4dF9zdGF0ZV9uYW1lCispKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wLmgudmFyIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjJmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXAuaC52YXIKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBpbmNsdWRlLzQ1L29tcC5oLnZhcgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fT01QX0gKKyMgICBkZWZpbmUgX19PTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgQExJQk9NUF9WRVJTSU9OX01JTk9SQAorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICBATElCT01QX1ZFUlNJT05fQlVJTERACisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICJATElCT01QX0JVSUxEX0RBVEVAIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyAgICAvKiBzY2hlZHVsZSBraW5kIGNvbnN0YW50cyAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfc2NoZWRfdCB7CisJb21wX3NjaGVkX3N0YXRpYyAgPSAxLAorCW9tcF9zY2hlZF9keW5hbWljID0gMiwKKwlvbXBfc2NoZWRfZ3VpZGVkICA9IDMsCisJb21wX3NjaGVkX2F1dG8gICAgPSA0CisgICAgfSBvbXBfc2NoZWRfdDsKKworICAgIC8qIHNldCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbnVtX3RocmVhZHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZHluYW1pYyAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdGVkICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgKG9tcF9zY2hlZF90LCBpbnQpOworCisgICAgLyogcXVlcnkgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZHluYW1pYyAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9uZXN0ZWQgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX251bSAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fcHJvY3MgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fcGFyYWxsZWwgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9maW5hbCAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAob21wX3NjaGVkX3QgKiwgaW50ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5ICAgKHZvaWQpOworCisgICAgLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbG9jayAgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9sb2NrICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X2xvY2sgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisKKyAgICAvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX25lc3RfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9uZXN0X2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0X2xvY2sgICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9uZXN0X2xvY2sgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisKKyAgICAvKiBsb2NrIGhpbnQgdHlwZSBmb3IgZHluYW1pYyB1c2VyIGxvY2sgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX2xvY2tfaGludF90IHsKKyAgICAgICAgb21wX2xvY2tfaGludF9ub25lICAgICAgICAgICA9IDAsCisgICAgICAgIG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQgICAgPSAxLAorICAgICAgICBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gKDE8PDEgKSwKKyAgICAgICAgb21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSA9ICgxPDwyICksCisgICAgICAgIG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUgICAgPSAoMTw8MyApLAorICAgICAgICBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gKDE8PDE2KSwKKyAgICAgICAga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9ICgxPDwxNyksCisgICAgICAgIGttcF9sb2NrX2hpbnRfYWRhcHRpdmUgICAgICAgPSAoMTw8MTgpCisgICAgfSBvbXBfbG9ja19oaW50X3Q7CisKKyAgICAvKiBoaW50ZWQgbG9jayBpbml0aWFsaXplcnMgKi8KKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2luaXRfbG9ja193aXRoX2hpbnQob21wX2xvY2tfdCAqLCBvbXBfbG9ja19oaW50X3QpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KG9tcF9uZXN0X2xvY2tfdCAqLCBvbXBfbG9ja19oaW50X3QpOworCisgICAgLyogdGltZSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpbWUgKHZvaWQpOworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aWNrICh2b2lkKTsKKworICAgIC8qIE9wZW5NUCA0LjAgKi8KKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKHZvaWQpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9kZWZhdWx0X2RldmljZSAoaW50KTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pc19pbml0aWFsX2RldmljZSAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9kZXZpY2VzICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RlYW1zICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGVhbV9udW0gKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9jYW5jZWxsYXRpb24gKHZvaWQpOworCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyogT3Blbk1QIDQuNSAqLworICAgIGV4dGVybiBpbnQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UgKHZvaWQpOworICAgIGV4dGVybiB2b2lkKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90YXJnZXRfYWxsb2Moc2l6ZV90LCBpbnQpOworICAgIGV4dGVybiB2b2lkICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90YXJnZXRfZnJlZSh2b2lkICosIGludCk7CisgICAgZXh0ZXJuIGludCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3RhcmdldF9pc19wcmVzZW50KHZvaWQgKiwgaW50KTsKKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X21lbWNweSh2b2lkICosIHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsIHNpemVfdCwgaW50LCBpbnQpOworICAgIGV4dGVybiBpbnQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90YXJnZXRfbWVtY3B5X3JlY3Qodm9pZCAqLCB2b2lkICosIHNpemVfdCwgaW50LCBjb25zdCBzaXplX3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICosIGNvbnN0IHNpemVfdCAqLCBjb25zdCBzaXplX3QgKiwgY29uc3Qgc2l6ZV90ICosIGludCwgaW50KTsKKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHIodm9pZCAqLCB2b2lkICosIHNpemVfdCwgc2l6ZV90LCBpbnQpOworICAgIGV4dGVybiBpbnQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90YXJnZXRfZGlzYXNzb2NpYXRlX3B0cih2b2lkICosIGludCk7CisKKyAgICAvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBzaXplX3QgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X3N0YWNrc2l6ZV9zICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgIChzaXplX3QpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2Jsb2NrdGltZSAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9ibG9ja3RpbWUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeSAgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAoY2hhciBjb25zdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kaXNwX251bV9idWZmZXJzICAgKGludCk7CisKKyAgICAvKiBJbnRlbCBhZmZpbml0eSBBUEkgKi8KKyAgICB0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCisgICAgLyogT3Blbk1QIDQuMCBhZmZpbml0eSBBUEkgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3Byb2NfYmluZF90IHsKKyAgICAgICAgb21wX3Byb2NfYmluZF9mYWxzZSA9IDAsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMiwKKyAgICAgICAgb21wX3Byb2NfYmluZF9jbG9zZSA9IDMsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorICAgIH0gb21wX3Byb2NfYmluZF90OworCisgICAgZXh0ZXJuIG9tcF9wcm9jX2JpbmRfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wcm9jX2JpbmQgKHZvaWQpOworCisgICAgLyogT3Blbk1QIDQuNSBhZmZpbml0eSBBUEkgKi8KKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9udW1fcGxhY2VzICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wbGFjZV9udW1fcHJvY3MgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMgKGludCwgaW50ICopOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3BsYWNlX251bSAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXMgKHZvaWQpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3BhcnRpdGlvbl9wbGFjZV9udW1zIChpbnQgKik7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9hbGlnbmVkX21hbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NhbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3JlYWxsb2MgKHZvaWQgKiwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2ZyZWUgICAgKHZvaWQgKik7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vbih2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vZmYodm9pZCk7CisKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fT01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5mLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmZjAzMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcF9saWIuZi52YXIKQEAgLTAsMCArMSw4NTUgQEAKKyEgaW5jbHVkZS80NS9vbXBfbGliLmYudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFkZWMkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2tpbmQgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKiksIHBhcmFtZXRlciA6OiBrbXBfYnVpbGRfZGF0ZSAgICA9ICdATElCT01QX0JVSUxEX0RBVEVAJworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3BhcmFsbGVsID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2xvb3AgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfc2VjdGlvbnMgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfbm9uZSAgICAgICAgICAgPSAwCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQgICAgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfY29udGVuZGVkICAgICAgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUgPSA0CisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUgICAgPSA4CisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfaGxlICAgICAgICAgICAgPSA2NTUzNgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X3J0bSAgICAgICAgICAgID0gMTMxMDcyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfYWRhcHRpdmUgICAgICAgPSAyNjIxNDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudW1fdGhyZWFkcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG51bV90aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZHluYW1pY190aHJlYWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZHluYW1pY190aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKG5lc3RlZCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG5lc3RlZAorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9maW5hbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX2ZpbmFsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgY2h1bmtfc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGNodW5rX3NpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgY2h1bmtfc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGNodW5rX3NpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wbGFjZXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcGxhY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3BsYWNlcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW1fcHJvY3MocGxhY2VfbnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcGxhY2VfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMocGxhY2VfbnVtLCBpZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwbGFjZV9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgaWRzKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9wbGFjZV9wcm9jX2lkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wbGFjZV9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMocGxhY2VfbnVtcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHBsYWNlX251bXMoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3BhcnRpdGlvbl9wbGFjZV9udW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrICgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZXZpY2VfbnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgZGV2aWNlX251bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2lzX2luaXRpYWxfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9pbml0aWFsX2RldmljZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhzdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2soc3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2soc3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2soc3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKG52YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKG52YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobnZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhudmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhudmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5CisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycyhudW0pCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2FsaWduZWRfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGFsaWdubWVudAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCkgY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50KHN2YXIsIGhpbnQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCkgaGludAorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQobnZhciwgaGludCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpIGhpbnQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1BST0NfQklORCcgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX0RFVklDRVMnIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RFQU1TJyA6OiBvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9URUFNX05VTScgOjogb21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9DQU5DRUxMQVRJT04nIDo6IG9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSVNfSU5JVElBTF9ERVZJQ0UnIDo6IG9tcF9pc19pbml0aWFsX2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfVEFTS19QUklPUklUWScgOjogb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrX3dpdGhfaGludCcgOjogb21wX2luaXRfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50JyA6OiBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQUxJR05FRF9NQUxMT0MnOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUycgOjoga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1BST0NfQklORCcgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fREVWSUNFUycgOjogb21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RFQU1TJyA6OiBvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0NBTkNFTExBVElPTicgOjogb21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSVNfSU5JVElBTF9ERVZJQ0UnIDo6IG9tcF9pc19pbml0aWFsX2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RBU0tfUFJJT1JUWScgOjogb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfd2l0aF9oaW50JyA6OiBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQnIDo6IG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQUxJR05FRF9NQUxMT0MnOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUycgOjoga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3Byb2NfYmluZF8nIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2RlZmF1bHRfZGV2aWNlXyc6Om9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX2RldmljZXNfJzo6b21wX2dldF9udW1fZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fdGVhbXNfJzo6b21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9udW1fJzo6b21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pc19pbml0aWFsX2RldmljZV8nOjpvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHlfJzo6b21wX2dldF9tYXhfdGFza19wcmlvcml0eQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnRfJzo6b21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9hbGlnbmVkX21hbGxvY18nOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3Byb2NfYmluZF8nIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGVhbXNfJzo6b21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RlYW1fbnVtXyc6Om9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2NhbmNlbGxhdGlvbl8nOjpvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pc19pbml0aWFsX2RldmljZV8nOjpvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90YXNrX3ByaW9ydHlfJzo6b21wX2dldF9tYXhfdGFza19wcmlvcml0eQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9ja193aXRoX2hpbnRfJzo6b21wX2luaXRfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludF8nOjpvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9hbGlnbmVkX21hbGxvY18nOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXyc6OmttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCBlbmRpZgorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5mOTAudmFyIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTdkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXBfbGliLmY5MC52YXIKQEAgLTAsMCArMSw1MjQgQEAKKyEgaW5jbHVkZS80NS9vbXBfbGliLmY5MC52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IGNfaW50CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IGNfZmxvYXQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9kb3VibGVfa2luZCAgICAgICAgPSBjX2RvdWJsZQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gY19zaXplX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2tpbmQgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3BhcmFsbGVsID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2xvb3AgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfc2VjdGlvbnMgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfbm9uZSAgICAgICAgICAgPSAwCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQgICAgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfY29udGVuZGVkICAgICAgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUgPSA0CisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUgICAgPSA4CisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfaGxlICAgICAgICAgICAgPSA2NTUzNgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X3J0bSAgICAgICAgICAgID0gMTMxMDcyCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfYWRhcHRpdmUgICAgICAgPSAyNjIxNDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudW1fdGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG51bV90aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZHluYW1pY190aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZHluYW1pY190aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKG5lc3RlZCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IG5lc3RlZAorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX2ZpbmFsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgY2h1bmtfc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGNodW5rX3NpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3BsYWNlcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3BsYWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wbGFjZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzKHBsYWNlX251bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHBsYWNlX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzKHBsYWNlX251bSwgaWRzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcGxhY2VfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGlkcygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wbGFjZV9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcyhwbGFjZV9udW1zKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwbGFjZV9udW1zKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZXZpY2VfbnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGV2aWNlX251bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGFza19wcmlvcml0eSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworICAgICAgICAgICAgY2hhcmFjdGVyIChraW5kPWNfY2hhcikgOjogc3RyaW5nKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycyhudW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2FsaWduZWRfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogYWxpZ25tZW50CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhjYW5jZWxraW5kKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCB2YWx1ZSA6OiBjYW5jZWxraW5kCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9ja193aXRoX2hpbnQoc3ZhciwgaGludCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCB2YWx1ZSA6OiBoaW50CisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9ja193aXRoX2hpbnQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChudmFyLCBoaW50KSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogaGludAorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5oLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcF9saWIuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyODRmMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcF9saWIuaC52YXIKQEAgLTAsMCArMSw2NDQgQEAKKyEgaW5jbHVkZS80NS9vbXBfbGliLmgudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFESVIkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IEBMSUJPTVBfT01QX1lFQVJfTU9OVEhACisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSBATElCT01QX1ZFUlNJT05fQlVJTERACisgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbmUgICAgICAgICAgID0gMAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF91bmNvbnRlbmRlZCAgICA9IDEKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfY29udGVuZGVkICAgICAgPSAyCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlID0gNAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSAgICA9IDgKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfaGxlICAgICAgICAgICAgPSA2NTUzNgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9IDEzMTA3MgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9hZGFwdGl2ZSAgICAgICA9IDI2MjE0NAorCisgICAgICBpbnRlcmZhY2UKKworISAgICAgICAqKioKKyEgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudW1fdGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZHluYW1pY190aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZHluYW1pY190aHJlYWRzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQobmVzdGVkKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogbmVzdGVkCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9maW5hbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9maW5hbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX2ZpbmFsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgY2h1bmtfc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogY2h1bmtfc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcGxhY2VzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcGxhY2VzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wbGFjZXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcyhwbGFjZV9udW0pIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwbGFjZV9udW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9wbGFjZV9wcm9jX2lkcyhwbGFjZV9udW0sIGlkcykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHBsYWNlX251bQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgaWRzKCopCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGxhY2VfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3BhcnRpdGlvbl9wbGFjZV9udW1zKHBsYWNlX251bXMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHBsYWNlX251bXMoKikKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZXZpY2VfbnVtKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGV2aWNlX251bQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2lzX2luaXRpYWxfZGV2aWNlCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9pbml0aWFsX2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9pbml0aWFsX2RldmljZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5CisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5CisKKyEgICAgICAgKioqCishICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgY2hhcmFjdGVyIHN0cmluZygqKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kaXNwX251bV9idWZmZXJzKG51bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbm1lbnQpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogYWxpZ25tZW50CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IG5lbGVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50KHN2YXIsIGhpbnQpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHZhbHVlIDo6IGhpbnQKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9ja193aXRoX2hpbnQKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQobnZhciwgaGludCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCB2YWx1ZSA6OiBoaW50CisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKworICAgICAgZW5kIGludGVyZmFjZQorCishRElSJCBJRiBERUZJTkVEIChfX0lOVEVMX09GRkxPQUQpCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9keW5hbWljCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbmVzdGVkCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9tYXhfdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fcHJvY3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luX3BhcmFsbGVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbl9maW5hbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9uZXN0ZWQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbGV2ZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGVhbV9zaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9zY2hlZHVsZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3d0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfd3RpY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9kZWZhdWx0X2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pc19pbml0aWFsX2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3RlYW1zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luaXRfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdGVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZV9zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYmxvY2t0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfZGVmYXVsdHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2xpYnJhcnkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9kaXNwX251bV9idWZmZXJzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYWZmaW5pdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX21hbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfYWxpZ25lZF9tYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2NhbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfcmVhbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZnJlZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3dhcm5pbmdzX29uCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfd2FybmluZ3Nfb2ZmCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKworIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9udW1fdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2R5bmFtaWMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9uZXN0ZWQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGhyZWFkX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV9wcm9jcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5fcGFyYWxsZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luX2ZpbmFsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfZHluYW1pYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X25lc3RlZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RocmVhZF9saW1pdCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9sZXZlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2FjdGl2ZV9sZXZlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90ZWFtX3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9zY2hlZHVsZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3NjaGVkdWxlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfcHJvY19iaW5kICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfd3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF93dGljayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2lzX2luaXRpYWxfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX2RldmljZXMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fdGVhbXMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90ZWFtX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5pdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9kZXN0cm95X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF91bnNldF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF90ZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9kZXN0cm95X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdW5zZXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF90ZXN0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfc3RhY2tzaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfc3RhY2tzaXplX3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9ibG9ja3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3NlcmlhbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9kZWZhdWx0cyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfbGlicmFyeSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9hZmZpbml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfbWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9hbGlnbmVkX21hbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfY2FsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9yZWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9mcmVlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb24gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF93YXJuaW5nc19vZmYgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbG9ja193aXRoX2hpbnQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCApCishRElSJCBFTkRJRgorIURJUiQgRU5ESUYKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wdC5oLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcHQuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3MThjNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcHQuaC52YXIKQEAgLTAsMCArMSw1MTUgQEAKKy8qCisgKiBpbmNsdWRlLzQ1L29tcHQuaC52YXIKKyAqLworCisjaWZuZGVmIF9fT01QVF9fCisjZGVmaW5lIF9fT01QVF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3lzdGVtIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpdGVyYXRpb24gbWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX0lOUVVJUllfRk4obWFjcm8pICBcCisgICAgbWFjcm8gKG9tcHRfZW51bWVyYXRlX3N0YXRlKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zZXRfY2FsbGJhY2spICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfaWRsZV9mcmFtZSkgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3Rhc2tfZnJhbWUpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfc3RhdGUpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9wYXJhbGxlbF9pZCkgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplKSBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3Rhc2tfaWQpICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90aHJlYWRfaWQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1BMQUNFSE9MREVSX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2lkbGUpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfb3ZlcmhlYWQpICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9iYXJyaWVyX3dhaXQpICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3Rhc2tfd2FpdCkgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfbXV0ZXhfd2FpdCkKKworI2RlZmluZSBGT1JFQUNIX09NUFRfU1RBVEUobWFjcm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGZpcnN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX2ZpcnN0LCAweDcxKSAgICAgICAgICAvKiBpbml0aWFsIGVudW1lcmF0aW9uIHN0YXRlICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHdvcmsgc3RhdGVzICgwLi4xNSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfc2VyaWFsLCAweDAwKSAgICAvKiB3b3JraW5nIG91dHNpZGUgcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwsIDB4MDEpICAvKiB3b3JraW5nIHdpdGhpbiBwYXJhbGxlbCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfcmVkdWN0aW9uLCAweDAyKSAvKiBwZXJmb3JtaW5nIGEgcmVkdWN0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGlkbGUgKDE2Li4zMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX2lkbGUsIDB4MTApICAgICAgICAgICAgLyogd2FpdGluZyBmb3Igd29yayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG92ZXJoZWFkIHN0YXRlcyAoMzIuLjYzKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX292ZXJoZWFkLCAweDIwKSAgICAgICAgLyogb3ZlcmhlYWQgZXhjbHVkaW5nIHdhaXQgc3RhdGVzICovICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGJhcnJpZXIgd2FpdCBzdGF0ZXMgKDY0Li43OSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllciwgMHg0MCkgICAgLyogd2FpdGluZyBhdCBhIGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9pbXBsaWNpdCwgMHg0MSkgICAgLyogaW1wbGljaXQgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9leHBsaWNpdCwgMHg0MikgICAgLyogZXhwbGljaXQgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRhc2sgd2FpdCBzdGF0ZXMgKDgwLi45NSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfdGFza3dhaXQsIDB4NTApICAgLyogd2FpdGluZyBhdCBhIHRhc2t3YWl0ICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfdGFza2dyb3VwLCAweDUxKSAgLyogd2FpdGluZyBhdCBhIHRhc2tncm91cCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG11dGV4IHdhaXQgc3RhdGVzICg5Ni4uMTExKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfbG9jaywgMHg2MCkgICAgICAgLyogd2FpdGluZyBmb3IgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfbmVzdF9sb2NrLCAweDYxKSAgLyogd2FpdGluZyBmb3IgbmVzdCBsb2NrICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfY3JpdGljYWwsIDB4NjIpICAgLyogd2FpdGluZyBmb3IgY3JpdGljYWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYXRvbWljLCAweDYzKSAgICAgLyogd2FpdGluZyBmb3IgYXRvbWljICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfb3JkZXJlZCwgMHg2NCkgICAgLyogd2FpdGluZyBmb3Igb3JkZXJlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfc2luZ2xlLCAweDZGKSAgICAgLyogd2FpdGluZyBmb3Igc2luZ2xlIHJlZ2lvbiAobm9uLXN0YW5kYXJkISkgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG1pc2MgKDExMi4uMTI3KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3VuZGVmaW5lZCwgMHg3MCkgICAgICAgLyogdW5kZWZpbmVkIHRocmVhZCBzdGF0ZSAqLworCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX0VWRU5UKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE1hbmRhdG9yeSBFdmVudHMgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbiwgICAgICAgICAgIG9tcHRfbmV3X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgMSkgLyogcGFyYWxsZWwgYmVnaW4gKi8gICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kLCAgICAgICAgICAgICBvbXB0X2VuZF9wYXJhbGxlbF9jYWxsYmFja190LCAgIDIpIC8qIHBhcmFsbGVsIGVuZCAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfbmV3X3Rhc2tfY2FsbGJhY2tfdCwgICAgICAgMykgLyogdGFzayBiZWdpbiAqLyAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19lbmQsICAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfY2FsbGJhY2tfdCwgICAgICAgICAgIDQpIC8qIHRhc2sgZGVzdHJveSAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90aHJlYWRfYmVnaW4sICAgICAgICAgICAgIG9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCwgICAgNSkgLyogdGhyZWFkIGJlZ2luICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2VuZCwgICAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDYpIC8qIHRocmVhZCBlbmQgKi8gICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9jb250cm9sLCAgICAgICAgICAgICAgICAgIG9tcHRfY29udHJvbF9jYWxsYmFja190LCAgICAgICAgNykgLyogc3VwcG9ydCBjb250cm9sIGNhbGxzICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3J1bnRpbWVfc2h1dGRvd24sICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgICA4KSAvKiBydW50aW1lIHNodXRkb3duICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gT3B0aW9uYWwgRXZlbnRzIChibGFtZSBzaGlmdGluZywgb21wdF9ldmVudF91bmltcGxlbWVudGVkKSAtLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2lkbGVfYmVnaW4sICAgICAgICAgICAgICAgb21wdF90aHJlYWRfY2FsbGJhY2tfdCwgICAgICAgICA5KSAvKiBiZWdpbiBpZGxlIHN0YXRlICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAxMCkgLyogZW5kIGlkbGUgc3RhdGUgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9iZWdpbiwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDExKSAvKiBiZWdpbiB3YWl0IGF0IGJhcnJpZXIgKi8gIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfZW5kLCAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMikgLyogZW5kIHdhaXQgYXQgYmFycmllciAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDEzKSAvKiBiZWdpbiB3YWl0IGF0IHRhc2t3YWl0ICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNCkgLyogZW5kIHdhaXQgYXQgdGFza3dhaXQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza2dyb3VwX2JlZ2luLCAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE1KSAvKiBiZWdpbiB3YWl0IGF0IHRhc2tncm91cCAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9lbmQsICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNikgLyogZW5kIHdhaXQgYXQgdGFza2dyb3VwICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE3KSAvKiBsb2NrIHJlbGVhc2UgKi8gICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0LCAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxOCkgLyogbGFzdCBuZXN0IGxvY2sgcmVsZWFzZSAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9jcml0aWNhbCwgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTkpIC8qIGNyaXRpY2FsIHJlbGVhc2UgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2F0b21pYywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMCkgLyogYXRvbWljIHJlbGVhc2UgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZCwgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDIxKSAvKiBvcmRlcmVkIHJlbGVhc2UgKi8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gT3B0aW9uYWwgRXZlbnRzIChzeW5jaHJvbm91cyBldmVudHMsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDIyKSAvKiBpbXBsaWNpdCB0YXNrIGJlZ2luICAgKi8gIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMykgLyogaW1wbGljaXQgdGFzayBlbmQgICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRpYWxfdGFza19iZWdpbiwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI0KSAvKiBpbml0aWFsIHRhc2sgYmVnaW4gICAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfZW5kLCAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNSkgLyogaW5pdGlhbCB0YXNrIGVuZCAgKi8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoLCAgICAgICAgICAgICAgb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCwgICAgIDI2KSAvKiB0YXNrIHN3aXRjaCAqLyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbG9vcF9iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMjcpIC8qIHRhc2sgYXQgbG9vcCBiZWdpbiAqLyAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfZW5kLCAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI4KSAvKiB0YXNrIGF0IGxvb3AgZW5kICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2VjdGlvbnNfYmVnaW4sICAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMjkpIC8qIHRhc2sgYXQgc2VjdGlvbnMgYmVnaW4gICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2VuZCwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMwKSAvKiB0YXNrIGF0IHNlY3Rpb25zIGVuZCAqLyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luLCAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMzEpIC8qIHRhc2sgYXQgc2luZ2xlIGJlZ2luKi8gICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19lbmQsICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMyKSAvKiB0YXNrIGF0IHNpbmdsZSBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzMpIC8qIHRhc2sgYXQgc2luZ2xlIGJlZ2luICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM0KSAvKiB0YXNrIGF0IHNpbmdsZSBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd29ya3NoYXJlX2JlZ2luLCAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMzUpIC8qIHRhc2sgYXQgd29ya3NoYXJlIGJlZ2luICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9lbmQsICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM2KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbWFzdGVyX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzcpIC8qIHRhc2sgYXQgbWFzdGVyIGJlZ2luICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9lbmQsICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM4KSAvKiB0YXNrIGF0IG1hc3RlciBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbiwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzkpIC8qIHRhc2sgYXQgYmFycmllciBiZWdpbiAgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfZW5kLCAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQwKSAvKiB0YXNrIGF0IGJhcnJpZXIgZW5kICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW4sICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDEpIC8qIHRhc2sgYXQgdGFza3dhaXQgYmVnaW4gKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZCwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQyKSAvKiB0YXNrIGF0IHRhc2sgd2FpdCBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza2dyb3VwX2JlZ2luLCAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDMpIC8qIHRhc2sgYXQgdGFza2dyb3VwIGJlZ2luICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9lbmQsICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQ0KSAvKiB0YXNrIGF0IHRhc2tncm91cCBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfcHJldiwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDUpIC8qIHByZXYgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2xvY2ssICAgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NikgLyogbG9jayB3YWl0ICovICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9uZXN0X2xvY2ssICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDcpIC8qIG5lc3QgbG9jayB3YWl0ICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfY3JpdGljYWwsICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ4KSAvKiBjcml0aWNhbCB3YWl0ICovICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2F0b21pYywgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OSkgLyogYXRvbWljIHdhaXQgKi8gICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9vcmRlcmVkLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTApIC8qIG9yZGVyZWQgd2FpdCAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9sb2NrLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MSkgLyogbG9jayBhY3F1aXJlZCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX2ZpcnN0LCBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTIpIC8qIDFzdCBuZXN0IGxvY2sgYWNxdWlyZWQgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19uZXh0LCAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUzKSAvKiBuZXh0IG5lc3QgbG9jayBhY3F1aXJlZCovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9jcml0aWNhbCwgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NCkgLyogY3JpdGljYWwgYWNxdWlyZWQgKi8gICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfYXRvbWljLCAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTUpIC8qIGF0b21pYyBhY3F1aXJlZCAqLyAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX29yZGVyZWQsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU2KSAvKiBvcmRlcmVkIGFjcXVpcmVkICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTcpIC8qIGxvY2sgaW5pdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU4KSAvKiBuZXN0IGxvY2sgaW5pdCAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTkpIC8qIGxvY2sgZGVzdHJ1Y3Rpb24gKi8gICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrLCAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDYwKSAvKiBuZXN0IGxvY2sgZGVzdHJ1Y3Rpb24gKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZmx1c2gsICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrX3QsICAgICAgICAgICAgICAgNjEpIC8qIGFmdGVyIGV4ZWN1dGluZyBmbHVzaCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VzLCAgICAgICAgIG9tcHRfdGFza19kZXBlbmRlbmNlc19jYWxsYmFja190LCA2OSkgLyogcmVwb3J0IHRhc2sgZGVwZW5kZW5jZXMgICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZV9wYWlyLCAgICAgb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCwgICAgIDcwKSAvKiByZXBvcnQgdGFzayBkZXBlbmRlbmNlIHBhaXIgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZGF0YSB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaWRlbnRpZmllcnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3RocmVhZF9pZF90OworI2RlZmluZSBvbXB0X3RocmVhZF9pZF9ub25lICgob21wdF90aHJlYWRfaWRfdCkgMCkgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfdGFza19pZF90OworI2RlZmluZSBvbXB0X3Rhc2tfaWRfbm9uZSAoKG9tcHRfdGFza19pZF90KSAwKSAgICAgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfcGFyYWxsZWxfaWRfdDsKKyNkZWZpbmUgb21wdF9wYXJhbGxlbF9pZF9ub25lICgob21wdF9wYXJhbGxlbF9pZF90KSAwKSAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3dhaXRfaWRfdDsKKyNkZWZpbmUgb21wdF93YWl0X2lkX25vbmUgKChvbXB0X3dhaXRfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb21wdF9mcmFtZV90CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IG9tcHRfZnJhbWVfcyB7CisgICAgdm9pZCAqZXhpdF9ydW50aW1lX2ZyYW1lOyAgICAvKiBuZXh0IGZyYW1lIGlzIHVzZXIgY29kZSAgICAgKi8KKyAgICB2b2lkICpyZWVudGVyX3J1bnRpbWVfZnJhbWU7IC8qIHByZXZpb3VzIGZyYW1lIGlzIHVzZXIgY29kZSAqLworfSBvbXB0X2ZyYW1lX3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRlcGVuZGVuY2VzIHR5cGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSBvbXB0X3Rhc2tfZGVwZW5kZW5jZV9mbGFnX2UgeworICAgIC8vIGEgdHdvIGJpdCBmaWVsZCBmb3IgdGhlIGRlcGVuZGVuY2UgdHlwZQorICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfb3V0ICAgPSAxLAorICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfaW4gICAgPSAyLAorICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfaW5vdXQgPSAzLAorfSBvbXB0X3Rhc2tfZGVwZW5kZW5jZV9mbGFnX3Q7CisKK3R5cGVkZWYgc3RydWN0IG9tcHRfdGFza19kZXBlbmRlbmNlX3MgeworICAgIHZvaWQgKnZhcmlhYmxlX2FkZHI7CisgICAgdWludDMyX3QgIGRlcGVuZGVuY2VfZmxhZ3M7Cit9IG9tcHRfdGFza19kZXBlbmRlbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBlbnVtZXJhdGlvbnMgZm9yIHRocmVhZCBzdGF0ZXMgYW5kIHJ1bnRpbWUgZXZlbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIHN0YXRlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X3N0YXRlX21hY3JvKHN0YXRlLCBjb2RlKSBzdGF0ZSA9IGNvZGUsCisgICAgRk9SRUFDSF9PTVBUX1NUQVRFKG9tcHRfc3RhdGVfbWFjcm8pCisjdW5kZWYgb21wdF9zdGF0ZV9tYWNybworfSBvbXB0X3N0YXRlX3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJ1bnRpbWUgZXZlbnRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnQsIGNhbGxiYWNrLCBldmVudGlkKSBldmVudCA9IGV2ZW50aWQsCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisjdW5kZWYgb21wdF9ldmVudF9tYWNybworfSBvbXB0X2V2ZW50X3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNldCBjYWxsYmFjayByZXN1bHRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfc2V0X3Jlc3VsdF9yZWdpc3RyYXRpb25fZXJyb3IgICAgICAgICAgICAgID0gMCwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX25vX2NhbGxiYWNrICAgICA9IDEsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X25ldmVyX29jY3VycyAgICAgICAgICAgICAgPSAyLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfY2FsbGJhY2tfc29tZSAgID0gMywKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX2Fsd2F5cyA9IDQsCit9IG9tcHRfc2V0X3Jlc3VsdF90OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYWxsYmFjayBzaWduYXR1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGluaXRpYWxpemF0aW9uICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X2ludGVyZmFjZV9mbl90KSh2b2lkKTsKKwordHlwZWRlZiBvbXB0X2ludGVyZmFjZV9mbl90ICgqb21wdF9mdW5jdGlvbl9sb29rdXBfdCkoCisgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIC8qIGVudHJ5IHBvaW50IHRvIGxvb2sgdXAgICAgICAgKi8KKyk7CisKKy8qIHRocmVhZHMgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3RocmVhZF9pZF90IHRocmVhZF9pZCAgICAgICAgLyogSUQgb2YgdGhyZWFkICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3RocmVhZF9pbml0aWFsID0gMSwgLy8gc3RhcnQgdGhlIGVudW1lcmF0aW9uIGF0IDEKKyAgICBvbXB0X3RocmVhZF93b3JrZXIgID0gMiwKKyAgICBvbXB0X3RocmVhZF9vdGhlciAgID0gMworfSBvbXB0X3RocmVhZF90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF9pbnZva2VyX3Byb2dyYW0gPSAwLCAgICAgICAgIC8qIHByb2dyYW0gaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KKyAgICBvbXB0X2ludm9rZXJfcnVudGltZSA9IDEgICAgICAgICAgLyogcnVudGltZSBpbnZva2VzIG1hc3RlciB0YXNrICAqLworfSBvbXB0X2ludm9rZXJfdDsKKwordHlwZWRlZiB2b2lkICgqb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCAgIC8qIHR5cGUgb2YgdGhyZWFkICAgICAgICAgICAgICAgKi8KKyAgICBvbXB0X3RocmVhZF9pZF90IHRocmVhZF9pZCAgICAgICAgLyogSUQgb2YgdGhyZWFkICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF93YWl0X2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3dhaXRfaWRfdCB3YWl0X2lkICAgICAgICAgICAgLyogd2FpdCBpZCAgICAgICAgICAgICAgICAgICAgICAqLworKTsKKworLyogcGFyYWxsZWwgYW5kIHdvcmtzaGFyZXMgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIHZvaWQgKndvcmtzaGFyZV9mdW5jdGlvbiAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF90YXNrX2ZyYW1lLCAgLyogZnJhbWUgZGF0YSBvZiBwYXJlbnQgdGFzayAgICAqLworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgdWludDMyX3QgcmVxdWVzdGVkX3RlYW1fc2l6ZSwgICAgIC8qIG51bWJlciBvZiB0aHJlYWRzIGluIHRlYW0gICAgKi8KKyAgICB2b2lkICpwYXJhbGxlbF9mdW5jdGlvbiwgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworICAgIG9tcHRfaW52b2tlcl90IGludm9rZXIgICAgICAgICAgICAvKiB3aG8gaW52b2tlcyBtYXN0ZXIgdGFzaz8gICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2VuZF9wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQsICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICovCispOworCisvKiB0YXNrcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IGZpcnN0X3Rhc2tfaWQsCisgICAgb21wdF90YXNrX2lkX3Qgc2Vjb25kX3Rhc2tfaWQKKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3Rhc2tfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgZm9yIHBhcmVudCB0YXNrICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCAgbmV3X3Rhc2tfaWQsICAgICAgLyogaWQgb2YgY3JlYXRlZCB0YXNrICAgICAgICAgICAqLworICAgIHZvaWQgKnRhc2tfZnVuY3Rpb24gICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCispOworCisvKiB0YXNrIGRlcGVuZGVuY2VzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3Rhc2tfZGVwZW5kZW5jZXNfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQsICAgICAgICAgICAgLyogSUQgb2YgdGFzayB3aXRoIGRlcGVuZGVuY2VzICovCisgICAgY29uc3Qgb21wdF90YXNrX2RlcGVuZGVuY2VfdCAqZGVwcywvKiB2ZWN0b3Igb2YgdGFzayBkZXBlbmRlbmNlcyAgKi8KKyAgICBpbnQgbmRlcHMgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkZXBlbmRlbmNlcyAgICAgICAqLworKTsKKworLyogcHJvZ3JhbSAqLwordHlwZWRlZiB2b2lkICgqb21wdF9jb250cm9sX2NhbGxiYWNrX3QpICgKKyAgICB1aW50NjRfdCBjb21tYW5kLCAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBvZiBjb250cm9sIGNhbGwgICAgICAqLworICAgIHVpbnQ2NF90IG1vZGlmaWVyICAgICAgICAgICAgICAgICAvKiBtb2RpZmllciBvZiBjb250cm9sIGNhbGwgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2NhbGxiYWNrX3QpKHZvaWQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvbXB0IEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBPTVBUX0FQSV9GTlRZUEUoZm4pIGZuIyNfdAorCisjZGVmaW5lIE9NUFRfQVBJX0ZVTkNUSU9OKHJldHVybl90eXBlLCBmbiwgYXJncykgIFwKKyAgICB0eXBlZGVmIHJldHVybl90eXBlICgqT01QVF9BUElfRk5UWVBFKGZuKSkgYXJncworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOUVVJUlkgRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzdGF0ZSAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF9zdGF0ZV90LCBvbXB0X2dldF9zdGF0ZSwgKAorICAgIG9tcHRfd2FpdF9pZF90ICpvbXB0X3dhaXRfaWQKKykpOworCisvKiB0aHJlYWQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfdGhyZWFkX2lkX3QsIG9tcHRfZ2V0X3RocmVhZF9pZCwgKHZvaWQpKTsKKworT01QVF9BUElfRlVOQ1RJT04odm9pZCAqLCBvbXB0X2dldF9pZGxlX2ZyYW1lLCAodm9pZCkpOworCisvKiBwYXJhbGxlbCByZWdpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfcGFyYWxsZWxfaWRfdCwgb21wdF9nZXRfcGFyYWxsZWxfaWQsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSwgKAorICAgIGludCBhbmNlc3Rvcl9sZXZlbAorKSk7CisKKy8qIHRhc2sgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfdGFza19pZF90LCBvbXB0X2dldF90YXNrX2lkLCAoCisgICAgaW50IGRlcHRoCispKTsKKworT01QVF9BUElfRlVOQ1RJT04ob21wdF9mcmFtZV90ICosIG9tcHRfZ2V0X3Rhc2tfZnJhbWUsICgKKyAgICBpbnQgZGVwdGgKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBMQUNFSE9MREVSUyBGT1IgUEVSRk9STUFOQ0UgUkVQT1JUSU5HCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpZGxlICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2lkbGUsICgKKyAgICB2b2lkCispKTsKKworLyogb3ZlcmhlYWQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfb3ZlcmhlYWQsICgKKyAgICB2b2lkCispKTsKKworLyogYmFycmllciB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2JhcnJpZXJfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiB0YXNrIHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfdGFza193YWl0LCAoCisgICAgdm9pZAorKSk7CisKKy8qIG11dGV4IHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfbXV0ZXhfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRJQUxJWkFUSU9OIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pbml0aWFsaXplLCAoCisgICAgb21wdF9mdW5jdGlvbl9sb29rdXBfdCBvbXB0X2ZuX2xvb2t1cCwKKyAgICBjb25zdCBjaGFyICpydW50aW1lX3ZlcnNpb24sCisgICAgdW5zaWduZWQgaW50IG9tcHRfdmVyc2lvbgorKSk7CisKKworLyogaW5pdGlhbGl6YXRpb24gaW50ZXJmYWNlIHRvIGJlIGRlZmluZWQgYnkgdG9vbCAqLworb21wdF9pbml0aWFsaXplX3Qgb21wdF90b29sKHZvaWQpOworCit0eXBlZGVmIGVudW0gb3B0X2luaXRfbW9kZV9lIHsKKyAgICBvbXB0X2luaXRfbW9kZV9uZXZlciAgPSAwLAorICAgIG9tcHRfaW5pdF9tb2RlX2ZhbHNlICA9IDEsCisgICAgb21wdF9pbml0X21vZGVfdHJ1ZSAgID0gMiwKKyAgICBvbXB0X2luaXRfbW9kZV9hbHdheXMgPSAzCit9IG9tcHRfaW5pdF9tb2RlX3Q7CisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9zZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190IGNhbGxiYWNrCispKTsKKwordHlwZWRlZiBlbnVtIG9tcHRfc2V0X2NhbGxiYWNrX3JjX2UgeyAgLyogbm9uLXN0YW5kYXJkICovCisgICAgb21wdF9zZXRfY2FsbGJhY2tfZXJyb3IgICAgICA9IDAsCisgICAgb21wdF9oYXNfZXZlbnRfbm9fY2FsbGJhY2sgICA9IDEsCisgICAgb21wdF9ub19ldmVudF9ub19jYWxsYmFjayAgICA9IDIsCisgICAgb21wdF9oYXNfZXZlbnRfbWF5X2NhbGxiYWNrICA9IDMsCisgICAgb21wdF9oYXNfZXZlbnRfbXVzdF9jYWxsYmFjayA9IDQsCit9IG9tcHRfc2V0X2NhbGxiYWNrX3JjX3Q7CisKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9jYWxsYmFjaywgKAorICAgIG9tcHRfZXZlbnRfdCBldmVudCwKKyAgICBvbXB0X2NhbGxiYWNrX3QgKmNhbGxiYWNrCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNSVNDRUxMQU5FT1VTIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY29udHJvbCAqLworLy8gRklYTUU6IHJlbW92ZSB3b3JrYXJvdW5kIGZvciBjbGFuZworI2lmICFkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfT1BFTk1QKSAmJiAoX09QRU5NUCA+PSAyMDEzMDcpCisjcHJhZ21hIG9tcCBkZWNsYXJlIHRhcmdldAorI2VuZGlmCit2b2lkIG9tcHRfY29udHJvbCgKKyAgICB1aW50NjRfdCBjb21tYW5kLAorICAgIHVpbnQ2NF90IG1vZGlmaWVyCispOworI2lmICFkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfT1BFTk1QKSAmJiAoX09QRU5NUCA+PSAyMDEzMDcpCisjcHJhZ21hIG9tcCBlbmQgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgorCisvKiBzdGF0ZSBlbnVtZXJhdGlvbiAqLworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2VudW1lcmF0ZV9zdGF0ZSwgKAorICAgIGludCBjdXJyZW50X3N0YXRlLAorICAgIGludCAqbmV4dF9zdGF0ZSwKKyAgICBjb25zdCBjaGFyICoqbmV4dF9zdGF0ZV9uYW1lCispKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcC5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZmM4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wLmgKQEAgLTAsMCArMSwzNTQyIEBACisvKiEgXGZpbGUgKi8KKy8qCisgKiBrbXAuaCAtLSBLUFRTIHJ1bnRpbWUgaGVhZGVyIGZpbGUuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0gKKyNkZWZpbmUgS01QX0gKKworI2luY2x1ZGUgImttcF9jb25maWcuaCIKKworLyogI2RlZmluZSBCVUlMRF9QQVJBTExFTF9PUkRFUkVEIDEgKi8KKworLyogVGhpcyBmaXggcmVwbGFjZXMgZ2V0dGltZW9mZGF5IHdpdGggY2xvY2tfZ2V0dGltZSBmb3IgYmV0dGVyIHNjYWxhYmlsaXR5IG9uCisgICB0aGUgQWx0aXguICBSZXF1aXJlcyB1c2VyIGNvZGUgdG8gYmUgbGlua2VkIHdpdGggLWxydC4KKyovCisvLyNkZWZpbmUgRklYX1NHSV9DTE9DSworCisvKiBEZWZpbmVzIGZvciBPcGVuTVAgMy4wIHRhc2tpbmcgYW5kIGF1dG8gc2NoZWR1bGluZyAqLworCisjIGlmbmRlZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKKyMgIGRlZmluZSBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgMQorIyBlbmRpZgorCisjZGVmaW5lIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEICAwCisjZGVmaW5lIFRBU0tfQ1VSUkVOVF9RVUVVRUQgICAgICAxCisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyNkZWZpbmUgVEFTS19TVEFDS19FTVBUWSAgICAgICAgIDAgIC8vIGVudHJpZXMgd2hlbiB0aGUgc3RhY2sgaXMgZW1wdHkKKworI2RlZmluZSBUQVNLX1NUQUNLX0JMT0NLX0JJVFMgICAgNSAgLy8gVXNlZCB0byBkZWZpbmUgVEFTS19TVEFDS19TSVpFIGFuZCBUQVNLX1NUQUNLX01BU0sKKyNkZWZpbmUgVEFTS19TVEFDS19CTE9DS19TSVpFICAgICggMSA8PCBUQVNLX1NUQUNLX0JMT0NLX0JJVFMgKSAvLyBOdW1iZXIgb2YgZW50cmllcyBpbiBlYWNoIHRhc2sgc3RhY2sgYXJyYXkKKyNkZWZpbmUgVEFTS19TVEFDS19JTkRFWF9NQVNLICAgICggVEFTS19TVEFDS19CTE9DS19TSVpFIC0gMSApICAvLyBNYXNrIGZvciBkZXRlcm1pbmluZyBpbmRleCBpbnRvIHN0YWNrIGJsb2NrCisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisKKyNkZWZpbmUgVEFTS19OT1RfUFVTSEVEICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19TVUNDRVNTRlVMTFlfUFVTSEVEIDAKKyNkZWZpbmUgVEFTS19USUVEICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19VTlRJRUQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVEFTS19FWFBMSUNJVCAgICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19JTVBMSUNJVCAgICAgICAgICAgIDAKKyNkZWZpbmUgVEFTS19QUk9YWSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVEFTS19GVUxMICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyNkZWZpbmUgS01QX1RIUkVBRF9BVFRSCisKKy8vIEFuZHJvaWQgZG9lcyBub3QgaGF2ZSBwdGhyZWFkX2NhbmNlbC4gIFVuZGVmaW5lIEtNUF9DQU5DRUxfVEhSRUFEUyBpZiBiZWluZworLy8gYnVpbHQgb24gQW5kcm9pZAorI2lmIGRlZmluZWQoX19BTkRST0lEX18pCisjdW5kZWYgS01QX0NBTkNFTF9USFJFQURTCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisvKiAgaW5jbHVkZSA8Y3R5cGUuaD4gZG9uJ3QgdXNlOyBwcm9ibGVtcyB3aXRoIC9NRCBvbiBXaW5kb3dzKiBPUyBOVCBkdWUgdG8gYmFkIE1pY3Jvc29mdCBsaWJyYXJ5ICAqLworLyogIHNvbWUgbWFjcm9zIHByb3ZpZGVkIGJlbG93IHRvIHJlcGxhY2Ugc29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgICovCisjaWZuZGVmIF9fQUJTT0ZUX1dJTgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImttcF9vcy5oIgorCisjaW5jbHVkZSAia21wX3NhZmVfY19hcGkuaCIKKworI2lmIEtNUF9TVEFUU19FTkFCTEVECitjbGFzcyBrbXBfc3RhdHNfbGlzdDsKKyNlbmRpZgorCisjaWYgS01QX1VTRV9IV0xPQyAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisjIGluY2x1ZGUgImh3bG9jLmgiCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAia21wX3ZlcnNpb24uaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2lmIFVTRV9ERUJVR0dFUgorI2luY2x1ZGUgImttcF9kZWJ1Z2dlci5oIgorI2VuZGlmCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2RlZmluZSBLTVBfSEFORExFX1NJR05BTFMgKEtNUF9PU19VTklYIHx8IEtNUF9PU19XSU5ET1dTKQorCisjaW5jbHVkZSAia21wX3dyYXBwZXJfbWFsbG9jLmgiCisjaWYgS01QX09TX1VOSVgKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGlmICFkZWZpbmVkIE5TSUcgJiYgZGVmaW5lZCBfTlNJRworIyAgZGVmaW5lIE5TSUcgX05TSUcKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgS01QX09TX0xJTlVYCisjIHByYWdtYSB3ZWFrIGNsb2NrX2dldHRpbWUKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1pbnRlcm5hbC5oIgorI2VuZGlmCisKKy8qU2VsZWN0IGRhdGEgcGxhY2VtZW50IGluIE5VTUEgbWVtb3J5ICovCisjZGVmaW5lIE5PX0ZJUlNUX1RPVUNIIDAKKyNkZWZpbmUgRklSU1RfVE9VQ0ggMSAgICAgICAvKiBFeHBsb2l0IFNHSSdzIGZpcnN0IHRvdWNoIHBhZ2UgcGxhY2VtZW50IGFsZ28gKi8KKworLyogSWYgbm90IHNwZWNpZmllZCBvbiBjb21waWxlIGNvbW1hbmQgbGluZSwgYXNzdW1lIG5vIGZpcnN0IHRvdWNoICovCisjaWZuZGVmIEJVSUxEX01FTU9SWQorI2RlZmluZSBCVUlMRF9NRU1PUlkgTk9fRklSU1RfVE9VQ0gKKyNlbmRpZgorCisvLyAwIC0gbm8gZmFzdCBtZW1vcnkgYWxsb2NhdGlvbiwgYWxpZ25tZW50OiA4LWJ5dGUgb24geDg2LCAxNi1ieXRlIG9uIHg2NC4KKy8vIDMgLSBmYXN0IGFsbG9jYXRpb24gdXNpbmcgc3luYywgbm9uLXN5bmMgZnJlZSBsaXN0cyBvZiBhbnkgc2l6ZSwgbm9uLXNlbGYgZnJlZSBsaXN0cyBvZiBsaW1pdGVkIHNpemUuCisjaWZuZGVmIFVTRV9GQVNUX01FTU9SWQorI2RlZmluZSBVU0VfRkFTVF9NRU1PUlkgMworI2VuZGlmCisKKyNpZm5kZWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyMgZGVmaW5lIEtNUF9ORVNURURfSE9UX1RFQU1TIDAKKyMgZGVmaW5lIFVTRV9ORVNURURfSE9UX0FSRyh4KQorI2Vsc2UKKyMgaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyMgIGlmIE9NUF80MF9FTkFCTEVECisjICAgZGVmaW5lIFVTRV9ORVNURURfSE9UX0FSRyh4KSAseAorIyAgZWxzZQorLy8gTmVzdGVkIGhvdCB0ZWFtcyBmZWF0dXJlIGRlcGVuZHMgb24gb21wIDQuMCwgZGlzYWJsZSBpdCBmb3IgZWFybGllciB2ZXJzaW9ucworIyAgIHVuZGVmIEtNUF9ORVNURURfSE9UX1RFQU1TCisjICAgZGVmaW5lIEtNUF9ORVNURURfSE9UX1RFQU1TIDAKKyMgICBkZWZpbmUgVVNFX05FU1RFRF9IT1RfQVJHKHgpCisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgVVNFX05FU1RFRF9IT1RfQVJHKHgpCisjIGVuZGlmCisjZW5kaWYKKworLy8gQXNzdW1lIHVzaW5nIEJHRVQgY29tcGFyZV9leGNoYW5nZSBpbnN0cnVjdGlvbiBpbnN0ZWFkIG9mIGxvY2sgYnkgZGVmYXVsdC4KKyNpZm5kZWYgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisjZGVmaW5lIFVTRV9DTVBfWENIR19GT1JfQkdFVCAxCisjZW5kaWYKKworLy8gVGVzdCB0byBzZWUgaWYgcXVldWluZyBsb2NrIGlzIGJldHRlciB0aGFuIGJvb3RzdHJhcCBsb2NrIGZvciBiZ2V0CisvLyAjaWZuZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKy8vICNkZWZpbmUgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorLy8gI2VuZGlmCisKKyNkZWZpbmUgS01QX05TRUNfUEVSX1NFQyAxMDAwMDAwMDAwTAorI2RlZmluZSBLTVBfVVNFQ19QRVJfU0VDIDEwMDAwMDBMCisKKy8qIQorQGluZ3JvdXAgQkFTSUNfVFlQRVMKK0B7CisqLworCisvLyBGSVhNRSBET1hZR0VOLi4uIG5lZWQgdG8gZ3JvdXAgdGhlc2UgZmxhZ3Mgc29tZWhvdyAoTWFraW5nIHRoZW0gYW4gYW5vbnltb3VzIGVudW0gd291bGQgZG8gaXQuLi4pCisvKiEKK1ZhbHVlcyBmb3IgYml0IGZsYWdzIHVzZWQgaW4gdGhlIGlkZW50X3QgdG8gZGVzY3JpYmUgdGhlIGZpZWxkcy4KKyovCisvKiEgVXNlIHRyYW1wb2xpbmUgZm9yIGludGVybmFsIG1pY3JvdGFza3MgKi8KKyNkZWZpbmUgS01QX0lERU5UX0lNQiAgICAgICAgICAgICAweDAxCisvKiEgVXNlIGMtc3R5bGUgaWRlbnQgc3RydWN0dXJlICovCisjZGVmaW5lIEtNUF9JREVOVF9LTVBDICAgICAgICAgICAgMHgwMgorLyogMHgwNCBpcyBubyBsb25nZXIgdXNlZCAqLworLyohIEVudHJ5IHBvaW50IGdlbmVyYXRlZCBieSBhdXRvLXBhcmFsbGVsaXphdGlvbiAqLworI2RlZmluZSBLTVBfSURFTlRfQVVUT1BBUiAgICAgICAgIDB4MDgKKy8qISBDb21waWxlciBnZW5lcmF0ZXMgYXRvbWljIHJlZHVjdGlvbiBvcHRpb24gZm9yIGttcGNfcmVkdWNlKiAqLworI2RlZmluZSBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSAgIDB4MTAKKy8qISBUbyBtYXJrIGEgJ2JhcnJpZXInIGRpcmVjdGl2ZSBpbiB1c2VyIGNvZGUgKi8KKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfRVhQTCAgICAweDIwCisvKiEgVG8gTWFyayBpbXBsaWNpdCBiYXJyaWVycy4gKi8KKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTCAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfTUFTSyAgICAgIDB4MDFDMAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX0ZPUiAgICAgICAweDAwNDAKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TRUNUSU9OUyAgMHgwMEMwCisKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TSU5HTEUgICAgMHgwMTQwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfV09SS1NIQVJFIDB4MDFDMAorCisvKiEKKyAqIFRoZSBpZGVudCBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgYSBzb3VyY2UgbG9jYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IGlkZW50IHsKKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMTsgICAvKio8ICBtaWdodCBiZSB1c2VkIGluIEZvcnRyYW47IHNlZSBhYm92ZSAgKi8KKyAgICBrbXBfaW50MzIgZmxhZ3M7ICAgICAgICAvKio8ICBhbHNvIGYuZmxhZ3M7IEtNUF9JREVOVF94eHggZmxhZ3M7IEtNUF9JREVOVF9LTVBDIGlkZW50aWZpZXMgdGhpcyB1bmlvbiBtZW1iZXIgICovCisgICAga21wX2ludDMyIHJlc2VydmVkXzI7ICAgLyoqPCAgbm90IHJlYWxseSB1c2VkIGluIEZvcnRyYW4gYW55IG1vcmU7IHNlZSBhYm92ZSAqLworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYnV0IGN1cnJlbnRseSB1c2VkIGZvciBzdG9yaW5nIHJlZ2lvbi1zcGVjaWZpYyBJVFQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4gKi8KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAga21wX2ludDMyIHJlc2VydmVkXzM7ICAgLyoqPCBzb3VyY2VbNF0gaW4gRm9ydHJhbiwgZG8gbm90IHVzZSBmb3IgQysrICAqLworICAgIGNoYXIgY29uc3QgKnBzb3VyY2U7ICAgIC8qKjwgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNvdXJjZSBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3RyaW5nIGlzIGNvbXBvc2VkIG9mIHNlbWktY29sb24gc2VwYXJhdGVkIGZpZWxkcyB3aGljaCBkZXNjcmliZSB0aGUgc291cmNlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIGFuZCBhIHBhaXIgb2YgbGluZSBudW1iZXJzIHRoYXQgZGVsaW1pdCB0aGUgY29uc3RydWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBpZGVudF90OworLyohCitAfQorKi8KKworLy8gU29tZSBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KKwordHlwZWRlZiB1bmlvbiAga21wX3RlYW0gICAgICBrbXBfdGVhbV90OwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tkYXRhICBrbXBfdGFza2RhdGFfdDsKK3R5cGVkZWYgdW5pb24gIGttcF90YXNrX3RlYW0ga21wX3Rhc2tfdGVhbV90OwordHlwZWRlZiB1bmlvbiAga21wX3RlYW0gICAgICBrbXBfdGVhbV9wOwordHlwZWRlZiB1bmlvbiAga21wX2luZm8gICAgICBrbXBfaW5mb19wOwordHlwZWRlZiB1bmlvbiAga21wX3Jvb3QgICAgICBrbXBfcm9vdF9wOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFBhY2sgdHdvIDMyLWJpdCBzaWduZWQgaW50ZWdlcnMgaW50byBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciAqLworLyogVG9EbzogRml4IHdvcmQgb3JkZXJpbmcgZm9yIGJpZy1lbmRpYW4gbWFjaGluZXMuICovCisjZGVmaW5lIEtNUF9QQUNLXzY0KEhJR0hfMzIsTE9XXzMyKSBcCisgICAgKCAoa21wX2ludDY0KSAoKCgoa21wX3VpbnQ2NCkoSElHSF8zMikpPDwzMikgfCAoa21wX3VpbnQ2NCkoTE9XXzMyKSkgKQorCisKKy8qCisgKiBHZW5lcmljIHN0cmluZyBtYW5pcHVsYXRpb24gbWFjcm9zLgorICogQXNzdW1lIHRoYXQgX3ggaXMgb2YgdHlwZSBjaGFyICoKKyAqLworI2RlZmluZSBTS0lQX1dTKF94KSAgICAgeyB3aGlsZSAoKihfeCkgPT0gJyAnIHx8ICooX3gpID09ICdcdCcpIChfeCkrKzsgfQorI2RlZmluZSBTS0lQX0RJR0lUUyhfeCkgeyB3aGlsZSAoKihfeCkgPj0gJzAnICYmICooX3gpIDw9ICc5JykgKF94KSsrOyB9CisjZGVmaW5lIFNLSVBfVE8oX3gsX2MpICB7IHdoaWxlICgqKF94KSAhPSAnXDAnICYmICooX3gpICE9IChfYykpIChfeCkrKzsgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9NQVgoIHgsIHkgKSAoICh4KSA+ICh5KSA/ICh4KSA6ICh5KSApCisjZGVmaW5lIEtNUF9NSU4oIHgsIHkgKSAoICh4KSA8ICh5KSA/ICh4KSA6ICh5KSApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogRW51bWVyYXRpb24gdHlwZXMgKi8KKworZW51bSBrbXBfc3RhdGVfdGltZXIgeworICAgIHRzX3N0b3AsCisgICAgdHNfc3RhcnQsCisgICAgdHNfcGF1c2UsCisKKyAgICB0c19sYXN0X3N0YXRlCit9OworCitlbnVtIGR5bmFtaWNfbW9kZSB7CisgICAgZHluYW1pY19kZWZhdWx0LAorI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBkeW5hbWljX2xvYWRfYmFsYW5jZSwKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisgICAgZHluYW1pY19yYW5kb20sCisgICAgZHluYW1pY190aHJlYWRfbGltaXQsCisgICAgZHluYW1pY19tYXgKK307CisKKy8qIGV4dGVybmFsIHNjaGVkdWxlIGNvbnN0YW50cywgZHVwbGljYXRlIGVudW0gb21wX3NjaGVkIGluIG9tcC5oIGluIG9yZGVyIHRvIG5vdCBpbmNsdWRlIGl0IGhlcmUgKi8KKyNpZm5kZWYgS01QX1NDSEVEX1RZUEVfREVGSU5FRAorI2RlZmluZSBLTVBfU0NIRURfVFlQRV9ERUZJTkVECit0eXBlZGVmIGVudW0ga21wX3NjaGVkIHsKKyAgICBrbXBfc2NoZWRfbG93ZXIgICAgICAgICAgICAgPSAwLCAgICAgLy8gbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBhcmUgZm9yIHJvdXRpbmUgcGFyYW1ldGVyIGNoZWNrCisgICAgLy8gTm90ZTogbmVlZCB0byBhZGp1c3QgX19rbXBfc2NoX21hcCBnbG9iYWwgYXJyYXkgaW4gY2FzZSB0aGlzIGVudW0gaXMgY2hhbmdlZAorICAgIGttcF9zY2hlZF9zdGF0aWMgICAgICAgICAgICA9IDEsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgKDMzKQorICAgIGttcF9zY2hlZF9keW5hbWljICAgICAgICAgICA9IDIsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9keW5hbWljX2NodW5rZWQgICAgICAgICAgKDM1KQorICAgIGttcF9zY2hlZF9ndWlkZWQgICAgICAgICAgICA9IDMsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCAgICAgICAgICAgKDM2KQorICAgIGttcF9zY2hlZF9hdXRvICAgICAgICAgICAgICA9IDQsICAgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgKDM4KQorICAgIGttcF9zY2hlZF91cHBlcl9zdGQgICAgICAgICA9IDUsICAgICAvLyB1cHBlciBib3VuZCBmb3Igc3RhbmRhcmQgc2NoZWR1bGVzCisgICAga21wX3NjaGVkX2xvd2VyX2V4dCAgICAgICAgID0gMTAwLCAgIC8vIGxvd2VyIGJvdW5kIG9mIEludGVsIGV4dGVuc2lvbiBzY2hlZHVsZXMKKyAgICBrbXBfc2NoZWRfdHJhcGV6b2lkYWwgICAgICAgPSAxMDEsICAgLy8gbWFwcGVkIHRvIGttcF9zY2hfdHJhcGV6b2lkYWwgICAgICAgICAgICAgICgzOSkKKyNpZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKKyAgICBrbXBfc2NoZWRfc3RhdGljX3N0ZWFsICAgICAgPSAxMDIsICAgLy8gbWFwcGVkIHRvIGttcF9zY2hfc3RhdGljX3N0ZWFsICAgICAgICAgICAgICg0NCkKKyNlbmRpZgorICAgIGttcF9zY2hlZF91cHBlciwKKyAgICBrbXBfc2NoZWRfZGVmYXVsdCA9IGttcF9zY2hlZF9zdGF0aWMgLy8gZGVmYXVsdCBzY2hlZHVsaW5nCit9IGttcF9zY2hlZF90OworI2VuZGlmCisKKy8qIQorIEBpbmdyb3VwIFdPUktfU0hBUklORworICogRGVzY3JpYmVzIHRoZSBsb29wIHNjaGVkdWxlIHRvIGJlIHVzZWQgZm9yIGEgcGFyYWxsZWwgZm9yIGxvb3AuCisgKi8KK2VudW0gc2NoZWRfdHlwZSB7CisgICAga21wX3NjaF9sb3dlciAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgLyoqPCBsb3dlciBib3VuZCBmb3IgdW5vcmRlcmVkIHZhbHVlcyAqLworICAgIGttcF9zY2hfc3RhdGljX2NodW5rZWQgICAgICAgICAgICA9IDMzLAorICAgIGttcF9zY2hfc3RhdGljICAgICAgICAgICAgICAgICAgICA9IDM0LCAgIC8qKjwgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAgPSAzNSwKKyAgICBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAgPSAzNiwgICAvKio8IGd1aWRlZCB1bnNwZWNpYWxpemVkICovCisgICAga21wX3NjaF9ydW50aW1lICAgICAgICAgICAgICAgICAgID0gMzcsCisgICAga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgID0gMzgsICAgLyoqPCBhdXRvICovCisgICAga21wX3NjaF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgID0gMzksCisKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfc2NoX3N0YXRpY19ncmVlZHkgICAgICAgICAgICAgPSA0MCwKKyAgICBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCAgICAgICAgICAgPSA0MSwKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCAgPSA0MiwKKyAgICBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQgPSA0MywKKworICAgIGttcF9zY2hfc3RhdGljX3N0ZWFsICAgICAgICAgICAgICA9IDQ0LCAgIC8qKjwgYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkX2NodW5rZWQgICA9IDQ1LCAgIC8qKjwgc3RhdGljIHdpdGggY2h1bmsgYWRqdXN0bWVudCAoZS5nLiwgc2ltZCkgKi8KKyNlbmRpZgorCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX3NjaF91cHBlciAgICAgICAgICAgICAgICAgICAgID0gNDYsICAgLyoqPCB1cHBlciBib3VuZCBmb3IgdW5vcmRlcmVkIHZhbHVlcyAqLworCisgICAga21wX29yZF9sb3dlciAgICAgICAgICAgICAgICAgICAgID0gNjQsICAgLyoqPCBsb3dlciBib3VuZCBmb3Igb3JkZXJlZCB2YWx1ZXMsIG11c3QgYmUgcG93ZXIgb2YgMiAqLworICAgIGttcF9vcmRfc3RhdGljX2NodW5rZWQgICAgICAgICAgICA9IDY1LAorICAgIGttcF9vcmRfc3RhdGljICAgICAgICAgICAgICAgICAgICA9IDY2LCAgIC8qKjwgb3JkZXJlZCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9vcmRfZHluYW1pY19jaHVua2VkICAgICAgICAgICA9IDY3LAorICAgIGttcF9vcmRfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICA9IDY4LAorICAgIGttcF9vcmRfcnVudGltZSAgICAgICAgICAgICAgICAgICA9IDY5LAorICAgIGttcF9vcmRfYXV0byAgICAgICAgICAgICAgICAgICAgICA9IDcwLCAgIC8qKjwgb3JkZXJlZCBhdXRvICovCisgICAga21wX29yZF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgID0gNzEsCisgICAga21wX29yZF91cHBlciAgICAgICAgICAgICAgICAgICAgID0gNzIsICAgLyoqPCB1cHBlciBib3VuZCBmb3Igb3JkZXJlZCB2YWx1ZXMgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLyogU2NoZWR1bGVzIGZvciBEaXN0cmlidXRlIGNvbnN0cnVjdCAqLworICAgIGttcF9kaXN0cmlidXRlX3N0YXRpY19jaHVua2VkICAgICA9IDkxLCAgIC8qKjwgZGlzdHJpYnV0ZSBzdGF0aWMgY2h1bmtlZCAqLworICAgIGttcF9kaXN0cmlidXRlX3N0YXRpYyAgICAgICAgICAgICA9IDkyLCAgIC8qKjwgZGlzdHJpYnV0ZSBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEZvciB0aGUgIm5vbWVyZ2UiIHZlcnNpb25zLCBrbXBfZGlzcGF0Y2hfbmV4dCooKSB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAgKiBhIHNpbmdsZSBpdGVyYXRpb24vY2h1bmssIGV2ZW4gaWYgdGhlIGxvb3AgaXMgc2VyaWFsaXplZC4gIEZvciB0aGUKKyAgICAgKiBzY2hlZHVsZSB0eXBlcyBsaXN0ZWQgYWJvdmUsIHRoZSBlbnRpcmUgaXRlcmF0aW9uIHZlY3RvciBpcyByZXR1cm5lZAorICAgICAqIGlmIHRoZSBsb29wIGlzIHNlcmlhbGl6ZWQuICBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgZ2NjL2djb21wIHNlY3Rpb25zLgorICAgICAqLworICAgIGttcF9ubV9sb3dlciAgICAgICAgICAgICAgICAgICAgICA9IDE2MCwgIC8qKjwgbG93ZXIgYm91bmQgZm9yIG5vbWVyZ2UgdmFsdWVzICovCisKKyAgICBrbXBfbm1fc3RhdGljX2NodW5rZWQgICAgICAgICAgICAgPSAoa21wX3NjaF9zdGF0aWNfY2h1bmtlZCAtIGttcF9zY2hfbG93ZXIgKyBrbXBfbm1fbG93ZXIpLAorICAgIGttcF9ubV9zdGF0aWMgICAgICAgICAgICAgICAgICAgICA9IDE2MiwgIC8qKjwgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfbm1fZHluYW1pY19jaHVua2VkICAgICAgICAgICAgPSAxNjMsCisgICAga21wX25tX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAgID0gMTY0LCAgLyoqPCBndWlkZWQgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9ubV9ydW50aW1lICAgICAgICAgICAgICAgICAgICA9IDE2NSwKKyAgICBrbXBfbm1fYXV0byAgICAgICAgICAgICAgICAgICAgICAgPSAxNjYsICAvKio8IGF1dG8gKi8KKyAgICBrbXBfbm1fdHJhcGV6b2lkYWwgICAgICAgICAgICAgICAgPSAxNjcsCisKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfbm1fc3RhdGljX2dyZWVkeSAgICAgICAgICAgICAgPSAxNjgsCisgICAga21wX25tX3N0YXRpY19iYWxhbmNlZCAgICAgICAgICAgID0gMTY5LAorICAgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICAgIGttcF9ubV9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgICA9IDE3MCwKKyAgICBrbXBfbm1fZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCAgPSAxNzEsCisgICAga21wX25tX3N0YXRpY19zdGVhbCAgICAgICAgICAgICAgID0gMTcyLCAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggT01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKyAgICBrbXBfbm1fb3JkX3N0YXRpY19jaHVua2VkICAgICAgICAgPSAxOTMsCisgICAga21wX25tX29yZF9zdGF0aWMgICAgICAgICAgICAgICAgID0gMTk0LCAgLyoqPCBvcmRlcmVkIHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisgICAga21wX25tX29yZF9keW5hbWljX2NodW5rZWQgICAgICAgID0gMTk1LAorICAgIGttcF9ubV9vcmRfZ3VpZGVkX2NodW5rZWQgICAgICAgICA9IDE5NiwKKyAgICBrbXBfbm1fb3JkX3J1bnRpbWUgICAgICAgICAgICAgICAgPSAxOTcsCisgICAga21wX25tX29yZF9hdXRvICAgICAgICAgICAgICAgICAgID0gMTk4LCAgLyoqPCBhdXRvICovCisgICAga21wX25tX29yZF90cmFwZXpvaWRhbCAgICAgICAgICAgID0gMTk5LAorICAgIGttcF9ubV91cHBlciAgICAgICAgICAgICAgICAgICAgICA9IDIwMCwgIC8qKjwgdXBwZXIgYm91bmQgZm9yIG5vbWVyZ2UgdmFsdWVzICovCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIC8qIFN1cHBvcnQgZm9yIE9wZW5NUCA0LjUgbW9ub3RvbmljIGFuZCBub25tb25vdG9uaWMgc2NoZWR1bGUgbW9kaWZpZXJzLgorICAgICAqIFNpbmNlIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHRocmVlIHBvc3NpYmxlIGNhc2VzIChubyBtb2RpZmllciwgbW9ub3RvbmljIG1vZGlmaWVyLAorICAgICAqIG5vbm1vbm90b25pYyBtb2RpZmllciksIHdlIG5lZWQgc2VwYXJhdGUgYml0cyBmb3IgZWFjaCBtb2RpZmllci4KKyAgICAgKiBUaGUgYWJzZW5jZSBvZiBtb25vdG9uaWMgZG9lcyBub3QgaW1wbHkgbm9ubW9ub3RvbmljLCBlc3BlY2lhbGx5IHNpbmNlIDQuNSBzYXlzCisgICAgICogdGhhdCB0aGUgYmVoYXZpb3VyIG9mIHRoZSAibm8gbW9kaWZpZXIiIGNhc2UgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBpbiA0LjUsCisgICAgICogYnV0IHdpbGwgYmVjb21lICJub25tb25vdG9uaWMiIGluIDUuMC4KKyAgICAgKgorICAgICAqIFNpbmNlIHdlJ3JlIHBhc3NpbmcgYSBmdWxsIDMyIGJpdCB2YWx1ZSwgd2UgY2FuIHVzZSBhIGNvdXBsZSBvZiBoaWdoIGJpdHMgZm9yIHRoZXNlCisgICAgICogZmxhZ3M7IG91dCBvZiBwYXJhbm9pYSB3ZSBhdm9pZCB0aGUgc2lnbiBiaXQuCisgICAgICoKKyAgICAgKiBUaGVzZSBtb2RpZmllcnMgY2FuIGJlIG9yLWVkIGludG8gbm9uLXN0YXRpYyBzY2hlZHVsZXMgYnkgdGhlIGNvbXBpbGVyIHRvIHBhc3MKKyAgICAgKiB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAgICAgKiBUaGV5IHdpbGwgYmUgc3RyaXBwZWQgZWFybHkgaW4gdGhlIHByb2Nlc3NpbmcgaW4gX19rbXBfZGlzcGF0Y2hfaW5pdCB3aGVuIHNldHRpbmcgdXAgc2NoZWR1bGVzLCBzbworICAgICAqIG1vc3Qgb2YgdGhlIGNvZGUgd29uJ3QgZXZlciBzZWUgc2NoZWR1bGVzIHdpdGggdGhlc2UgYml0cyBzZXQuCisgICAgICovCisgICAga21wX3NjaF9tb2RpZmllcl9tb25vdG9uaWMgICAgICA9ICgxPDwyOSksIC8qKjwgU2V0IGlmIHRoZSBtb25vdG9uaWMgc2NoZWR1bGUgbW9kaWZpZXIgd2FzIHByZXNlbnQgKi8KKyAgICBrbXBfc2NoX21vZGlmaWVyX25vbm1vbm90b25pYyAgID0gKDE8PDMwKSwgLyoqPCBTZXQgaWYgdGhlIG5vbm1vbm90b25pYyBzY2hlZHVsZSBtb2RpZmllciB3YXMgcHJlc2VudCAqLworCisjIGRlZmluZSBTQ0hFRFVMRV9XSVRIT1VUX01PRElGSUVSUyhzKSAoZW51bSBzY2hlZF90eXBlKSgocykgJiB+IChrbXBfc2NoX21vZGlmaWVyX25vbm1vbm90b25pYyB8IGttcF9zY2hfbW9kaWZpZXJfbW9ub3RvbmljKSkKKyMgZGVmaW5lIFNDSEVEVUxFX0hBU19NT05PVE9OSUMocykgICAgICgoKHMpICYga21wX3NjaF9tb2RpZmllcl9tb25vdG9uaWMpICAgICE9IDApCisjIGRlZmluZSBTQ0hFRFVMRV9IQVNfTk9OTU9OT1RPTklDKHMpICAoKChzKSAmIGttcF9zY2hfbW9kaWZpZXJfbm9ubW9ub3RvbmljKSAhPSAwKQorIyBkZWZpbmUgU0NIRURVTEVfSEFTX05PX01PRElGSUVSUyhzKSAgKCgocykgJiAoa21wX3NjaF9tb2RpZmllcl9ub25tb25vdG9uaWMgfCBrbXBfc2NoX21vZGlmaWVyX21vbm90b25pYykpID09IDApCisjZWxzZQorICAgIC8qIEJ5IGRvaW5nIHRoaXMgd2UgaG9wZSB0byBhdm9pZCBtdWx0aXBsZSB0ZXN0cyBvbiBPTVBfNDVfRU5BQkxFRC4gQ29tcGlsZXJzIGNhbiBub3cgZWxpbWluYXRlIHRlc3RzIG9uIGNvbXBpbGUgdGltZQorICAgICAqIGNvbnN0YW50cyBhbmQgZGVhZCBjb2RlIHRoYXQgcmVzdWx0cyBmcm9tIHRoZW0sIHNvIHdlIGNhbiBsZWF2ZSBjb2RlIGd1YXJkZWQgYnkgc3VjaCBhbiBpZiBpbiBwbGFjZS4KKyAgICAgKi8KKyMgZGVmaW5lIFNDSEVEVUxFX1dJVEhPVVRfTU9ESUZJRVJTKHMpIChzKQorIyBkZWZpbmUgU0NIRURVTEVfSEFTX01PTk9UT05JQyhzKSAgICAgZmFsc2UKKyMgZGVmaW5lIFNDSEVEVUxFX0hBU19OT05NT05PVE9OSUMocykgIGZhbHNlCisjIGRlZmluZSBTQ0hFRFVMRV9IQVNfTk9fTU9ESUZJRVJTKHMpICB0cnVlCisjZW5kaWYKKworICAgIGttcF9zY2hfZGVmYXVsdCA9IGttcF9zY2hfc3RhdGljICAvKio8IGRlZmF1bHQgc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KK307CisKKy8qIFR5cGUgdG8ga2VlcCBydW50aW1lIHNjaGVkdWxlIHNldCB2aWEgT01QX1NDSEVEVUxFIG9yIG9tcF9zZXRfc2NoZWR1bGUoKSAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3Jfc2NoZWQgeworICAgIGVudW0gc2NoZWRfdHlwZSByX3NjaGVkX3R5cGU7CisgICAgaW50ICAgICAgICAgICAgIGNodW5rOworfSBrbXBfcl9zY2hlZF90OworCitleHRlcm4gZW51bSBzY2hlZF90eXBlIF9fa21wX3NjaF9tYXBbXTsgLy8gbWFwIE9NUCAzLjAgc2NoZWR1bGUgdHlwZXMgd2l0aCBvdXIgaW50ZXJuYWwgc2NoZWR1bGUgdHlwZXMKKworZW51bSBsaWJyYXJ5X3R5cGUgeworICAgIGxpYnJhcnlfbm9uZSwKKyAgICBsaWJyYXJ5X3NlcmlhbCwKKyAgICBsaWJyYXJ5X3R1cm5hcm91bmQsCisgICAgbGlicmFyeV90aHJvdWdocHV0Cit9OworCisjaWYgS01QX09TX0xJTlVYCitlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgeworICAgIGNsb2NrX2Z1bmN0aW9uX2dldHRpbWVvZmRheSwKKyAgICBjbG9ja19mdW5jdGlvbl9jbG9ja19nZXR0aW1lCit9OworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCitlbnVtIG1pY190eXBlIHsKKyAgICBub25fbWljLAorICAgIG1pYzEsCisgICAgbWljMiwKKyAgICBtaWMzLAorICAgIGR1bW15Cit9OworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0gZmFzdCByZWR1Y3Rpb24gc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyN1bmRlZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorI2RlZmluZSBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUiAxCisKKyN1bmRlZiBLTVBfRkFTVF9SRURVQ1RJT05fQ09SRV9EVU8KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgI2RlZmluZSBLTVBfRkFTVF9SRURVQ1RJT05fQ09SRV9EVU8gMQorI2VuZGlmCisKK2VudW0gX3JlZHVjdGlvbl9tZXRob2QgeworICAgIHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQgPSAwLAorICAgIGNyaXRpY2FsX3JlZHVjZV9ibG9jayAgICAgICAgPSAoIDEgPDwgOCApLAorICAgIGF0b21pY19yZWR1Y2VfYmxvY2sgICAgICAgICAgPSAoIDIgPDwgOCApLAorICAgIHRyZWVfcmVkdWNlX2Jsb2NrICAgICAgICAgICAgPSAoIDMgPDwgOCApLAorICAgIGVtcHR5X3JlZHVjZV9ibG9jayAgICAgICAgICAgPSAoIDQgPDwgOCApCit9OworCisvLyBkZXNjcmlwdGlvbiBvZiB0aGUgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFyaWFibGUKKy8vIHRoZSBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCB2YXJpYWJsZSBjb25zaXN0cyBvZiB0d28gZW51bSB0eXBlcyB2YXJpYWJsZXMgdGhhdCBhcmUgcGFja2VkIHRvZ2V0aGVyIGludG8gMC10aCBieXRlIGFuZCAxLXN0IGJ5dGU6CisvLyAwOiAoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICYgMHgwMDAwMDBGRiApIGlzIGEgJ2VudW0gYmFycmllcl90eXBlJyB2YWx1ZSBvZiBiYXJyaWVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIGZhc3QgcmVkdWN0aW9uOiBic19wbGFpbl9iYXJyaWVyIG9yIGJzX3JlZHVjdGlvbl9iYXJyaWVyCisvLyAxOiAoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICYgMHgwMDAwRkYwMCApIGlzIGEgcmVkdWN0aW9uIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCBpbiBmYXN0IHJlZHVjdGlvbjsKKy8vIHJlZHVjdGlvbiBtZXRob2QgaXMgb2YgJ2VudW0gX3JlZHVjdGlvbl9tZXRob2QnIHR5cGUgYW5kIGl0J3MgZGVmaW5lZCB0aGUgd2F5IHNvIHRoYXQgdGhlIGJpdHMgb2YgMC10aCBieXRlIGFyZSBlbXB0eSwKKy8vIHNvIG5vIG5lZWQgdG8gZXhlY3V0ZSBhIHNoaWZ0IGluc3RydWN0aW9uIHdoaWxlIHBhY2tpbmcvdW5wYWNraW5nCisKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICNkZWZpbmUgUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKHJlZHVjdGlvbl9tZXRob2QsYmFycmllcl90eXBlKSBcCisgICAgICAgICAgICAoICggcmVkdWN0aW9uX21ldGhvZCApIHwgKCBiYXJyaWVyX3R5cGUgKSApCisKKyAgICAjZGVmaW5lIFVOUEFDS19SRURVQ1RJT05fTUVUSE9EKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSBcCisgICAgICAgICAgICAoICggZW51bSBfcmVkdWN0aW9uX21ldGhvZCApKCAoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgJiAoIDB4MDAwMEZGMDAgKSApICkKKworICAgICNkZWZpbmUgVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSBcCisgICAgICAgICAgICAoICggZW51bSBiYXJyaWVyX3R5cGUgKSggICAgICAoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgJiAoIDB4MDAwMDAwRkYgKSApICkKKyNlbHNlCisgICAgI2RlZmluZSBQQUNLX1JFRFVDVElPTl9NRVRIT0RfQU5EX0JBUlJJRVIocmVkdWN0aW9uX21ldGhvZCxiYXJyaWVyX3R5cGUpIFwKKyAgICAgICAgICAgICggcmVkdWN0aW9uX21ldGhvZCApCisKKyAgICAjZGVmaW5lIFVOUEFDS19SRURVQ1RJT05fTUVUSE9EKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSBcCisgICAgICAgICAgICAoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkKKworICAgICNkZWZpbmUgVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSBcCisgICAgICAgICAgICAoIGJzX3BsYWluX2JhcnJpZXIgKQorI2VuZGlmCisKKyNkZWZpbmUgVEVTVF9SRURVQ1RJT05fTUVUSE9EKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLHdoaWNoX3JlZHVjdGlvbl9ibG9jaykgXAorICAgICAgICAgICAgKCAoIFVOUEFDS19SRURVQ1RJT05fTUVUSE9EKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICkgPT0gKCB3aGljaF9yZWR1Y3Rpb25fYmxvY2sgKSApCisKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICNkZWZpbmUgVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9SRURVQ1RJT05fQkFSUklFUiBcCisgICAgICAgICAgICAoIFBBQ0tfUkVEVUNUSU9OX01FVEhPRF9BTkRfQkFSUklFUiggdHJlZV9yZWR1Y2VfYmxvY2ssIGJzX3JlZHVjdGlvbl9iYXJyaWVyICkgKQorCisgICAgI2RlZmluZSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1BMQUlOX0JBUlJJRVIgXAorICAgICAgICAgICAgKCBQQUNLX1JFRFVDVElPTl9NRVRIT0RfQU5EX0JBUlJJRVIoIHRyZWVfcmVkdWNlX2Jsb2NrLCBic19wbGFpbl9iYXJyaWVyICkgKQorI2VuZGlmCisKK3R5cGVkZWYgaW50IFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1Q7CisKKy8qIC0tIGVuZCBvZiBmYXN0IHJlZHVjdGlvbiBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgZGVmaW5lIFVTRV9DQkxLREFUQQorIyBwcmFnbWEgd2FybmluZyggcHVzaCApCisjIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiAyNzEgMzEwICkKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorIyBpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBPbmx5IExpbnV4KiBPUyBhbmQgV2luZG93cyogT1Mgc3VwcG9ydCB0aHJlYWQgYWZmaW5pdHkuCisgKi8KKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKy8vIEdST1VQX0FGRklOSVRZIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgX01TQ19WRVI+PTE2MDAgKFZTMjAxMCBhbmQgbGF0ZXIpLgorIyBpZiBLTVBfT1NfV0lORE9XUworIyAgaWYgX01TQ19WRVIgPCAxNjAwCit0eXBlZGVmIHN0cnVjdCBHUk9VUF9BRkZJTklUWSB7CisgICAgS0FGRklOSVRZIE1hc2s7CisgICAgV09SRCBHcm91cDsKKyAgICBXT1JEIFJlc2VydmVkWzNdOworfSBHUk9VUF9BRkZJTklUWTsKKyMgIGVuZGlmIC8qIF9NU0NfVkVSIDwgMTYwMCAqLworIyAgaWYgS01QX0dST1VQX0FGRklOSVRZCitleHRlcm4gaW50IF9fa21wX251bV9wcm9jX2dyb3VwczsKKyMgIGVsc2UKK3N0YXRpYyBjb25zdCBpbnQgX19rbXBfbnVtX3Byb2NfZ3JvdXBzID0gMTsKKyMgIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLwordHlwZWRlZiBEV09SRCAoKmttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudF90KShXT1JEKTsKK2V4dGVybiBrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudDsKKwordHlwZWRlZiBXT1JEICgqa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCkodm9pZCk7CitleHRlcm4ga21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50OworCit0eXBlZGVmIEJPT0wgKCprbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KShIQU5ETEUsIEdST1VQX0FGRklOSVRZICopOworZXh0ZXJuIGttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eTsKKwordHlwZWRlZiBCT09MICgqa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHlfdCkoSEFORExFLCBjb25zdCBHUk9VUF9BRkZJTklUWSAqLCBHUk9VUF9BRkZJTklUWSAqKTsKK2V4dGVybiBrbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90IF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHk7CisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyMgaWYgS01QX1VTRV9IV0xPQworZXh0ZXJuIGh3bG9jX3RvcG9sb2d5X3QgX19rbXBfaHdsb2NfdG9wb2xvZ3k7CitleHRlcm4gaW50IF9fa21wX2h3bG9jX2Vycm9yOworIyBlbmRpZgorCitleHRlcm4gc2l6ZV90IF9fa21wX2FmZmluX21hc2tfc2l6ZTsKKyMgZGVmaW5lIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKF9fa21wX2FmZmluX21hc2tfc2l6ZSA+IDApCisjIGRlZmluZSBLTVBfQUZGSU5JVFlfRElTQUJMRSgpIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwKQorIyBkZWZpbmUgS01QX0FGRklOSVRZX0VOQUJMRShtYXNrX3NpemUpIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSBtYXNrX3NpemUpCisjIGRlZmluZSBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksbWFzaykgXAorICAgIGZvciAoaSA9IChtYXNrKS0+YmVnaW4oKTsgaSAhPSAobWFzayktPmVuZCgpIDsgaSA9IChtYXNrKS0+bmV4dChpKSkKKyMgZGVmaW5lIEtNUF9DUFVfU0VUKGksbWFzaykgKG1hc2spLT5zZXQoaSkKKyMgZGVmaW5lIEtNUF9DUFVfSVNTRVQoaSxtYXNrKSAobWFzayktPmlzX3NldChpKQorIyBkZWZpbmUgS01QX0NQVV9DTFIoaSxtYXNrKSAobWFzayktPmNsZWFyKGkpCisjIGRlZmluZSBLTVBfQ1BVX1pFUk8obWFzaykgKG1hc2spLT56ZXJvKCkKKyMgZGVmaW5lIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpIChkZXN0KS0+Y29weShzcmMpCisjIGRlZmluZSBLTVBfQ1BVX0FORChkZXN0LCBzcmMpIChkZXN0KS0+Yml0d2lzZV9hbmQoc3JjKQorIyBkZWZpbmUgS01QX0NQVV9DT01QTEVNRU5UKG1heF9iaXRfbnVtYmVyLCBtYXNrKSAobWFzayktPmJpdHdpc2Vfbm90KCkKKyMgZGVmaW5lIEtNUF9DUFVfVU5JT04oZGVzdCwgc3JjKSAoZGVzdCktPmJpdHdpc2Vfb3Ioc3JjKQorIyBkZWZpbmUgS01QX0NQVV9BTExPQyhwdHIpIChwdHIgPSBfX2ttcF9hZmZpbml0eV9kaXNwYXRjaC0+YWxsb2NhdGVfbWFzaygpKQorIyBkZWZpbmUgS01QX0NQVV9GUkVFKHB0cikgX19rbXBfYWZmaW5pdHlfZGlzcGF0Y2gtPmRlYWxsb2NhdGVfbWFzayhwdHIpCisjIGRlZmluZSBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKHB0cikgS01QX0NQVV9BTExPQyhwdHIpCisjIGRlZmluZSBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhwdHIpIEtNUF9DUFVfRlJFRShwdHIpCisjIGRlZmluZSBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DKHB0cikgS01QX0NQVV9BTExPQyhwdHIpCisjIGRlZmluZSBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUUocHRyKSBLTVBfQ1BVX0ZSRUUocHRyKQorIyBkZWZpbmUgS01QX0NQVV9JTkRFWChhcnIsaSkgX19rbXBfYWZmaW5pdHlfZGlzcGF0Y2gtPmluZGV4X21hc2tfYXJyYXkoYXJyLCBpKQorIyBkZWZpbmUgS01QX0NQVV9BTExPQ19BUlJBWShhcnIsIG4pIChhcnIgPSBfX2ttcF9hZmZpbml0eV9kaXNwYXRjaC0+YWxsb2NhdGVfbWFza19hcnJheShuKSkKKyMgZGVmaW5lIEtNUF9DUFVfRlJFRV9BUlJBWShhcnIsIG4pIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5kZWFsbG9jYXRlX21hc2tfYXJyYXkoYXJyKQorIyBkZWZpbmUgS01QX0NQVV9JTlRFUk5BTF9BTExPQ19BUlJBWShhcnIsIG4pIEtNUF9DUFVfQUxMT0NfQVJSQVkoYXJyLCBuKQorIyBkZWZpbmUgS01QX0NQVV9JTlRFUk5BTF9GUkVFX0FSUkFZKGFyciwgbikgS01QX0NQVV9GUkVFX0FSUkFZKGFyciwgbikKKyMgZGVmaW5lIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkobWFzaywgYWJvcnRfYm9vbCkgKG1hc2spLT5nZXRfc3lzdGVtX2FmZmluaXR5KGFib3J0X2Jvb2wpCisjIGRlZmluZSBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG1hc2ssIGFib3J0X2Jvb2wpIChtYXNrKS0+c2V0X3N5c3RlbV9hZmZpbml0eShhYm9ydF9ib29sKQorIyBkZWZpbmUgX19rbXBfZ2V0X3Byb2NfZ3JvdXAobWFzaykgKG1hc2spLT5nZXRfcHJvY19ncm91cCgpCisKK2NsYXNzIEtNUEFmZmluaXR5IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBNYXNrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgbik7CisgICAgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHApOworICAgICAgICB2b2lkKiBvcGVyYXRvciBuZXdbXShzaXplX3Qgbik7CisgICAgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCk7CisgICAgICAgIHZpcnR1YWwgfk1hc2soKSB7fQorICAgICAgICAvLyBTZXQgYml0IGkgdG8gMQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KGludCBpKSB7fQorICAgICAgICAvLyBSZXR1cm4gYml0IGkKKyAgICAgICAgdmlydHVhbCBib29sIGlzX3NldChpbnQgaSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgLy8gU2V0IGJpdCBpIHRvIDAKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsZWFyKGludCBpKSB7fQorICAgICAgICAvLyBaZXJvIG91dCBlbnRpcmUgbWFzaworICAgICAgICB2aXJ0dWFsIHZvaWQgemVybygpIHt9CisgICAgICAgIC8vIENvcHkgc3JjIGludG8gdGhpcyBtYXNrCisgICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5KGNvbnN0IE1hc2sqIHNyYykge30KKyAgICAgICAgLy8gdGhpcyAmPSByaHMKKyAgICAgICAgdmlydHVhbCB2b2lkIGJpdHdpc2VfYW5kKGNvbnN0IE1hc2sqIHJocykge30KKyAgICAgICAgLy8gdGhpcyB8PSByaHMKKyAgICAgICAgdmlydHVhbCB2b2lkIGJpdHdpc2Vfb3IoY29uc3QgTWFzayogcmhzKSB7fQorICAgICAgICAvLyB0aGlzID0gfnRoaXMKKyAgICAgICAgdmlydHVhbCB2b2lkIGJpdHdpc2Vfbm90KCkge30KKyAgICAgICAgLy8gQVBJIGZvciBpdGVyYXRpbmcgb3ZlciBhbiBhZmZpbml0eSBtYXNrCisgICAgICAgIC8vIGZvciAoaW50IGkgPSBtYXNrLT5iZWdpbigpOyBpICE9IG1hc2stPmVuZCgpOyBpID0gbWFzay0+bmV4dChpKSkKKyAgICAgICAgdmlydHVhbCBpbnQgYmVnaW4oKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgICAgIHZpcnR1YWwgaW50IGVuZCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICAgICAgdmlydHVhbCBpbnQgbmV4dChpbnQgcHJldmlvdXMpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICAgICAgLy8gU2V0IHRoZSBzeXN0ZW0ncyBhZmZpbml0eSB0byB0aGlzIGFmZmluaXR5IG1hc2sncyB2YWx1ZQorICAgICAgICB2aXJ0dWFsIGludCBzZXRfc3lzdGVtX2FmZmluaXR5KGJvb2wgYWJvcnRfb25fZXJyb3IpIGNvbnN0IHsgcmV0dXJuIC0xOyB9CisgICAgICAgIC8vIFNldCB0aGlzIGFmZmluaXR5IG1hc2sgdG8gdGhlIGN1cnJlbnQgc3lzdGVtIGFmZmluaXR5CisgICAgICAgIHZpcnR1YWwgaW50IGdldF9zeXN0ZW1fYWZmaW5pdHkoYm9vbCBhYm9ydF9vbl9lcnJvcikgeyByZXR1cm4gLTE7IH0KKyAgICAgICAgLy8gT25seSAxIERXT1JEIGluIHRoZSBtYXNrIHNob3VsZCBoYXZlIGFueSBwcm9jcyBzZXQuCisgICAgICAgIC8vIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW5kZXgsIG9yIC0xIGZvciBhbiBpbnZhbGlkIG1hc2suCisgICAgICAgIHZpcnR1YWwgaW50IGdldF9wcm9jX2dyb3VwKCkgY29uc3QgeyByZXR1cm4gLTE7IH0KKyAgICB9OworICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgbik7CisgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCogcCk7CisgICAgLy8gRGV0ZXJtaW5lIGlmIGFmZmluaXR5IGlzIGNhcGFibGUKKyAgICB2aXJ0dWFsIHZvaWQgZGV0ZXJtaW5lX2NhcGFibGUoY29uc3QgY2hhciogZW52X3Zhcikge30KKyAgICAvLyBCaW5kIHRoZSBjdXJyZW50IHRocmVhZCB0byBvcyBwcm9jCisgICAgdmlydHVhbCB2b2lkIGJpbmRfdGhyZWFkKGludCBwcm9jKSB7fQorICAgIC8vIEZhY3RvcnkgZnVuY3Rpb25zIHRvIGFsbG9jYXRlL2RlYWxsb2NhdGUgYSBtYXNrCisgICAgdmlydHVhbCBNYXNrKiBhbGxvY2F0ZV9tYXNrKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorICAgIHZpcnR1YWwgdm9pZCBkZWFsbG9jYXRlX21hc2soTWFzayogbSkgeyB9CisgICAgdmlydHVhbCBNYXNrKiBhbGxvY2F0ZV9tYXNrX2FycmF5KGludCBudW0pIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGVhbGxvY2F0ZV9tYXNrX2FycmF5KE1hc2sqIG0pIHsgfQorICAgIHZpcnR1YWwgTWFzayogaW5kZXhfbWFza19hcnJheShNYXNrKiBtLCBpbnQgaW5kZXgpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgICBzdGF0aWMgdm9pZCBwaWNrX2FwaSgpOworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lfYXBpKCk7CisgICAgZW51bSBhcGlfdHlwZSB7CisgICAgICAgIE5BVElWRV9PUworI2lmIEtNUF9VU0VfSFdMT0MKKyAgICAgICAgLCBIV0xPQworI2VuZGlmCisgICAgfTsKKyAgICB2aXJ0dWFsIGFwaV90eXBlIGdldF9hcGlfdHlwZSgpIGNvbnN0IHsgS01QX0FTU0VSVCgwKTsgcmV0dXJuIE5BVElWRV9PUzsgfTsKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgcGlja2VkX2FwaTsKK307CisKK3R5cGVkZWYgS01QQWZmaW5pdHk6Ok1hc2sga21wX2FmZmluX21hc2tfdDsKK2V4dGVybiBLTVBBZmZpbml0eSogX19rbXBfYWZmaW5pdHlfZGlzcGF0Y2g7CisKKy8vCisvLyBEZWNsYXJlIGxvY2FsIGNoYXIgYnVmZmVycyB3aXRoIHRoaXMgc2l6ZSBmb3IgcHJpbnRpbmcgZGVidWcgYW5kIGluZm8KKy8vIG1lc3NhZ2VzLCB1c2luZyBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKCkuCisvLworI2RlZmluZSBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4gICAgICAgIDEwMjQKKworZW51bSBhZmZpbml0eV90eXBlIHsKKyAgICBhZmZpbml0eV9ub25lID0gMCwKKyAgICBhZmZpbml0eV9waHlzaWNhbCwKKyAgICBhZmZpbml0eV9sb2dpY2FsLAorICAgIGFmZmluaXR5X2NvbXBhY3QsCisgICAgYWZmaW5pdHlfc2NhdHRlciwKKyAgICBhZmZpbml0eV9leHBsaWNpdCwKKyAgICBhZmZpbml0eV9iYWxhbmNlZCwKKyAgICBhZmZpbml0eV9kaXNhYmxlZCwgIC8vIG5vdCB1c2VkIG91dHNpemUgdGhlIGVudiB2YXIgcGFyc2VyCisgICAgYWZmaW5pdHlfZGVmYXVsdAorfTsKKworZW51bSBhZmZpbml0eV9ncmFuIHsKKyAgICBhZmZpbml0eV9ncmFuX2ZpbmUgPSAwLAorICAgIGFmZmluaXR5X2dyYW5fdGhyZWFkLAorICAgIGFmZmluaXR5X2dyYW5fY29yZSwKKyAgICBhZmZpbml0eV9ncmFuX3BhY2thZ2UsCisgICAgYWZmaW5pdHlfZ3Jhbl9ub2RlLAorI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgIC8vCisgICAgLy8gVGhlICJncm91cCIgZ3JhbnVsYXJpdHkgaXNuJ3QgbmVjZXNzc2FyaWx5IGNvYXJzZXIgdGhhbiBhbGwgb2YgdGhlCisgICAgLy8gb3RoZXIgbGV2ZWxzLCBidXQgd2UgcHV0IGl0IGxhc3QgaW4gdGhlIGVudW0uCisgICAgLy8KKyAgICBhZmZpbml0eV9ncmFuX2dyb3VwLAorI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworICAgIGFmZmluaXR5X2dyYW5fZGVmYXVsdAorfTsKKworZW51bSBhZmZpbml0eV90b3BfbWV0aG9kIHsKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2FsbCA9IDAsIC8vIHRyeSBhbGwgKHN1cHBvcnRlZCkgbWV0aG9kcywgaW4gb3JkZXIKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9hcGljaWQsCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF94MmFwaWNpZCwKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvLCAvLyBLTVBfQ1BVSU5GT19GSUxFIGlzIHVzYWJsZSBvbiBXaW5kb3dzKiBPUywgdG9vCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCwKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQsCisjaWYgS01QX1VTRV9IV0xPQworICAgIGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2MsCisjZW5kaWYKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQKK307CisKKyNkZWZpbmUgYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgICAoLTEpCisKK2V4dGVybiBlbnVtIGFmZmluaXR5X3R5cGUgX19rbXBfYWZmaW5pdHlfdHlwZTsgLyogQWZmaW5pdHkgdHlwZSAqLworZXh0ZXJuIGVudW0gYWZmaW5pdHlfZ3JhbiBfX2ttcF9hZmZpbml0eV9ncmFuOyAvKiBBZmZpbml0eSBncmFudWxhcml0eSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVsczsgLyogY29ycmVzcG9uZGluZyBpbnQgdmFsdWUgKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfZHVwczsgLyogQWZmaW5pdHkgZHVwbGljYXRlIG1hc2tzICovCitleHRlcm4gZW51bSBhZmZpbml0eV90b3BfbWV0aG9kIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2Q7CitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IC8qIEFmZmluaXR5ICdjb21wYWN0JyB2YWx1ZSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9vZmZzZXQ7IC8qIEFmZmluaXR5IG9mZnNldCB2YWx1ZSAgKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfdmVyYm9zZTsgLyogV2FzIHZlcmJvc2Ugc3BlY2lmaWVkIGZvciBLTVBfQUZGSU5JVFk/ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzOyAvKiBLTVBfQUZGSU5JVFkgd2FybmluZ3MgZW5hYmxlZCA/ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzazsgLyogUmVzcGVjdCBwcm9jZXNzJyBpbml0aWFsIGFmZmluaXR5IG1hc2s/ICovCitleHRlcm4gY2hhciAqIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0OyAvKiBwcm9jIElEIGxpc3QgKi8KK2V4dGVybiBrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9tYXNrczsKK2V4dGVybiB1bnNpZ25lZCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZChpbnQgd2hpY2gpOworCitleHRlcm4ga21wX2FmZmluX21hc2tfdCAqX19rbXBfYWZmaW5fZnVsbE1hc2s7CitleHRlcm4gY2hhciBjb25zdCAqIF9fa21wX2NwdWluZm9fZmlsZTsKKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vCisvLyBUaGlzIG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB2YWx1ZXMgaW4gb21wLmggISEhCisvLwordHlwZWRlZiBlbnVtIGttcF9wcm9jX2JpbmRfdCB7CisgICAgcHJvY19iaW5kX2ZhbHNlID0gMCwKKyAgICBwcm9jX2JpbmRfdHJ1ZSwKKyAgICBwcm9jX2JpbmRfbWFzdGVyLAorICAgIHByb2NfYmluZF9jbG9zZSwKKyAgICBwcm9jX2JpbmRfc3ByZWFkLAorICAgIHByb2NfYmluZF9pbnRlbCwgICAgLy8gdXNlIEtNUF9BRkZJTklUWSBpbnRlcmZhY2UKKyAgICBwcm9jX2JpbmRfZGVmYXVsdAorfSBrbXBfcHJvY19iaW5kX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9uZXN0ZWRfcHJvY19iaW5kX3QgeworICAgIGttcF9wcm9jX2JpbmRfdCAqYmluZF90eXBlczsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgdXNlZDsKK30ga21wX25lc3RlZF9wcm9jX2JpbmRfdDsKKworZXh0ZXJuIGttcF9uZXN0ZWRfcHJvY19iaW5kX3QgX19rbXBfbmVzdGVkX3Byb2NfYmluZDsKKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorIyAgZGVmaW5lIEtNUF9QTEFDRV9BTEwgICAgICAgKC0xKQorIyAgZGVmaW5lIEtNUF9QTEFDRV9VTkRFRklORUQgKC0yKQorIyBlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlczsKKworCisjaWYgT01QXzQwX0VOQUJMRUQKK3R5cGVkZWYgZW51bSBrbXBfY2FuY2VsX2tpbmRfdCB7CisgICAgY2FuY2VsX25vcmVxID0gMCwKKyAgICBjYW5jZWxfcGFyYWxsZWwgPSAxLAorICAgIGNhbmNlbF9sb29wID0gMiwKKyAgICBjYW5jZWxfc2VjdGlvbnMgPSAzLAorICAgIGNhbmNlbF90YXNrZ3JvdXAgPSA0Cit9IGttcF9jYW5jZWxfa2luZF90OworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKK2V4dGVybiBpbnQgX19rbXBfcGxhY2VfbnVtX3NvY2tldHM7CitleHRlcm4gaW50IF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQ7CitleHRlcm4gaW50IF9fa21wX3BsYWNlX251bV9jb3JlczsKK2V4dGVybiBpbnQgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQ7CitleHRlcm4gaW50IF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9QQUQodHlwZSwgc3opICAgICAoc2l6ZW9mKHR5cGUpICsgKHN6IC0gKChzaXplb2YodHlwZSkgLSAxKSAlIChzeikpIC0gMSkpCisKKy8vCisvLyBXZSBuZWVkIHRvIGF2b2lkIHVzaW5nIC0xIGFzIGEgR1RJRCBhcyArMSBpcyBhZGRlZCB0byB0aGUgZ3RpZAorLy8gd2hlbiBzdG9yaW5nIGl0IGluIGEgbG9jaywgYW5kIHRoZSB2YWx1ZSAwIGlzIHJlc2VydmVkLgorLy8KKyNkZWZpbmUgS01QX0dUSURfRE5FICAgICAgICAgICAgKC0yKSAgICAvKiBEb2VzIG5vdCBleGlzdCAqLworI2RlZmluZSBLTVBfR1RJRF9TSFVURE9XTiAgICAgICAoLTMpICAgIC8qIExpYnJhcnkgaXMgc2h1dHRpbmcgZG93biAqLworI2RlZmluZSBLTVBfR1RJRF9NT05JVE9SICAgICAgICAoLTQpICAgIC8qIE1vbml0b3IgdGhyZWFkIElEICovCisjZGVmaW5lIEtNUF9HVElEX1VOS05PV04gICAgICAgICgtNSkgICAgLyogSXMgbm90IGtub3duICovCisjZGVmaW5lIEtNUF9HVElEX01JTiAgICAgICAgICAgICgtNikgICAgLyogTWluaW1hbCBndGlkIGZvciBsb3cgYm91bmQgY2hlY2sgaW4gREVCVUcgKi8KKworI2RlZmluZSBfX2ttcF9nZXRfZ3RpZCgpICAgICAgICAgICAgICAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKQorI2RlZmluZSBfX2ttcF9lbnRyeV9ndGlkKCkgICAgICAgICAgICAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnKCkKKworI2RlZmluZSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpICAgICAoIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSAwICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRzWyAoZ3RpZCkgXS0+dGgudGhfaW5mby5kcy5kc190aWQgKQorCisjZGVmaW5lIF9fa21wX2dldF90aWQoKSAgICAgICAgICAgICAgICggX19rbXBfdGlkX2Zyb21fZ3RpZCggX19rbXBfZ2V0X2d0aWQoKSApICkKKyNkZWZpbmUgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aWQsdGVhbSkgKCBLTVBfREVCVUdfQVNTRVJUKCAodGlkKSA+PSAwICYmICh0ZWFtKSAhPSBOVUxMICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtIC0+IHQudF90aHJlYWRzWyAodGlkKSBdIC0+IHRoLnRoX2luZm8gLmRzLmRzX2d0aWQgKQorCisjZGVmaW5lIF9fa21wX2dldF90ZWFtKCkgICAgICAgICAgICAgICggX19rbXBfdGhyZWFkc1sgKF9fa21wX2dldF9ndGlkKCkpIF0tPiB0aC50aF90ZWFtICkKKyNkZWZpbmUgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCkgICAgKCBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPj0gMCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc1sgKGd0aWQpIF0tPiB0aC50aF90ZWFtICkKKworI2RlZmluZSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpICAoIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA+PSAwICksIF9fa21wX3RocmVhZHNbIChndGlkKSBdICkKKyNkZWZpbmUgX19rbXBfZ2V0X3RocmVhZCgpICAgICAgICAgICAgKCBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBfX2ttcF9nZXRfZ3RpZCgpICkgKQorCisgICAgLy8gUmV0dXJucyBjdXJyZW50IHRocmVhZCAocG9pbnRlciB0byBrbXBfaW5mb190KS4gSW4gY29udHJhc3QgdG8gX19rbXBfZ2V0X3RocmVhZCgpLCBpdCB3b3JrcworICAgIC8vIHdpdGggcmVnaXN0ZXJlZCBhbmQgbm90LXlldC1yZWdpc3RlcmVkIHRocmVhZHMuCisjZGVmaW5lIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyKSAgICggS01QX0RFQlVHX0FTU0VSVCggKHRocikgIT0gTlVMTCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRociktPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApCisKKy8vIEFUOiBXaGljaCB3YXkgaXMgY29ycmVjdD8KKy8vIEFUOiAxLiBucHJvYyA9IF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisvLyBBVDogMi4gbnByb2MgPSBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX3RlYW1fbnByb2M7CisjZGVmaW5lIF9fa21wX2dldF90ZWFtX251bV90aHJlYWRzKGd0aWQpICggX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYyApCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfVUlOVDY0X01BWCAgICAgICAgICh+KChrbXBfdWludDY0KTE8PCgoc2l6ZW9mKGttcF91aW50NjQpKigxPDwzKSktMSkpKQorCisjZGVmaW5lIEtNUF9NSU5fTlRIICAgICAgICAgICAxCisKKyNpZm5kZWYgS01QX01BWF9OVEgKKyMgIGlmIGRlZmluZWQoUFRIUkVBRF9USFJFQURTX01BWCkgJiYgUFRIUkVBRF9USFJFQURTX01BWCA8IElOVF9NQVgKKyMgICAgZGVmaW5lIEtNUF9NQVhfTlRIICAgICAgICAgIFBUSFJFQURfVEhSRUFEU19NQVgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEtNUF9NQVhfTlRIICAgICAgICAgIElOVF9NQVgKKyMgIGVuZGlmCisjZW5kaWYgLyogS01QX01BWF9OVEggKi8KKworI2lmZGVmIFBUSFJFQURfU1RBQ0tfTUlOCisjIGRlZmluZSBLTVBfTUlOX1NUS1NJWkUgICAgICAgICBQVEhSRUFEX1NUQUNLX01JTgorI2Vsc2UKKyMgZGVmaW5lIEtNUF9NSU5fU1RLU0laRSAgICAgICAgICgoc2l6ZV90KSgzMiAqIDEwMjQpKQorI2VuZGlmCisKKyNkZWZpbmUgS01QX01BWF9TVEtTSVpFICAgICAgICAgICh+KChzaXplX3QpMTw8KChzaXplb2Yoc2l6ZV90KSooMTw8MykpLTEpKSkKKworI2lmIEtNUF9BUkNIX1g4NgorIyBkZWZpbmUgS01QX0RFRkFVTFRfU1RLU0laRSAgICAgKChzaXplX3QpKDIgKiAxMDI0ICogMTAyNCkpCisjZWxpZiBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS1NJWkUgICAgICgoc2l6ZV90KSg0ICogMTAyNCAqIDEwMjQpKQorIyBkZWZpbmUgS01QX0JBQ0tVUF9TVEtTSVpFICAgICAgKChzaXplX3QpKDIgKiAxMDI0ICogMTAyNCkpCisjZWxzZQorIyBkZWZpbmUgS01QX0RFRkFVTFRfU1RLU0laRSAgICAgKChzaXplX3QpKDEwMjQgKiAxMDI0KSkKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9ERUZBVUxUX01BTExPQ19QT09MX0lOQ1IgICAgKChzaXplX3QpICgxMDI0ICogMTAyNCkpCisjZGVmaW5lIEtNUF9NSU5fTUFMTE9DX1BPT0xfSU5DUiAgICAgICAgKChzaXplX3QpICg0ICogMTAyNCkpCisjZGVmaW5lIEtNUF9NQVhfTUFMTE9DX1BPT0xfSU5DUiAgICAgICAgKH4oKHNpemVfdCkxPDwoKHNpemVvZihzaXplX3QpKigxPDwzKSktMSkpKQorCisjZGVmaW5lIEtNUF9NSU5fU1RLT0ZGU0VUICAgICAgICgwKQorI2RlZmluZSBLTVBfTUFYX1NUS09GRlNFVCAgICAgICBLTVBfTUFYX1NUS1NJWkUKKyNpZiBLTVBfT1NfREFSV0lOCisjIGRlZmluZSBLTVBfREVGQVVMVF9TVEtPRkZTRVQgIEtNUF9NSU5fU1RLT0ZGU0VUCisjZWxzZQorIyBkZWZpbmUgS01QX0RFRkFVTFRfU1RLT0ZGU0VUICBDQUNIRV9MSU5FCisjZW5kaWYKKworI2RlZmluZSBLTVBfTUlOX1NUS1BBRERJTkcgICAgICAoMCkKKyNkZWZpbmUgS01QX01BWF9TVEtQQURESU5HICAgICAgKDIgKiAxMDI0ICogMTAyNCkKKworI2RlZmluZSBLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgICAgICgxMDAwKSAgICAvKiBudW1iZXIgb2YgYmxvY2t0aW1lIHVuaXRzIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgS01QX01JTl9CTE9DS1RJTUUgICAgICAgICAgICAoMCkKKyNkZWZpbmUgS01QX01BWF9CTE9DS1RJTUUgICAgICAgICAgICAoSU5UX01BWCkgLyogTXVzdCBiZSB0aGlzIGZvciAiaW5maW5pdGUiIHNldHRpbmcgdGhlIHdvcmsgKi8KKyNkZWZpbmUgS01QX0RFRkFVTFRfQkxPQ0tUSU1FICAgICAgICAoMjAwKSAgICAgLyogIF9fa21wX2Jsb2NrdGltZSBpcyBpbiBtaWxsaXNlY29uZHMgICovCisKKyNpZiBLTVBfVVNFX01PTklUT1IKKyNkZWZpbmUgS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFICAoKHNpemVfdCkoNjQgKiAxMDI0KSkKKyNkZWZpbmUgS01QX01JTl9NT05JVE9SX1dBS0VVUFMgICAgICAoMSkgICAgICAgLyogbWluIG51bWJlciBvZiB0aW1lcyBtb25pdG9yIHdha2VzIHVwIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgS01QX01BWF9NT05JVE9SX1dBS0VVUFMgICAgICAoMTAwMCkgICAgLyogbWF4aW11bSBudW1iZXIgb2YgdGltZXMgbW9uaXRvciBjYW4gd2FrZSB1cCBwZXIgc2Vjb25kICovCisKKy8qIENhbGN1bGF0ZSBuZXcgbnVtYmVyIG9mIG1vbml0b3Igd2FrZXVwcyBmb3IgYSBzcGVjaWZpYyBibG9jayB0aW1lIGJhc2VkIG9uIHByZXZpb3VzIG1vbml0b3Jfd2FrZXVwcyAqLworLyogT25seSBhbGxvdyBpbmNyZWFzaW5nIG51bWJlciBvZiB3YWtldXBzICovCisjZGVmaW5lIEtNUF9XQUtFVVBTX0ZST01fQkxPQ0tUSU1FKGJsb2NrdGltZSwgbW9uaXRvcl93YWtldXBzKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoYmxvY2t0aW1lKSA9PSBLTVBfTUFYX0JMT0NLVElNRSkgPyAobW9uaXRvcl93YWtldXBzKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChibG9ja3RpbWUpID09IEtNUF9NSU5fQkxPQ0tUSU1FKSA/IEtNUF9NQVhfTU9OSVRPUl9XQUtFVVBTIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1vbml0b3Jfd2FrZXVwcykgPiAoS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSIC8gKGJsb2NrdGltZSkpKSA/IChtb25pdG9yX3dha2V1cHMpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUikgLyAoYmxvY2t0aW1lKSApCisKKy8qIENhbGN1bGF0ZSBudW1iZXIgb2YgaW50ZXJ2YWxzIGZvciBhIHNwZWNpZmljIGJsb2NrIHRpbWUgYmFzZWQgb24gbW9uaXRvcl93YWtldXBzICovCisjZGVmaW5lIEtNUF9JTlRFUlZBTFNfRlJPTV9CTE9DS1RJTUUoYmxvY2t0aW1lLCBtb25pdG9yX3dha2V1cHMpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggKGJsb2NrdGltZSkgKyAoS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSIC8gKG1vbml0b3Jfd2FrZXVwcykpIC0gMSApIC8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUiAvIChtb25pdG9yX3dha2V1cHMpKSApCisjZW5kaWYgLy8gS01QX1VTRV9NT05JVE9SCisKKyNkZWZpbmUgS01QX01JTl9TVEFUU0NPTFMgICAgICAgNDAKKyNkZWZpbmUgS01QX01BWF9TVEFUU0NPTFMgICAgICAgNDA5NgorI2RlZmluZSBLTVBfREVGQVVMVF9TVEFUU0NPTFMgICA4MAorCisjZGVmaW5lIEtNUF9NSU5fSU5URVJWQUwgICAgICAgIDAKKyNkZWZpbmUgS01QX01BWF9JTlRFUlZBTCAgICAgICAgKElOVF9NQVgtMSkKKyNkZWZpbmUgS01QX0RFRkFVTFRfSU5URVJWQUwgICAgMAorCisjZGVmaW5lIEtNUF9NSU5fQ0hVTksgICAgICAgICAgIDEKKyNkZWZpbmUgS01QX01BWF9DSFVOSyAgICAgICAgICAgKElOVF9NQVgtMSkKKyNkZWZpbmUgS01QX0RFRkFVTFRfQ0hVTksgICAgICAgMQorCisjZGVmaW5lIEtNUF9NSU5fSU5JVF9XQUlUICAgICAgIDEKKyNkZWZpbmUgS01QX01BWF9JTklUX1dBSVQgICAgICAgKElOVF9NQVgvMikKKyNkZWZpbmUgS01QX0RFRkFVTFRfSU5JVF9XQUlUICAgMjA0OFUKKworI2RlZmluZSBLTVBfTUlOX05FWFRfV0FJVCAgICAgICAxCisjZGVmaW5lIEtNUF9NQVhfTkVYVF9XQUlUICAgICAgIChJTlRfTUFYLzIpCisjZGVmaW5lIEtNUF9ERUZBVUxUX05FWFRfV0FJVCAgIDEwMjRVCisKKyNkZWZpbmUgS01QX0RGTFRfRElTUF9OVU1fQlVGRiAgNworI2RlZmluZSBLTVBfTUFYX09SREVSRUQgICAgICAgICA4CisKKyNkZWZpbmUgS01QX01BWF9GSUVMRFMgICAgICAgICAgMzIKKworI2RlZmluZSBLTVBfTUFYX0JSQU5DSF9CSVRTICAgICAzMQorCisjZGVmaW5lIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCBJTlRfTUFYCisKKyNkZWZpbmUgS01QX01BWF9ERUZBVUxUX0RFVklDRV9MSU1JVCBJTlRfTUFYCisKKyNkZWZpbmUgS01QX01BWF9UQVNLX1BSSU9SSVRZX0xJTUlUIElOVF9NQVgKKworLyogTWluaW11bSBudW1iZXIgb2YgdGhyZWFkcyBiZWZvcmUgc3dpdGNoIHRvIFRMUyBndGlkIChleHBlcmltZW50YWxseSBkZXRlcm1pbmVkKSAqLworLyogam9zaCBUT0RPOiB3aGF0IGFib3V0IE9TIFgqIHR1bmluZz8gKi8KKyNpZiAgIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9UTFNfR1RJRF9NSU4gICAgIDUKKyNlbHNlCisjIGRlZmluZSBLTVBfVExTX0dUSURfTUlOICAgICBJTlRfTUFYCisjZW5kaWYKKworI2RlZmluZSBLTVBfTUFTVEVSX1RJRCh0aWQpICAgICAgKCAodGlkKSA9PSAwICkKKyNkZWZpbmUgS01QX1dPUktFUl9USUQodGlkKSAgICAgICggKHRpZCkgIT0gMCApCisKKyNkZWZpbmUgS01QX01BU1RFUl9HVElEKGd0aWQpICAgICggX19rbXBfdGlkX2Zyb21fZ3RpZCgoZ3RpZCkpID09IDAgKQorI2RlZmluZSBLTVBfV09SS0VSX0dUSUQoZ3RpZCkgICAgKCBfX2ttcF90aWRfZnJvbV9ndGlkKChndGlkKSkgIT0gMCApCisjZGVmaW5lIEtNUF9VQkVSX0dUSUQoZ3RpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGd0aWQpID49IEtNUF9HVElEX01JTiApLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChndGlkKSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKSwgICAgICAgICAgXAorICAgICAgICAoZ3RpZCkgPj0gMCAmJiBfX2ttcF9yb290WyhndGlkKV0gJiYgX19rbXBfdGhyZWFkc1soZ3RpZCldICYmIFwKKyAgICAgICAgKF9fa21wX3RocmVhZHNbKGd0aWQpXSA9PSBfX2ttcF9yb290WyhndGlkKV0tPnIucl91YmVyX3RocmVhZClcCisgICAgKQorI2RlZmluZSBLTVBfSU5JVElBTF9HVElEKGd0aWQpICAgKCAoZ3RpZCkgPT0gMCApCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBGQUxTRSAgIDAKKyNkZWZpbmUgVFJVRSAgICAoISBGQUxTRSkKKyNlbmRpZgorCisvKiBOT1RFOiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgbXVzdCBiZSBldmVuICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgICAgNjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICAgMzJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX0NOSworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgICAgMTZVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICAgIDhVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX0xJTlVYCisjICBkZWZpbmUgS01QX0lOSVRfV0FJVCAgMTAyNFUgICAgICAgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjICBkZWZpbmUgS01QX05FWFRfV0FJVCAgIDUxMlUgICAgICAgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZWxpZiBLTVBfT1NfREFSV0lOCisvKiBUT0RPOiB0dW5lIGZvciBLTVBfT1NfREFSV0lOICovCisjICBkZWZpbmUgS01QX0lOSVRfV0FJVCAgMTAyNFUgICAgICAgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjICBkZWZpbmUgS01QX05FWFRfV0FJVCAgIDUxMlUgICAgICAgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZWxpZiBLTVBfT1NfRlJFRUJTRAorLyogVE9ETzogdHVuZSBmb3IgS01QX09TX0ZSRUVCU0QgKi8KKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAxMDI0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgNTEyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19ORVRCU0QKKy8qIFRPRE86IHR1bmUgZm9yIEtNUF9PU19ORVRCU0QgKi8KKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAxMDI0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgNTEyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAordHlwZWRlZiBzdHJ1Y3Qga21wX2NwdWlkIHsKKyAgICBrbXBfdWludDMyICBlYXg7CisgICAga21wX3VpbnQzMiAgZWJ4OworICAgIGttcF91aW50MzIgIGVjeDsKKyAgICBrbXBfdWludDMyICBlZHg7Cit9IGttcF9jcHVpZF90OworZXh0ZXJuIHZvaWQgX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCBzdHJ1Y3Qga21wX2NwdWlkICpwICk7CisjIGlmIEtNUF9BUkNIX1g4NgorICBleHRlcm4gdm9pZCBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKTsKKyMgZWxpZiBLTVBfTUlDCisgIHN0YXRpYyB2b2lkIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApIHsgX21tX2RlbGF5XzMyKCAxMDAgKTsgfQorIyBlbHNlCisgIHN0YXRpYyB2b2lkIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApIHsgX21tX3BhdXNlKCk7IH0KKyMgZW5kaWYKKyMgZGVmaW5lIEtNUF9DUFVfUEFVU0UoKSBfX2ttcF94ODZfcGF1c2UoKQorI2VsaWYgS01QX0FSQ0hfUFBDNjQKKyMgZGVmaW5lIEtNUF9QUEM2NF9QUklfTE9XKCkgX19hc21fXyB2b2xhdGlsZSAoIm9yIDEsIDEsIDEiKQorIyBkZWZpbmUgS01QX1BQQzY0X1BSSV9NRUQoKSBfX2FzbV9fIHZvbGF0aWxlICgib3IgMiwgMiwgMiIpCisjIGRlZmluZSBLTVBfUFBDNjRfUFJJX0xPQ19NQigpIF9fYXNtX18gdm9sYXRpbGUgKCIiIDogOiA6ICJtZW1vcnkiKQorIyBkZWZpbmUgS01QX0NQVV9QQVVTRSgpIGRvIHsgS01QX1BQQzY0X1BSSV9MT1coKTsgS01QX1BQQzY0X1BSSV9NRUQoKTsgS01QX1BQQzY0X1BSSV9MT0NfTUIoKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBLTVBfQ1BVX1BBVVNFKCkgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNlbmRpZgorCisjZGVmaW5lIEtNUF9JTklUX1lJRUxEKGNvdW50KSAgICAgICAgICAgeyAoY291bnQpID0gX19rbXBfeWllbGRfaW5pdDsgfQorCisjZGVmaW5lIEtNUF9ZSUVMRChjb25kKSAgICAgICAgICAgICAgICAgeyBLTVBfQ1BVX1BBVVNFKCk7IF9fa21wX3lpZWxkKCAoY29uZCkgKTsgfQorCisvLyBOb3RlIHRoZSBkZWNyZW1lbnQgb2YgMiBpbiB0aGUgZm9sbG93aW5nIE1hY3Jvcy4gIFdpdGggS01QX0xJQlJBUlk9dHVybmFyb3VuZCwKKy8vIHRoZXJlIHNob3VsZCBiZSBubyB5aWVsZGluZyBzaW5jZSB0aGUgc3RhcnRpbmcgdmFsdWUgZnJvbSBLTVBfSU5JVF9ZSUVMRCgpIGlzIG9kZC4KKworI2RlZmluZSBLTVBfWUlFTERfV0hFTihjb25kLGNvdW50KSAgICAgIHsgS01QX0NQVV9QQVVTRSgpOyAoY291bnQpIC09IDI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNvdW50KSkgeyBLTVBfWUlFTEQoY29uZCk7IChjb3VudCkgPSBfX2ttcF95aWVsZF9uZXh0OyB9IH0KKyNkZWZpbmUgS01QX1lJRUxEX1NQSU4oY291bnQpICAgICAgICAgICB7IEtNUF9DUFVfUEFVU0UoKTsgKGNvdW50KSAtPTI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNvdW50KSkgeyBLTVBfWUlFTEQoMSk7IChjb3VudCkgPSBfX2ttcF95aWVsZF9uZXh0OyB9IH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBTdXBwb3J0IGRhdGF0eXBlcyBmb3IgdGhlIG9ycGhhbmVkIGNvbnN0cnVjdCBuZXN0aW5nIGNoZWNrcy4gICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIGNvbnNfdHlwZSB7CisgICAgY3Rfbm9uZSwKKyAgICBjdF9wYXJhbGxlbCwKKyAgICBjdF9wZG8sCisgICAgY3RfcGRvX29yZGVyZWQsCisgICAgY3RfcHNlY3Rpb25zLAorICAgIGN0X3BzaW5nbGUsCisKKyAgICAvKiB0aGUgZm9sbG93aW5nIG11c3QgYmUgbGVmdCBpbiBvcmRlciBhbmQgbm90IHNwbGl0IHVwICovCisgICAgY3RfdGFza3EsCisgICAgY3RfdGFzaywgICAgICAgICAgICAgICAgICAgIC8qIHJlYWxseSB0YXNrIGluc2lkZSBub24tb3JkZXJlZCB0YXNrcSwgY29uc2lkZXJlZCBhIHdvcmtzaGFyaW5nIHR5cGUgKi8KKyAgICBjdF90YXNrX29yZGVyZWQsICAgICAgICAgICAgLyogcmVhbGx5IHRhc2sgaW5zaWRlIG9yZGVyZWQgdGFza3EsIGNvbnNpZGVyZWQgYSB3b3Jrc2hhcmluZyB0eXBlICovCisgICAgLyogdGhlIHByZWNlZGluZyBtdXN0IGJlIGxlZnQgaW4gb3JkZXIgYW5kIG5vdCBzcGxpdCB1cCAqLworCisgICAgY3RfY3JpdGljYWwsCisgICAgY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCwKKyAgICBjdF9vcmRlcmVkX2luX3BkbywKKyAgICBjdF9vcmRlcmVkX2luX3Rhc2txLAorICAgIGN0X21hc3RlciwKKyAgICBjdF9yZWR1Y2UsCisgICAgY3RfYmFycmllcgorfTsKKworLyogdGVzdCB0byBzZWUgaWYgd2UgYXJlIGluIGEgdGFza3EgY29uc3RydWN0ICovCisjIGRlZmluZSBJU19DT05TX1RZUEVfVEFTS1EoIGN0ICkgICAgICAgKCAoKGludCkoY3QpKSA+PSAoKGludCljdF90YXNrcSkgJiYgKChpbnQpKGN0KSkgPD0gKChpbnQpY3RfdGFza19vcmRlcmVkKSApCisjIGRlZmluZSBJU19DT05TX1RZUEVfT1JERVJFRCggY3QgKSAgICAgKChjdCkgPT0gY3RfcGRvX29yZGVyZWQgfHwgKGN0KSA9PSBjdF90YXNrX29yZGVyZWQpCisKK3N0cnVjdCBjb25zX2RhdGEgeworICAgIGlkZW50X3QgY29uc3QgICAgICppZGVudDsKKyAgICBlbnVtIGNvbnNfdHlwZSAgICAgdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgcHJldjsKKyAgICBrbXBfdXNlcl9sb2NrX3AgICAgbmFtZTsgICAgLyogYWRkcmVzcyBleGNsdXNpdmVseSBmb3IgY3JpdGljYWwgc2VjdGlvbiBuYW1lIGNvbXBhcmlzb24gKi8KK307CisKK3N0cnVjdCBjb25zX2hlYWRlciB7CisgICAgaW50ICAgICAgICAgICAgICAgICBwX3RvcCwgd190b3AsIHNfdG9wOworICAgIGludCAgICAgICAgICAgICAgICAgc3RhY2tfc2l6ZSwgc3RhY2tfdG9wOworICAgIHN0cnVjdCBjb25zX2RhdGEgICAqc3RhY2tfZGF0YTsKK307CisKK3N0cnVjdCBrbXBfcmVnaW9uX2luZm8geworICAgIGNoYXIgICAgICAgICAgICAgICAgKnRleHQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBvZmZzZXRbS01QX01BWF9GSUVMRFNdOworICAgIGludCAgICAgICAgICAgICAgICAgbGVuZ3RoW0tNUF9NQVhfRklFTERTXTsKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyAgICB0eXBlZGVmIEhBTkRMRSAgICAgICAgICAgICAga21wX3RocmVhZF90OworICAgIHR5cGVkZWYgRFdPUkQgICAgICAgICAgICAgICBrbXBfa2V5X3Q7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworI2lmIEtNUF9PU19VTklYCisgICAgdHlwZWRlZiBwdGhyZWFkX3QgICAgICAgICAgIGttcF90aHJlYWRfdDsKKyAgICB0eXBlZGVmIHB0aHJlYWRfa2V5X3QgICAgICAga21wX2tleV90OworI2VuZGlmCisKK2V4dGVybiBrbXBfa2V5X3QgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXk7CisKK3R5cGVkZWYgc3RydWN0IGttcF9zeXNfaW5mbyB7CisgICAgbG9uZyBtYXhyc3M7ICAgICAgICAgIC8qIHRoZSBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplIHV0aWxpemVkIChpbiBraWxvYnl0ZXMpICAgICAqLworICAgIGxvbmcgbWluZmx0OyAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHdpdGhvdXQgYW55IEkvTyAgICAgICAgKi8KKyAgICBsb25nIG1hamZsdDsgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBwYWdlIGZhdWx0cyBzZXJ2aWNlZCB0aGF0IHJlcXVpcmVkIEkvTyAgICAgICovCisgICAgbG9uZyBuc3dhcDsgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9jZXNzIHdhcyAic3dhcHBlZCIgb3V0IG9mIG1lbW9yeSAqLworICAgIGxvbmcgaW5ibG9jazsgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBpbnB1dCAgKi8KKyAgICBsb25nIG91YmxvY2s7ICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gb3V0cHV0ICovCisgICAgbG9uZyBudmNzdzsgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgdm9sdW50YXJpbHkgICAgICAqLworICAgIGxvbmcgbml2Y3N3OyAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIGZvcmNlZCAgICAgICAgICAgKi8KK30ga21wX3N5c19pbmZvX3Q7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0Cit0eXBlZGVmIHN0cnVjdCBrbXBfY3B1aW5mbyB7CisgICAgaW50ICAgICAgICBpbml0aWFsaXplZDsgIC8vIElmIDAsIG90aGVyIGZpZWxkcyBhcmUgbm90IGluaXRpYWxpemVkLgorICAgIGludCAgICAgICAgc2lnbmF0dXJlOyAgICAvLyBDUFVJRCgxKS5FQVgKKyAgICBpbnQgICAgICAgIGZhbWlseTsgICAgICAgLy8gQ1BVSUQoMSkuRUFYWzI3OjIwXSArIENQVUlEKDEpLkVBWFsxMTo4XSAoIEV4dGVuZGVkIEZhbWlseSArIEZhbWlseSApCisgICAgaW50ICAgICAgICBtb2RlbDsgICAgICAgIC8vICggQ1BVSUQoMSkuRUFYWzE5OjE2XSA8PCA0ICkgKyBDUFVJRCgxKS5FQVhbNzo0XSAoICggRXh0ZW5kZWQgTW9kZWwgPDwgNCApICsgTW9kZWwpCisgICAgaW50ICAgICAgICBzdGVwcGluZzsgICAgIC8vIENQVUlEKDEpLkVBWFszOjBdICggU3RlcHBpbmcgKQorICAgIGludCAgICAgICAgc3NlMjsgICAgICAgICAvLyAwIGlmIFNTRTIgaW5zdHJ1Y3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCAxIG90aGVyd2lzZS4KKyAgICBpbnQgICAgICAgIHJ0bTsgICAgICAgICAgLy8gMCBpZiBSVE0gaW5zdHJ1Y3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCAxIG90aGVyd2lzZS4KKyAgICBpbnQgICAgICAgIGNwdV9zdGFja29mZnNldDsKKyAgICBpbnQgICAgICAgIGFwaWNfaWQ7CisgICAgaW50ICAgICAgICBwaHlzaWNhbF9pZDsKKyAgICBpbnQgICAgICAgIGxvZ2ljYWxfaWQ7CisgICAga21wX3VpbnQ2NCBmcmVxdWVuY3k7ICAgIC8vIE5vbWluYWwgQ1BVIGZyZXF1ZW5jeSBpbiBIei4KKyAgICBjaGFyICAgICAgIG5hbWUgWzMqc2l6ZW9mIChrbXBfY3B1aWRfdCldOyAvLyBDUFVJRCgweDgwMDAwMDAyLDB4ODAwMDAwMDMsMHg4MDAwMDAwNCkKK30ga21wX2NwdWluZm9fdDsKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfVFYKKworc3RydWN0IHR2X3RocmVhZHByaXZhdGUgeworICAgIC8qIFJlY29yZCB0eXBlICMxICovCisgICAgdm9pZCAgICAgICAgKmdsb2JhbF9hZGRyOworICAgIHZvaWQgICAgICAgICp0aHJlYWRfYWRkcjsKK307CisKK3N0cnVjdCB0dl9kYXRhIHsKKyAgICBzdHJ1Y3QgdHZfZGF0YSAgICAgICpuZXh0OworICAgIHZvaWQgICAgICAgICAgICAgICAgKnR5cGU7CisgICAgdW5pb24gdHZfdW5pb24geworICAgICAgICBzdHJ1Y3QgdHZfdGhyZWFkcHJpdmF0ZSB0cDsKKyAgICB9IHU7Cit9OworCitleHRlcm4ga21wX2tleV90IF9fa21wX3R2X2tleTsKKworI2VuZGlmIC8qIEJVSUxEX1RWICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgVVNFX0lUVF9CVUlMRAorLy8gV2UgY2Fubm90IGluY2x1ZGUgImttcF9pdHQuaCIgZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3kuIERlY2xhcmUgdGhlIG9ubHkgcmVxdWlyZWQgdHlwZSBoZXJlLgorLy8gTGF0ZXIgd2Ugd2lsbCBjaGVjayB0aGUgdHlwZSBtZWV0cyByZXF1aXJlbWVudHMuCit0eXBlZGVmIGludCBrbXBfaXR0X21hcmtfdDsKKyNkZWZpbmUgS01QX0lUVF9ERUJVRyAwCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRhc2txIGRhdGEgc3RydWN0dXJlcworICovCisKKyNkZWZpbmUgSElHSF9XQVRFUl9NQVJLKG5zbG90cykgICAgICAgICAoKChuc2xvdHMpICogMykgLyA0KQorI2RlZmluZSBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIICAgICAgICAxICAgICAgLyogbnVtIHRodW5rcyB0aGF0IGVhY2ggdGhyZWFkIGNhbiBzaW11bHRhbmVvdXNseSBleGVjdXRlIGZyb20gYSB0YXNrIHF1ZXVlICovCisKKy8qICBmbGFncyBmb3IgdGFza3FfZ2xvYmFsX2ZsYWdzLCBrbXBfdGFza19xdWV1ZV90IHRxX2ZsYWdzLCBrbXBjX3RodW5rX3QgdGhfZmxhZ3MgICovCisKKyNkZWZpbmUgVFFGX0lTX09SREVSRUQgICAgICAgICAgMHgwMDAxICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgdGFza3Egb3JkZXJlZCAgKi8KKyNkZWZpbmUgVFFGX0lTX0xBU1RQUklWQVRFICAgICAgMHgwMDAyICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgdGFza3Egd2l0aCBsYXN0cHJpdmF0ZSBsaXN0ICAqLworI2RlZmluZSBUUUZfSVNfTk9XQUlUICAgICAgICAgICAweDAwMDQgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCBlbmQgdGFza3Egbm93YWl0ICAqLworI2RlZmluZSBUUUZfSEVVUklTVElDUyAgICAgICAgICAweDAwMDggIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCB1c2UgaGV1cmlzdGljcyB0byBkZWNpZGUgdGFzayBxdWV1ZSBzaXplICAqLworI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMSAweDAwMTAgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgKi8KKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDIgMHgwMDIwICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgICovCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQzIDB4MDA0MCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICAqLworI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVENCAweDAwODAgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgKi8KKworI2RlZmluZSBUUUZfSU5URVJGQUNFX0ZMQUdTICAgICAweDAwZmYgIC8qICBhbGwgdGhlIF9fa21wY190YXNrcSBpbnRlcmZhY2UgZmxhZ3MgICovCisKKyNkZWZpbmUgVFFGX0lTX0xBU1RfVEFTSyAgICAgICAgMHgwMTAwICAvKiAgaW50ZXJuYWwvcmVhZCBieSBpbnN0cnVtZW50YXRpb247IG9ubHkgdXNlZCB3aXRoIFRRRl9JU19MQVNUUFJJVkFURSAgKi8KKyNkZWZpbmUgVFFGX1RBU0tRX1RBU0sgICAgICAgICAgMHgwMjAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk7IHRoaXMgdGh1bmstPnRoX3Rhc2sgaXMgdGhlIHRhc2txX3Rhc2sgICovCisjZGVmaW5lIFRRRl9SRUxFQVNFX1dPUktFUlMgICAgIDB4MDQwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OyBtdXN0IHJlbGVhc2Ugd29ya2VyIHRocmVhZHMgb25jZSBBTlkgcXVldWVkIHRhc2sgZXhpc3RzIChnbG9iYWwpICovCisjZGVmaW5lIFRRRl9BTExfVEFTS1NfUVVFVUVEICAgIDB4MDgwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OyBub3RpZnkgd29ya2VycyB0aGF0IG1hc3RlciBoYXMgZmluaXNoZWQgZW5xdWV1aW5nIHRhc2tzICovCisjZGVmaW5lIFRRRl9QQVJBTExFTF9DT05URVhUICAgIDB4MTAwMCAgLyogIGludGVybmFsIHVzZSBvbmx5OiB0aGlzIHF1ZXVlIGVuY291bnRlcmVkIGluIGEgcGFyYWxsZWwgY29udGV4dDogbm90IHNlcmlhbGl6ZWQgKi8KKyNkZWZpbmUgVFFGX0RFQUxMT0NBVEVEICAgICAgICAgMHgyMDAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk7IHRoaXMgcXVldWUgaXMgb24gdGhlIGZyZWVsaXN0IGFuZCBub3QgaW4gdXNlICovCisKKyNkZWZpbmUgVFFGX0lOVEVSTkFMX0ZMQUdTICAgICAgMHgzZjAwICAvKiAgYWxsIHRoZSBpbnRlcm5hbCB1c2Ugb25seSBmbGFncyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcGNfYWxpZ25lZF9pbnQzMl90IHsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgYWlfZGF0YTsKK30ga21wY19hbGlnbmVkX2ludDMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90IHsKKyAgICBzdHJ1Y3Qga21wY190aHVua190ICAgKnFzX3RodW5rOworfSBrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCB7CisgICAgICAgIC8qIHRhc2sgcXVldWUgbGlua2FnZSBmaWVsZHMgZm9yIG4tYXJ5IHRyZWUgb2YgcXVldWVzIChsb2NrZWQgd2l0aCBnbG9iYWwgdGFza3FfdHJlZV9sY2spICovCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgICAgICAgdHFfbGlua19sY2s7ICAgICAgICAgIC8qICBsb2NrIGZvciBjaGlsZCBsaW5rLCBjaGlsZCBuZXh0L3ByZXYgbGlua3MgYW5kIGNoaWxkIHJlZiBjb3VudHMgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFfcGFyZW50OyAgICAgICAgICAgIC8qICBwb2ludGVyIHRvIHBhcmVudCB0YXNrcSwgbm90IGxvY2tlZCAqLworICAgICAgICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgKnRxX25leHRfZnJlZTsgICAgICAgICAvKiAgZm9yIHRhc2txIGludGVybmFsIGZyZWVsaXN0cywgbG9ja2VkIHdpdGggZ2xvYmFsIHRhc2txX2ZyZWVsaXN0X2xjayAqLworICAgIH0gdHE7CisgICAgdm9sYXRpbGUgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICp0cV9maXJzdF9jaGlsZDsgIC8qICBwb2ludGVyIHRvIGxpbmtlZC1saXN0IG9mIGNoaWxkcmVuLCBsb2NrZWQgYnkgdHEncyB0cV9saW5rX2xjayAqLworICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAgICAgKnRxX25leHRfY2hpbGQ7ICAgICAgICAvKiAgbmV4dCBjaGlsZCBpbiBsaW5rZWQtbGlzdCwgbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrICovCisgICAgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICAgICAqdHFfcHJldl9jaGlsZDsgICAgICAgIC8qICBwcmV2aW91cyBjaGlsZCBpbiBsaW5rZWQtbGlzdCwgbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrICovCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgICAgdHFfcmVmX2NvdW50OyAgICAgICAgIC8qICByZWZlcmVuY2UgY291bnQgb2YgdGhyZWFkcyB3aXRoIGFjY2VzcyB0byB0aGlzIHRhc2sgcXVldWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIChvdGhlciB0aGFuIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBrbXBjX2VuZF90YXNrcSBjYWxsKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrICovCisKKyAgICAgICAgLyogc2hhcmVkIGRhdGEgZm9yIHRhc2sgcXVldWUgKi8KKyAgICBzdHJ1Y3Qga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgICAgKnRxX3NoYXJlZHM7ICAgLyogIHBlci10aHJlYWQgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIG9ubHkgb25lIGFycmF5IGVsZW1lbnQgZXhpc3RzIGZvciBhbGwgYnV0IG91dGVybW9zdCB0YXNrcSAqLworCisgICAgICAgIC8qIGJvb2trZWVwaW5nIGZvciBvcmRlcmVkIHRhc2sgcXVldWUgKi8KKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICAgICB0cV90YXNrbnVtX3F1ZXVpbmc7ICAgLyogIG9yZGVyZWQgdGFzayBudW1iZXIgYXNzaWduZWQgd2hpbGUgcXVldWluZyB0YXNrcyAqLworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICAgICAgIHRxX3Rhc2tudW1fc2VydmluZzsgICAvKiAgb3JkZXJlZCBudW1iZXIgb2YgbmV4dCB0YXNrIHRvIGJlIHNlcnZlZCAoZXhlY3V0ZWQpICovCisKKyAgICAgICAgLyogdGh1bmsgc3RvcmFnZSBtYW5hZ2VtZW50IGZvciB0YXNrIHF1ZXVlICovCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgICAgICAgdHFfZnJlZV90aHVua3NfbGNrOyAgIC8qICBsb2NrIGZvciB0aHVuayBmcmVlbGlzdCBtYW5pcHVsYXRpb24gKi8KKyAgICBzdHJ1Y3Qga21wY190aHVua190ICAgICAgICAgICp0cV9mcmVlX3RodW5rczsgICAgICAgLyogIHRodW5rIGZyZWVsaXN0LCBjaGFpbmVkIHZpYSB0aC50aF9uZXh0X2ZyZWUgICovCisgICAgc3RydWN0IGttcGNfdGh1bmtfdCAgICAgICAgICAqdHFfdGh1bmtfc3BhY2U7ICAgICAgIC8qICBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRodW5rcyBmb3IgdGhpcyB0YXNrIHF1ZXVlICAqLworCisgICAgICAgIC8qIGRhdGEgZmllbGRzIGZvciBxdWV1ZSBpdHNlbGYgKi8KKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgICAgICB0cV9xdWV1ZV9sY2s7ICAgICAgICAgLyogIGxvY2sgZm9yIFtkZV1lbnF1ZXVlIG9wZXJhdGlvbnM6IHRxX3F1ZXVlLCB0cV9oZWFkLCB0cV90YWlsLCB0cV9uZnVsbCAqLworICAgIGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3QgICAgKnRxX3F1ZXVlOyAgICAgICAgICAgICAvKiAgYXJyYXkgb2YgcXVldWUgc2xvdHMgdG8gaG9sZCB0aHVua3MgZm9yIHRhc2tzICovCisgICAgdm9sYXRpbGUgc3RydWN0IGttcGNfdGh1bmtfdCAqdHFfdGFza3Ffc2xvdDsgICAgICAgIC8qICBzcGVjaWFsIHNsb3QgZm9yIHRhc2txIHRhc2sgdGh1bmssIG9jY3VwaWVkIGlmIG5vdCBOVUxMICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX25zbG90czsgICAgICAgICAgICAvKiAgIyBvZiB0cV90aHVua19zcGFjZSB0aHVua3MgYWxsb2MnZCAobm90IGluY2wuIHRxX3Rhc2txX3Nsb3Qgc3BhY2UpICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX2hlYWQ7ICAgICAgICAgICAgICAvKiAgZW5xdWV1ZSBwdXRzIG5leHQgaXRlbSBpbiBoZXJlIChpbmRleCBpbnRvIHRxX3F1ZXVlIGFycmF5KSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX3RhaWw7ICAgICAgICAgICAgICAvKiAgZGVxdWV1ZSB0YWtlcyBuZXh0IGl0ZW0gb3V0IG9mIGhlcmUgKGluZGV4IGludG8gdHFfcXVldWUgYXJyYXkpICovCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgICAgdHFfbmZ1bGw7ICAgICAgICAgICAgIC8qICAjIG9mIG9jY3VwaWVkIGVudHJpZXMgaW4gdGFzayBxdWV1ZSByaWdodCBub3cgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfaGl3YXQ7ICAgICAgICAgICAgIC8qICBoaWdoLXdhdGVyIG1hcmsgZm9yIHRxX25mdWxsIGFuZCBxdWV1ZSBzY2hlZHVsaW5nICAqLworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgICAgICAgIHRxX2ZsYWdzOyAgICAgICAgICAgICAvKiAgVFFGX3h4eCAgKi8KKworICAgICAgICAvKiBib29ra2VlcGluZyBmb3Igb3V0c3RhbmRpbmcgdGh1bmtzICovCisgICAgc3RydWN0IGttcGNfYWxpZ25lZF9pbnQzMl90ICAqdHFfdGhfdGh1bmtzOyAgICAgICAgIC8qICBwZXItdGhyZWFkIGFycmF5IGZvciAjIG9mIHJlZ3VsYXIgdGh1bmtzIGN1cnJlbnRseSBiZWluZyBleGVjdXRlZCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgIHRxX25wcm9jOyAgICAgICAgICAgICAvKiAgbnVtYmVyIG9mIHRodW5rcyBpbiB0aGUgdGhfdGh1bmtzIGFycmF5ICovCisKKyAgICAgICAgLyogc3RhdGlzdGljcyBsaWJyYXJ5IGJvb2trZWVwaW5nICovCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgKnRxX2xvYzsgICAgICAgICAgICAgIC8qICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRhc2txIGRpcmVjdGl2ZSAqLworfSBrbXBjX3Rhc2tfcXVldWVfdDsKKwordHlwZWRlZiB2b2lkICgqa21wY190YXNrX3QpIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwgc3RydWN0IGttcGNfdGh1bmtfdCAqdGh1bmspOworCisvKiAgc2l6ZW9mX3NoYXJlZHMgcGFzc2VkIGFzIGFyZyB0byBfX2ttcGNfdGFza3EgY2FsbCAgKi8KK3R5cGVkZWYgc3RydWN0IGttcGNfc2hhcmVkX3ZhcnNfdCB7ICAgICAgICAgICAgIC8qICBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gKi8KKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICAgICAgICpzdl9xdWV1ZTsKKyAgICAvKiAgKHBvaW50ZXJzIHRvKSBzaGFyZWQgdmFycyAgKi8KK30ga21wY19zaGFyZWRfdmFyc190OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgeworICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBjX3NoYXJlZF92YXJzX3QgICAgICphaV9kYXRhOworfSBrbXBjX2FsaWduZWRfc2hhcmVkX3ZhcnNfdDsKKworLyogIHNpemVvZl90aHVuayBwYXNzZWQgYXMgYXJnIHRvIGttcGNfdGFza3EgY2FsbCAgKi8KK3R5cGVkZWYgc3RydWN0IGttcGNfdGh1bmtfdCB7ICAgICAgICAgICAgICAgICAgIC8qICBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gKi8KKyAgICB1bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBmaWVsZCB1c2VkIGZvciBpbnRlcm5hbCBmcmVlbGlzdHMgdG9vICAqLworICAgICAgICBrbXBjX3NoYXJlZF92YXJzX3QgICp0aF9zaGFyZWRzOworICAgICAgICBzdHJ1Y3Qga21wY190aHVua190ICp0aF9uZXh0X2ZyZWU7ICAgICAgLyogIGZyZWVsaXN0IG9mIGluZGl2aWR1YWwgdGh1bmtzIHdpdGhpbiBxdWV1ZSwgaGVhZCBhdCB0cV9mcmVlX3RodW5rcyAgKi8KKyAgICB9IHRoOworICAgIGttcGNfdGFza190IHRoX3Rhc2s7ICAgICAgICAgICAgICAgICAgICAgICAgLyogIHRhc2txX3Rhc2sgaWYgZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSyAgKi8KKyAgICBzdHJ1Y3Qga21wY190aHVua190ICp0aF9lbmNsX3RodW5rOyAgICAgICAgIC8qICBwb2ludGVyIHRvIGR5bmFtaWNhbGx5IGVuY2xvc2luZyB0aHVuayBvbiB0aGlzIHRocmVhZCdzIGNhbGwgc3RhY2sgKi8KKyAgICBrbXBfaW50MzIgdGhfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBUUUZfeHh4ICh0cV9mbGFncyBpbnRlcmZhY2UgcGx1cyBwb3NzaWJsZSBpbnRlcm5hbCBmbGFncykgICovCisgICAga21wX2ludDMyIHRoX3N0YXR1czsKKyAgICBrbXBfdWludDMyIHRoX3Rhc2tudW07ICAgICAgICAgICAgICAgICAgICAgIC8qICB0YXNrIG51bWJlciBhc3NpZ25lZCBpbiBvcmRlciBvZiBxdWV1aW5nLCB1c2VkIGZvciBvcmRlcmVkIHNlY3Rpb25zICovCisgICAgLyogIHByaXZhdGUgdmFycyAgKi8KK30ga21wY190aHVua190OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wX3Rhc2txIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHRxX2N1cnJfdGh1bmtfY2FwYWNpdHk7CisKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgKnRxX3Jvb3Q7CisgICAga21wX2ludDMyICAgICAgICAgICB0cV9nbG9iYWxfZmxhZ3M7CisKKyAgICBrbXBfbG9ja190ICAgICAgICAgIHRxX2ZyZWVsaXN0X2xjazsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgKnRxX2ZyZWVsaXN0OworCisgICAga21wY190aHVua190ICAgICAgKip0cV9jdXJyX3RodW5rOworfSBrbXBfdGFza3FfdDsKKworLyogRU5EIFRhc2txIGRhdGEgc3RydWN0dXJlcyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYga21wX2ludDMyIGttcF9jcml0aWNhbF9uYW1lWzhdOworCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitUaGUgdHlwZSBmb3IgYSBtaWNyb3Rhc2sgd2hpY2ggZ2V0cyBwYXNzZWQgdG8gQHJlZiBfX2ttcGNfZm9ya19jYWxsKCkuCitUaGUgYXJndW1lbnRzIHRvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbiBhcmUKK0BwYXJhbSBnbG9iYWxfdGlkIHRoZSBnbG9iYWwgdGhyZWFkIGlkZW50aXR5IG9mIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbi4KK0BwYXJhbSBib3VuZF90aWQgIHRoZSBsb2NhbCBpZGVudGl0aXkgb2YgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uCitAcGFyYW0gLi4uIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgdGhlIGZ1bmN0aW9uLgorKi8KK3R5cGVkZWYgdm9pZCAoKmttcGNfbWljcm8pICAgICAgICAgICAgICAoIGttcF9pbnQzMiAqIGdsb2JhbF90aWQsIGttcF9pbnQzMiAqIGJvdW5kX3RpZCwgLi4uICk7Cit0eXBlZGVmIHZvaWQgKCprbXBjX21pY3JvX2JvdW5kKSAgICAgICAgKCBrbXBfaW50MzIgKiBib3VuZF90aWQsIGttcF9pbnQzMiAqIGJvdW5kX250aCwgLi4uICk7CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorQHsKKyovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFRocmVhZHByaXZhdGUgaW5pdGlhbGl6YXRpb24vZmluYWxpemF0aW9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworCisvKiAgZm9yIG5vbi1hcnJheSBvYmplY3RzOiAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXIoKSAgKi8KKworLyohCisgUG9pbnRlciB0byB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyovCit0eXBlZGVmIHZvaWQgKigqa21wY19jdG9yKSAgICAodm9pZCAqKTsKKworLyohCisgUG9pbnRlciB0byB0aGUgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KKyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorKi8KK3R5cGVkZWYgdm9pZCAoKmttcGNfZHRvcikgICAgICh2b2lkICogLyosIHNpemVfdCAqLyk7IC8qIDJuZCBhcmc6IG1hZ2ljIG51bWJlciBmb3IgS0NDIHVudXNlZCBieSBJbnRlbCBjb21waWxlciAqLworLyohCisgUG9pbnRlciB0byBhbiBhbHRlcm5hdGUgY29uc3RydWN0b3IuCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIuCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY2N0b3IpICAgKHZvaWQgKiwgdm9pZCAqKTsKKworLyogIGZvciBhcnJheSBvYmplY3RzOiBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMoKSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgYXJnOiAidGhpcyIgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMYXN0IGFyZzogbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICovCisvKiEKKyBBcnJheSBjb25zdHJ1Y3Rvci4KKyBGaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisgU2Vjb25kIGFyZ3VtZW50IHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMuCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY3Rvcl92ZWMpICAodm9pZCAqLCBzaXplX3QpOworLyohCisgUG9pbnRlciB0byB0aGUgYXJyYXkgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KKyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorIFNlY29uZCBhcmd1bWVudCB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzLgorKi8KK3R5cGVkZWYgdm9pZCAoKmttcGNfZHRvcl92ZWMpICAgKHZvaWQgKiwgc2l6ZV90KTsKKy8qIQorIEFycmF5IGNvbnN0cnVjdG9yLgorIEZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyBUaGlyZCBhcmd1bWVudCB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzLgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2NjdG9yX3ZlYykgKHZvaWQgKiwgdm9pZCAqLCBzaXplX3QpOyAvKiBmdW5jdGlvbiB1bnVzZWQgYnkgY29tcGlsZXIgKi8KKworLyohCitAfQorKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoga2VlcHMgdHJhY2tlZCBvZiB0aHJlYWRwcml2YXRlIGNhY2hlIGFsbG9jYXRpb25zIGZvciBjbGVhbnVwIGxhdGVyICovCit0eXBlZGVmIHN0cnVjdCBrbXBfY2FjaGVkX2FkZHIgeworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKiphZGRyOyAgICAgICAgICAgLyogYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGUgKi8KKyAgICBzdHJ1Y3Qga21wX2NhY2hlZF9hZGRyICAgICAqbmV4dDsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBjYWNoZWQgYWRkcmVzcyAqLworfSBrbXBfY2FjaGVkX2FkZHJfdDsKKworc3RydWN0IHByaXZhdGVfZGF0YSB7CisgICAgc3RydWN0IHByaXZhdGVfZGF0YSAqbmV4dDsgICAgICAgICAgLyogVGhlIG5leHQgZGVzY3JpcHRvciBpbiB0aGUgbGlzdCAgICAgICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAqZGF0YTsgICAgICAgICAgLyogVGhlIGRhdGEgYnVmZmVyIGZvciB0aGlzIGRlc2NyaXB0b3IgICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgbW9yZTsgICAgICAgICAgLyogVGhlIHJlcGVhdCBjb3VudCBmb3IgdGhpcyBkZXNjcmlwdG9yICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAgLyogVGhlIGRhdGEgc2l6ZSBmb3IgdGhpcyBkZXNjcmlwdG9yICAgICovCit9OworCitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24geworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAgICAgKm5leHQ7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICAgICAqbGluazsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpnYmxfYWRkcjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpwYXJfYWRkcjsgICAgICAgIC8qIHBhcl9hZGRyID09IGdibF9hZGRyIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgY21uX3NpemU7Cit9OworCitzdHJ1Y3Qgc2hhcmVkX2NvbW1vbgoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICAgICAgKm5leHQ7CisgICAgc3RydWN0IHByaXZhdGVfZGF0YSAgICAgICAqcG9kX2luaXQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqb2JqX2luaXQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZ2JsX2FkZHI7CisgICAgdW5pb24geworICAgICAgICBrbXBjX2N0b3IgICAgICAgICAgICAgIGN0b3I7CisgICAgICAgIGttcGNfY3Rvcl92ZWMgICAgICAgICAgY3RvcnY7CisgICAgfSBjdDsKKyAgICB1bmlvbiB7CisgICAgICAgIGttcGNfY2N0b3IgICAgICAgICAgICAgY2N0b3I7CisgICAgICAgIGttcGNfY2N0b3JfdmVjICAgICAgICAgY2N0b3J2OworICAgIH0gY2N0OworICAgIHVuaW9uIHsKKyAgICAgICAga21wY19kdG9yICAgICAgICAgICAgICBkdG9yOworICAgICAgICBrbXBjX2R0b3JfdmVjICAgICAgICAgIGR0b3J2OworICAgIH0gZHQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgdmVjX2xlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBpc192ZWM7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgY21uX3NpemU7Cit9OworCisjZGVmaW5lIEtNUF9IQVNIX1RBQkxFX0xPRzIgICAgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9nMiBvZiB0aGUgaGFzaCB0YWJsZSBzaXplICovCisjZGVmaW5lIEtNUF9IQVNIX1RBQkxFX1NJWkUgICAgICgxIDw8IEtNUF9IQVNIX1RBQkxFX0xPRzIpICAgICAgLyogc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSAqLworI2RlZmluZSBLTVBfSEFTSF9TSElGVCAgICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocm93IGF3YXkgdGhpcyBtYW55IGxvdyBiaXRzIGZyb20gdGhlIGFkZHJlc3MgKi8KKyNkZWZpbmUgS01QX0hBU0goeCkgICAgICAgICAgICAgKCgoKGttcF91aW50cHRyX3QpIHgpID4+IEtNUF9IQVNIX1NISUZUKSAmIChLTVBfSEFTSF9UQUJMRV9TSVpFLTEpKQorCitzdHJ1Y3QgY29tbW9uX3RhYmxlIHsKKyAgICBzdHJ1Y3QgIHByaXZhdGVfY29tbW9uICAgICAgKmRhdGFbIEtNUF9IQVNIX1RBQkxFX1NJWkUgXTsKK307CisKK3N0cnVjdCBzaGFyZWRfdGFibGUgeworICAgIHN0cnVjdCAgc2hhcmVkX2NvbW1vbiAgICAgICAqZGF0YVsgS01QX0hBU0hfVEFCTEVfU0laRSBdOworfTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMiB7CisgICAga21wX2ludDMyIGNvdW50OworICAgIGttcF9pbnQzMiB1YjsKKyAgICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAgICBrbXBfaW50MzIgbGI7CisgICAga21wX2ludDMyIHN0OworICAgIGttcF9pbnQzMiB0YzsKKyAgICBrbXBfaW50MzIgc3RhdGljX3N0ZWFsX2NvdW50ZXI7IC8qIGZvciBzdGF0aWNfc3RlYWwgb25seTsgbWF5YmUgYmV0dGVyIHRvIHB1dCBhZnRlciB1YiAqLworCisgICAgLy8gS01QX0FMSUdOKCAxNiApIGVuc3VyZXMgKCBpZiB0aGUgS01QX0FMSUdOIG1hY3JvIGlzIHR1cm5lZCBvbiApCisgICAgLy8gICAgYSkgcGFybTMgaXMgcHJvcGVybHkgYWxpZ25lZCBhbmQKKyAgICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgICAvLyBCZWNhdXNlIG9mIHBhcm0xLTQgYXJlIHVzZWQgdG9nZXRoZXIsIHBlcmZvcm1hbmNlIHNlZW1zIHRvIGJlIGJldHRlcgorICAgIC8vIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGxpbmUgKG5vdCBtZWFzdXJlZCB0aG91Z2gpLgorCisgICAgc3RydWN0IEtNUF9BTElHTiggMzIgKSB7IC8vIEFDOiBjaGFuZ2VkIDE2IHRvIDMyIGluIG9yZGVyIHRvIHNpbXBsaWZ5IHRlbXBsYXRlCisgICAgICAgIGttcF9pbnQzMiBwYXJtMTsgICAgIC8vICAgICBzdHJ1Y3R1cmVzIGluIGttcF9kaXNwYXRjaC5jcHAuIFRoaXMgc2hvdWxkCisgICAgICAgIGttcF9pbnQzMiBwYXJtMjsgICAgIC8vICAgICBtYWtlIG5vIHJlYWwgY2hhbmdlIGF0IGxlYXN0IHdoaWxlIHBhZGRpbmcgaXMgb2ZmLgorICAgICAgICBrbXBfaW50MzIgcGFybTM7CisgICAgICAgIGttcF9pbnQzMiBwYXJtNDsKKyAgICB9OworCisgICAga21wX3VpbnQzMiBvcmRlcmVkX2xvd2VyOworICAgIGttcF91aW50MzIgb3JkZXJlZF91cHBlcjsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIC8vIFRoaXMgdmFyIGNhbiBiZSBwbGFjZWQgaW4gdGhlIGhvbGUgYmV0d2VlbiAndGMnIGFuZCAncGFybTEnLCBpbnN0ZWFkIG9mICdzdGF0aWNfc3RlYWxfY291bnRlcicuCisgICAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZWFzdXJlIGV4ZWN1dGlvbiB0aW1lcy4KKyAgICAvLyBDb25kaXRpb25hbCBpZi9lbmRpZiBjYW4gYmUgcmVtb3ZlZCBhdCBhbGwuCisgICAga21wX2ludDMyIGxhc3RfdXBwZXI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0IHsKKyAgICBrbXBfaW50NjQgY291bnQ7ICAgLyogY3VycmVudCBjaHVuayBudW1iZXIgZm9yIHN0YXRpYyBhbmQgc3RhdGljLXN0ZWFsIHNjaGVkdWxpbmcqLworICAgIGttcF9pbnQ2NCB1YjsgICAgICAvKiB1cHBlci1ib3VuZCAqLworICAgIC8qIEFkZGluZyBLTVBfQUxJR05fQ0FDSEUgaGVyZSBkb2Vzbid0IGhlbHAgLyBjYW4gaHVydCBwZXJmb3JtYW5jZSAqLworICAgIGttcF9pbnQ2NCBsYjsgICAgICAvKiBsb3dlci1ib3VuZCAqLworICAgIGttcF9pbnQ2NCBzdDsgICAgICAvKiBzdHJpZGUgKi8KKyAgICBrbXBfaW50NjQgdGM7ICAgICAgLyogdHJpcCBjb3VudCAobnVtYmVyIG9mIGl0ZXJhdGlvbnMpICovCisgICAga21wX2ludDY0IHN0YXRpY19zdGVhbF9jb3VudGVyOyAvKiBmb3Igc3RhdGljX3N0ZWFsIG9ubHk7IG1heWJlIGJldHRlciB0byBwdXQgYWZ0ZXIgdWIgKi8KKworICAgIC8qIHBhcm1bMS00XSBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cyBieSBkaWZmZXJlbnQgc2NoZWR1bGluZyBhbGdvcml0aG1zICovCisKKyAgICAvLyBLTVBfQUxJR04oIDMyICkgZW5zdXJlcyAoIGlmIHRoZSBLTVBfQUxJR04gbWFjcm8gaXMgdHVybmVkIG9uICkKKyAgICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAgIC8vICAgIGIpIGFsbCBwYXJtMS00IGFyZSBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICAgIC8vIEJlY2F1c2Ugb2YgcGFybTEtNCBhcmUgdXNlZCB0b2dldGhlciwgcGVyZm9ybWFuY2Ugc2VlbXMgdG8gYmUgYmV0dGVyCisgICAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgICBzdHJ1Y3QgS01QX0FMSUdOKCAzMiApIHsKKyAgICAgICAga21wX2ludDY0IHBhcm0xOworICAgICAgICBrbXBfaW50NjQgcGFybTI7CisgICAgICAgIGttcF9pbnQ2NCBwYXJtMzsKKyAgICAgICAga21wX2ludDY0IHBhcm00OworICAgIH07CisKKyAgICBrbXBfdWludDY0IG9yZGVyZWRfbG93ZXI7CisgICAga21wX3VpbnQ2NCBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgLy8gVGhpcyB2YXIgY2FuIGJlIHBsYWNlZCBpbiB0aGUgaG9sZSBiZXR3ZWVuICd0YycgYW5kICdwYXJtMScsIGluc3RlYWQgb2YgJ3N0YXRpY19zdGVhbF9jb3VudGVyJy4KKyAgICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWVzLgorICAgIC8vIENvbmRpdGlvbmFsIGlmL2VuZGlmIGNhbiBiZSByZW1vdmVkIGF0IGFsbC4KKyAgICBrbXBfaW50NjQgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90OworI2Vsc2UgLyogS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICovCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvMzIgeworICAgIGttcF9pbnQzMiBsYjsKKyAgICBrbXBfaW50MzIgdWI7CisgICAga21wX2ludDMyIHN0OworICAgIGttcF9pbnQzMiB0YzsKKworICAgIGttcF9pbnQzMiBwYXJtMTsKKyAgICBrbXBfaW50MzIgcGFybTI7CisgICAga21wX2ludDMyIHBhcm0zOworICAgIGttcF9pbnQzMiBwYXJtNDsKKworICAgIGttcF9pbnQzMiBjb3VudDsKKworICAgIGttcF91aW50MzIgb3JkZXJlZF9sb3dlcjsKKyAgICBrbXBfdWludDMyIG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBrbXBfaW50MzIgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMl90OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjQgeworICAgIGttcF9pbnQ2NCBsYjsgICAgICAvKiBsb3dlci1ib3VuZCAqLworICAgIGttcF9pbnQ2NCB1YjsgICAgICAvKiB1cHBlci1ib3VuZCAqLworICAgIGttcF9pbnQ2NCBzdDsgICAgICAvKiBzdHJpZGUgKi8KKyAgICBrbXBfaW50NjQgdGM7ICAgICAgLyogdHJpcCBjb3VudCAobnVtYmVyIG9mIGl0ZXJhdGlvbnMpICovCisKKyAgICAvKiBwYXJtWzEtNF0gYXJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXMgYnkgZGlmZmVyZW50IHNjaGVkdWxpbmcgYWxnb3JpdGhtcyAqLworICAgIGttcF9pbnQ2NCBwYXJtMTsKKyAgICBrbXBfaW50NjQgcGFybTI7CisgICAga21wX2ludDY0IHBhcm0zOworICAgIGttcF9pbnQ2NCBwYXJtNDsKKworICAgIGttcF9pbnQ2NCBjb3VudDsgICAvKiBjdXJyZW50IGNodW5rIG51bWJlciBmb3Igc3RhdGljIHNjaGVkdWxpbmcgKi8KKworICAgIGttcF91aW50NjQgb3JkZXJlZF9sb3dlcjsKKyAgICBrbXBfdWludDY0IG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBrbXBfaW50NjQgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90OworI2VuZGlmIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvIHsKKyAgICB1bmlvbiBwcml2YXRlX2luZm8geworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm8zMl90ICBwMzI7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3QgIHA2NDsKKyAgICB9IHU7CisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlOyAgLyogc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KKyAgICBrbXBfaW50MzIgICAgICAgb3JkZXJlZDsgICAvKiBvcmRlcmVkIGNsYXVzZSBzcGVjaWZpZWQgKi8KKyAgICBrbXBfaW50MzIgICAgICAgb3JkZXJlZF9idW1wZWQ7CisgICAga21wX2ludDMyICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtM107IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorICAgIHN0cnVjdCBkaXNwYXRjaF9wcml2YXRlX2luZm8gKiBuZXh0OyAvKiBzdGFjayBvZiBidWZmZXJzIGZvciBuZXN0IG9mIHNlcmlhbCByZWdpb25zICovCisgICAga21wX2ludDMyICAgICAgIG5vbWVyZ2U7ICAgLyogZG9uJ3QgbWVyZ2UgaXRlcnMgaWYgc2VyaWFsaXplZCAqLworICAgIGttcF9pbnQzMiAgICAgICB0eXBlX3NpemU7IC8qIHRoZSBzaXplIG9mIHR5cGVzIGluIHByaXZhdGVfaW5mbyAqLworICAgIGVudW0gY29uc190eXBlICBwdXNoZWRfd3M7Cit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mbzMyIHsKKyAgICAvKiBjaHVuayBpbmRleCB1bmRlciBkeW5hbWljLCBudW1iZXIgb2YgaWRsZSB0aHJlYWRzIHVuZGVyIHN0YXRpYy1zdGVhbDsKKyAgICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgIGl0ZXJhdGlvbjsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgbnVtX2RvbmU7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgIG9yZGVyZWRfaXRlcmF0aW9uOworICAgIGttcF9pbnQzMiAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTFdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKK30gZGlzcGF0Y2hfc2hhcmVkX2luZm8zMl90OworCit0eXBlZGVmIHN0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mbzY0IHsKKyAgICAvKiBjaHVuayBpbmRleCB1bmRlciBkeW5hbWljLCBudW1iZXIgb2YgaWRsZSB0aHJlYWRzIHVuZGVyIHN0YXRpYy1zdGVhbDsKKyAgICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgIGl0ZXJhdGlvbjsKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgbnVtX2RvbmU7CisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgIG9yZGVyZWRfaXRlcmF0aW9uOworICAgIGttcF9pbnQ2NCAgIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVELTNdOyAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKK30gZGlzcGF0Y2hfc2hhcmVkX2luZm82NF90OworCit0eXBlZGVmIHN0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mbyB7CisgICAgdW5pb24gc2hhcmVkX2luZm8geworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mbzMyX3QgIHMzMjsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm82NF90ICBzNjQ7CisgICAgfSB1OworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIGJ1ZmZlcl9pbmRleDsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgIGRvYWNyb3NzX2J1Zl9pZHg7ICAvLyB0ZWFtd2lzZSBpbmRleAorICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgKmRvYWNyb3NzX2ZsYWdzOyAgICAvLyBzaGFyZWQgYXJyYXkgb2YgaXRlcmF0aW9uIGZsYWdzICgwLzEpCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgZG9hY3Jvc3NfbnVtX2RvbmU7IC8vIGNvdW50IGZpbmlzaGVkIHRocmVhZHMKKyNlbmRpZgorI2lmIEtNUF9VU0VfSFdMT0MKKyAgICAvLyBXaGVuIGxpbmtpbmcgd2l0aCBsaWJod2xvYywgdGhlIE9SREVSRUQgRVBDQyB0ZXN0IHNsb3dzIGRvd24gb24gYmlnCisgICAgLy8gbWFjaGluZXMgKD4gNDggY29yZXMpLiBQZXJmb3JtYW5jZSBhbmFseXNpcyBzaG93ZWQgdGhhdCBhIGNhY2hlIHRocmFzaAorICAgIC8vIHdhcyBvY2N1cnJpbmcgYW5kIHRoaXMgcGFkZGluZyBoZWxwcyBhbGxldmlhdGUgdGhlIHByb2JsZW0uCisgICAgY2hhciBwYWRkaW5nWzY0XTsKKyNlbmRpZgorfSBkaXNwYXRjaF9zaGFyZWRfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBrbXBfZGlzcCB7CisgICAgLyogVmVjdG9yIGZvciBPUkRFUkVEIFNFQ1RJT04gKi8KKyAgICB2b2lkICgqdGhfZGVvX2ZjbikoIGludCAqIGd0aWQsIGludCAqIGNpZCwgaWRlbnRfdCAqKTsKKyAgICAvKiBWZWN0b3IgZm9yIEVORCBPUkRFUkVEIFNFQ1RJT04gKi8KKyAgICB2b2lkICgqdGhfZHhvX2ZjbikoIGludCAqIGd0aWQsIGludCAqIGNpZCwgaWRlbnRfdCAqKTsKKworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QgICp0aF9kaXNwYXRjaF9zaF9jdXJyZW50OworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICp0aF9kaXNwYXRjaF9wcl9jdXJyZW50OworCisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKnRoX2Rpc3BfYnVmZmVyOworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICB0aF9kaXNwX2luZGV4OworI2lmIE9NUF80NV9FTkFCTEVECisgICAga21wX2ludDMyICAgICAgICAgICAgICAgIHRoX2RvYWNyb3NzX2J1Zl9pZHg7IC8vIHRocmVhZCdzIGRvYWNyb3NzIGJ1ZmZlciBpbmRleAorICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICp0aF9kb2Fjcm9zc19mbGFnczsgICAvLyBwb2ludGVyIHRvIHNoYXJlZCBhcnJheSBvZiBmbGFncworICAgIHVuaW9uIHsgLy8gd2UgY2FuIHVzZSB1bmlvbiBoZXJlIGJlY2F1c2UgZG9hY3Jvc3MgY2Fubm90IGJlIHVzZWQgaW4gbm9ubW9ub3RvbmljIGxvb3BzCisgICAgICAgIGttcF9pbnQ2NCAgICAgICAgICAgKnRoX2RvYWNyb3NzX2luZm87ICAgIC8vIGluZm8gb24gbG9vcCBib3VuZHMKKyAgICAgICAga21wX2xvY2tfdCAgICAgICAgICAqdGhfc3RlYWxfbG9jazsgICAgICAgLy8gbG9jayB1c2VkIGZvciBjaHVuayBzdGVhbGluZyAoOC1ieXRlIHZhcmlhYmxlKQorICAgIH07CisjZWxzZQorI2lmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgICp0aF9zdGVhbF9sb2NrOyAgICAgICAvLyBsb2NrIHVzZWQgZm9yIGNodW5rIHN0ZWFsaW5nICg4LWJ5dGUgdmFyaWFibGUpCisgICAgdm9pZCogZHVtbXlfcGFkZGluZ1sxXTsgLy8gbWFrZSBpdCA2NCBieXRlcyBvbiBJbnRlbChSKSA2NAorI2Vsc2UKKyAgICB2b2lkKiBkdW1teV9wYWRkaW5nWzJdOyAvLyBtYWtlIGl0IDY0IGJ5dGVzIG9uIEludGVsKFIpIDY0CisjZW5kaWYKKyNlbmRpZgorI2lmIEtNUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVAorICAgIGNoYXIgbW9yZV9wYWRkaW5nW0lOVEVSTk9ERV9DQUNIRV9MSU5FXTsKKyNlbmRpZgorfSBrbXBfZGlzcF90OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBCYXJyaWVyIHN0dWZmICovCisKKy8qIGNvbnN0YW50cyBmb3IgYmFycmllciBzdGF0ZSB1cGRhdGUgKi8KKyNkZWZpbmUgS01QX0lOSVRfQkFSUklFUl9TVEFURSAgMCAgICAgICAvKiBzaG91bGQgcHJvYmFibHkgc3RhcnQgZnJvbSB6ZXJvICovCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NMRUVQX0JJVCAgIDAgICAgICAgLyogYml0IHVzZWQgZm9yIHN1c3BlbmQvc2xlZXAgcGFydCBvZiBzdGF0ZSAqLworI2RlZmluZSBLTVBfQkFSUklFUl9VTlVTRURfQklUICAxICAgICAgIC8qIGJpdCB0aGF0IG11c3QgbmV2ZXIgYmUgc2V0IGZvciB2YWxpZCBzdGF0ZSAqLworI2RlZmluZSBLTVBfQkFSUklFUl9CVU1QX0JJVCAgICAyICAgICAgIC8qIGxzYiB1c2VkIGZvciBidW1wIG9mIGdvL2Fycml2ZWQgc3RhdGUgKi8KKworI2RlZmluZSBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSAgICAgICAgICgxIDw8IEtNUF9CQVJSSUVSX1NMRUVQX0JJVCkKKyNkZWZpbmUgS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFICAgICAgICAoMSA8PCBLTVBfQkFSUklFUl9VTlVTRURfQklUKQorI2RlZmluZSBLTVBfQkFSUklFUl9TVEFURV9CVU1QICAgICAgICAgICgxIDw8IEtNUF9CQVJSSUVSX0JVTVBfQklUKQorCisjaWYgKEtNUF9CQVJSSUVSX1NMRUVQX0JJVCA+PSBLTVBfQkFSUklFUl9CVU1QX0JJVCkKKyMgZXJyb3IgIkJhcnJpZXIgc2xlZXAgYml0IG11c3QgYmUgc21hbGxlciB0aGFuIGJhcnJpZXIgYnVtcCBiaXQiCisjZW5kaWYKKyNpZiAoS01QX0JBUlJJRVJfVU5VU0VEX0JJVCA+PSBLTVBfQkFSUklFUl9CVU1QX0JJVCkKKyMgZXJyb3IgIkJhcnJpZXIgdW51c2VkIGJpdCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBiYXJyaWVyIGJ1bXAgYml0IgorI2VuZGlmCisKKy8vIENvbnN0YW50cyBmb3IgcmVsZWFzZSBiYXJyaWVyIHdhaXQgc3RhdGU6IGN1cnJlbnRseSwgaGllcmFyY2hpY2FsIG9ubHkKKyNkZWZpbmUgS01QX0JBUlJJRVJfTk9UX1dBSVRJTkcgICAgICAgIDAgIC8vIE5vcm1hbCBzdGF0ZTsgd29ya2VyIG5vdCBpbiB3YWl0X3NsZWVwCisjZGVmaW5lIEtNUF9CQVJSSUVSX09XTl9GTEFHICAgICAgICAgICAxICAvLyBOb3JtYWwgc3RhdGU7IHdvcmtlciB3YWl0aW5nIG9uIG93biBiX2dvIGZsYWcgaW4gcmVsZWFzZQorI2RlZmluZSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyAgICAgICAgMiAgLy8gU3BlY2lhbCBzdGF0ZTsgd29ya2VyIHdhaXRpbmcgb24gcGFyZW50J3MgYl9nbyBmbGFnIGluIHJlbGVhc2UKKyNkZWZpbmUgS01QX0JBUlJJRVJfU1dJVENIX1RPX09XTl9GTEFHIDMgIC8vIFNwZWNpYWwgc3RhdGU7IHRlbGxzIHdvcmtlciB0byBzaGlmdCBmcm9tIHBhcmVudCB0byBvd24gYl9nbworI2RlZmluZSBLTVBfQkFSUklFUl9TV0lUQ0hJTkcgICAgICAgICAgNCAgLy8gU3BlY2lhbCBzdGF0ZTsgd29ya2VyIHJlc2V0cyBhcHByb3ByaWF0ZSBmbGFnIG9uIHdha2UtdXAKKworZW51bSBiYXJyaWVyX3R5cGUgeworICAgIGJzX3BsYWluX2JhcnJpZXIgPSAwLCAgICAgICAvKiAwLCBBbGwgbm9uLWZvcmsvam9pbiBiYXJyaWVycyAoZXhjZXB0IHJlZHVjdGlvbiBiYXJyaWVycyBpZiBlbmFibGVkKSAqLworICAgIGJzX2Zvcmtqb2luX2JhcnJpZXIsICAgICAgICAvKiAxLCBBbGwgZm9yay9qb2luIChwYXJhbGxlbCByZWdpb24pIGJhcnJpZXJzICovCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIGJzX3JlZHVjdGlvbl9iYXJyaWVyLCAgIC8qIDIsIEFsbCBiYXJyaWVycyB0aGF0IGFyZSB1c2VkIGluIHJlZHVjdGlvbiAqLworICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIGJzX2xhc3RfYmFycmllciAgICAgICAgICAgICAvKiBKdXN0IGEgcGxhY2Vob2xkZXIgdG8gbWFyayB0aGUgZW5kICovCit9OworCisvLyB0byB3b3JrIHdpdGggcmVkdWN0aW9uIGJhcnJpZXJzIGp1c3QgbGlrZSB3aXRoIHBsYWluIGJhcnJpZXJzCisjaWYgIUtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgI2RlZmluZSBic19yZWR1Y3Rpb25fYmFycmllciBic19wbGFpbl9iYXJyaWVyCisjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKwordHlwZWRlZiBlbnVtIGttcF9iYXJfcGF0IHsgICAgICAvKiBCYXJyaWVyIGNvbW11bmljYXRpb24gcGF0dGVybnMgKi8KKyAgICBicF9saW5lYXJfYmFyID0gMCwgICAgICAgICAgLyogU2luZ2xlIGxldmVsIChkZWdlbmVyYXRlKSB0cmVlICovCisgICAgYnBfdHJlZV9iYXIgPSAxLCAgICAgICAgICAgIC8qIEJhbGFuY2VkIHRyZWUgd2l0aCBicmFuY2hpbmcgZmFjdG9yIDJebiAqLworICAgIGJwX2h5cGVyX2JhciA9IDIsICAgICAgICAgICAvKiBIeXBlcmN1YmUtZW1iZWRkZWQgdHJlZSB3aXRoIG1pbiBicmFuY2hpbmcgZmFjdG9yIDJebiAqLworICAgIGJwX2hpZXJhcmNoaWNhbF9iYXIgPSAzLCAgICAvKiBNYWNoaW5lIGhpZXJhcmNoeSB0cmVlICovCisgICAgYnBfbGFzdF9iYXIgPSA0ICAgICAgICAgICAgIC8qIFBsYWNlaG9sZGVyIHRvIG1hcmsgdGhlIGVuZCAqLworfSBrbXBfYmFyX3BhdF9lOworCisjIGRlZmluZSBLTVBfQkFSUklFUl9JQ1ZfUFVTSCAgIDEKKworLyogUmVjb3JkIGZvciBob2xkaW5nIHRoZSB2YWx1ZXMgb2YgdGhlIGludGVybmFsIGNvbnRyb2xzIHN0YWNrIHJlY29yZHMgKi8KK3R5cGVkZWYgc3RydWN0IGttcF9pbnRlcm5hbF9jb250cm9sIHsKKyAgICBpbnQgICAgICAgICAgIHNlcmlhbF9uZXN0aW5nX2xldmVsOyAgLyogY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB0aF90ZWFtX3NlcmlhbGl6ZWQgZmllbGQgKi8KKyAgICBrbXBfaW50OCAgICAgIG5lc3RlZDsgICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgbmVzdGVkIHBhcmFsbGVsaXNtIChwZXIgdGhyZWFkKSAqLworICAgIGttcF9pbnQ4ICAgICAgZHluYW1pYzsgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBkeW5hbWljIGFkanVzdG1lbnQgb2YgdGhyZWFkcyAocGVyIHRocmVhZCkgKi8KKyAgICBrbXBfaW50OCAgICAgIGJ0X3NldDsgICAgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3Igd2hldGhlciBibG9ja3RpbWUgaXMgZXhwbGljaXRseSBzZXQgKi8KKyAgICBpbnQgICAgICAgICAgIGJsb2NrdGltZTsgICAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lICovCisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgaW50ICAgICAgICAgICBidF9pbnRlcnZhbHM7ICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZSBpbnRlcnZhbHMgKi8KKyNlbmRpZgorICAgIGludCAgICAgICAgICAgbnByb2M7ICAgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciAjdGhyZWFkcyBmb3IgbmV4dCBwYXJhbGxlbCByZWdpb24gKHBlciB0aHJlYWQpICovCisgICAgaW50ICAgICAgICAgICBtYXhfYWN0aXZlX2xldmVsczsgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIG1heF9hY3RpdmVfbGV2ZWxzICovCisgICAga21wX3Jfc2NoZWRfdCBzY2hlZDsgICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIHJ1bnRpbWUgc2NoZWR1bGUge3NjaGVkLGNodW5rfSBwYWlyICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kOyAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYWZmaW5pdHkgICovCisgICAga21wX2ludDMyICAgICAgIGRlZmF1bHRfZGV2aWNlOyAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGRlZmF1bHQgZGV2aWNlICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyAgICBzdHJ1Y3Qga21wX2ludGVybmFsX2NvbnRyb2wgKm5leHQ7Cit9IGttcF9pbnRlcm5hbF9jb250cm9sX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY29weV9pY3ZzKCBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpkc3QsIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKnNyYyApIHsKKyAgICAqZHN0ID0gKnNyYzsKK30KKworLyogVGhyZWFkIGJhcnJpZXIgbmVlZHMgdm9sYXRpbGUgYmFycmllciBmaWVsZHMgKi8KK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfYnN0YXRlIHsKKyAgICAvLyB0aF9maXhlZF9pY3ZzIGlzIGFsaWduZWQgYnkgdmlydHVlIG9mIGttcF9ic3RhdGUgYmVpbmcgYWxpZ25lZCAoYW5kIGFsbCB1c2VzIG9mIGl0KS4KKyAgICAvLyBJdCBpcyBub3QgZXhwbGljaXRseSBhbGlnbmVkIGJlbG93LCBiZWNhdXNlIHdlICpkb24ndCogd2FudCBpdCB0byBiZSBwYWRkZWQgLS0gaW5zdGVhZCwKKyAgICAvLyB3ZSBmaXQgYl9nbyBpbnRvIHRoZSBzYW1lIGNhY2hlIGxpbmUgd2l0aCB0aF9maXhlZF9pY3ZzLCBlbmFibGluZyBOR08gY2FjaGUgbGluZXMKKyAgICAvLyBzdG9yZXMgaW4gdGhlIGhpZXJhcmNoaWNhbCBiYXJyaWVyLgorICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgdGhfZml4ZWRfaWN2czsgICAgICAgICAgLy8gSW5pdGlhbCBJQ1ZzIGZvciB0aGUgdGhyZWFkCisgICAgLy8gVHVjayBiX2dvIGludG8gZW5kIG9mIHRoX2ZpeGVkX2ljdnMgY2FjaGUgbGluZSwgc28gaXQgY2FuIGJlIHN0b3JlZCB3aXRoIHNhbWUgTkdPIHN0b3JlCisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCBiX2dvOyAgICAgICAgICAgICAgICAgICAgICAvLyBTVEFURSA9PiB0YXNrIHNob3VsZCBwcm9jZWVkIChoaWVyYXJjaGljYWwpCisgICAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlIGttcF91aW50NjQgYl9hcnJpdmVkOyAvLyBTVEFURSA9PiB0YXNrIHJlYWNoZWQgc3luY2ggcG9pbnQuCisgICAga21wX3VpbnQzMiAqc2tpcF9wZXJfbGV2ZWw7CisgICAga21wX3VpbnQzMiBteV9sZXZlbDsKKyAgICBrbXBfaW50MzIgcGFyZW50X3RpZDsKKyAgICBrbXBfaW50MzIgb2xkX3RpZDsKKyAgICBrbXBfdWludDMyIGRlcHRoOworICAgIHN0cnVjdCBrbXBfYnN0YXRlICpwYXJlbnRfYmFyOworICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX3VpbnQ2NCBsZWFmX3N0YXRlOworICAgIGttcF91aW50MzIgbnByb2M7CisgICAga21wX3VpbnQ4IGJhc2VfbGVhZl9raWRzOworICAgIGttcF91aW50OCBsZWFmX2tpZHM7CisgICAga21wX3VpbnQ4IG9mZnNldDsKKyAgICBrbXBfdWludDggd2FpdF9mbGFnOworICAgIGttcF91aW50OCB1c2Vfb25jb3JlX2JhcnJpZXI7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgdGhlIGRlYnVnZ2VyIHNvbGVseS4gT25seSB0aGUgd29ya2VyIHRocmVhZCBpdHNlbGYgYWNjZXNzZXMgdGhpcworICAgIC8vIGZpZWxkOiB0aGUgd29ya2VyIGluY3JlYXNlcyBpdCBieSAxIHdoZW4gaXQgYXJyaXZlcyB0byBhIGJhcnJpZXIuCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF91aW50IGJfd29ya2VyX2Fycml2ZWQ7CisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCit9IGttcF9ic3RhdGVfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9iYXJyaWVyX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgYl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICBiX3BhZFsgS01QX1BBRChrbXBfYnN0YXRlX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2JzdGF0ZV90IGJiOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfYmFycmllcl91bmlvbiBrbXBfYmFsaWduX3Q7CisKKy8qIFRlYW0gYmFycmllciBuZWVkcyBvbmx5IG5vbi12b2xhdGlsZSBhcnJpdmVkIGNvdW50ZXIgKi8KK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfYmFycmllcl90ZWFtX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgYl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICBiX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHN0cnVjdCB7CisgICAgICAgIGttcF91aW50NjQgICBiX2Fycml2ZWQ7ICAgICAgIC8qIFNUQVRFID0+IHRhc2sgcmVhY2hlZCBzeW5jaCBwb2ludC4gKi8KKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB0d28gZmllbGRzIGFyZSBpbmRlbmRlZCBmb3IgdGhlIGRlYnVnZ2VyIHNvbGVseS4gT25seSBtYXN0ZXIgb2YgdGhlIHRlYW0gYWNjZXNzZXMKKyAgICAgICAgLy8gdGhlc2UgZmllbGRzOiB0aGUgZmlyc3Qgb25lIGlzIGluY3JlYXNlZCBieSAxIHdoZW4gbWFzdGVyIGFycml2ZXMgdG8gYSBiYXJyaWVyLCB0aGUKKyAgICAgICAgLy8gc2Vjb25kIG9uZSBpcyBpbmNyZWFzZWQgYnkgb25lIHdoZW4gYWxsIHRoZSB0aHJlYWRzIGFycml2ZWQuCisgICAgICAgIGttcF91aW50ICAgICBiX21hc3Rlcl9hcnJpdmVkOworICAgICAgICBrbXBfdWludCAgICAgYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICB9OworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfYmFycmllcl90ZWFtX3VuaW9uIGttcF9iYWxpZ25fdGVhbV90OworCisvKgorICogUGFkZGluZyBmb3IgTGludXgqIE9TIHB0aHJlYWRzIGNvbmRpdGlvbiB2YXJpYWJsZXMgYW5kIG11dGV4ZXMgdXNlZCB0byBzaWduYWwKKyAqIHRocmVhZHMgd2hlbiBhIGNvbmRpdGlvbiBjaGFuZ2VzLiAgVGhpcyBpcyB0byB3b3JrYXJvdW5kIGFuIE5QVEwgYnVnCisgKiB3aGVyZSBwYWRkaW5nIHdhcyBhZGRlZCB0byBwdGhyZWFkX2NvbmRfdCB3aGljaCBjYXVzZWQgdGhlIGluaXRpYWxpemF0aW9uCisgKiByb3V0aW5lIHRvIHdyaXRlIG91dHNpZGUgb2YgdGhlIHN0cnVjdHVyZSBpZiBjb21waWxlZCBvbiBwcmUtTlBUTCB0aHJlYWRzLgorICovCisKKyNpZiBLTVBfT1NfV0lORE9XUwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX211dGV4Cit7CisgICAgLyogVGhlIExvY2sgKi8KKyAgICBDUklUSUNBTF9TRUNUSU9OIGNzOworfSBrbXBfd2luMzJfbXV0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX2NvbmQKK3sKKyAgICAvKiBDb3VudCBvZiB0aGUgbnVtYmVyIG9mIHdhaXRlcnMuICovCisgICAgaW50IHdhaXRlcnNfY291bnRfOworCisgICAgLyogU2VyaWFsaXplIGFjY2VzcyB0byA8d2FpdGVyc19jb3VudF8+ICovCisgICAga21wX3dpbjMyX211dGV4X3Qgd2FpdGVyc19jb3VudF9sb2NrXzsKKworICAgIC8qIE51bWJlciBvZiB0aHJlYWRzIHRvIHJlbGVhc2UgdmlhIGEgPGNvbmRfYnJvYWRjYXN0PiBvciBhICovCisgICAgLyogPGNvbmRfc2lnbmFsPiAqLworICAgIGludCByZWxlYXNlX2NvdW50XzsKKworICAgIC8qIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50ICJnZW5lcmF0aW9uIiBzbyB0aGF0IHdlIGRvbid0IGFsbG93ICovCisgICAgLyogb25lIHRocmVhZCB0byBzdGVhbCBhbGwgdGhlICJyZWxlYXNlcyIgZnJvbSB0aGUgYnJvYWRjYXN0LiAqLworICAgIGludCB3YWl0X2dlbmVyYXRpb25fY291bnRfOworCisgICAgLyogQSBtYW51YWwtcmVzZXQgZXZlbnQgdGhhdCdzIHVzZWQgdG8gYmxvY2sgYW5kIHJlbGVhc2Ugd2FpdGluZyAqLworICAgIC8qIHRocmVhZHMuICovCisgICAgSEFORExFIGV2ZW50XzsKK30ga21wX3dpbjMyX2NvbmRfdDsKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9jb25kX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGNfYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBjX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHB0aHJlYWRfY29uZF90ICAgICAgY19jb25kOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfY29uZF91bmlvbiBrbXBfY29uZF9hbGlnbl90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX211dGV4X3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIG1fYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBtX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHB0aHJlYWRfbXV0ZXhfdCAgICAgbV9tdXRleDsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX211dGV4X3VuaW9uIGttcF9tdXRleF9hbGlnbl90OworCisjZW5kaWYgLyogS01QX09TX1VOSVggKi8KKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Rlc2NfYmFzZSB7CisgICAgdm9pZCAgICAqZHNfc3RhY2tiYXNlOworICAgIHNpemVfdCAgICAgICAgICAgIGRzX3N0YWNrc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgICBkc19zdGFja2dyb3c7CisgICAga21wX3RocmVhZF90ICAgICAgZHNfdGhyZWFkOworICAgIHZvbGF0aWxlIGludCAgICAgIGRzX3RpZDsKKyAgICBpbnQgICAgICAgICAgICAgICBkc19ndGlkOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgdm9sYXRpbGUgaW50ICAgICAgZHNfYWxpdmU7CisgICAgRFdPUkQgICAgICAgICAgICAgZHNfdGhyZWFkX2lkOworICAgICAgICAvKgorICAgICAgICAgICAgZHNfdGhyZWFkIGtlZXBzIHRocmVhZCBoYW5kbGUgb24gV2luZG93cyogT1MuIEl0IGlzIGVub3VnaCBmb3IgUlRMIHB1cnBvc2VzLiBIb3dldmVyLAorICAgICAgICAgICAgZGVidWdnZXIgc3VwcG9ydCAobGlib21wX2RiKSBjYW5ub3Qgd29yayB3aXRoIGhhbmRsZXMsIGJlY2F1c2UgdGhleSB1bmNvbXBhcmFibGUuIEZvcgorICAgICAgICAgICAgZXhhbXBsZSwgZGVidWdnZXIgcmVxdWVzdHMgaW5mbyBhYm91dCB0aHJlYWQgd2l0aCBoYW5kbGUgaC4gaCBpcyB2YWxpZCB3aXRoaW4gZGVidWdnZXIKKyAgICAgICAgICAgIHByb2Nlc3MsIGFuZCBtZWFuaW5nbGVzcyB3aXRoaW4gZGVidWdlZSBwcm9jZXNzLiBFdmVuIGlmIGggaXMgZHVwZWQgYnkgY2FsbCB0bworICAgICAgICAgICAgRHVwbGljYXRlSGFuZGxlKCksIHNvIHRoZSByZXN1bHQgaCcgaXMgdmFsaWQgd2l0aGluIGRlYnVnZWUgcHJvY2VzcywgYnV0IGl0IGlzIGEgKm5ldyoKKyAgICAgICAgICAgIGhhbmRsZSB3aGljaCBkb2VzICpub3QqIGVxdWFsIHRvIGFueSBvdGhlciBoYW5kbGUgaW4gZGVidWdlZS4uLiBUaGUgb25seSB3YXkgdG8KKyAgICAgICAgICAgIGNvbXBhcmUgaGFuZGxlcyBpcyBjb252ZXJ0IHRoZW0gdG8gc3lzdGVtLXdpZGUgaWRzLiBHZXRUaHJlYWRJZCgpIGZ1bmN0aW9uIGlzCisgICAgICAgICAgICBhdmFpbGFibGUgb25seSBpbiBMb25naG9ybiBhbmQgU2VydmVyIDIwMDMuIDotKCBJbiBjb250cmFzdCwgR2V0Q3VycmVudFRocmVhZElkKCkgaXMKKyAgICAgICAgICAgIGF2YWlsYWJsZSBvbiBhbGwgV2luZG93cyogT1MgZmxhdm91cnMgKGluY2x1ZGluZyBXaW5kb3dzKiA5NSkuIFRodXMsIHdlIGhhdmUgdG8gZ2V0IHRocmVhZCBpZCBieQorICAgICAgICAgICAgY2FsbCB0byBHZXRDdXJyZW50VGhyZWFkSWQoKSBmcm9tIHdpdGhpbiB0aGUgdGhyZWFkIGFuZCBzYXZlIGl0IHRvIGxldCBsaWJvbXBfZGIKKyAgICAgICAgICAgIGlkZW50aWZ5IHRocmVhZHMuCisgICAgICAgICovCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30ga21wX2Rlc2NfYmFzZV90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZGVzYyB7CisgICAgZG91YmxlICAgICAgICAgICBkc19hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgZHNfcGFkWyBLTVBfUEFEKGttcF9kZXNjX2Jhc2VfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfZGVzY19iYXNlX3QgIGRzOworfSBrbXBfZGVzY190OworCisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NhbCB7CisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICB0aGlzX2NvbnN0cnVjdDsgLyogY291bnQgb2Ygc2luZ2xlJ3MgZW5jb3VudGVyZWQgYnkgdGhyZWFkICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICpyZWR1Y2VfZGF0YTsKKyNpZiBLTVBfVVNFX0JHRVQKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKmJnZXRfZGF0YTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKmJnZXRfbGlzdDsKKyNpZiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgIGJnZXRfbG9jazsgICAgICAvKiBMb2NrIGZvciBhY2Nlc3NpbmcgYmdldCBmcmVlIGxpc3QgKi8KKyNlbHNlCisgICAga21wX2Jvb3RzdHJhcF9sb2NrX3QgICBiZ2V0X2xvY2s7ICAgICAgLyogTG9jayBmb3IgYWNjZXNzaW5nIGJnZXQgZnJlZSBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTXVzdCBiZSBib290c3RyYXAgbG9jayBzbyB3ZSBjYW4gdXNlIGl0IGF0IGxpYnJhcnkgc2h1dGRvd24gKi8KKyNlbmRpZiAvKiBVU0VfTE9DS19GT1JfQkdFVCAqLworI2VuZGlmIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisjZW5kaWYgLyogS01QX1VTRV9CR0VUICovCisKKyNpZmRlZiBCVUlMRF9UVgorICAgIHN0cnVjdCB0dl9kYXRhICAgICAgICAqdHZfZGF0YTsKKyNlbmRpZgorCisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsgLyogc3RvcmVkIGJ5IF9fa21wY19yZWR1Y2UqKCksIHVzZWQgYnkgX19rbXBjX2VuZF9yZWR1Y2UqKCkgKi8KKworfSBrbXBfbG9jYWxfdDsKKworI2RlZmluZSBLTVBfQ0hFQ0tfVVBEQVRFKGEsIGIpIGlmICgoYSkgIT0gKGIpKSAoYSkgPSAoYikKKyNkZWZpbmUgS01QX0NIRUNLX1VQREFURV9TWU5DKGEsIGIpIGlmICgoYSkgIT0gKGIpKSBUQ1dfU1lOQ19QVFIoKGEpLCAoYikpCisKKyNkZWZpbmUgZ2V0X19ibG9ja3RpbWUoIHh0ZWFtLCB4dGlkICkgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYmxvY2t0aW1lKQorI2RlZmluZSBnZXRfX2J0X3NldCggeHRlYW0sIHh0aWQgKSAgICAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9zZXQpCisjaWYgS01QX1VTRV9NT05JVE9SCisjZGVmaW5lIGdldF9fYnRfaW50ZXJ2YWxzKCB4dGVhbSwgeHRpZCApICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJ0X2ludGVydmFscykKKyNlbmRpZgorCisjZGVmaW5lIGdldF9fbmVzdGVkXzIoeHRlYW0seHRpZCkgICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5lc3RlZCkKKyNkZWZpbmUgZ2V0X19keW5hbWljXzIoeHRlYW0seHRpZCkgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYykKKyNkZWZpbmUgZ2V0X19ucHJvY18yKHh0ZWFtLHh0aWQpICAgICAgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MpCisjZGVmaW5lIGdldF9fc2NoZWRfMih4dGVhbSx4dGlkKSAgICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkKQorCisjZGVmaW5lIHNldF9fYmxvY2t0aW1lX3RlYW0oIHh0ZWFtLCB4dGlkLCB4dmFsICkgXAorICAgICAgICAoICggKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJsb2NrdGltZSApICAgID0gKHh2YWwpICkKKworI2lmIEtNUF9VU0VfTU9OSVRPUgorI2RlZmluZSBzZXRfX2J0X2ludGVydmFsc190ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgKCAoICh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9pbnRlcnZhbHMgKSA9ICh4dmFsKSApCisjZW5kaWYKKworI2RlZmluZSBzZXRfX2J0X3NldF90ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgKCAoICh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9zZXQgKSAgICAgICA9ICh4dmFsKSApCisKKworI2RlZmluZSBzZXRfX25lc3RlZCggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5lc3RlZCApID0gKHh2YWwpICkKKyNkZWZpbmUgZ2V0X19uZXN0ZWQoIHh0aHJlYWQgKSBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5uZXN0ZWQgKSA/IChGVE5fVFJVRSkgOiAoRlROX0ZBTFNFKSApCisKKyNkZWZpbmUgc2V0X19keW5hbWljKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYyApID0gKHh2YWwpICkKKyNkZWZpbmUgZ2V0X19keW5hbWljKCB4dGhyZWFkICkgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYyApID8gKEZUTl9UUlVFKSA6IChGVE5fRkFMU0UpICkKKworI2RlZmluZSBzZXRfX25wcm9jKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgKSA9ICh4dmFsKSApCisKKyNkZWZpbmUgc2V0X19tYXhfYWN0aXZlX2xldmVscyggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzICkgPSAoeHZhbCkgKQorCisjZGVmaW5lIHNldF9fc2NoZWQoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZCApID0gKHh2YWwpICkKKworI2lmIE9NUF80MF9FTkFCTEVECisKKyNkZWZpbmUgc2V0X19wcm9jX2JpbmQoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kICkgPSAoeHZhbCkgKQorI2RlZmluZSBnZXRfX3Byb2NfYmluZCggeHRocmVhZCApIFwKKyAgICAgICAgKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgKQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIE9wZW5NUCB0YXNraW5nIGRhdGEgc3RydWN0dXJlcworLy8KKwordHlwZWRlZiBlbnVtIGttcF90YXNraW5nX21vZGUgeworICAgIHRza21faW1tZWRpYXRlX2V4ZWMgPSAwLAorICAgIHRza21fZXh0cmFfYmFycmllciA9IDEsCisgICAgdHNrbV90YXNrX3RlYW1zID0gMiwKKyAgICB0c2ttX21heCA9IDIKK30ga21wX3Rhc2tpbmdfbW9kZV90OworCitleHRlcm4ga21wX3Rhc2tpbmdfbW9kZV90IF9fa21wX3Rhc2tpbmdfbW9kZTsgICAgICAgICAvKiBkZXRlcm1pbmVzIGhvdy93aGVuIHRvIGV4ZWN1dGUgdGFza3MgKi8KK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50OworI2lmIE9NUF80MF9FTkFCTEVECisgICAgZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9kZWZhdWx0X2RldmljZTsgLy8gU2V0IHZpYSBPTVBfREVGQVVMVF9ERVZJQ0UgaWYgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAwIG90aGVyd2lzZQorI2VuZGlmCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBleHRlcm4ga21wX2ludDMyIF9fa21wX21heF90YXNrX3ByaW9yaXR5OyAvLyBTZXQgdmlhIE9NUF9NQVhfVEFTS19QUklPUklUWSBpZiBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIDAgb3RoZXJ3aXNlCisjZW5kaWYKKworLyogTk9URToga21wX3Rhc2tkYXRhX3QgYW5kIGttcF90YXNrX3Qgc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gc2luZ2xlIGJsb2NrIHdpdGggdGFza2RhdGEgZmlyc3QgKi8KKyNkZWZpbmUgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgICAgICgoKGttcF90YXNrZGF0YV90ICopIHRhc2spIC0gMSkKKyNkZWZpbmUgS01QX1RBU0tEQVRBX1RPX1RBU0sodGFza2RhdGEpIChrbXBfdGFza190ICopICh0YXNrZGF0YSArIDEpCisKKy8vIFRoZSB0dF9mb3VuZF90YXNrcyBmbGFnIGlzIGEgc2lnbmFsIHRvIGFsbCB0aHJlYWRzIGluIHRoZSB0ZWFtIHRoYXQgdGFza3Mgd2VyZSBzcGF3bmVkIGFuZAorLy8gcXVldWVkIHNpbmNlIHRoZSBwcmV2aW91cyBiYXJyaWVyIHJlbGVhc2UuCisjZGVmaW5lIEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtKSBcCisgICAgKFRDUl9TWU5DXzQoKHRhc2tfdGVhbSktPnR0LnR0X2ZvdW5kX3Rhc2tzKSA9PSBUUlVFKQorLyohCitAaW5ncm91cCBCQVNJQ19UWVBFUworQHsKKyovCisKKy8qIQorICovCit0eXBlZGVmIGttcF9pbnQzMiAoKiBrbXBfcm91dGluZV9lbnRyeV90KSgga21wX2ludDMyLCB2b2lkICogKTsKKworI2lmIE9NUF80MF9FTkFCTEVEIHx8IE9NUF80NV9FTkFCTEVECit0eXBlZGVmIHVuaW9uIGttcF9jbXBscmRhdGEgeworI2lmIE9NUF80NV9FTkFCTEVECisgICAga21wX2ludDMyICAgICAgICAgICBwcmlvcml0eTsgICAgICAgICAgIC8qKjwgcHJpb3JpdHkgc3BlY2lmaWVkIGJ5IHVzZXIgZm9yIHRoZSB0YXNrICovCisjZW5kaWYgLy8gT01QXzQ1X0VOQUJMRUQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgZGVzdHJ1Y3RvcnM7ICAgICAgICAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uIHRvIGludm9rZSBkZWNvbnN0cnVjdG9ycyBvZiBmaXJzdHByaXZhdGUgQysrIG9iamVjdHMgKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorICAgIC8qIGZ1dHVyZSBkYXRhICovCit9IGttcF9jbXBscmRhdGFfdDsKKyNlbmRpZgorCisvKiAgc2l6ZW9mX2ttcF90YXNrX3QgcGFzc2VkIGFzIGFyZyB0byBrbXBjX29tcF90YXNrIGNhbGwgICovCisvKiEKKyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2sgeyAgICAgICAgICAgICAgICAgICAvKiBHRUg6IFNob3VsZG4ndCB0aGlzIGJlIGFsaWduZWQgc29tZWhvdz8gKi8KKyAgICB2b2lkICogICAgICAgICAgICAgIHNoYXJlZHM7ICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIGJsb2NrIG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzICAgKi8KKyAgICBrbXBfcm91dGluZV9lbnRyeV90IHJvdXRpbmU7ICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIHJvdXRpbmUgdG8gY2FsbCBmb3IgZXhlY3V0aW5nIHRhc2sgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgIHBhcnRfaWQ7ICAgICAgICAgICAgLyoqPCBwYXJ0IGlkIGZvciB0aGUgdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRCB8fCBPTVBfNDVfRU5BQkxFRAorICAgIGttcF9jbXBscmRhdGFfdCBkYXRhMTsgICAgICAgICAgICAgICAgICAvKiBUd28ga25vd24gb3B0aW9uYWwgYWRkaXRpb25zOiBkZXN0cnVjdG9ycyBhbmQgcHJpb3JpdHkgKi8KKyAgICBrbXBfY21wbHJkYXRhX3QgZGF0YTI7ICAgICAgICAgICAgICAgICAgLyogUHJvY2VzcyBkZXN0cnVjdG9ycyBmaXJzdCwgcHJpb3JpdHkgc2Vjb25kICovCisgICAgLyogZnV0dXJlIGRhdGEgKi8KKyNlbmRpZgorICAgIC8qICBwcml2YXRlIHZhcnMgICovCit9IGttcF90YXNrX3Q7CisKKy8qIQorQH0KKyovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tncm91cCB7CisgICAga21wX3VpbnQzMiAgICAgICAgICAgIGNvdW50OyAgIC8vIG51bWJlciBvZiBhbGxvY2F0ZWQgYW5kIG5vdCB5ZXQgY29tcGxldGUgdGFza3MKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgY2FuY2VsX3JlcXVlc3Q7IC8vIHJlcXVlc3QgZm9yIGNhbmNlbGxhdGlvbiBvZiB0aGlzIHRhc2tncm91cAorICAgIHN0cnVjdCBrbXBfdGFza2dyb3VwICpwYXJlbnQ7ICAvLyBwYXJlbnQgdGFza2dyb3VwCit9IGttcF90YXNrZ3JvdXBfdDsKKworCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9ucwordHlwZWRlZiB1bmlvbiBrbXBfZGVwbm9kZSAgICAgICBrbXBfZGVwbm9kZV90OwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcG5vZGVfbGlzdCAga21wX2RlcG5vZGVfbGlzdF90OwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGhhc2hfZW50cnkga21wX2RlcGhhc2hfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGVuZF9pbmZvIHsKKyAgICAga21wX2ludHB0cl90ICAgICAgICAgICAgICAgYmFzZV9hZGRyOworICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgIHN0cnVjdCB7CisgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgIGluOjE7CisgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgIG91dDoxOworICAgICB9IGZsYWdzOworfSBrbXBfZGVwZW5kX2luZm9fdDsKKworc3RydWN0IGttcF9kZXBub2RlX2xpc3QgeworICAga21wX2RlcG5vZGVfdCAqICAgICAgICAgICAgICBub2RlOworICAga21wX2RlcG5vZGVfbGlzdF90ICogICAgICAgICBuZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZGVwbm9kZSB7CisgICAga21wX2RlcG5vZGVfbGlzdF90ICAgICAgICAqIHN1Y2Nlc3NvcnM7CisgICAga21wX3Rhc2tfdCAgICAgICAgICAgICAgICAqIHRhc2s7CisKKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgICAgbG9jazsKKworI2lmIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVAorICAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgICBpZDsKKyNlbmRpZgorCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgIG5wcmVkZWNlc3NvcnM7CisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgIG5yZWZzOworfSBrbXBfYmFzZV9kZXBub2RlX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZGVwbm9kZSB7CisgICAgZG91YmxlICAgICAgICAgIGRuX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgIGRuX3BhZFsgS01QX1BBRChrbXBfYmFzZV9kZXBub2RlX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGVwbm9kZV90IGRuOworfTsKKworc3RydWN0IGttcF9kZXBoYXNoX2VudHJ5IHsKKyAgICBrbXBfaW50cHRyX3QgICAgICAgICAgICAgICBhZGRyOworICAgIGttcF9kZXBub2RlX3QgICAgICAgICAgICAqIGxhc3Rfb3V0OworICAgIGttcF9kZXBub2RlX2xpc3RfdCAgICAgICAqIGxhc3RfaW5zOworICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgICAgICAqIG5leHRfaW5fYnVja2V0OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGhhc2ggeworICAga21wX2RlcGhhc2hfZW50cnlfdCAgICAgKiogYnVja2V0czsKKyAgIHNpemVfdAkJICAgICAgc2l6ZTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgIG5lbGVtZW50czsKKyAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgIG5jb25mbGljdHM7CisjZW5kaWYKK30ga21wX2RlcGhhc2hfdDsKKworI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKworLyogVGllZCBUYXNrIHN0YWNrIGRlZmluaXRpb25zICovCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RhY2tfYmxvY2sgeworICAgIGttcF90YXNrZGF0YV90ICogICAgICAgICAgc2JfYmxvY2tbIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSBdOworICAgIHN0cnVjdCBrbXBfc3RhY2tfYmxvY2sgKiAgc2JfbmV4dDsKKyAgICBzdHJ1Y3Qga21wX3N0YWNrX2Jsb2NrICogIHNiX3ByZXY7Cit9IGttcF9zdGFja19ibG9ja190OworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza19zdGFjayB7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgICAgICAgICB0c19maXJzdF9ibG9jazsgIC8vIGZpcnN0IGJsb2NrIG9mIHN0YWNrIGVudHJpZXMKKyAgICBrbXBfdGFza2RhdGFfdCAqKiAgICAgICAgIHRzX3RvcDsgICAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgdG9wIG9mIHN0YWNrCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICB0c19lbnRyaWVzOyAgICAgIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjaworfSBrbXBfdGFza19zdGFja190OworCisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisKK3R5cGVkZWYgc3RydWN0IGttcF90YXNraW5nX2ZsYWdzIHsgICAgICAgICAgLyogVG90YWwgc3RydWN0IG11c3QgYmUgZXhhY3RseSAzMiBiaXRzICovCisgICAgLyogQ29tcGlsZXIgZmxhZ3MgKi8gICAgICAgICAgICAgICAgICAgIC8qIFRvdGFsIGNvbXBpbGVyIGZsYWdzIG11c3QgYmUgMTYgYml0cyAqLworICAgIHVuc2lnbmVkIHRpZWRuZXNzICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGVpdGhlciB0aWVkICgxKSBvciB1bnRpZWQgKDApICovCisgICAgdW5zaWduZWQgZmluYWwgICAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIHRhc2sgaXMgZmluYWwoMSkgc28gZXhlY3V0ZSBpbW1lZGlhdGVseSAqLworICAgIHVuc2lnbmVkIG1lcmdlZF9pZjAgIDogMTsgICAgICAgICAgICAgICAvKiBubyBfX2ttcGNfdGFza197YmVnaW4vY29tcGxldGV9X2lmMCBjYWxscyBpbiBpZjAgY29kZSBwYXRoICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB1bnNpZ25lZCBkZXN0cnVjdG9yc190aHVuayA6IDE7ICAgICAgICAgLyogc2V0IGlmIHRoZSBjb21waWxlciBjcmVhdGVzIGEgdGh1bmsgdG8gaW52b2tlIGRlc3RydWN0b3JzIGZyb20gdGhlIHJ1bnRpbWUgKi8KKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIHVuc2lnbmVkIHByb3h5ICAgICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGEgcHJveHkgdGFzayAoaXQgd2lsbCBiZSBleGVjdXRlZCBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIHRoZSBSVEwpICovCisgICAgdW5zaWduZWQgcHJpb3JpdHlfc3BlY2lmaWVkIDoxOyAgICAgICAgIC8qIHNldCBpZiB0aGUgY29tcGlsZXIgcHJvdmlkZXMgcHJpb3JpdHkgc2V0dGluZyBmb3IgdGhlIHRhc2sgKi8KKyAgICB1bnNpZ25lZCByZXNlcnZlZCAgICA6IDEwOyAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGNvbXBpbGVyIHVzZSAqLworI2Vsc2UKKyAgICB1bnNpZ25lZCByZXNlcnZlZCAgICA6IDEyOyAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGNvbXBpbGVyIHVzZSAqLworI2VuZGlmCisjZWxzZSAvLyBPTVBfNDBfRU5BQkxFRAorICAgIHVuc2lnbmVkIHJlc2VydmVkICAgIDogMTM7ICAgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgY29tcGlsZXIgdXNlICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIC8qIExpYnJhcnkgZmxhZ3MgKi8gICAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBsaWJyYXJ5IGZsYWdzIG11c3QgYmUgMTYgYml0cyAqLworICAgIHVuc2lnbmVkIHRhc2t0eXBlICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGVpdGhlciBleHBsaWNpdCgxKSBvciBpbXBsaWNpdCAoMCkgKi8KKyAgICB1bnNpZ25lZCB0YXNrX3NlcmlhbCA6IDE7ICAgICAgICAgICAgICAgLyogdGhpcyB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5ICgxKSBvciBkZWZlcnJlZCAoMCkgKi8KKyAgICB1bnNpZ25lZCB0YXNraW5nX3NlciA6IDE7ICAgICAgICAgICAgICAgLyogYWxsIHRhc2tzIGluIHRlYW0gYXJlIGVpdGhlciBleGVjdXRlZCBpbW1lZGlhdGVseSAoMSkgb3IgbWF5IGJlIGRlZmVycmVkICgwKSAqLworICAgIHVuc2lnbmVkIHRlYW1fc2VyaWFsIDogMTsgICAgICAgICAgICAgICAvKiBlbnRpcmUgdGVhbSBpcyBzZXJpYWwgKDEpIFsxIHRocmVhZF0gb3IgcGFyYWxsZWwgKDApIFs+PSAyIHRocmVhZHNdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGVpdGhlciB0ZWFtX3NlcmlhbCBvciB0YXNraW5nX3NlciBpcyBzZXQsIHRhc2sgdGVhbSBtYXkgYmUgTlVMTCAqLworICAgIC8qIFRhc2sgU3RhdGUgRmxhZ3M6ICovCisgICAgdW5zaWduZWQgc3RhcnRlZCAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PXN0YXJ0ZWQsIDA9PW5vdCBzdGFydGVkICAgICAqLworICAgIHVuc2lnbmVkIGV4ZWN1dGluZyAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1leGVjdXRpbmcsIDA9PW5vdCBleGVjdXRpbmcgKi8KKyAgICB1bnNpZ25lZCBjb21wbGV0ZSAgICA6IDE7ICAgICAgICAgICAgICAgLyogMT09Y29tcGxldGUsIDA9PW5vdCBjb21wbGV0ZSAgICovCisgICAgdW5zaWduZWQgZnJlZWQgICAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PWZyZWVkLCAwPT1hbGxvY2F0ZWVkICAgICAgICAqLworICAgIHVuc2lnbmVkIG5hdGl2ZSAgICAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1nY2MtY29tcGlsZWQgdGFzaywgMD09aW50ZWwgKi8KKyAgICB1bnNpZ25lZCByZXNlcnZlZDMxICA6IDc7ICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGxpYnJhcnkgdXNlICovCisKK30ga21wX3Rhc2tpbmdfZmxhZ3NfdDsKKworCitzdHJ1Y3Qga21wX3Rhc2tkYXRhIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gICAgICAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF90YXNrX2lkOyAgICAgICAgICAgICAgIC8qIGlkLCBhc3NpZ25lZCBieSBkZWJ1Z2dlciAgICAgICAgICAgICAgICAqLworICAgIGttcF90YXNraW5nX2ZsYWdzX3QgICAgIHRkX2ZsYWdzOyAgICAgICAgICAgICAgICAgLyogdGFzayBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAga21wX3RlYW1fdCAqICAgICAgICAgICAgdGRfdGVhbTsgICAgICAgICAgICAgICAgICAvKiB0ZWFtIGZvciB0aGlzIHRhc2sgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBrbXBfaW5mb19wICogICAgICAgICAgICB0ZF9hbGxvY190aHJlYWQ7ICAgICAgICAgIC8qIHRocmVhZCB0aGF0IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudGx5IG5vdCB1c2VkIGV4Y2VwdCBmb3IgcGVyaGFwcyBJREIgKi8KKyAgICBrbXBfdGFza2RhdGFfdCAqICAgICAgICB0ZF9wYXJlbnQ7ICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX2xldmVsOyAgICAgICAgICAgICAgICAgLyogdGFzayBuZXN0aW5nIGxldmVsICAgICAgICAgICAgICAgICAgICAgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfdW50aWVkX2NvdW50OyAgICAgICAgICAvKiB1bnRpZWQgdGFzayBhY3RpdmUgcGFydHMgY291bnRlciAgICAgICAgKi8KKyAgICBpZGVudF90ICogICAgICAgICAgICAgICB0ZF9pZGVudDsgICAgICAgICAgICAgICAgIC8qIHRhc2sgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhc2t3YWl0IGRhdGEuCisgICAgaWRlbnRfdCAqICAgICAgICAgICAgICAgdGRfdGFza3dhaXRfaWRlbnQ7CisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgdGRfdGFza3dhaXRfY291bnRlcjsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF90YXNrd2FpdF90aHJlYWQ7ICAgICAgIC8qIGd0aWQgKyAxIG9mIHRocmVhZCBlbmNvdW50ZXJlZCB0YXNrd2FpdCAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfaW50ZXJuYWxfY29udHJvbF90ICB0ZF9pY3ZzOyAgLyogSW50ZXJuYWwgY29udHJvbCB2YXJpYWJsZXMgZm9yIHRoZSB0YXNrICovCisgICAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlIGttcF91aW50MzIgdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzOyAgLyogQ2hpbGQgdGFza3MgKCsgY3VycmVudCB0YXNrKSBub3QgeWV0IGRlYWxsb2NhdGVkICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrczsgLyogQ2hpbGQgdGFza3Mgbm90IHlldCBjb21wbGV0ZSAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Rhc2tncm91cF90ICogICAgICAgdGRfdGFza2dyb3VwOyAgICAgICAgIC8vIEVhY2ggdGFzayBrZWVwcyBwb2ludGVyIHRvIGl0cyBjdXJyZW50IHRhc2tncm91cAorICAgIGttcF9kZXBoYXNoX3QgKiAgICAgICAgIHRkX2RlcGhhc2g7ICAgICAgICAgICAvLyBEZXBlbmRlbmNpZXMgZm9yIGNoaWxkcmVuIHRhc2tzIGFyZSB0cmFja2VkIGZyb20gaGVyZQorICAgIGttcF9kZXBub2RlX3QgKiAgICAgICAgIHRkX2RlcG5vZGU7ICAgICAgICAgICAvLyBQb2ludGVyIHRvIGdyYXBoIG5vZGUgaWYgdGhpcyB0YXNrIGhhcyBkZXBlbmRlbmNpZXMKKyNlbmRpZgorI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGFza19pbmZvX3QgICAgICAgIG9tcHRfdGFza19pbmZvOworI2VuZGlmCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBrbXBfdGFza190ZWFtX3QgKiAgICAgICB0ZF90YXNrX3RlYW07CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfc2l6ZV9hbGxvYzsgICAgICAgIC8vIFRoZSBzaXplIG9mIHRhc2sgc3RydWN0dXJlLCBpbmNsdWRpbmcgc2hhcmVkcyBldGMuCisjZW5kaWYKK307IC8vIHN0cnVjdCBrbXBfdGFza2RhdGEKKworLy8gTWFrZSBzdXJlIHBhZGRpbmcgYWJvdmUgd29ya2VkCitLTVBfQlVJTERfQVNTRVJUKCBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICUgc2l6ZW9mKHZvaWQgKikgPT0gMCApOworCisvLyBEYXRhIGZvciB0YXNrIHRlYW0gYnV0IHBlciB0aHJlYWQKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3RocmVhZF9kYXRhIHsKKyAgICBrbXBfaW5mb19wICogICAgICAgICAgICB0ZF90aHI7ICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgYmFjayB0byB0aHJlYWQgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlZCBvbmx5IGluIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUsIG1heWJlIG5vdCBhdmFpbCB1bnRpbCB0YXNrIGlzIHF1ZXVlZD8KKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgICB0ZF9kZXF1ZV9sb2NrOyAgICAgICAgIC8vIExvY2sgZm9yIGFjY2Vzc2luZyBkZXF1ZQorICAgIGttcF90YXNrZGF0YV90ICoqICAgICAgIHRkX2RlcXVlOyAgICAgICAgICAgICAgLy8gRGVxdWUgb2YgdGFza3MgZW5jb3VudGVyZWQgYnkgdGRfdGhyLCBkeW5hbWljYWxseSBhbGxvY2F0ZWQKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF9kZXF1ZV9zaXplOyAgICAgICAgIC8vIFNpemUgb2YgZGVjaworICAgIGttcF91aW50MzIgICAgICAgICAgICAgIHRkX2RlcXVlX2hlYWQ7ICAgICAgICAgLy8gSGVhZCBvZiBkZXF1ZSAod2lsbCB3cmFwKQorICAgIGttcF91aW50MzIgICAgICAgICAgICAgIHRkX2RlcXVlX3RhaWw7ICAgICAgICAgLy8gVGFpbCBvZiBkZXF1ZSAod2lsbCB3cmFwKQorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX2RlcXVlX250YXNrczsgICAgICAgLy8gTnVtYmVyIG9mIHRhc2tzIGluIGRlcXVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHRUg6IHNob3VsZG4ndCB0aGlzIGJlIHZvbGF0aWxlIHNpbmNlIHVzZWQgaW4gd2hpbGUtc3Bpbj8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF9kZXF1ZV9sYXN0X3N0b2xlbjsgIC8vIFRocmVhZCBudW1iZXIgb2YgbGFzdCBzdWNjZXNzZnVsIHN0ZWFsCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAga21wX3Rhc2tfc3RhY2tfdCAgICAgICAgdGRfc3VzcF90aWVkX3Rhc2tzOyAgICAvLyBTdGFjayBvZiBzdXNwZW5kZWQgdGllZCB0YXNrcyBmb3IgdGFzayBzY2hlZHVsaW5nIGNvbnN0cmFpbnQKKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKK30ga21wX2Jhc2VfdGhyZWFkX2RhdGFfdDsKKworI2RlZmluZSBUQVNLX0RFUVVFX0JJVFMgICAgICAgICAgOCAgLy8gVXNlZCBzb2xlbHkgdG8gZGVmaW5lIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFCisjZGVmaW5lIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFICAoIDEgPDwgVEFTS19ERVFVRV9CSVRTICkKKworI2RlZmluZSBUQVNLX0RFUVVFX1NJWkUodGQpICAgICAoKHRkKS50ZF9kZXF1ZV9zaXplKQorI2RlZmluZSBUQVNLX0RFUVVFX01BU0sodGQpICAgICAoKHRkKS50ZF9kZXF1ZV9zaXplIC0gMSkKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3RocmVhZF9kYXRhIHsKKyAgICBrbXBfYmFzZV90aHJlYWRfZGF0YV90ICB0ZDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICB0ZF9hbGlnbjsgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgdGRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIENBQ0hFX0xJTkUpIF07Cit9IGttcF90aHJlYWRfZGF0YV90OworCisKKy8vIERhdGEgZm9yIHRhc2sgdGVhbXMgd2hpY2ggYXJlIHVzZWQgd2hlbiB0YXNraW5nIGlzIGVuYWJsZWQgZm9yIHRoZSB0ZWFtCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV90YXNrX3RlYW0geworICAgIGttcF9ib290c3RyYXBfbG9ja190ICAgIHR0X3RocmVhZHNfbG9jazsgICAgICAgLyogTG9jayB1c2VkIHRvIGFsbG9jYXRlIHBlci10aHJlYWQgcGFydCBvZiB0YXNrIHRlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgYmUgYm9vdHN0cmFwIGxvY2sgc2luY2UgdXNlZCBhdCBsaWJyYXJ5IHNodXRkb3duKi8KKyAgICBrbXBfdGFza190ZWFtX3QgKiAgICAgICB0dF9uZXh0OyAgICAgICAgICAgICAgIC8qIEZvciBsaW5raW5nIHRoZSB0YXNrIHRlYW0gZnJlZSBsaXN0ICovCisgICAga21wX3RocmVhZF9kYXRhX3QgKiAgICAgdHRfdGhyZWFkc19kYXRhOyAgICAgICAvKiBBcnJheSBvZiBwZXItdGhyZWFkIHN0cnVjdHVyZXMgZm9yIHRhc2sgdGVhbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBzdXJ2aXZlcyB0YXNrIHRlYW0gZGVhbGxvY2F0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdHRfZm91bmRfdGFza3M7ICAgICAgICAvKiBIYXZlIHdlIGZvdW5kIHRhc2tzIGFuZCBxdWV1ZWQgdGhlbSB3aGlsZSBleGVjdXRpbmcgdGhpcyB0ZWFtPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFJVRSBtZWFucyB0dF90aHJlYWRzX2RhdGEgaXMgc2V0IHVwIGFuZCBpbml0aWFsaXplZCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHR0X25wcm9jOyAgICAgICAgICAgICAgLyogI3RocmVhZHMgaW4gdGVhbSAgICAgICAgICAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9tYXhfdGhyZWFkczsgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBmb3IgdGhyZWFkc19kYXRhIGFycmF5ICovCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9mb3VuZF9wcm94eV90YXNrczsgIC8qIEhhdmUgd2UgZm91bmQgcHJveHkgdGFza3Mgc2luY2UgbGFzdCBiYXJyaWVyICovCisjZW5kaWYKKworICAgIEtNUF9BTElHTl9DQUNIRQorICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHR0X3VuZmluaXNoZWRfdGhyZWFkczsgLyogI3RocmVhZHMgc3RpbGwgYWN0aXZlICAgICAgKi8KKworICAgIEtNUF9BTElHTl9DQUNIRQorICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHR0X2FjdGl2ZTsgICAgICAgICAgICAgLyogaXMgdGhlIHRlYW0gc3RpbGwgYWN0aXZlbHkgZXhlY3V0aW5nIHRhc2tzICovCit9IGttcF9iYXNlX3Rhc2tfdGVhbV90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3Rhc2tfdGVhbSB7CisgICAga21wX2Jhc2VfdGFza190ZWFtX3QgdHQ7CisgICAgZG91YmxlICAgICAgICAgICAgICAgdHRfYWxpZ247ICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgIHR0X3BhZFsgS01QX1BBRChrbXBfYmFzZV90YXNrX3RlYW1fdCwgQ0FDSEVfTElORSkgXTsKK307CisKKyNpZiAoIFVTRV9GQVNUX01FTU9SWSA9PSAzICkgfHwgKCBVU0VfRkFTVF9NRU1PUlkgPT0gNSApCisvLyBGcmVlIGxpc3RzIGtlZXAgc2FtZS1zaXplIGZyZWUgbWVtb3J5IHNsb3RzIGZvciBmYXN0IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzCit0eXBlZGVmIHN0cnVjdCBrbXBfZnJlZV9saXN0IHsKKyAgICB2b2lkICAgICAgICAgICAgICp0aF9mcmVlX2xpc3Rfc2VsZjsgICAvLyBTZWxmLWFsbG9jYXRlZCB0YXNrcyBmcmVlIGxpc3QKKyAgICB2b2lkICAgICAgICAgICAgICp0aF9mcmVlX2xpc3Rfc3luYzsgICAvLyBTZWxmLWFsbG9jYXRlZCB0YXNrcyBzdG9sZW4vcmV0dXJuZWQgYnkgb3RoZXIgdGhyZWFkcworICAgIHZvaWQgICAgICAgICAgICAgKnRoX2ZyZWVfbGlzdF9vdGhlcjsgIC8vIE5vbi1zZWxmIGZyZWUgbGlzdCAodG8gYmUgcmV0dXJuZWQgdG8gb3duZXIncyBzeW5jIGxpc3QpCit9IGttcF9mcmVlX2xpc3RfdDsKKyNlbmRpZgorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisvLyBIb3QgdGVhbXMgYXJyYXkga2VlcHMgaG90IHRlYW1zIGFuZCB0aGVpciBzaXplcyBmb3IgZ2l2ZW4gdGhyZWFkLgorLy8gSG90IHRlYW1zIGFyZSBub3QgcHV0IGluIHRlYW1zIHBvb2wsIGFuZCB0aGV5IGRvbid0IHB1dCB0aHJlYWRzIGluIHRocmVhZHMgcG9vbC4KK3R5cGVkZWYgc3RydWN0IGttcF9ob3RfdGVhbV9wdHIgeworICAgIGttcF90ZWFtX3AgKmhvdF90ZWFtOyAgICAgIC8vIHBvaW50ZXIgdG8gaG90X3RlYW0gb2YgZ2l2ZW4gbmVzdGluZyBsZXZlbAorICAgIGttcF9pbnQzMiAgIGhvdF90ZWFtX250aDsgIC8vIG51bWJlciBvZiB0aHJlYWRzIGFsbG9jYXRlZCBmb3IgdGhlIGhvdF90ZWFtCit9IGttcF9ob3RfdGVhbV9wdHJfdDsKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECit0eXBlZGVmIHN0cnVjdCBrbXBfdGVhbXNfc2l6ZSB7CisgICAga21wX2ludDMyICAgbnRlYW1zOyAgICAgICAgLy8gbnVtYmVyIG9mIHRlYW1zIGluIGEgbGVhZ3VlCisgICAga21wX2ludDMyICAgbnRoOyAgICAgICAgICAgLy8gbnVtYmVyIG9mIHRocmVhZHMgaW4gZWFjaCB0ZWFtIG9mIHRoZSBsZWFndWUKK30ga21wX3RlYW1zX3NpemVfdDsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIE9wZW5NUCB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzCisvLworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wX2Jhc2VfaW5mbyB7CisvKgorICogU3RhcnQgd2l0aCB0aGUgcmVhZG9ubHkgZGF0YSB3aGljaCBpcyBjYWNoZSBhbGlnbmVkIGFuZCBwYWRkZWQuCisgKiB0aGlzIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSB0aHJlYWQgc3RhcnRzIHdvcmtpbmcgYnkgdGhlIG1hc3Rlci4KKyAqICh1YmVyIG1hc3RlcnMgbWF5IHVwZGF0ZSB0aGVtc2VsdmVzIGxhdGVyKQorICogKHVzYWdlIGRvZXMgbm90IGNvbnNpZGVyIHNlcmlhbGl6ZWQgcmVnaW9ucykKKyAqLworICAgIGttcF9kZXNjX3QgICAgICAgIHRoX2luZm87CisgICAga21wX3RlYW1fcCAgICAgICAqdGhfdGVhbTsgICAgICAgLyogdGVhbSB3ZSBiZWxvbmcgdG8gKi8KKyAgICBrbXBfcm9vdF9wICAgICAgICp0aF9yb290OyAgICAgICAvKiBwb2ludGVyIHRvIHJvb3Qgb2YgdGFzayBoaWVyYXJjaHkgKi8KKyAgICBrbXBfaW5mb19wICAgICAgICp0aF9uZXh0X3Bvb2w7ICAvKiBuZXh0IGF2YWlsYWJsZSB0aHJlYWQgaW4gdGhlIHBvb2wgKi8KKyAgICBrbXBfZGlzcF90ICAgICAgICp0aF9kaXNwYXRjaDsgICAvKiB0aHJlYWQncyBkaXNwYXRjaCBkYXRhICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfaW5fcG9vbDsgICAgLyogaW4gdGhyZWFkIHBvb2wgKDMyIGJpdHMgZm9yIFRDUi9UQ1cpICovCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBjYWNoZWQgZnJvbSB0aGUgdGVhbSBpbmZvIHN0cnVjdHVyZSAqLworICAgIC8qIFRPRE8gdXNlIHRoZXNlIGluIG1vcmUgcGxhY2VzIGFzIGRldGVybWluZWQgdG8gYmUgbmVlZGVkIHZpYSBwcm9maWxpbmcgKi8KKyAgICBpbnQgICAgICAgICAgICAgICB0aF90ZWFtX25wcm9jOyAgICAgIC8qIG51bWJlciBvZiB0aHJlYWRzIGluIGEgdGVhbSAqLworICAgIGttcF9pbmZvX3AgICAgICAgKnRoX3RlYW1fbWFzdGVyOyAgICAgLyogdGhlIHRlYW0ncyBtYXN0ZXIgdGhyZWFkICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9zZXJpYWxpemVkOyAvKiB0ZWFtIGlzIHNlcmlhbGl6ZWQgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIG1pY3JvdGFza190ICAgICAgIHRoX3RlYW1zX21pY3JvdGFzazsgLyogc2F2ZSBlbnRyeSBhZGRyZXNzIGZvciB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyAgICBpbnQgICAgICAgICAgICAgICB0aF90ZWFtc19sZXZlbDsgICAgIC8qIHNhdmUgaW5pdGlhbCBsZXZlbCBvZiB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0IGlzIDAgb24gZGV2aWNlIGJ1dCBtYXkgYmUgYW55IG9uIGhvc3QgKi8KKyNlbmRpZgorCisgICAgLyogVGhlIGJsb2NrdGltZSBpbmZvIGlzIGNvcGllZCBmcm9tIHRoZSB0ZWFtIHN0cnVjdCB0byB0aGUgdGhyZWFkIHNydWN0ICovCisgICAgLyogYXQgdGhlIHN0YXJ0IG9mIGEgYmFycmllciwgYW5kIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSB0ZWFtIGFyZSB1c2VkICovCisgICAgLyogYXQgcG9pbnRzIGluIHRoZSBjb2RlIHdoZXJlIHRoZSB0ZWFtIHN0cnVjdCBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCAgICovCisgICAgLyogdG8gZXhpc3QgKGZyb20gdGhlIFBPViBvZiB3b3JrZXIgdGhyZWFkcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9idF9pbnRlcnZhbHM7CisjZW5kaWYKKyAgICBpbnQgICAgICAgICAgICAgICB0aF90ZWFtX2J0X3NldDsKKworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGttcF9hZmZpbl9tYXNrX3QgICp0aF9hZmZpbl9tYXNrOyAvKiB0aHJlYWQncyBjdXJyZW50IGFmZmluaXR5IG1hc2sgKi8KKyNlbmRpZgorCisvKgorICogVGhlIGRhdGEgc2V0IGJ5IHRoZSBtYXN0ZXIgYXQgcmVpbml0LCB0aGVuIFIvVyBieSB0aGUgd29ya2VyCisgKi8KKyAgICBLTVBfQUxJR05fQ0FDSEUgaW50ICAgICB0aF9zZXRfbnByb2M7ICAvKiBpZiA+IDAsIHRoZW4gb25seSB1c2UgdGhpcyByZXF1ZXN0IGZvciB0aGUgbmV4dCBmb3JrICovCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgICAgICp0aF9ob3RfdGVhbXM7ICAgICAvKiBhcnJheSBvZiBob3QgdGVhbXMgKi8KKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Byb2NfYmluZF90ICAgICAgICAgdGhfc2V0X3Byb2NfYmluZDsgLyogaWYgIT0gcHJvY19iaW5kX2RlZmF1bHQsIHVzZSByZXF1ZXN0IGZvciBuZXh0IGZvcmsgKi8KKyAgICBrbXBfdGVhbXNfc2l6ZV90ICAgICAgICB0aF90ZWFtc19zaXplOyAgICAvKiBudW1iZXIgb2YgdGVhbXMvdGhyZWFkcyBpbiB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGludCAgICAgICAgICAgICAgICAgICAgIHRoX2N1cnJlbnRfcGxhY2U7IC8qIHBsYWNlIGN1cnJlbnRseSBib3VuZCB0byAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHRoX25ld19wbGFjZTsgICAgIC8qIHBsYWNlIHRvIGJpbmQgdG8gaW4gcGFyIHJlZyAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHRoX2ZpcnN0X3BsYWNlOyAgIC8qIGZpcnN0IHBsYWNlIGluIHBhcnRpdGlvbiAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHRoX2xhc3RfcGxhY2U7ICAgIC8qIGxhc3QgcGxhY2UgaW4gcGFydGl0aW9uICovCisjIGVuZGlmCisjZW5kaWYKKyNpZiBVU0VfSVRUX0JVSUxECisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgdGhfYmFyX2Fycml2ZV90aW1lOyAgICAgICAgICAgLyogYXJyaXZhbCB0byBiYXJyaWVyIHRpbWVzdGFtcCAqLworICAgIGttcF91aW50NjQgICAgICAgICAgICAgIHRoX2Jhcl9taW5fdGltZTsgICAgICAgICAgICAgIC8qIG1pbmltdW0gYXJyaXZhbCB0aW1lIGF0IHRoZSBiYXJyaWVyICovCisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgdGhfZnJhbWVfdGltZTsgICAgICAgICAgICAgICAgLyogZnJhbWUgdGltZXN0YW1wICovCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIGttcF9sb2NhbF90ICAgICAgICAgICAgIHRoX2xvY2FsOworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAgKnRoX3ByaV9oZWFkOworCisvKgorICogTm93IHRoZSBkYXRhIG9ubHkgdXNlZCBieSB0aGUgd29ya2VyIChhZnRlciBpbml0aWFsIGFsbG9jYXRpb24pCisgKi8KKyAgICAvKiBUT0RPIHRoZSBmaXJzdCBzZXJpYWwgdGVhbSBzaG91bGQgYWN0dWFsbHkgYmUgc3RvcmVkIGluIHRoZSBpbmZvX3QKKyAgICAgKiBzdHJ1Y3R1cmUuICB0aGlzIHdpbGwgaGVscCByZWR1Y2UgaW5pdGlhbCBhbGxvY2F0aW9uIG92ZXJoZWFkICovCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF90ZWFtX3AgKnRoX3NlcmlhbF90ZWFtOyAvKnNlcmlhbGl6ZWQgdGVhbSBoZWxkIGluIHJlc2VydmUqLworCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF90aHJlYWRfaW5mb190ICAgICAgb21wdF90aHJlYWRfaW5mbzsKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSBhbHNvIHJlYWQgYnkgdGhlIG1hc3RlciBkdXJpbmcgcmVpbml0ICovCisgICAgc3RydWN0IGNvbW1vbl90YWJsZSAgICAqdGhfcHJpX2NvbW1vbjsKKworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHRoX3NwaW5faGVyZTsgICAvKiB0aHJlYWQtbG9jYWwgbG9jYXRpb24gZm9yIHNwaW5uaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIGF3YWl0aW5nIHF1ZXVpbmcgbG9jayBhY3F1aXJlICovCisKKyAgICB2b2xhdGlsZSB2b2lkICAgICAgICAgICp0aF9zbGVlcF9sb2M7ICAgLy8gdGhpcyBwb2ludHMgYXQgYSBrbXBfZmxhZzxUPgorCisgICAgaWRlbnRfdCAgICAgICAgICAqdGhfaWRlbnQ7CisgICAgdW5zaWduZWQgICAgICAgICB0aF94OyAgICAgICAgICAgICAgICAgICAgIC8vIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGRhdGEKKyAgICB1bnNpZ25lZCAgICAgICAgIHRoX2E7ICAgICAgICAgICAgICAgICAgICAgLy8gUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZGF0YQorCisvKgorICogVGFza2luZy1yZWxhdGVkIGRhdGEgZm9yIHRoZSB0aHJlYWQKKyAqLworICAgIGttcF90YXNrX3RlYW1fdCAgICAqIHRoX3Rhc2tfdGVhbTsgICAgICAgICAgIC8vIFRhc2sgdGVhbSBzdHJ1Y3QKKyAgICBrbXBfdGFza2RhdGFfdCAgICAgKiB0aF9jdXJyZW50X3Rhc2s7ICAgICAgICAvLyBJbm5lcm1vc3QgVGFzayBiZWluZyBleGVjdXRlZAorICAgIGttcF91aW50OCAgICAgICAgICAgIHRoX3Rhc2tfc3RhdGU7ICAgICAgICAgIC8vIGFsdGVybmF0aW5nIDAvMSBmb3IgdGFzayB0ZWFtIGlkZW50aWZpY2F0aW9uCisgICAga21wX3VpbnQ4ICAgICAgICAgICogdGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrOyAgLy8gU3RhY2sgaG9sZGluZyBtZW1vcyBvZiB0aF90YXNrX3N0YXRlIGF0IG5lc3RlZCBsZXZlbHMKKyAgICBrbXBfdWludDMyICAgICAgICAgICB0aF90YXNrX3N0YXRlX3RvcDsgICAgICAgICAvLyBUb3AgZWxlbWVudCBvZiB0aF90YXNrX3N0YXRlX21lbW9fc3RhY2sKKyAgICBrbXBfdWludDMyICAgICAgICAgICB0aF90YXNrX3N0YXRlX3N0YWNrX3N6OyAgICAvLyBTaXplIG9mIHRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjaworCisgICAgLyoKKyAgICAgKiBNb3JlIHN0dWZmIGZvciBrZWVwaW5nIHRyYWNrIG9mIGFjdGl2ZS9zbGVlcGluZyB0aHJlYWRzCisgICAgICogKHRoaXMgcGFydCBpcyB3cml0dGVuIGJ5IHRoZSB3b3JrZXIgdGhyZWFkKQorICAgICAqLworICAgIGttcF91aW50OCAgICAgICAgICAgIHRoX2FjdGl2ZV9pbl9wb29sOyAgICAgIC8vIGluY2x1ZGVkIGluIGNvdW50IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gI2FjdGl2ZSB0aHJlYWRzIGluIHBvb2wKKyAgICBpbnQgICAgICAgICAgICAgICAgICB0aF9hY3RpdmU7ICAgICAgICAgICAgICAvLyAhIHNsZWVwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzIgYml0cyBmb3IgVENSL1RDVworCisgICAgc3RydWN0IGNvbnNfaGVhZGVyICogdGhfY29uczsgLy8gdXNlZCBmb3IgY29uc2lzdGVuY3kgY2hlY2sKKworLyoKKyAqIEFkZCB0aGUgc3luY3Jvbml6aW5nIGRhdGEgd2hpY2ggaXMgY2FjaGUgYWxpZ25lZCBhbmQgcGFkZGVkLgorICovCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF9iYWxpZ25fdCAgICAgIHRoX2JhclsgYnNfbGFzdF9iYXJyaWVyIF07CisKKyAgICBLTVBfQUxJR05fQ0FDSEUgdm9sYXRpbGUgICAgIGttcF9pbnQzMiAgICB0aF9uZXh0X3dhaXRpbmc7ICAvKiBndGlkKzEgb2YgbmV4dCB0aHJlYWQgb24gbG9jayB3YWl0IHF1ZXVlLCAwIGlmIG5vbmUgKi8KKworI2lmICggVVNFX0ZBU1RfTUVNT1JZID09IDMgKSB8fCAoIFVTRV9GQVNUX01FTU9SWSA9PSA1ICkKKyAgICAjZGVmaW5lIE5VTV9MSVNUUyA0CisgICAga21wX2ZyZWVfbGlzdF90ICAgdGhfZnJlZV9saXN0c1tOVU1fTElTVFNdOyAgIC8vIEZyZWUgbGlzdHMgZm9yIGZhc3QgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKKyNlbmRpZgorCisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBrbXBfd2luMzJfY29uZF90ICB0aF9zdXNwZW5kX2N2OworICAgIGttcF93aW4zMl9tdXRleF90IHRoX3N1c3BlbmRfbXg7CisgICAgaW50ICAgICAgICAgICAgICAgdGhfc3VzcGVuZF9pbml0OworI2VuZGlmCisjaWYgS01QX09TX1VOSVgKKyAgICBrbXBfY29uZF9hbGlnbl90ICB0aF9zdXNwZW5kX2N2OworICAgIGttcF9tdXRleF9hbGlnbl90IHRoX3N1c3BlbmRfbXg7CisgICAgaW50ICAgICAgICAgICAgICAgdGhfc3VzcGVuZF9pbml0X2NvdW50OworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAga21wX2l0dF9tYXJrX3QgICAgICAgIHRoX2l0dF9tYXJrX3NpbmdsZTsKKyAgICAvLyBhbGlnbm1lbnQgPz8/CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAga21wX3N0YXRzX2xpc3QqIHRoX3N0YXRzOworI2VuZGlmCit9IGttcF9iYXNlX2luZm9fdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2luZm8geworICAgIGRvdWJsZSAgICAgICAgICB0aF9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICB0aF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfaW5mb190LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2luZm9fdCB0aDsKK30ga21wX2luZm9fdDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBPcGVuTVAgdGhyZWFkIHRlYW0gZGF0YSBzdHJ1Y3R1cmVzCisvLwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZGF0YSB7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiB0X3ZhbHVlOworfSBrbXBfYmFzZV9kYXRhX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9zbGVlcF90ZWFtIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGR0X2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBkdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2RhdGFfdCAgICAgZHQ7Cit9IGttcF9zbGVlcF90ZWFtX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9vcmRlcmVkX3RlYW0geworICAgIGRvdWJsZSAgICAgICAgICAgICAgZHRfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIGR0X3BhZFsgS01QX1BBRChrbXBfYmFzZV9kYXRhX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGF0YV90ICAgICBkdDsKK30ga21wX29yZGVyZWRfdGVhbV90OworCit0eXBlZGVmIGludCAgICAgKCpsYXVuY2hfdCkoIGludCBndGlkICk7CisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIEFSR1YgZW50cmllcyB0byBtYWxsb2MgaWYgbmVjZXNzYXJ5ICovCisjZGVmaW5lIEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyAgICAgMTAwCisKKy8vIFNldCB1cCBob3cgbWFueSBhcmd2IHBvaW50ZXJzIHdpbGwgZml0IGluIGNhY2hlIGxpbmVzIGNvbnRhaW5pbmcgdF9pbmxpbmVfYXJndi4gSGlzdG9yaWNhbGx5LCB3ZQorLy8gaGF2ZSBzdXBwb3J0ZWQgYXQgbGVhc3QgOTYgYnl0ZXMuIFVzaW5nIGEgbGFyZ2VyIHZhbHVlIGZvciBtb3JlIHNwYWNlIGJldHdlZW4gdGhlIG1hc3RlciB3cml0ZS93b3JrZXIKKy8vIHJlYWQgc2VjdGlvbiBhbmQgcmVhZC93cml0ZSBieSBhbGwgc2VjdGlvbiBzZWVtcyB0byBidXkgbW9yZSBwZXJmb3JtYW5jZSBvbiBFUENDIFBBUkFMTEVMLgorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICggNCAqIENBQ0hFX0xJTkUgLSAoICggMyAqIEtNUF9QVFJfU0tJUCArIDIgKiBzaXplb2YoaW50KSArIDIgKiBzaXplb2Yoa21wX2ludDgpICsgc2l6ZW9mKGttcF9pbnQxNikgKyBzaXplb2Yoa21wX3VpbnQzMikgKSAlIENBQ0hFX0xJTkUgKSApCisjZWxzZQorIyBkZWZpbmUgS01QX0lOTElORV9BUkdWX0JZVEVTICAgICAgICAgKCAyICogQ0FDSEVfTElORSAtICggKCAzICogS01QX1BUUl9TS0lQICsgMiAqIHNpemVvZihpbnQpICkgJSBDQUNIRV9MSU5FICkgKQorI2VuZGlmCisjZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTICAgICAgICAoaW50KSggS01QX0lOTElORV9BUkdWX0JZVEVTIC8gS01QX1BUUl9TS0lQICkKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9iYXNlX3RlYW0geworICAgIC8vIFN5bmNocm9uaXphdGlvbiBEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfb3JkZXJlZF90ZWFtX3QgdF9vcmRlcmVkOworICAgIGttcF9iYWxpZ25fdGVhbV90ICAgICAgICB0X2JhclsgYnNfbGFzdF9iYXJyaWVyIF07CisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICAgIHRfY29uc3RydWN0OyAgICAvLyBjb3VudCBvZiBzaW5nbGUgZGlyZWN0aXZlIGVuY291bnRlcmVkIGJ5IHRlYW0KKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgdF9zaW5nbGVfbG9jazsgIC8vIHRlYW0gc3BlY2lmaWMgbG9jaworCisgICAgLy8gTWFzdGVyIG9ubHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBLTVBfQUxJR05fQ0FDSEUgaW50ICAgICAgdF9tYXN0ZXJfdGlkOyAgIC8vIHRpZCBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXN0ZXJfdGhpc19jb25zOyAvLyAidGhpc19jb25zdHJ1Y3QiIHNpbmdsZSBjb3VudGVyIG9mIG1hc3RlciBpbiBwYXJlbnQgdGVhbQorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICp0X2lkZW50OyAgICAgICAgLy8gaWYgdm9sYXRpbGUsIGhhdmUgdG8gY2hhbmdlIHRvbyBtdWNoIG90aGVyIGNydWQgdG8gdm9sYXRpbGUgdG9vCisgICAga21wX3RlYW1fcCAgICAgICAgICAgICAgKnRfcGFyZW50OyAgICAgICAvLyBwYXJlbnQgdGVhbQorICAgIGttcF90ZWFtX3AgICAgICAgICAgICAgICp0X25leHRfcG9vbDsgICAgLy8gbmV4dCBmcmVlIHRlYW0gaW4gdGhlIHRlYW0gcG9vbAorICAgIGttcF9kaXNwX3QgICAgICAgICAgICAgICp0X2Rpc3BhdGNoOyAgICAgLy8gdGhyZWFkJ3MgZGlzcGF0Y2ggZGF0YQorICAgIGttcF90YXNrX3RlYW1fdCAgICAgICAgICp0X3Rhc2tfdGVhbVsyXTsgLy8gVGFzayB0ZWFtIHN0cnVjdDsgc3dpdGNoIGJldHdlZW4gMgorI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Byb2NfYmluZF90ICAgICAgICAgIHRfcHJvY19iaW5kOyAgICAvLyBiaW5kIHR5cGUgZm9yIHBhciByZWdpb24KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICAgdF9yZWdpb25fdGltZTsgIC8vIHJlZ2lvbiBiZWdpbiB0aW1lc3RhbXAKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAvLyBNYXN0ZXIgd3JpdGUsIHdvcmtlcnMgcmVhZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEtNUF9BTElHTl9DQUNIRSB2b2lkICAgKip0X2FyZ3Y7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfYXJnYzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9ucHJvYzsgICAgICAgIC8vIG51bWJlciBvZiB0aHJlYWRzIGluIHRlYW0KKyAgICBtaWNyb3Rhc2tfdCAgICAgICAgICAgICAgdF9wa2ZuOworICAgIGxhdW5jaF90ICAgICAgICAgICAgICAgICB0X2ludm9rZTsgICAgICAgLy8gcHJvY2VkdXJlIHRvIGxhdW5jaCB0aGUgbWljcm90YXNrCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3RlYW1faW5mb190ICAgICAgICAgb21wdF90ZWFtX2luZm87CisgICAgb21wdF9sd190YXNrdGVhbV90ICAgICAgKm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm87CisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBrbXBfaW50OCAgICAgICAgICAgICAgICAgdF9mcF9jb250cm9sX3NhdmVkOworICAgIGttcF9pbnQ4ICAgICAgICAgICAgICAgICB0X3BhZDJiOworICAgIGttcF9pbnQxNiAgICAgICAgICAgICAgICB0X3g4N19mcHVfY29udHJvbF93b3JkOyAvLyBGUCBjb250cm9sIHJlZ3MKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgdF9teGNzcjsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqdF9pbmxpbmVfYXJndlsgS01QX0lOTElORV9BUkdWX0VOVFJJRVMgXTsKKworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfaW5mb190ICoqdF90aHJlYWRzOworICAgIGttcF90YXNrZGF0YV90ICp0X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGE7ICAvLyBUYXNrZGF0YSBmb3IgdGhlIHRocmVhZCdzIGltcGxpY2l0IHRhc2sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9sZXZlbDsgICAgICAgICAgLy8gbmVzdGVkIHBhcmFsbGVsIGxldmVsCisKKyAgICBLTVBfQUxJR05fQ0FDSEUgaW50ICAgICAgdF9tYXhfYXJnYzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXhfbnByb2M7ICAgIC8vIG1heGltdW0gdGhyZWFkcyB0aGlzIHRlYW0gY2FuIGhhbmRsZSAoZHluYW1pY2x5IGV4cGFuZGFibGUpCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfc2VyaWFsaXplZDsgICAvLyBsZXZlbHMgZGVlcCBvZiBzZXJpYWxpemVkIHRlYW1zCisgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCAgKnRfZGlzcF9idWZmZXI7ICAvLyBidWZmZXJzIGZvciBkaXNwYXRjaCBzeXN0ZW0KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9pZDsgICAgICAgICAgIC8vIHRlYW0ncyBpZCwgYXNzaWduZWQgYnkgZGVidWdnZXIuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfYWN0aXZlX2xldmVsOyAvLyBuZXN0ZWQgYWN0aXZlIHBhcmFsbGVsIGxldmVsCisgICAga21wX3Jfc2NoZWRfdCAgICAgICAgICAgIHRfc2NoZWQ7ICAgICAgICAvLyBydW4tdGltZSBzY2hlZHVsZSBmb3IgdGhlIHRlYW0KKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfZmlyc3RfcGxhY2U7ICAvLyBmaXJzdCAmIGxhc3QgcGxhY2UgaW4gcGFyZW50IHRocmVhZCdzIHBhcnRpdGlvbi4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9sYXN0X3BsYWNlOyAgIC8vIFJlc3RvcmUgdGhlc2UgdmFsdWVzIHRvIG1hc3RlciBhZnRlciBwYXIgcmVnaW9uLgorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpbnQgdF9zaXplX2NoYW5nZWQ7IC8vIHRlYW0gc2l6ZSB3YXMgY2hhbmdlZD86IDA6IG5vLCAxOiB5ZXMsIC0xOiBjaGFuZ2VkIHZpYSBvbXBfc2V0X251bV90aHJlYWRzKCkgY2FsbAorCisgICAgLy8gUmVhZC93cml0ZSBieSB3b3JrZXJzIGFzIHdlbGwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKyAgICAvLyBVc2luZyBDQUNIRV9MSU5FPTY0IHJlZHVjZXMgbWVtb3J5IGZvb3RwcmludCwgYnV0IGNhdXNlcyBhIGJpZyBwZXJmIHJlZ3Jlc3Npb24gb2YgZXBjYyAncGFyYWxsZWwnCisgICAgLy8gYW5kICdiYXJyaWVyJyBvbiBmeGUyNTZsaW4wMS4gVGhpcyBleHRyYSBwYWRkaW5nIHNlcnZlcyB0byBmaXggdGhlIHBlcmZvcm1hbmNlIG9mIGVwY2MgJ3BhcmFsbGVsJworICAgIC8vIGFuZCAnYmFycmllcicgd2hlbiBDQUNIRV9MSU5FPTY0LiBUT0RPOiBpbnZlc3RpZ2F0ZSBtb3JlIGFuZCBnZXQgcmlkIGlmIHRoaXMgcGFkZGluZy4KKyAgICBjaGFyIGR1bW15X3BhZGRpbmdbMTAyNF07CisjZW5kaWYKKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX2ludGVybmFsX2NvbnRyb2xfdCAqdF9jb250cm9sX3N0YWNrX3RvcDsgIC8vIGludGVybmFsIGNvbnRyb2wgc3RhY2sgZm9yIGFkZGl0aW9uYWwgbmVzdGVkIHRlYW1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIFNFUklBTElaRUQgdGVhbXMgbmVzdGVkIDIgb3IgbW9yZSBsZXZlbHMgZGVlcAorI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX2ludDMyICAgICAgICAgICAgICAgIHRfY2FuY2VsX3JlcXVlc3Q7IC8vIHR5cGVkIGZsYWcgdG8gc3RvcmUgcmVxdWVzdCBzdGF0ZSBvZiBjYW5jZWxsYXRpb24KKyNlbmRpZgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X21hc3Rlcl9hY3RpdmU7ICAvLyBzYXZlIG9uIGZvcmssIHJlc3RvcmUgb24gam9pbgorICAgIGttcF90YXNrcV90ICAgICAgICAgICAgICB0X3Rhc2txOyAgICAgICAgICAvLyB0aGlzIHRlYW0ncyB0YXNrIHF1ZXVlCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnRfY29weXByaXZfZGF0YTsgIC8vIHRlYW0gc3BlY2lmaWMgcG9pbnRlciB0byBjb3B5cHJpdmF0ZSBkYXRhIGFycmF5CisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgIHRfY29weWluX2NvdW50ZXI7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICp0X3N0YWNrX2lkOyAgICAgICAvLyB0ZWFtIHNwZWNpZmljIHN0YWNrIHN0aXRjaGluZyBpZCAoZm9yIGl0dG5vdGlmeSkKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9IGttcF9iYXNlX3RlYW1fdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90ZWFtIHsKKyAgICBrbXBfYmFzZV90ZWFtX3QgICAgIHQ7CisgICAgZG91YmxlICAgICAgICAgICAgICB0X2FsaWduOyAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIHRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3RlYW1fdCwgQ0FDSEVfTElORSkgXTsKK307CisKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3RpbWVfZ2xvYmFsIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGR0X2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBkdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2RhdGFfdCAgICAgZHQ7Cit9IGttcF90aW1lX2dsb2JhbF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9nbG9iYWwgeworICAgIC8qIGNhY2hlLWFsaWduZWQgKi8KKyAgICBrbXBfdGltZV9nbG9iYWxfdCAgIGdfdGltZTsKKworICAgIC8qIG5vbiBjYWNoZS1hbGlnbmVkICovCisgICAgdm9sYXRpbGUgaW50ICAgICAgICBnX2Fib3J0OworICAgIHZvbGF0aWxlIGludCAgICAgICAgZ19kb25lOworCisgICAgaW50ICAgICAgICAgICAgICAgICBnX2R5bmFtaWM7CisgICAgZW51bSBkeW5hbWljX21vZGUgICBnX2R5bmFtaWNfbW9kZTsKK30ga21wX2Jhc2VfZ2xvYmFsX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9nbG9iYWwgeworICAgIGttcF9iYXNlX2dsb2JhbF90ICAgZzsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGdfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIGdfcGFkWyBLTVBfUEFEKGttcF9iYXNlX2dsb2JhbF90LCBDQUNIRV9MSU5FKSBdOworfSBrbXBfZ2xvYmFsX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2Vfcm9vdCB7CisgICAgLy8gVE9ETzogR0VIIC0gY29tYmluZSByX2FjdGl2ZSB3aXRoIHJfaW5fcGFyYWxsZWwgdGhlbiByX2FjdGl2ZSA9PSAocl9pbl9wYXJhbGxlbD49IDApCisgICAgLy8gVE9ETzogR0VIIC0gdGhlbiByZXBsYWNlIHJfYWN0aXZlIHdpdGggdF9hY3RpdmVfbGV2ZWxzIGlmIHdlIGNhbiB0byByZWR1Y2UgdGhlIHN5bmNoCisgICAgLy8gICAgICAgICAgICAgb3ZlcmhlYWQgb3Iga2VlcGluZyByX2FjdGl2ZQorCisgICAgdm9sYXRpbGUgaW50ICAgICAgICByX2FjdGl2ZTsgICAgICAgLyogVFJVRSBpZiBzb21lIHJlZ2lvbiBpbiBhIG5lc3QgaGFzID4gMSB0aHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHRUg6IFRoaXMgaXMgbWlzbmFtZWQsIHNob3VsZCBiZSByX2luX3BhcmFsbGVsCisgICAgdm9sYXRpbGUgaW50ICAgICAgICByX25lc3RlZDsgICAgICAgLy8gVE9ETzogR0VIIC0gVGhpcyBpcyB1bnVzZWQsIGp1c3QgcmVtb3ZlIGl0IGVudGlyZWx5LgorICAgIGludCAgICAgICAgICAgICAgICAgcl9pbl9wYXJhbGxlbDsgIC8qIGtlZXBzIGEgY291bnQgb2YgYWN0aXZlIHBhcmFsbGVsIHJlZ2lvbnMgcGVyIHJvb3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHRUg6IFRoaXMgaXMgbWlzbmFtZWQsIHNob3VsZCBiZSByX2FjdGl2ZV9sZXZlbHMKKyAgICBrbXBfdGVhbV90ICAgICAgICAgKnJfcm9vdF90ZWFtOworICAgIGttcF90ZWFtX3QgICAgICAgICAqcl9ob3RfdGVhbTsKKyAgICBrbXBfaW5mb190ICAgICAgICAgKnJfdWJlcl90aHJlYWQ7CisgICAga21wX2xvY2tfdCAgICAgICAgICByX2JlZ2luX2xvY2s7CisgICAgdm9sYXRpbGUgaW50ICAgICAgICByX2JlZ2luOworICAgIGludCAgICAgICAgICAgICAgICAgcl9ibG9ja3RpbWU7IC8qIGJsb2NrdGltZSBmb3IgdGhpcyByb290IGFuZCBkZXNjZW5kYW50cyAqLworfSBrbXBfYmFzZV9yb290X3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9yb290IHsKKyAgICBrbXBfYmFzZV9yb290X3QgICAgIHI7CisgICAgZG91YmxlICAgICAgICAgICAgICByX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICByX3BhZFsgS01QX1BBRChrbXBfYmFzZV9yb290X3QsIENBQ0hFX0xJTkUpIF07Cit9IGttcF9yb290X3Q7CisKK3N0cnVjdCBmb3J0cmFuX2lueF9pbmZvIHsKKyAgICBrbXBfaW50MzIgICBkYXRhOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBpbnQgICAgICBfX2ttcF9zZXR0aW5nczsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9kdXBsaWNhdGVfbGlicmFyeV9vazsKKyNpZiBVU0VfSVRUX0JVSUxECitleHRlcm4gaW50ICAgICAgX19rbXBfZm9ya2pvaW5fZnJhbWVzOworZXh0ZXJuIGludCAgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlOworI2VuZGlmCitleHRlcm4gUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kOworZXh0ZXJuIGludCAgICAgIF9fa21wX2RldGVybV9yZWQ7CisKKyNpZmRlZiBLTVBfREVCVUcKK2V4dGVybiBpbnQgICAgICBrbXBfYV9kZWJ1ZzsKK2V4dGVybiBpbnQgICAgICBrbXBfYl9kZWJ1ZzsKK2V4dGVybiBpbnQgICAgICBrbXBfY19kZWJ1ZzsKK2V4dGVybiBpbnQgICAgICBrbXBfZF9kZWJ1ZzsKK2V4dGVybiBpbnQgICAgICBrbXBfZV9kZWJ1ZzsKK2V4dGVybiBpbnQgICAgICBrbXBfZl9kZWJ1ZzsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworLyogRm9yIGRlYnVnIGluZm9ybWF0aW9uIGxvZ2dpbmcgdXNpbmcgcm90YXRpbmcgYnVmZmVyICovCisjZGVmaW5lIEtNUF9ERUJVR19CVUZfTElORVNfSU5JVCAgICAgICAgNTEyCisjZGVmaW5lIEtNUF9ERUJVR19CVUZfTElORVNfTUlOICAgICAgICAgMQorCisjZGVmaW5lIEtNUF9ERUJVR19CVUZfQ0hBUlNfSU5JVCAgICAgICAgMTI4CisjZGVmaW5lIEtNUF9ERUJVR19CVUZfQ0hBUlNfTUlOICAgICAgICAgMgorCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19idWY7ICAgICAgICAgICAgLyogVFJVRSBtZWFucyB1c2UgYnVmZmVyLCBGQUxTRSBtZWFucyBwcmludCB0byBzdGRlcnIgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9saW5lczsgICAgICAvKiBIb3cgbWFueSBsaW5lcyBvZiBkZWJ1ZyBzdG9yZWQgaW4gYnVmZmVyICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfY2hhcnM7ICAgICAgLyogSG93IG1hbnkgY2hhcmFjdGVycyBhbGxvd2VkIHBlciBsaW5lIGluIGJ1ZmZlciAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmX2F0b21pYzsgICAgIC8qIFRSVUUgbWVhbnMgdXNlIGF0b21pYyB1cGRhdGUgb2YgYnVmZmVyIGVudHJ5IHBvaW50ZXIgKi8KKworZXh0ZXJuIGNoYXIgICAqX19rbXBfZGVidWdfYnVmZmVyOyAgICAgICAgIC8qIERlYnVnIGJ1ZmZlciBpdHNlbGYgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2NvdW50OyAgICAgICAgICAvKiBDb3VudGVyIGZvciBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCBpbiBidWZmZXIgc28gZmFyICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfd2Fybl9jaGFyczsgLyogS2VlcCB0cmFjayBvZiBjaGFyIGluY3JlYXNlIHJlY29tbWVuZGVkIGluIHdhcm5pbmdzICovCisvKiBlbmQgcm90YXRpbmcgZGVidWcgYnVmZmVyICovCisKKyNpZmRlZiBLTVBfREVCVUcKK2V4dGVybiBpbnQgICAgICBfX2ttcF9wYXJfcmFuZ2U7ICAgICAgICAgICAvKiArMSA9PiBvbmx5IGdvIHBhciBmb3IgY29uc3RydWN0cyBpbiByYW5nZSAqLworCisjZGVmaW5lIEtNUF9QQVJfUkFOR0VfUk9VVElORV9MRU4gICAgICAgMTAyNAorZXh0ZXJuIGNoYXIgICAgIF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lW0tNUF9QQVJfUkFOR0VfUk9VVElORV9MRU5dOworI2RlZmluZSBLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTiAgICAgIDEwMjQKK2V4dGVybiBjaGFyICAgICBfX2ttcF9wYXJfcmFuZ2VfZmlsZW5hbWVbS01QX1BBUl9SQU5HRV9GSUxFTkFNRV9MRU5dOworZXh0ZXJuIGludCAgICAgIF9fa21wX3Bhcl9yYW5nZV9sYjsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9wYXJfcmFuZ2VfdWI7CisjZW5kaWYKKworLyogRm9yIHByaW50aW5nIG91dCBkeW5hbWljIHN0b3JhZ2UgbWFwIGZvciB0aHJlYWRzIGFuZCB0ZWFtcyAqLworZXh0ZXJuIGludCAgICAgIF9fa21wX3N0b3JhZ2VfbWFwOyAgICAgICAgIC8qIFRydWUgbWVhbnMgcHJpbnQgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitleHRlcm4gaW50ICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZTsgLyogVHJ1ZSBtZWFucyBzdG9yYWdlIG1hcCBpbmNsdWRlcyBwbGFjZW1lbnQgaW5mbyAqLworZXh0ZXJuIGludCAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2Vfc3BlY2lmaWVkOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorZXh0ZXJuIGttcF9jcHVpbmZvX3QgICAgX19rbXBfY3B1aW5mbzsKKyNlbmRpZgorCitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfc2VyaWFsOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X2d0aWQ7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfY29tbW9uOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X21pZGRsZTsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9wYXJhbGxlbDsKKyNpZiBLTVBfVVNFX01PTklUT1IKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9tb25pdG9yOworI2VuZGlmCitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfdXNlcl9sb2NrczsKK2V4dGVybiBpbnQgX19rbXBfaW5pdF9jb3VudGVyOworZXh0ZXJuIGludCBfX2ttcF9yb290X2NvdW50ZXI7CitleHRlcm4gaW50IF9fa21wX3ZlcnNpb247CisKKy8qIGxpc3Qgb2YgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgY2FjaGVzIGZvciBjb21tb25zICovCitleHRlcm4ga21wX2NhY2hlZF9hZGRyX3QgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdDsKKworLyogQmFycmllciBhbGdvcml0aG0gdHlwZXMgYW5kIG9wdGlvbnMgKi8KK2V4dGVybiBrbXBfdWludDMyICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQ7CitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0OworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdF9kZmx0OworZXh0ZXJuIGttcF91aW50MzIgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gICAgICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm4gICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWUgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBjaGFyIGNvbnN0ICAgKl9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZSAgICBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGNoYXIgY29uc3QgICAqX19rbXBfYmFycmllcl90eXBlX25hbWUgICAgICAgICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSAgICAgICAgWyBicF9sYXN0X2JhciBdOworCisvKiBHbG9iYWwgTG9ja3MgKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pbml0el9sb2NrOyAgICAgLyogY29udHJvbCBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2Zvcmtqb2luX2xvY2s7ICAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9leGl0X2xvY2s7ICAgICAgLyogZXhpdCgpIGlzIG5vdCBhbHdheXMgdGhyZWFkLXNhZmUgKi8KKyNpZiBLTVBfVVNFX01PTklUT1IKK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9tb25pdG9yX2xvY2s7ICAgLyogY29udHJvbCBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiAqLworI2VuZGlmCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdHBfY2FjaGVkX2xvY2s7IC8qIHVzZWQgZm9yIHRoZSBoYWNrIHRvIGFsbG93IHRocmVhZHByaXZhdGUgY2FjaGUgYW5kIF9fa21wX3RocmVhZHMgZXhwYW5zaW9uIHRvIGNvLWV4aXN0ICovCisKK2V4dGVybiBrbXBfbG9ja190IF9fa21wX2dsb2JhbF9sb2NrOyAgICAvKiBjb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgICovCitleHRlcm4ga21wX3F1ZXVpbmdfbG9ja190IF9fa21wX2Rpc3BhdGNoX2xvY2s7ICAvKiBjb250cm9sIGRpc3BhdGNoIGFjY2VzcyAgKi8KK2V4dGVybiBrbXBfbG9ja190IF9fa21wX2RlYnVnX2xvY2s7ICAgICAvKiBjb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworCisvKiB1c2VkIGZvciB5aWVsZGluZyBzcGluLXdhaXRzICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX2luaXRfd2FpdDsgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX25leHRfd2FpdDsgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisKK2V4dGVybiBlbnVtIGxpYnJhcnlfdHlwZSBfX2ttcF9saWJyYXJ5OworCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9zY2hlZDsgICAgLyogZGVmYXVsdCBydW50aW1lIHNjaGVkdWxpbmcgKi8KK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgIF9fa21wX3N0YXRpYzsgICAvKiBkZWZhdWx0IHN0YXRpYyBzY2hlZHVsaW5nIG1ldGhvZCAqLworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSAgX19rbXBfZ3VpZGVkOyAgIC8qIGRlZmF1bHQgZ3VpZGVkIHNjaGVkdWxpbmcgbWV0aG9kICovCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9hdXRvOyAgICAgLyogZGVmYXVsdCBhdXRvIHNjaGVkdWxpbmcgbWV0aG9kICovCitleHRlcm4gaW50ICAgICAgICAgICAgICBfX2ttcF9jaHVuazsgICAgLyogZGVmYXVsdCBydW50aW1lIGNodW5rIHNpemUgKi8KKworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfc3Rrc2l6ZTsgICAgICAgIC8qIHN0YWNrIHNpemUgcGVyIHRocmVhZCAgICAgICAgICovCisjaWYgS01QX1VTRV9NT05JVE9SCitleHRlcm4gc2l6ZV90ICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemU7Lyogc3RhY2sgc2l6ZSBmb3IgbW9uaXRvciB0aHJlYWQgKi8KKyNlbmRpZgorZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfc3Rrb2Zmc2V0OyAgICAgIC8qIHN0YWNrIG9mZnNldCBwZXIgdGhyZWFkICAgICAgICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9zdGtwYWRkaW5nOyAgICAgLyogU2hvdWxkIHdlIHBhZCByb290IHRocmVhZChzKSBzdGFjayAqLworCitleHRlcm4gc2l6ZV90ICAgICBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyOyAvKiBpbmNyZW1lbnRhbCBzaXplIG9mIHBvb2wgZm9yIGttcF9tYWxsb2MoKSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X2NodW5rOyAgICAgIC8qIHdhcyBLTVBfQ0hVTksgc3BlY2lmaWVkPyAgICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9zdGtzaXplOyAgICAvKiB3YXMgS01QX1NUQUNLU0laRSBzcGVjaWZpZWQ/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfb21wX3N0a3NpemU7Lyogd2FzIE9NUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X2FsbF90aHJlYWRzOyAgICAvKiB3YXMgS01QX0FMTF9USFJFQURTIG9yIEtNUF9NQVhfVEhSRUFEUyBzcGVjaWZpZWQ/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfb21wX2FsbF90aHJlYWRzOy8qIHdhcyBPTVBfVEhSRUFEX0xJTUlUIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWU7ICAvKiB3YXMgS01QX0JMT0NLVElNRSBzcGVjaWZpZWQ/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfY2hlY2tzOyAgICAgLyogd2FzIEtNUF9DSEVDS1Mgc3BlY2lmaWVkPyAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrOyAgICAgLyogd2FzIEtNUF9DT05TSVNURU5DWV9DSEVDSyBzcGVjaWZpZWQ/ICAgICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9nZW5lcmF0ZV93YXJuaW5nczsgLyogc2hvdWxkIHdlIGlzc3VlIHdhcm5pbmdzPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuOyAgIC8qIGhhdmUgd2UgaXNzdWVkIHJlc2VydmVfdGhyZWFkcyB3YXJuaW5nPyAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAorZXh0ZXJuIGludCAgICAgICAgX19rbXBfc3VzcGVuZF9jb3VudDsgIC8qIGNvdW50IGluc2lkZSBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKCkgKi8KKyNlbmRpZgorCitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZF9pbml0OworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfeWllbGRfbmV4dDsKKworI2lmIEtNUF9VU0VfTU9OSVRPUgorZXh0ZXJuIGttcF91aW50MzIgX19rbXBfeWllbGRpbmdfb247CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZTsKK2V4dGVybiBrbXBfaW50MzIgIF9fa21wX3lpZWxkX29uX2NvdW50OworZXh0ZXJuIGttcF9pbnQzMiAgX19rbXBfeWllbGRfb2ZmX2NvdW50OworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQ7CisKK2V4dGVybiBzaXplX3QgICAgIF9fa21wX2FsaWduX2FsbG9jOworLyogZm9sbG93aW5nIGRhdGEgcHJvdGVjdGVkIGJ5IGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF94cHJvYzsgICAgICAgICAgLyogbnVtYmVyIG9mIHByb2Nlc3NvcnMgaW4gdGhlIHN5c3RlbSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfYXZhaWxfcHJvYzsgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdmFpbGFibGUgdG8gdGhlIHByb2Nlc3MgKi8KK2V4dGVybiBzaXplX3QgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZTsgLyogc3lzdGVtLWRlZmluZWQgbWluaW11bSBzdGFjayBzaXplICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9zeXNfbWF4X250aDsgICAgLyogc3lzdGVtLWltcG9zZWQgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbWF4X250aDsgICAgICAgIC8qIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIGNvbmN1cnJlbnRseS1leGlzdGluZyB0aHJlYWRzICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyAvKiBjYXBhY2l0eSBvZiB0aGUgYXJyYXlzIF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3QgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGg7ICAvKiBkZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzIGluIGEgcGFyYWxsZWwgcmVnaW9uIGEgbGEgT01QX05VTV9USFJFQURTICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViOyAvKiB1cHBlciBib3VuZCBvbiAiIiBkZXRlcm1pbmVkIGF0IHNlcmlhbCBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfdHBfY2FwYWNpdHk7ICAgIC8qIGNhcGFjaXR5IG9mIF9fa21wX3RocmVhZHMgaWYgdGhyZWFkcHJpdmF0ZSBpcyB1c2VkIChmaXhlZCkgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3RwX2NhY2hlZDsgICAgICAvKiB3aGV0aGVyIHRocmVhZHByaXZhdGUgY2FjaGUgaGFzIGJlZW4gY3JlYXRlZCAoX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkKCkpICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X25lc3RlZDsgICAgLyogbmVzdGVkIHBhcmFsbGVsaXNtIGVuYWJsZWQgYnkgZGVmYXVsdCBhIGxhIE9NUF9ORVNURUQgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lOyAvKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGJsb2NraW5nIChlbnYgc2V0dGluZykgKi8KKyNpZiBLTVBfVVNFX01PTklUT1IKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX21vbml0b3Jfd2FrZXVwczsvKiBudW1iZXIgb2YgdGltZXMgbW9uaXRvciB3YWtlcyB1cCBwZXIgc2Vjb25kICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9idF9pbnRlcnZhbHM7ICAgLyogbnVtYmVyIG9mIG1vbml0b3IgdGltZXN0YW1wIGludGVydmFscyBiZWZvcmUgYmxvY2tpbmcgKi8KKyNlbmRpZgorI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCitleHRlcm4gaW50ICAgICAgICBfX2ttcF96ZXJvX2J0OyAgICAgICAgLyogd2hldGhlciBibG9ja3RpbWUgaGFzIGJlZW4gZm9yY2VkIHRvIHplcm8gKi8KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworI2lmZGVmIEtNUF9ERkxUX05USF9DT1JFUworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbmNvcmVzOyAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBjb3JlcyBmb3IgdGhyZWFkcyBwbGFjZW1lbnQgKi8KKyNlbmRpZgorZXh0ZXJuIGludCAgICAgICAgX19rbXBfYWJvcnRfZGVsYXk7ICAgIC8qIE51bWJlciBvZiBtaWxsaXNlY3MgdG8gZGVsYXkgb24gYWJvcnQgZm9yIFZUdW5lICovCisKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZDsKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrOy8qIEF0IGluaXRpYWxpemF0aW9uLCBjYWxsIHB0aHJlYWRfYXRmb3JrIHRvIGluc3RhbGwgZm9yayBoYW5kbGVyICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9ndGlkX21vZGU7ICAgICAgLyogTWV0aG9kIG9mIGdldHRpbmcgZ3RpZCwgdmFsdWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBub3Qgc2V0LCB3aWxsIGJlIHNldCBhdCBydW50aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIHVzaW5nIHN0YWNrIHNlYXJjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLSBkeW5hbWljIFRMUyAocHRocmVhZF9nZXRzcGVjaWZpYyhMaW51eCogT1MvT1MgWCopIG9yIFRsc0dldFZhbHVlKFdpbmRvd3MqIE9TKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIC0gc3RhdGljIFRMUyAoX19kZWNsc3BlYyh0aHJlYWQpIF9fa21wX2d0aWQpLCBMaW51eCogT1MgLnNvIG9ubHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlOyAvKiBJZiB0cnVlLCBhZGp1c3QgbWV0aG9kIGJhc2VkIG9uICN0aHJlYWRzICovCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyNpZiBLTVBfT1NfV0lORE9XUworZXh0ZXJuIF9fZGVjbHNwZWModGhyZWFkKSBpbnQgX19rbXBfZ3RpZDsgLyogVGhpcyB0aHJlYWQncyBndGlkLCBpZiBfX2ttcF9ndGlkX21vZGUgPT0gMyAqLworI2Vsc2UKK2V4dGVybiBfX3RocmVhZCBpbnQgX19rbXBfZ3RpZDsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAtIHdvcmthcm91bmQgYmVjYXVzZSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBjb21waWxlciAyMDExMDMxNiBkb2Vzbid0IGFjY2VwdCBfX2RlY2xzcGVjICovCisjZW5kaWYKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3Rsc19ndGlkX21pbjsgICAvKiAjdGhyZWFkcyBiZWxvdyB3aGljaCB1c2Ugc3Agc2VhcmNoIGZvciBndGlkICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9mb3JlaWduX3RwOyAgICAgLyogSWYgdHJ1ZSwgc2VwYXJhdGUgVFAgdmFyIGZvciBlYWNoIGZvcmVpZ24gdGhyZWFkICovCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorZXh0ZXJuIGludCAgICAgICAgX19rbXBfaW5oZXJpdF9mcF9jb250cm9sOyAvKiBjb3B5IGZwIGNyZWcocykgcGFyZW50LT53b3JrZXJzIGF0IGZvcmsgKi8KK2V4dGVybiBrbXBfaW50MTYgIF9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQ7IC8qIGluaXQgdGhyZWFkJ3MgRlAgY29udHJvbCByZWcgKi8KK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2luaXRfbXhjc3I7ICAgICAgLyogaW5pdCB0aHJlYWQncyBteHNjciAqLworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVsczsgLyogbWF4X2FjdGl2ZV9sZXZlbHMgZm9yIG5lc3RlZCBwYXJhbGxlbGlzbSBlbmFibGVkIGJ5IGRlZmF1bHQgYSBsYSBPTVBfTUFYX0FDVElWRV9MRVZFTFMgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzOyAvKiBtYXggcG9zc2libGUgZHluYW1pYyBsb29wcyBpbiBjb25jdXJyZW50IGV4ZWN1dGlvbiBwZXIgdGVhbSAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9ob3RfdGVhbXNfbW9kZTsKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWw7CisjZW5kaWYKKworIyBpZiBLTVBfT1NfTElOVVgKK2V4dGVybiBlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgX19rbXBfY2xvY2tfZnVuY3Rpb247CitleHRlcm4gaW50IF9fa21wX2Nsb2NrX2Z1bmN0aW9uX3BhcmFtOworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorZXh0ZXJuIGVudW0gbWljX3R5cGUgX19rbXBfbWljX3R5cGU7CisjZW5kaWYKKworIyBpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitleHRlcm4gZG91YmxlICAgICAgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsOyAgIC8qIEludGVydmFsIGZvciB0aGUgbG9hZCBiYWxhbmNlIGFsZ29yaXRobSAqLworIyBlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKy8vIE9wZW5NUCAzLjEgLSBOZXN0ZWQgbnVtIHRocmVhZHMgYXJyYXkKK3R5cGVkZWYgc3RydWN0IGttcF9uZXN0ZWRfbnRocmVhZHNfdCB7CisgICAgaW50ICogbnRoOworICAgIGludCAgIHNpemU7CisgICAgaW50ICAgdXNlZDsKK30ga21wX25lc3RlZF9udGhyZWFkc190OworCitleHRlcm4ga21wX25lc3RlZF9udGhyZWFkc190IF9fa21wX25lc3RlZF9udGg7CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIFBhcmFtZXRlcnMgZm9yIHRoZSBzcGVjdWxhdGl2ZSBsb2NrIGJhY2tvZmYgc3lzdGVtLgorc3RydWN0IGttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtc190IHsKKyAgICAvLyBOdW1iZXIgb2Ygc29mdCByZXRyaWVzIGJlZm9yZSBpdCBjb3VudHMgYXMgYSBoYXJkIHJldHJ5LgorICAgIGttcF91aW50MzIgbWF4X3NvZnRfcmV0cmllczsKKyAgICAvLyBCYWRuZXNzIGlzIGEgYml0IG1hc2sgOiAwLDEsMyw3LDE1LC4uLiBvbiBlYWNoIGhhcmQgZmFpbHVyZSB3ZSBtb3ZlIG9uZSB0byB0aGUgcmlnaHQKKyAgICBrbXBfdWludDMyIG1heF9iYWRuZXNzOworfTsKKworZXh0ZXJuIGttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtc190IF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zOworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCitleHRlcm4gY2hhciAqIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZTsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBpbnQgX19rbXBfZGlzcGxheV9lbnY7ICAgICAgICAgICAvKiBUUlVFIG9yIEZBTFNFICovCitleHRlcm4gaW50IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2U7ICAgLyogVFJVRSBpZiBPTVBfRElTUExBWV9FTlY9VkVSQk9TRSAqLworZXh0ZXJuIGludCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uOyAgICAgIC8qIFRSVUUgb3IgRkFMU0UgKi8KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdGhlIGZvbGxvd2luZyBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBmb3JrL2pvaW4gbG9jayAqLworLyogd3JpdGU6IGxvY2sgIHJlYWQ6IGFueXRpbWUgKi8KK2V4dGVybiAgICAgICAgICBrbXBfaW5mb190ICoqX19rbXBfdGhyZWFkczsgICAgICAvKiBEZXNjcmlwdG9ycyBmb3IgdGhlIHRocmVhZHMgKi8KKy8qIHJlYWQvd3JpdGU6IGxvY2sgKi8KK2V4dGVybiB2b2xhdGlsZSBrbXBfdGVhbV90ICAqICAgICBfX2ttcF90ZWFtX3Bvb2w7CitleHRlcm4gdm9sYXRpbGUga21wX2luZm9fdCAgKiAgICAgX19rbXBfdGhyZWFkX3Bvb2w7CisKKy8qIHRvdGFsIG51bWJlciBvZiB0aHJlYWRzIHJlYWNoYWJsZSBmcm9tIHNvbWUgcm9vdCB0aHJlYWQgaW5jbHVkaW5nIGFsbCByb290IHRocmVhZHMqLworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9udGg7CisvKiB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyByZWFjaGFibGUgZnJvbSBzb21lIHJvb3QgdGhyZWFkIGluY2x1ZGluZyBhbGwgcm9vdCB0aHJlYWRzLAorICAgYW5kIHRob3NlIGluIHRoZSB0aHJlYWQgcG9vbCAqLworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9hbGxfbnRoOworZXh0ZXJuIGludCBfX2ttcF90aHJlYWRfcG9vbF9udGg7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGg7CisKK2V4dGVybiBrbXBfcm9vdF90ICoqX19rbXBfcm9vdDsgICAgICAgICAvKiByb290IG9mIHRocmVhZCBoaWVyYXJjaHkgKi8KKy8qIGVuZCBkYXRhIHByb3RlY3RlZCBieSBmb3JrL2pvaW4gbG9jayAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBrbXBfZ2xvYmFsX3QgIF9fa21wX2dsb2JhbDsgICAgICAgICAvKiBnbG9iYWwgc3RhdHVzICovCisKK2V4dGVybiBrbXBfaW5mb190IF9fa21wX21vbml0b3I7CitleHRlcm4gdm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90ZWFtX2NvdW50ZXI7ICAgICAgLy8gVXNlZCBieSBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5LgorZXh0ZXJuIHZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGFza19jb3VudGVyOyAgICAgIC8vIFVzZWQgYnkgRGVidWdnaW5nIFN1cHBvcnQgTGlicmFyeS4KKworI2lmIFVTRV9ERUJVR0dFUgorCisjZGVmaW5lIF9LTVBfR0VOX0lEKCBjb3VudGVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9kZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKHZvbGF0aWxlIGttcF9pbnQzMiAqKSAmIGNvdW50ZXIgKSArIDEgICAgXAorICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisjZWxzZQorI2RlZmluZSBfS01QX0dFTl9JRCggY291bnRlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICkKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KKworI2RlZmluZSBLTVBfR0VOX1RBU0tfSUQoKSAgICBfS01QX0dFTl9JRCggX19rbXBfdGFza19jb3VudGVyICkKKyNkZWZpbmUgS01QX0dFTl9URUFNX0lEKCkgICAgX0tNUF9HRU5fSUQoIF9fa21wX3RlYW1fY291bnRlciApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGludCBndGlkLCB2b2lkICpwMSwgdm9pZCogcDIsIHNpemVfdCBzaXplLCBjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLiApOworCitleHRlcm4gdm9pZCBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoIHZvaWQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfYmVnaW4oIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCBpbnQgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9hdGV4aXQoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9maW5pKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfZHRvciggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2Rlc3QoIHZvaWQqICk7CisKK2V4dGVybiBpbnQgIF9fa21wX3JlZ2lzdGVyX3Jvb3QoIGludCBpbml0aWFsX3RocmVhZCApOworZXh0ZXJuIHZvaWQgX19rbXBfdW5yZWdpc3Rlcl9yb290KCBpbnQgZ3RpZCApOworCitleHRlcm4gaW50ICBfX2ttcF9pZ25vcmVfbXBwYmVnKCB2b2lkICk7CitleHRlcm4gaW50ICBfX2ttcF9pZ25vcmVfbXBwZW5kKCB2b2lkICk7CisKK2V4dGVybiBpbnQgIF9fa21wX2VudGVyX3NpbmdsZSggaW50IGd0aWQsIGlkZW50X3QgKmlkX3JlZiwgaW50IHB1c2hfd3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX2V4aXRfc2luZ2xlKCBpbnQgZ3RpZCApOworCitleHRlcm4gdm9pZCBfX2ttcF9wYXJhbGxlbF9kZW8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApOworZXh0ZXJuIHZvaWQgX19rbXBfcGFyYWxsZWxfZHhvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKTsKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK2V4dGVybiBpbnQgIF9fa21wX2dldF9sb2FkX2JhbGFuY2UoIGludCApOworI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9UVgorZXh0ZXJuIHZvaWQgX19rbXBfdHZfdGhyZWFkcHJpdmF0ZV9zdG9yZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKmdsb2JhbF9hZGRyLCB2b2lkICp0aHJlYWRfYWRkciApOworI2VuZGlmCisKK2V4dGVybiBpbnQgIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCB2b2lkICk7CitleHRlcm4gaW50ICBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2V4aXRfdGhyZWFkKCBpbnQgZXhpdF9zdGF0dXMgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0X3RocmVhZCggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYWJvcnRfcHJvY2Vzcyggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfd2FybiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3NldF9udW1fdGhyZWFkcyggaW50IG5ld19udGgsIGludCBndGlkICk7CisKKy8vIFJldHVybnMgY3VycmVudCB0aHJlYWQgKHBvaW50ZXIgdG8ga21wX2luZm9fdCkuIEN1cnJlbnQgdGhyZWFkICptdXN0KiBiZSByZWdpc3RlcmVkLgorc3RhdGljIGlubGluZSBrbXBfaW5mb190ICogX19rbXBfZW50cnlfdGhyZWFkKCkKK3sKKyAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCisgICAgICByZXR1cm4gX19rbXBfdGhyZWFkc1tndGlkXTsKK30KKworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgZ3RpZCwgaW50IG5ld19tYXhfYWN0aXZlX2xldmVscyApOworZXh0ZXJuIGludCAgX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgZ3RpZCApOworZXh0ZXJuIGludCAgX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIGludCBndGlkLCBpbnQgbGV2ZWwgKTsKK2V4dGVybiBpbnQgIF9fa21wX2dldF90ZWFtX3NpemUoIGludCBndGlkLCBpbnQgbGV2ZWwgKTsKK2V4dGVybiB2b2lkIF9fa21wX3NldF9zY2hlZHVsZSggaW50IGd0aWQsIGttcF9zY2hlZF90IG5ld19zY2hlZCwgaW50IGNodW5rICk7CitleHRlcm4gdm9pZCBfX2ttcF9nZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCAqIHNjaGVkLCBpbnQgKiBjaHVuayApOworCitleHRlcm4gdW5zaWduZWQgc2hvcnQgX19rbXBfZ2V0X3JhbmRvbSgga21wX2luZm9fdCAqIHRocmVhZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9yYW5kb20oIGttcF9pbmZvX3QgKiB0aHJlYWQgKTsKKworZXh0ZXJuIGttcF9yX3NjaGVkX3QgX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYWRqdXN0X251bV90aHJlYWRzKCBpbnQgbmV3X25wcm9jICk7CisKK2V4dGVybiB2b2lkICogX19fa21wX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAqIF9fX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fX2ttcF9mcmVlKCB2b2lkICogcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKTsKKyNkZWZpbmUgX19rbXBfYWxsb2NhdGUoIHNpemUgKSAgICAgIF9fX2ttcF9hbGxvY2F0ZSggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplICkgX19fa21wX3BhZ2VfYWxsb2NhdGUoIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfZnJlZSggcHRyICkgICAgICAgICAgIF9fX2ttcF9mcmVlKCAocHRyKSBLTVBfU1JDX0xPQ19DVVJSICkKKworI2lmIFVTRV9GQVNUX01FTU9SWQorZXh0ZXJuIHZvaWQgKiBfX19rbXBfZmFzdF9hbGxvY2F0ZSgga21wX2luZm9fdCAqdGhpc190aHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICAgX19fa21wX2Zhc3RfZnJlZSgga21wX2luZm9fdCAqdGhpc190aHIsIHZvaWQgKnB0ciBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fa21wX2ZyZWVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CitleHRlcm4gdm9pZCAgIF9fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CisjZGVmaW5lIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRoaXNfdGhyLCBzaXplICkgX19fa21wX2Zhc3RfYWxsb2NhdGUoICh0aGlzX3RociksIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfZmFzdF9mcmVlKCB0aGlzX3RociwgcHRyICkgICAgICBfX19rbXBfZmFzdF9mcmVlKCAodGhpc190aHIpLCAocHRyKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNlbmRpZgorCitleHRlcm4gdm9pZCAqIF9fX2ttcF90aHJlYWRfbWFsbG9jKCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgKiBfX19rbXBfdGhyZWFkX2NhbGxvYygga21wX2luZm9fdCAqdGgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAqIF9fX2ttcF90aHJlYWRfcmVhbGxvYygga21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgICBfX19rbXBfdGhyZWFkX2ZyZWUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCApOworI2RlZmluZSBfX2ttcF90aHJlYWRfbWFsbG9jKCAgdGgsIHNpemUgKSAgICAgICAgICBfX19rbXBfdGhyZWFkX21hbGxvYyggICh0aCksIChzaXplKSAgICAgICAgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfY2FsbG9jKCAgdGgsIG5lbGVtLCBlbHNpemUgKSBfX19rbXBfdGhyZWFkX2NhbGxvYyggICh0aCksIChuZWxlbSksIChlbHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfcmVhbGxvYyggdGgsIHB0ciwgc2l6ZSApICAgICBfX19rbXBfdGhyZWFkX3JlYWxsb2MoICh0aCksIChwdHIpLCAoc2l6ZSkgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorI2RlZmluZSBfX2ttcF90aHJlYWRfZnJlZSggICAgdGgsIHB0ciApICAgICAgICAgICBfX19rbXBfdGhyZWFkX2ZyZWUoICAgICh0aCksIChwdHIpICAgICAgICAgICAgIEtNUF9TUkNfTE9DX0NVUlIgKQorCisjZGVmaW5lIEtNUF9JTlRFUk5BTF9NQUxMT0Moc3opICAgIG1hbGxvYyhzeikKKyNkZWZpbmUgS01QX0lOVEVSTkFMX0ZSRUUocCkgICAgICAgZnJlZShwKQorI2RlZmluZSBLTVBfSU5URVJOQUxfUkVBTExPQyhwLHN6KSByZWFsbG9jKChwKSwoc3opKQorI2RlZmluZSBLTVBfSU5URVJOQUxfQ0FMTE9DKG4sc3opICBjYWxsb2MoKG4pLChzeikpCisKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGludCBudW1fdGhyZWFkcyApOworCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfcHJvY19iaW5kKCBpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kICk7CitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX251bV90ZWFtcyggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IG51bV90ZWFtcywgaW50IG51bV90aHJlYWRzICk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfeWllbGQoIGludCBjb25kICk7CisKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgIGttcF9pbnQzMiBjaHVuayApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAga21wX2ludDMyIGNodW5rICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmsgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgIGttcF9pbnQ2NCBjaHVuayApOworCitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQzMiAqcF9sYiwga21wX2ludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QgKTsKK2V4dGVybiBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50MzIgKnBfbGIsIGttcF91aW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCApOworZXh0ZXJuIGludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfaW50NjQgKnBfbGIsIGttcF9pbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0ICk7CitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfdWludDY0ICpwX2xiLCBrbXBfdWludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9maW5pXzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CisKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDMyIGxiLCBrbXBfaW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50MzIgbGIsIGttcF91aW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2VxXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX25lcV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2x0XzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2dlXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2xlXzQoICBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIgKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3dhaXRfeWllbGRfNCgga21wX3VpbnQzMiB2b2xhdGlsZSAqIHNwaW5uZXIsIGttcF91aW50MzIgY2hlY2tlciwga21wX3VpbnQzMiAoKnByZWQpIChrbXBfdWludDMyLCBrbXBfdWludDMyKSwgdm9pZCAqIG9iaiApOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF95aWVsZF80X3B0ciggdm9pZCAqIHNwaW5uZXIsIGttcF91aW50MzIgY2hlY2tlciwga21wX3VpbnQzMiAoKiBwcmVkKSggdm9pZCAqLCBrbXBfdWludDMyICksIHZvaWQgKiBvYmogKTsKKworY2xhc3Mga21wX2ZsYWdfMzI7CitjbGFzcyBrbXBfZmxhZ182NDsKK2NsYXNzIGttcF9mbGFnX29uY29yZTsKK2V4dGVybiB2b2lkIF9fa21wX3dhaXRfNjQoa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9mbGFnXzY0ICpmbGFnLCBpbnQgZmluYWxfc3BpbgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAsIHZvaWQgKiBpdHRfc3luY19vYmoKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlXzY0KGttcF9mbGFnXzY0ICpmbGFnKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfaW5maW5pdGVfbG9vcCggdm9pZCApOworCitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwKCB2b2lkICk7CisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICBleHRlcm4gaW50ICBfX2ttcF9oYW5kbGVfc2lnbmFsczsKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIGludCBwYXJhbGxlbF9pbml0ICk7CisgICAgZXh0ZXJuIHZvaWQgX19rbXBfcmVtb3ZlX3NpZ25hbHMoIHZvaWQgKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2ttcF9jbGVhcl9zeXN0ZW1fdGltZSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggZG91YmxlICpkZWx0YSApOworCitleHRlcm4gdm9pZCBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCBrbXBfaW5mb190ICp0aHIgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZXhwYW5kX2hvc3RfbmFtZSggY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSApOworZXh0ZXJuIHZvaWQgX19rbXBfZXhwYW5kX2ZpbGVfbmFtZSggY2hhciAqcmVzdWx0LCBzaXplX3QgcmxlbiwgY2hhciAqcGF0dGVybiApOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorZXh0ZXJuIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV9zeXN0ZW1fdGljayggdm9pZCApOyAgLyogSW5pdGlhbGl6ZSB0aW1lciB0aWNrIHZhbHVlICovCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfcnVudGltZV9pbml0aWFsaXplKCB2b2lkICk7ICAvKiBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCitleHRlcm4gdm9pZCBfX2ttcF9ydW50aW1lX2Rlc3Ryb3koIHZvaWQgKTsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKK2V4dGVybiBjaGFyICpfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4sIGttcF9hZmZpbl9tYXNrX3QgKm1hc2spOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soaW50IGd0aWQsIGludCBpc2Ffcm9vdCk7IC8qIHNldCBhZmZpbml0eSBhY2NvcmRpbmcgdG8gS01QX0FGRklOSVRZICovCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X3NldF9wbGFjZShpbnQgZ3RpZCk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKCBjb25zdCBjaGFyICplbnZfdmFyICk7CitleHRlcm4gaW50IF9fa21wX2F1eF9zZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXhfcHJvYygpOworZXh0ZXJuIGludCBfX2ttcF9hdXhfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzayk7CitleHRlcm4gaW50IF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzayk7CitleHRlcm4gdm9pZCBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eSggaW50IHRpZCwgaW50IHRlYW1fc2l6ZSApOworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfY2xlYW51cF9oaWVyYXJjaHkoKTsKK2V4dGVybiB2b2lkIF9fa21wX2dldF9oaWVyYXJjaHkoa21wX3VpbnQzMiBucHJvYywga21wX2JzdGF0ZV90ICp0aHJfYmFyKTsKKworI2lmIEtNUF9VU0VfRlVURVgKKworZXh0ZXJuIGludCBfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZSggdm9pZCApOworCisjZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorCitleHRlcm4gdm9pZCBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggaW50IGd0aWQgKTsKK2V4dGVybiBpbnQgIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCB2b2lkICk7CisKK2V4dGVybiBkb3VibGUgX19rbXBfcmVhZF9jcHVfdGltZSggdm9pZCApOworCitleHRlcm4gaW50ICBfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICk7CisKKyNpZiBLTVBfVVNFX01PTklUT1IKK2V4dGVybiB2b2lkIF9fa21wX2NyZWF0ZV9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApOworI2VuZGlmCisKK2V4dGVybiB2b2lkICpfX2ttcF9sYXVuY2hfdGhyZWFkKCBrbXBfaW5mb190ICp0aHIgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY3JlYXRlX3dvcmtlciggaW50IGd0aWQsIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc3RhY2tfc2l6ZSApOworCisjaWYgS01QX09TX1dJTkRPV1MKK2V4dGVybiBpbnQgIF9fa21wX3N0aWxsX3J1bm5pbmcoa21wX2luZm9fdCAqdGgpOworZXh0ZXJuIGludCAgX19rbXBfaXNfdGhyZWFkX2FsaXZlKCBrbXBfaW5mb190ICogdGgsIERXT1JEICpleGl0X3ZhbCApOworZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV9oYW5kbGUoIGttcF90aHJlYWRfdCB0SGFuZGxlICk7CisjZW5kaWYKKworI2lmIEtNUF9VU0VfTU9OSVRPUgorZXh0ZXJuIHZvaWQgX19rbXBfcmVhcF9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApOworI2VuZGlmCitleHRlcm4gdm9pZCBfX2ttcF9yZWFwX3dvcmtlcigga21wX2luZm9fdCAqdGggKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGludCBndGlkICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfMzIoIGludCB0aF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZyApOworZXh0ZXJuIHZvaWQgX19rbXBfc3VzcGVuZF82NCggaW50IHRoX2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnICk7CitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kX29uY29yZSggaW50IHRoX2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZyApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVzdW1lXzMyKCBpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzMyICpmbGFnICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZXN1bWVfNjQoIGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcgKTsKK2V4dGVybiB2b2lkIF9fa21wX3Jlc3VtZV9vbmNvcmUoIGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2VsYXBzZWQoIGRvdWJsZSAqICk7CitleHRlcm4gdm9pZCBfX2ttcF9lbGFwc2VkX3RpY2soIGRvdWJsZSAqICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2VuYWJsZSggaW50IG9sZF9zdGF0ZSApOworZXh0ZXJuIHZvaWQgX19rbXBfZGlzYWJsZSggaW50ICpvbGRfc3RhdGUgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfdGhyZWFkX3NsZWVwKCBpbnQgbWlsbGlzICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NvbW1vbl9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9jb21tb25fZGVzdHJveSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZCggaW50IGd0aWQgKTsKKworI2lmIEtNUF9PU19VTklYCitleHRlcm4gdm9pZCBfX2ttcF9yZWdpc3Rlcl9hdGZvcmsoIHZvaWQgKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kX3VuaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICk7CisKK2V4dGVybiBrbXBfaW5mb190ICogX19rbXBfYWxsb2NhdGVfdGhyZWFkKCBrbXBfcm9vdF90ICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQpOworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4ga21wX3RlYW1fdCAqIF9fa21wX2FsbG9jYXRlX3RlYW0oIGttcF9yb290X3QgKnJvb3QsIGludCBuZXdfbnByb2MsIGludCBtYXhfbnByb2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKm5ld19pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYyBVU0VfTkVTVEVEX0hPVF9BUkcoa21wX2luZm9fdCAqdGhyKSApOworI2Vsc2UKK2V4dGVybiBrbXBfdGVhbV90ICogX19rbXBfYWxsb2NhdGVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwgaW50IG5ld19ucHJvYywgaW50IG1heF9ucHJvYywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICp0aHIpICk7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKK2V4dGVybiB2b2lkIF9fa21wX2ZyZWVfdGhyZWFkKCBrbXBfaW5mb190ICogKTsKK2V4dGVybiB2b2lkIF9fa21wX2ZyZWVfdGVhbSgga21wX3Jvb3RfdCAqLCBrbXBfdGVhbV90ICogIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICopICk7CitleHRlcm4ga21wX3RlYW1fdCAqIF9fa21wX3JlYXBfdGVhbSgga21wX3RlYW1fdCAqICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gdm9pZCBfX2ttcF9pbml0aWFsaXplX2JnZXQoIGttcF9pbmZvX3QgKnRoICk7CitleHRlcm4gdm9pZCBfX2ttcF9maW5hbGl6ZV9iZ2V0KCBrbXBfaW5mb190ICp0aCApOworCitLTVBfRVhQT1JUIHZvaWQgKmttcGNfbWFsbG9jKCBzaXplX3Qgc2l6ZSApOworS01QX0VYUE9SVCB2b2lkICprbXBjX2FsaWduZWRfbWFsbG9jKCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWdubWVudCApOworS01QX0VYUE9SVCB2b2lkICprbXBjX2NhbGxvYyggc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplICk7CitLTVBfRVhQT1JUIHZvaWQgKmttcGNfcmVhbGxvYyggdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSApOworS01QX0VYUE9SVCB2b2lkICBrbXBjX2ZyZWUoIHZvaWQgKnB0ciApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGRlY2xhcmF0aW9ucyBmb3IgaW50ZXJuYWwgdXNlICovCisKK2V4dGVybiBpbnQgIF9fa21wX2JhcnJpZXIoIGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCwgaW50IGlzX3NwbGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopICk7CitleHRlcm4gdm9pZCBfX2ttcF9lbmRfc3BsaXRfYmFycmllciAoIGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCApOworCisvKiEKKyAqIFRlbGwgdGhlIGZvcmsgY2FsbCB3aGljaCBjb21waWxlciBnZW5lcmF0ZWQgdGhlIGZvcmsgY2FsbCwgYW5kIHRoZXJlZm9yZSBob3cgdG8gZGVhbCB3aXRoIHRoZSBjYWxsLgorICovCitlbnVtIGZvcmtfY29udGV4dF9lCit7CisgICAgZm9ya19jb250ZXh0X2dudSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENhbGxlZCBmcm9tIEdOVSBnZW5lcmF0ZWQgY29kZSwgc28gbXVzdCBub3QgaW52b2tlIHRoZSBtaWNyb3Rhc2sgaW50ZXJuYWxseS4gKi8KKyAgICBmb3JrX2NvbnRleHRfaW50ZWwsICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2FsbGVkIGZyb20gSW50ZWwgZ2VuZXJhdGVkIGNvZGUuICAqLworICAgIGZvcmtfY29udGV4dF9sYXN0Cit9OworZXh0ZXJuIGludCBfX2ttcF9mb3JrX2NhbGwoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGVudW0gZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0LAorICBrbXBfaW50MzIgYXJnYywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgdm9pZCAqdW53cmFwcGVkX3Rhc2ssCisjZW5kaWYKKyAgbWljcm90YXNrX3QgbWljcm90YXNrLCBsYXVuY2hfdCBpbnZva2VyLAorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgKmFwCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFwCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfam9pbl9jYWxsKCBpZGVudF90ICpsb2MsIGludCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGVudW0gZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQgZXhpdF90ZWFtcyA9IDAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICppZCwga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZm9yayggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfdGVhbV90ICp0ZWFtICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9qb2luKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiBpbnQgX19rbXBfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKCBpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3J1bl9hZnRlcl9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSApOworCisvLyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGV4cG9ydGVkCitLTVBfRVhQT1JUIGludCBfX2ttcGNfaW52b2tlX3Rhc2tfZnVuYyggaW50IGd0aWQgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIGludCAgX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3RlYW1zX21hc3RlciggaW50IGd0aWQgKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scygga21wX2luZm9fdCAqIHRocmVhZCApOworZXh0ZXJuIHZvaWQgX19rbXBfdXNlcl9zZXRfbGlicmFyeSAoZW51bSBsaWJyYXJ5X3R5cGUgYXJnKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfbGlicmFyeSAoZW51bSBsaWJyYXJ5X3R5cGUgYXJnKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBzaXplX3QgYXJnKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfYmxvY2t0aW1lIChpbnQgYXJnLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCB0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X3NldF9kZWZhdWx0cyggY2hhciBjb25zdCAqIHN0ciwgaW50IGxlbiApOworCisvKiBGdW5jdGlvbnMgY2FsbGVkIGZyb20gX19rbXBfYXV4X2Vudl9pbml0aWFsaXplKCkgaW4ga21wX3NldHRpbmdzLmNwcCAqLwordm9pZCBrbXBjX3NldF9ibG9ja3RpbWUgKGludCBhcmcpOwordm9pZCBvbXBjX3NldF9uZXN0ZWQoIGludCBmbGFnICk7Cit2b2lkIG9tcGNfc2V0X2R5bmFtaWMoIGludCBmbGFnICk7Cit2b2lkIG9tcGNfc2V0X251bV90aHJlYWRzKCBpbnQgYXJnICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RociApOworZXh0ZXJuIGttcF90YXNrX3QqIF9fa21wX3Rhc2tfYWxsb2MoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLAorICBrbXBfdGFza2luZ19mbGFnc190ICpmbGFncywgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQsIGludCBzZXRfY3Vycl90YXNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9maW5pc2hfaW1wbGljaXRfdGFzayhrbXBfaW5mb190ICp0aGlzX3Rocik7CitleHRlcm4gdm9pZCBfX2ttcF9mcmVlX2ltcGxpY2l0X3Rhc2soa21wX2luZm9fdCAqdGhpc190aHIpOworCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc18zMihrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ18zMiAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqLAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCk7CitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc182NChrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqLAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCk7CitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc19vbmNvcmUoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGl0dF9zeW5jX29iaiwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV90YXNrX3RlYW0oIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlYXBfdGFza190ZWFtcyggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF90YXNrX3RlYW1fc2V0dXAgKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IGFsd2F5cyApOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza190ZWFtX3N5bmMgICgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rhc2tfdGVhbV93YWl0ICAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB2b2lkICogaXR0X3N5bmNfb2JqCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQgd2FpdD0xCispOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza2luZ19iYXJyaWVyKCBrbXBfdGVhbV90ICp0ZWFtLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCBndGlkICk7CisKK2V4dGVybiBpbnQgIF9fa21wX2lzX2FkZHJlc3NfbWFwcGVkKCB2b2lkICphZGRyICk7CitleHRlcm4ga21wX3VpbnQ2NCBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCk7CisKKyNpZiBLTVBfT1NfVU5JWAorZXh0ZXJuIGludCAgX19rbXBfcmVhZF9mcm9tX2ZpbGUoIGNoYXIgY29uc3QgKnBhdGgsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uICk7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLworLy8gQXNzZW1ibHkgcm91dGluZXMgdGhhdCBoYXZlIG5vIGNvbXBpbGVyIGludHJpbnNpYyByZXBsYWNlbWVudAorLy8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworZXh0ZXJuIHZvaWQgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoIGttcF9jcHVpbmZvX3QgKnAgKTsKKworI2RlZmluZSBfX2ttcF9sb2FkX214Y3NyKHApIF9tbV9zZXRjc3IoKihwKSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9zdG9yZV9teGNzcigga21wX3VpbnQzMiAqcCApIHsgKnAgPSBfbW1fZ2V0Y3NyKCk7IH0KKworZXh0ZXJuIHZvaWQgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CitleHRlcm4gdm9pZCBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisjIGRlZmluZSBLTVBfWDg2X01YQ1NSX01BU0sgICAgICAweGZmZmZmZmMwICAgLyogaWdub3JlIHN0YXR1cyBmbGFncyAoNiBsc2IpICovCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK2V4dGVybiBpbnQgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwgaW50IGd0aWQsIGludCBucHIsIGludCBhcmdjLCB2b2lkICphcmd2W10KKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB2b2lkICoqZXhpdF9mcmFtZV9wdHIKKyNlbmRpZgorKTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2JlZ2luICAgICAgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZmxhZ3MgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmQgICAgICAgICAgICAgICAgICAoIGlkZW50X3QgKiApOworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMgKCBpZGVudF90ICosIHZvaWQgKiBkYXRhLCBrbXBjX2N0b3JfdmVjIGN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfY2N0b3JfdmVjIGNjdG9yLCBrbXBjX2R0b3JfdmVjIGR0b3IsIHNpemVfdCB2ZWN0b3JfbGVuZ3RoICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlciAgICAgKCBpZGVudF90ICosIHZvaWQgKiBkYXRhLCBrbXBjX2N0b3IgY3Rvciwga21wY19jY3RvciBjY3Rvciwga21wY19kdG9yIGR0b3IgKTsKK0tNUF9FWFBPUlQgdm9pZCAqIF9fa21wY190aHJlYWRwcml2YXRlICAgICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIHZvaWQgKiBkYXRhLCBzaXplX3Qgc2l6ZSApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtICAoIGlkZW50X3QgKiApOworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19nbG9iYWxfbnVtX3RocmVhZHMgKCBpZGVudF90ICogKTsKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYm91bmRfdGhyZWFkX251bSAgICggaWRlbnRfdCAqICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2JvdW5kX251bV90aHJlYWRzICAoIGlkZW50X3QgKiApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX29rX3RvX2ZvcmsgICAgICggaWRlbnRfdCAqICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZm9ya19jYWxsICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgbmFyZ3MsIGttcGNfbWljcm8gbWljcm90YXNrLCAuLi4gKTsKKworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZmx1c2ggICAgICAgICAgICAgICggaWRlbnRfdCAqKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19iYXJyaWVyICAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX21hc3RlciAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9tYXN0ZXIgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19vcmRlcmVkICAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX29yZGVyZWQgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2NyaXRpY2FsICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfY3JpdGljYWwgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqICk7CisKKyNpZiBPTVBfNDVfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2NyaXRpY2FsX3dpdGhfaGludCAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICosIHVpbnRwdHJfdCBoaW50ICk7CisjZW5kaWYKKworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19iYXJyaWVyX21hc3RlciAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfYmFycmllcl9tYXN0ZXIgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0ICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX3NpbmdsZSAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9zaW5nbGUgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCB2b2lkIEtNUENfRk9SX1NUQVRJQ19JTklUICAgICggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ICpwbG93ZXIsIGttcF9pbnQgKnB1cHBlciwga21wX2ludCAqcHN0cmlkZSwga21wX2ludCBpbmNyLCBrbXBfaW50IGNodW5rICk7CisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZm9yX3N0YXRpY19maW5pICAoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCB2b2lkIF9fa21wY19jb3B5cHJpdmF0ZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgc2l6ZV90IGNweV9zaXplLCB2b2lkICpjcHlfZGF0YSwgdm9pZCgqY3B5X2Z1bmMpKHZvaWQqLHZvaWQqKSwga21wX2ludDMyIGRpZGl0ICk7CisKK2V4dGVybiB2b2lkIEtNUENfU0VUX05VTV9USFJFQURTICAgICAgICAoIGludCBhcmcgKTsKK2V4dGVybiB2b2lkIEtNUENfU0VUX0RZTkFNSUMgICAgICAgICAgICAoIGludCBmbGFnICk7CitleHRlcm4gdm9pZCBLTVBDX1NFVF9ORVNURUQgICAgICAgICAgICAgKCBpbnQgZmxhZyApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRhc2txIGludGVyZmFjZSByb3V0aW5lcworICovCisKK0tNUF9FWFBPUlQga21wY190aHVua190ICogX19rbXBjX3Rhc2txIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfdCB0YXNrcV90YXNrLCBzaXplX3Qgc2l6ZW9mX3RodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfc2hhcmVkcywga21wX2ludDMyIGZsYWdzLCBrbXBjX3NoYXJlZF92YXJzX3QgKipzaGFyZWRzKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3Rhc2txIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY190YXNrIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdGFza3FfdGFzayAoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIHN0YXR1cyk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF90YXNrcV90YXNrIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQga21wY190aHVua190ICogX19rbXBjX3Rhc2tfYnVmZmVyIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRhc2txX3RodW5rLCBrbXBjX3Rhc2tfdCB0YXNrKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBPTVAgMy4wIHRhc2tpbmcgaW50ZXJmYWNlIHJvdXRpbmVzCisgKi8KKworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzayApOworS01QX0VYUE9SVCBrbXBfdGFza190KgorX19rbXBjX29tcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAga21wX3JvdXRpbmVfZW50cnlfdCB0YXNrX2VudHJ5ICk7CitLTVBfRVhQT1JUIHZvaWQKK19fa21wY19vbXBfdGFza19iZWdpbl9pZjAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApOworS01QX0VYUE9SVCB2b2lkCitfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApOworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFza19wYXJ0cyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzayApOworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3dhaXQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2t5aWVsZCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGludCBlbmRfcGFydCApOworCisjaWYgVEFTS19VTlVTRUQKK3ZvaWQgX19rbXBjX29tcF90YXNrX2JlZ2luKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKTsKK3ZvaWQgX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApOworI2VuZGlmIC8vIFRBU0tfVU5VU0VECisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKworS01QX0VYUE9SVCB2b2lkIF9fa21wY190YXNrZ3JvdXAoIGlkZW50X3QgKiBsb2MsIGludCBndGlkICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF90YXNrZ3JvdXAoIGlkZW50X3QgKiBsb2MsIGludCBndGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMoCisgICAgaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKm5ld190YXNrLCBrbXBfaW50MzIgbmRlcHMsCisgICAga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LCBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywKKyAgICBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX29tcF93YWl0X2RlcHMoaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCk7CitleHRlcm4gdm9pZCBfX2ttcF9yZWxlYXNlX2RlcHMoa21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICp0YXNrKTsKK2V4dGVybiB2b2lkIF9fa21wX2RlcGhhc2hfZnJlZV9lbnRyaWVzKGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcGhhc2hfdCAqaCk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXBoYXNoX2ZyZWUoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwaGFzaF90ICpoKTsKKworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9vbXBfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywgYm9vbCBzZXJpYWxpemVfaW1tZWRpYXRlICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19jYW5jZWwoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBjbmNsX2tpbmQpOworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50KGlkZW50X3QqIGxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgY25jbF9raW5kKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19jYW5jZWxfYmFycmllcihpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCk7CitLTVBfRVhQT1JUIGludCBfX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhpbnQgY2FuY2VsX2tpbmQpOworCisjaWYgT01QXzQ1X0VOQUJMRUQKKworS01QX0VYUE9SVCB2b2lkIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZCgga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnB0YXNrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbyAoIGttcF90YXNrX3QgKnB0YXNrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Rhc2tsb29wKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2ssIGttcF9pbnQzMiBpZl92YWwsCisgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqbGIsIGttcF91aW50NjQgKnViLCBrbXBfaW50NjQgc3QsCisgICAgICAgICAgICAgICAga21wX2ludDMyIG5vZ3JvdXAsIGttcF9pbnQzMiBzY2hlZCwga21wX3VpbnQ2NCBncmFpbnNpemUsIHZvaWQgKiB0YXNrX2R1cCApOworI2VuZGlmCisKKyNlbmRpZgorCisKKy8qCisgKiBMb2NrIGludGVyZmFjZSByb3V0aW5lcyAoZmFzdCB2ZXJzaW9ucyB3aXRoIGd0aWQgcGFzc2VkIGluKQorICovCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2luaXRfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfaW5pdF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZGVzdHJveV9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3NldF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3NldF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdW5zZXRfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY191bnNldF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgaW50IF9fa21wY190ZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgaW50IF9fa21wY190ZXN0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworCisjaWYgT01QXzQ1X0VOQUJMRUQKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfaW5pdF9sb2NrX3dpdGhfaGludCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jaywgdWludHB0cl90IGhpbnQgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgaGludCApOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogSW50ZXJmYWNlIHRvIGZhc3Qgc2NhbGFibGUgcmVkdWNlIG1ldGhvZHMgcm91dGluZXMKKyAqLworCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfcmVkdWNlX25vd2FpdCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19yZWR1Y2UoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF9yZWR1Y2UoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKKworLyoKKyAqIGludGVybmFsIGZhc3QgcmVkdWN0aW9uIHJvdXRpbmVzCisgKi8KKworZXh0ZXJuIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QKK19fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworCisvLyB0aGlzIGZ1bmN0aW9uIGlzIGZvciB0ZXN0aW5nIHNldC9nZXQvZGV0ZXJtaW5lIHJlZHVjZSBtZXRob2QKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kKCB2b2lkICk7CisKK0tNUF9FWFBPUlQga21wX3VpbnQ2NCBfX2ttcGNfZ2V0X3Rhc2tpZCgpOworS01QX0VYUE9SVCBrbXBfdWludDY0IF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZCgpOworCisvLyB0aGlzIGZ1bmN0aW9uIGV4cG9ydGVkIGZvciB0ZXN0aW5nIG9mIEtNUF9QTEFDRV9USFJFQURTIGZ1bmN0aW9uYWxpdHkKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcGxhY2VfdGhyZWFkcyhpbnQsaW50LGludCxpbnQsaW50KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gQysrIHBvcnQKKy8vIG1pc3NpbmcgJ2V4dGVybiAiQyInIGRlY2xhcmF0aW9ucworCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfaW5fcGFyYWxsZWwoIGlkZW50X3QgKmxvYyApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19wb3BfbnVtX3RocmVhZHMoICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3B1c2hfbnVtX3RocmVhZHMoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdGhyZWFkcyApOworCisjaWYgT01QXzQwX0VOQUJMRUQKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHVzaF9wcm9jX2JpbmQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGludCBwcm9jX2JpbmQgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHVzaF9udW1fdGVhbXMoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdGVhbXMsIGttcF9pbnQzMiBudW1fdGhyZWFkcyApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19mb3JrX3RlYW1zKGlkZW50X3QgKmxvYywga21wX2ludDMyIGFyZ2MsIGttcGNfbWljcm8gbWljcm90YXNrLCAuLi4pOworI2VuZGlmCisjaWYgT01QXzQ1X0VOQUJMRUQKK3N0cnVjdCBrbXBfZGltIHsgIC8vIGxvb3AgYm91bmRzIGluZm8gY2FzdGVkIHRvIGttcF9pbnQ2NAorICAgIGttcF9pbnQ2NCBsbzsgLy8gbG93ZXIKKyAgICBrbXBfaW50NjQgdXA7IC8vIHVwcGVyCisgICAga21wX2ludDY0IHN0OyAvLyBzdHJpZGUKK307CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2RvYWNyb3NzX2luaXQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIG51bV9kaW1zLCBzdHJ1Y3Qga21wX2RpbSAqIGRpbXMpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kb2Fjcm9zc193YWl0KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQ2NCAqdmVjKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZG9hY3Jvc3NfcG9zdChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50NjQgKnZlYyk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2RvYWNyb3NzX2ZpbmkoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCk7CisjZW5kaWYKKworS01QX0VYUE9SVCB2b2lkKgorX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGRhdGEsIHNpemVfdCBzaXplLCB2b2lkICoqKiBjYWNoZSApOworCisvLyBTeW1ib2xzIGZvciBNUyBtdXR1YWwgZGV0ZWN0aW9uLgorZXh0ZXJuIGludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5OworZXh0ZXJuIGludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5OworI2lmIEtNUF9PU19XSU5ET1dTICYmICggS01QX1ZFUlNJT05fTUFKT1IgPiA0ICkKKyAgICBleHRlcm4gaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfTWljcm9zb2Z0X09wZW5NUF9saWJyYXJ5OworI2VuZGlmCisKKworLy8gVGhlIHJvdXRpbmVzIGJlbG93IGFyZSBub3QgZXhwb3J0ZWQuCisvLyBDb25zaWRlciBtYWtpbmcgdGhlbSAnc3RhdGljJyBpbiBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlcy4KK3ZvaWQKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICk7CitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKgora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApOworCisvLworLy8gb21wY18sIGttcGNfIGVudHJpZXMgbW92ZWQgZnJvbSBvbXAuaC4KKy8vCisjaWYgS01QX09TX1dJTkRPV1MKKyMgICBkZWZpbmUgS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyNlbHNlCisjICAgZGVmaW5lIEtNUENfQ09OVkVOVElPTgorI2VuZGlmCisKKyNpZm5kZWYgX19PTVBfSAordHlwZWRlZiBlbnVtIG9tcF9zY2hlZF90IHsKKyAgICBvbXBfc2NoZWRfc3RhdGljICA9IDEsCisgICAgb21wX3NjaGVkX2R5bmFtaWMgPSAyLAorICAgIG9tcF9zY2hlZF9ndWlkZWQgID0gMywKKyAgICBvbXBfc2NoZWRfYXV0byAgICA9IDQKK30gb21wX3NjaGVkX3Q7Cit0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworI2VuZGlmCisKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04gb21wY19zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoaW50KTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04gb21wY19zZXRfc2NoZWR1bGUob21wX3NjaGVkX3QsIGludCk7CitLTVBfRVhQT1JUIGludCAgS01QQ19DT05WRU5USU9OIG9tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oaW50KTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04gb21wY19nZXRfdGVhbV9zaXplKGludCk7CitLTVBfRVhQT1JUIGludCAgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CitLTVBfRVhQT1JUIGludCAgS01QQ19DT05WRU5USU9OIGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04ga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9zdGFja3NpemUoaW50KTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfc3RhY2tzaXplX3Moc2l6ZV90KTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfbGlicmFyeShpbnQpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9kZWZhdWx0cyhjaGFyIGNvbnN0ICopOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9kaXNwX251bV9idWZmZXJzKGludCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfSCAqLworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YjliOTEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmNwcApAQCAtMCwwICsxLDQ5MTcgQEAKKy8qCisgKiBrbXBfYWZmaW5pdHkuY3BwIC0tIGFmZmluaXR5IG1hbmFnZW1lbnQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9hZmZpbml0eS5oIgorCisvLyBTdG9yZSB0aGUgcmVhbCBvciBpbWFnaW5lZCBtYWNoaW5lIGhpZXJhcmNoeSBoZXJlCitzdGF0aWMgaGllcmFyY2h5X2luZm8gbWFjaGluZV9oaWVyYXJjaHk7CisKK3ZvaWQgX19rbXBfY2xlYW51cF9oaWVyYXJjaHkoKSB7CisgICAgbWFjaGluZV9oaWVyYXJjaHkuZmluaSgpOworfQorCit2b2lkIF9fa21wX2dldF9oaWVyYXJjaHkoa21wX3VpbnQzMiBucHJvYywga21wX2JzdGF0ZV90ICp0aHJfYmFyKSB7CisgICAga21wX3VpbnQzMiBkZXB0aDsKKyAgICAvLyBUaGUgdGVzdCBiZWxvdyBpcyB0cnVlIGlmIGFmZmluaXR5IGlzIGF2YWlsYWJsZSwgYnV0IHNldCB0byAibm9uZSIuIE5lZWQgdG8gaW5pdCBvbiBmaXJzdCB1c2Ugb2YgaGllcmFyY2hpY2FsIGJhcnJpZXIuCisgICAgaWYgKFRDUl8xKG1hY2hpbmVfaGllcmFyY2h5LnVuaW5pdGlhbGl6ZWQpKQorICAgICAgICBtYWNoaW5lX2hpZXJhcmNoeS5pbml0KE5VTEwsIG5wcm9jKTsKKworICAgIC8vIEFkanVzdCB0aGUgaGllcmFyY2h5IGluIGNhc2UgbnVtIHRocmVhZHMgZXhjZWVkcyBvcmlnaW5hbAorICAgIGlmIChucHJvYyA+IG1hY2hpbmVfaGllcmFyY2h5LmJhc2VfbnVtX3RocmVhZHMpCisgICAgICAgIG1hY2hpbmVfaGllcmFyY2h5LnJlc2l6ZShucHJvYyk7CisKKyAgICBkZXB0aCA9IG1hY2hpbmVfaGllcmFyY2h5LmRlcHRoOworICAgIEtNUF9ERUJVR19BU1NFUlQoZGVwdGggPiAwKTsKKworICAgIHRocl9iYXItPmRlcHRoID0gZGVwdGg7CisgICAgdGhyX2Jhci0+YmFzZV9sZWFmX2tpZHMgPSAoa21wX3VpbnQ4KW1hY2hpbmVfaGllcmFyY2h5Lm51bVBlckxldmVsWzBdLTE7CisgICAgdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWwgPSBtYWNoaW5lX2hpZXJhcmNoeS5za2lwUGVyTGV2ZWw7Cit9CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKK2Jvb2wgS01QQWZmaW5pdHk6OnBpY2tlZF9hcGkgPSBmYWxzZTsKKwordm9pZCogS01QQWZmaW5pdHk6Ok1hc2s6Om9wZXJhdG9yIG5ldyhzaXplX3QgbikgeyByZXR1cm4gX19rbXBfYWxsb2NhdGUobik7IH0KK3ZvaWQqIEtNUEFmZmluaXR5OjpNYXNrOjpvcGVyYXRvciBuZXdbXShzaXplX3QgbikgeyByZXR1cm4gX19rbXBfYWxsb2NhdGUobik7IH0KK3ZvaWQgS01QQWZmaW5pdHk6Ok1hc2s6Om9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwKSB7IF9fa21wX2ZyZWUocCk7IH0KK3ZvaWQgS01QQWZmaW5pdHk6Ok1hc2s6Om9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHApIHsgX19rbXBfZnJlZShwKTsgfQordm9pZCogS01QQWZmaW5pdHk6Om9wZXJhdG9yIG5ldyhzaXplX3QgbikgeyByZXR1cm4gX19rbXBfYWxsb2NhdGUobik7IH0KK3ZvaWQgS01QQWZmaW5pdHk6Om9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwKSB7IF9fa21wX2ZyZWUocCk7IH0KKwordm9pZCBLTVBBZmZpbml0eTo6cGlja19hcGkoKSB7CisgICAgS01QQWZmaW5pdHkqIGFmZmluaXR5X2Rpc3BhdGNoOworICAgIGlmIChwaWNrZWRfYXBpKQorICAgICAgICByZXR1cm47CisjaWYgS01QX1VTRV9IV0xPQworICAgIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2MpIHsKKyAgICAgICAgYWZmaW5pdHlfZGlzcGF0Y2ggPSBuZXcgS01QSHdsb2NBZmZpbml0eSgpOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBhZmZpbml0eV9kaXNwYXRjaCA9IG5ldyBLTVBOYXRpdmVBZmZpbml0eSgpOworICAgIH0KKyAgICBfX2ttcF9hZmZpbml0eV9kaXNwYXRjaCA9IGFmZmluaXR5X2Rpc3BhdGNoOworICAgIHBpY2tlZF9hcGkgPSB0cnVlOworfQorCit2b2lkIEtNUEFmZmluaXR5OjpkZXN0cm95X2FwaSgpIHsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZGlzcGF0Y2ggIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgX19rbXBfYWZmaW5pdHlfZGlzcGF0Y2g7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoID0gTlVMTDsKKyAgICAgICAgcGlja2VkX2FwaSA9IGZhbHNlOworICAgIH0KK30KKworLy8KKy8vIFByaW50IHRoZSBhZmZpbml0eSBtYXNrIHRvIHRoZSBjaGFyYWN0ZXIgYXJyYXkgaW4gYSBwcmV0dHkgZm9ybWF0LgorLy8KK2NoYXIgKgorX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhjaGFyICpidWYsIGludCBidWZfbGVuLCBrbXBfYWZmaW5fbWFza190ICptYXNrKQoreworICAgIEtNUF9BU1NFUlQoYnVmX2xlbiA+PSA0MCk7CisgICAgY2hhciAqc2NhbiA9IGJ1ZjsKKyAgICBjaGFyICplbmQgPSBidWYgKyBidWZfbGVuIC0gMTsKKworICAgIC8vCisgICAgLy8gRmluZCBmaXJzdCBlbGVtZW50IC8gY2hlY2sgZm9yIGVtcHR5IHNldC4KKyAgICAvLworICAgIHNpemVfdCBpOworICAgIGkgPSBtYXNrLT5iZWdpbigpOworICAgIGlmIChpID09IG1hc2stPmVuZCgpKSB7CisgICAgICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQtc2NhbisxLCAiezxlbXB0eT59Iik7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgICAgIEtNUF9BU1NFUlQoc2NhbiA8PSBlbmQpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQtc2NhbisxLCAieyVsZCIsIChsb25nKWkpOworICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgaSsrOworICAgIGZvciAoOyBpICE9IG1hc2stPmVuZCgpOyBpID0gbWFzay0+bmV4dChpKSkgeworICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIG1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBidWZmZXIgb3ZlcmZsb3cuICBBIHN0cmluZyBvZiB0aGUgZm9ybSAiLDxuPiIgd2lsbCBoYXZlCisgICAgICAgIC8vIGF0IG1vc3QgMTAgY2hhcmFjdGVycywgcGx1cyB3ZSB3YW50IHRvIGxlYXZlIHJvb20gdG8gcHJpbnQgIiwuLi59IgorICAgICAgICAvLyBpZiB0aGUgc2V0IGlzIHRvbyBsYXJnZSB0byBwcmludCBmb3IgYSB0b3RhbCBvZiAxNSBjaGFyYWN0ZXJzLgorICAgICAgICAvLyBXZSBhbHJlYWR5IGxlZnQgcm9vbSBmb3IgJ1wwJyBpbiBzZXR0aW5nIGVuZC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKGVuZCAtIHNjYW4gPCAxNSkgeworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBLTVBfU05QUklOVEYoc2NhbiwgZW5kLXNjYW4rMSwgIiwlLWxkIiwgKGxvbmcpaSk7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgfQorICAgIGlmIChpICE9IG1hc2stPmVuZCgpKSB7CisgICAgICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQtc2NhbisxLCAgIiwuLi4iKTsKKyAgICAgICAgd2hpbGUgKCpzY2FuICE9ICdcMCcpIHNjYW4rKzsKKyAgICB9CisgICAgS01QX1NOUFJJTlRGKHNjYW4sIGVuZC1zY2FuKzEsICJ9Iik7CisgICAgd2hpbGUgKCpzY2FuICE9ICdcMCcpIHNjYW4rKzsKKyAgICBLTVBfQVNTRVJUKHNjYW4gPD0gZW5kKTsKKyAgICByZXR1cm4gYnVmOworfQorCisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2VudGlyZV9tYWNoaW5lX21hc2soa21wX2FmZmluX21hc2tfdCAqbWFzaykKK3sKKyAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKyAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICBpbnQgZ3JvdXA7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgIT0gTlVMTCk7CisgICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgZ3JvdXArKykgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpbnQgbnVtID0gX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQoZ3JvdXApOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoaSArIGdyb3VwICogKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpLCBtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICB7CisgICAgICAgIGludCBwcm9jOworICAgICAgICBmb3IgKHByb2MgPSAwOyBwcm9jIDwgX19rbXBfeHByb2M7IHByb2MrKykgeworICAgICAgICAgICAgS01QX0NQVV9TRVQocHJvYywgbWFzayk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vCisvLyBXaGVuIHNvcnRpbmcgYnkgbGFiZWxzLCBfX2ttcF9hZmZpbml0eV9hc3NpZ25fY2hpbGRfbnVtcygpIG11c3QgZmlyc3QgYmUKKy8vIGNhbGxlZCB0byByZW51bWJlciB0aGUgbGFiZWxzIGZyb20gWzAuLm5dIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGNoaWxkX251bQorLy8gdmVjdG9yIG9mIHRoZSBhZGRyZXNzIG9iamVjdC4gIFRoaXMgaXMgZG9uZSBpbiBjYXNlIHRoZSBsYWJlbHMgdXNlZCBmb3IKKy8vIHRoZSBjaGlsZHJlbiBhdCBvbmUgbm9kZSBvZiB0aGUgaGllcmFyY2h5IGRpZmZlciBmcm9tIHRob3NlIHVzZWQgZm9yCisvLyBhbm90aGVyIG5vZGUgYXQgdGhlIHNhbWUgbGV2ZWwuICBFeGFtcGxlOiAgc3VwcG9zZSB0aGUgbWFjaGluZSBoYXMgMiBub2RlcworLy8gd2l0aCAyIHBhY2thZ2VzIGVhY2guICBUaGUgZmlyc3Qgbm9kZSBjb250YWlucyBwYWNrYWdlcyA2MDEgYW5kIDYwMiwgYW5kCisvLyBzZWNvbmQgbm9kZSBjb250YWlucyBwYWNrYWdlcyA2MDMgYW5kIDYwNC4gIElmIHdlIHRyeSB0byBzb3J0IHRoZSB0YWJsZQorLy8gZm9yICJzY2F0dGVyIiBhZmZpbml0eSwgdGhlIHRhYmxlIHdpbGwgc3RpbGwgYmUgc29ydGVkIDYwMSwgNjAyLCA2MDMsIDYwNAorLy8gYmVjYXVzZSB3ZSBhcmUgcGF5aW5nIGF0dGVudGlvbiB0byB0aGUgbGFiZWxzIHRoZW1zZWx2ZXMsIG5vdCB0aGUgb3JkaW5hbAorLy8gY2hpbGQgbnVtYmVycy4gIEJ5IHVzaW5nIHRoZSBjaGlsZCBudW1iZXJzIGluIHRoZSBzb3J0LCB0aGUgcmVzdWx0IGlzCisvLyB7MCwwfT02MDEsIHswLDF9PTYwMywgezEsMH09NjAyLCB7MSwxfT02MDQuCisvLworc3RhdGljIHZvaWQKK19fa21wX2FmZmluaXR5X2Fzc2lnbl9jaGlsZF9udW1zKEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLAorICBpbnQgbnVtQWRkcnMpCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChudW1BZGRycyA+IDApOworICAgIGludCBkZXB0aCA9IGFkZHJlc3Myb3MtPmZpcnN0LmRlcHRoOworICAgIHVuc2lnbmVkICpjb3VudHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICpsYXN0TGFiZWwgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aAorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICBpbnQgbGFiQ3Q7CisgICAgZm9yIChsYWJDdCA9IDA7IGxhYkN0IDwgZGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgYWRkcmVzczJvc1swXS5maXJzdC5jaGlsZE51bXNbbGFiQ3RdID0gY291bnRzW2xhYkN0XSA9IDA7CisgICAgICAgIGxhc3RMYWJlbFtsYWJDdF0gPSBhZGRyZXNzMm9zWzBdLmZpcnN0LmxhYmVsc1tsYWJDdF07CisgICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIGZvciAobGFiQ3QgPSAwOyBsYWJDdCA8IGRlcHRoOyBsYWJDdCsrKSB7CisgICAgICAgICAgICBpZiAoYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3RdICE9IGxhc3RMYWJlbFtsYWJDdF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgbGFiQ3QyOworICAgICAgICAgICAgICAgIGZvciAobGFiQ3QyID0gbGFiQ3QgKyAxOyBsYWJDdDIgPCBkZXB0aDsgbGFiQ3QyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2xhYkN0Ml0gPSAwOworICAgICAgICAgICAgICAgICAgICBsYXN0TGFiZWxbbGFiQ3QyXSA9IGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzW2xhYkN0Ml07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50c1tsYWJDdF0rKzsKKyAgICAgICAgICAgICAgICBsYXN0TGFiZWxbbGFiQ3RdID0gYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3RdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAobGFiQ3QgPSAwOyBsYWJDdCA8IGRlcHRoOyBsYWJDdCsrKSB7CisgICAgICAgICAgICBhZGRyZXNzMm9zW2ldLmZpcnN0LmNoaWxkTnVtc1tsYWJDdF0gPSBjb3VudHNbbGFiQ3RdOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBsYWJDdCA8IChpbnQpQWRkcmVzczo6bWF4RGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QuY2hpbGROdW1zW2xhYkN0XSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgX19rbXBfZnJlZShsYXN0TGFiZWwpOworICAgIF9fa21wX2ZyZWUoY291bnRzKTsKK30KKworCisvLworLy8gQWxsIG9mIHRoZSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfKl9tYXAoKSByb3V0aW5lcyBzaG91bGQgc2V0CisvLyBfX2ttcF9hZmZpbml0eV9tYXNrcyB0byBhIHZlY3RvciBvZiBhZmZpbml0eSBtYXNrIG9iamVjdHMgb2YgbGVuZ3RoCisvLyBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MsIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSwgYW5kCisvLyByZXR1cm4gdGhlIG51bWJlciBvZiBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdHJlZSAoemVybyBpZgorLy8gX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKS4KKy8vCisvLyBBbGwgb2YgdGhlIF9fa21wX2FmZmluaXR5X2NyZWF0ZV8qX21hcCgpIHJvdXRpbmVzIHNob3VsZCBzZXQgKl9fa21wX2FmZmluX2Z1bGxNYXNrCisvLyB0byB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGluaXRpYWxpemF0aW9uIHRocmVhZC4gIFRoZXkgbmVlZCB0byBzYXZlIGFuZAorLy8gcmVzdG9yZSB0aGUgbWFzaywgYW5kIGl0IGNvdWxkIGJlIG5lZWRlZCBsYXRlciwgc28gc2F2aW5nIGl0IGlzIGp1c3QgYW4KKy8vIG9wdGltaXphdGlvbiB0byBhdm9pZCBjYWxsaW5nIGttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCkgYWdhaW4uCisvLwora21wX2FmZmluX21hc2tfdCAqX19rbXBfYWZmaW5fZnVsbE1hc2sgPSBOVUxMOworCitzdGF0aWMgaW50IG5Db3Jlc1BlclBrZywgblBhY2thZ2VzOworc3RhdGljIGludCBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisjaWZuZGVmIEtNUF9ERkxUX05USF9DT1JFUworc3RhdGljIGludCBfX2ttcF9uY29yZXM7CisjZW5kaWYKK3N0YXRpYyBpbnQgKl9fa21wX3B1X29zX2lkeCA9IE5VTEw7CisKKy8vCisvLyBfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkgZG9lc24ndCB3b3JrIHdoZW4gY2FsbGVkIGZyb20KKy8vIHBsYWNlcyB3aGljaCBzdXBwb3J0IGFyYml0cmFyaWx5IG1hbnkgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5CisvLyBtYXAsIGkuZS4gdGhlIG5vbi1kZWZhdWx0IGNhc2VzIGluIF9fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcCgpCisvLyBfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKCkuCisvLworaW5saW5lIHN0YXRpYyBib29sCitfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkKK3sKKyAgICByZXR1cm4gX19rbXBfYXZhaWxfcHJvYyA9PSAoX19rbXBfblRocmVhZHNQZXJDb3JlICogbkNvcmVzUGVyUGtnICogblBhY2thZ2VzKTsKK30KKworCisvLworLy8gUHJpbnQgb3V0IHRoZSBkZXRhaWxlZCBtYWNoaW5lIHRvcG9sb2d5IG1hcCwgaS5lLiB0aGUgcGh5c2ljYWwgbG9jYXRpb25zCisvLyBvZiBlYWNoIE9TIHByb2MuCisvLworc3RhdGljIHZvaWQKK19fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLCBpbnQgbGVuLCBpbnQgZGVwdGgsCisgIGludCBwa2dMZXZlbCwgaW50IGNvcmVMZXZlbCwgaW50IHRocmVhZExldmVsKQoreworICAgIGludCBwcm9jOworCisgICAgS01QX0lORk9STShPU1Byb2NUb1BoeXNpY2FsVGhyZWFkTWFwLCAiS01QX0FGRklOSVRZIik7CisgICAgZm9yIChwcm9jID0gMDsgcHJvYyA8IGxlbjsgcHJvYysrKSB7CisgICAgICAgIGludCBsZXZlbDsKKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmKTsKKyAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSB0aHJlYWRMZXZlbCkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVzICIsIEtNUF9JMThOX1NUUihUaHJlYWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID09IGNvcmVMZXZlbCkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVzICIsIEtNUF9JMThOX1NUUihDb3JlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA9PSBwa2dMZXZlbCkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVzICIsIEtNUF9JMThOX1NUUihQYWNrYWdlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA+IHBrZ0xldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXNfJWQgIiwgS01QX0kxOE5fU1RSKE5vZGUpLAorICAgICAgICAgICAgICAgICAgbGV2ZWwgLSBwa2dMZXZlbCAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiTCVkICIsIGxldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVkICIsCisgICAgICAgICAgICAgIGFkZHJlc3Myb3NbcHJvY10uZmlyc3QubGFiZWxzW2xldmVsXSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShPU1Byb2NNYXBUb1BhY2ssICJLTVBfQUZGSU5JVFkiLCBhZGRyZXNzMm9zW3Byb2NdLnNlY29uZCwKKyAgICAgICAgICBidWYuc3RyKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICAgIH0KK30KKworI2lmIEtNUF9VU0VfSFdMT0MKKworLy8gVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSB0b3BvbG9neSBsZXZlbHMgdGhhdCBhcmUgcmFkaXggMSBhbmQgZG9uJ3Qgb2ZmZXIKKy8vIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRvcG9sb2d5LiAgVGhlIG1vc3QgY29tbW9uIGV4YW1wbGUgaXMgd2hlbiB5b3UKKy8vIGhhdmUgb25lIHRocmVhZCBjb250ZXh0IHBlciBjb3JlLCB3ZSBkb24ndCB3YW50IHRoZSBleHRyYSB0aHJlYWQgY29udGV4dAorLy8gbGV2ZWwgaWYgaXQgb2ZmZXJzIG5vIHVuaXF1ZSBsYWJlbHMuICBTbyB0aGV5IGFyZSByZW1vdmVkLgorLy8gcmV0dXJuIHZhbHVlOiB0aGUgbmV3IGRlcHRoIG9mIGFkZHJlc3Myb3MKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X3JlbW92ZV9yYWRpeF9vbmVfbGV2ZWxzKEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLCBpbnQgbkFjdGl2ZVRocmVhZHMsIGludCBkZXB0aCwgaW50KiBwa2dMZXZlbCwgaW50KiBjb3JlTGV2ZWwsIGludCogdGhyZWFkTGV2ZWwpIHsKKyAgICBpbnQgbGV2ZWw7CisgICAgaW50IGk7CisgICAgaW50IHJhZGl4MV9kZXRlY3RlZDsKKworICAgIGZvciAobGV2ZWwgPSBkZXB0aC0xOyBsZXZlbCA+PSAwOyAtLWxldmVsKSB7CisgICAgICAgIC8vIEFsd2F5cyBrZWVwIHRoZSBwYWNrYWdlIGxldmVsCisgICAgICAgIGlmIChsZXZlbCA9PSAqcGtnTGV2ZWwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gRGV0ZWN0IGlmIHRoaXMgbGV2ZWwgaXMgcmFkaXggMQorICAgICAgICByYWRpeDFfZGV0ZWN0ZWQgPSAxOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbkFjdGl2ZVRocmVhZHM7ICsraSkgeworICAgICAgICAgICAgaWYgKGFkZHJlc3Myb3NbMF0uZmlyc3QubGFiZWxzW2xldmVsXSAhPSBhZGRyZXNzMm9zW2ldLmZpcnN0LmxhYmVsc1tsZXZlbF0pIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgZGlmZmVyaW5nIGxhYmVsIHZhbHVlcyBmb3IgdGhpcyBsZXZlbCBzbyBpdCBzdGF5cworICAgICAgICAgICAgICAgIHJhZGl4MV9kZXRlY3RlZCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyYWRpeDFfZGV0ZWN0ZWQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gUmFkaXggMSB3YXMgZGV0ZWN0ZWQKKyAgICAgICAgaWYgKGxldmVsID09ICp0aHJlYWRMZXZlbCkgeworICAgICAgICAgICAgLy8gSWYgb25seSBvbmUgdGhyZWFkIHBlciBjb3JlLCB0aGVuIGp1c3QgZGVjcmVtZW50CisgICAgICAgICAgICAvLyB0aGUgZGVwdGggd2hpY2ggcmVtb3ZlcyB0aGUgdGhyZWFkbGV2ZWwgZnJvbSBhZGRyZXNzMm9zCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkFjdGl2ZVRocmVhZHM7ICsraSkgeworICAgICAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QuZGVwdGgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp0aHJlYWRMZXZlbCA9IC0xOworICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09ICpjb3JlTGV2ZWwpIHsKKyAgICAgICAgICAgIC8vIEZvciBjb3JlIGxldmVsLCB3ZSBtb3ZlIHRoZSB0aHJlYWQgbGFiZWxzIG92ZXIgaWYgdGhleSBhcmUgc3RpbGwKKyAgICAgICAgICAgIC8vIHZhbGlkICgqdGhyZWFkTGV2ZWwgIT0gLTEpLCBhbmQgYWxzbyByZWR1Y2UgdGhlIGRlcHRoIGFub3RoZXIgbGV2ZWwKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuQWN0aXZlVGhyZWFkczsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCp0aHJlYWRMZXZlbCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBhZGRyZXNzMm9zW2ldLmZpcnN0LmxhYmVsc1sqY29yZUxldmVsXSA9IGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzWyp0aHJlYWRMZXZlbF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QuZGVwdGgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpjb3JlTGV2ZWwgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWRkcmVzczJvc1swXS5maXJzdC5kZXB0aDsKK30KKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgb2YgdHlwZSAndHlwZScgYmVsb3cgJ29iaicgd2l0aGluIHRoZSB0b3BvbG9neSB0cmVlIHN0cnVjdHVyZS4KKy8vIGUuZy4sIGlmIG9iaiBpcyBhIEhXTE9DX09CSl9TT0NLRVQgb2JqZWN0LCBhbmQgdHlwZSBpcyBIV0xPQ19PQkpfUFUsIHRoZW4KKy8vICB0aGlzIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgUFUncyB1bmRlciB0aGUgU09DS0VUIG9iamVjdC4KK3N0YXRpYyBpbnQKK19fa21wX2h3bG9jX2dldF9ub2Jqc191bmRlcl9vYmooaHdsb2Nfb2JqX3Qgb2JqLCBod2xvY19vYmpfdHlwZV90IHR5cGUpIHsKKyAgICBpbnQgcmV0dmFsID0gMDsKKyAgICBod2xvY19vYmpfdCBmaXJzdDsKKyAgICBmb3IoZmlyc3QgPSBod2xvY19nZXRfb2JqX2JlbG93X2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIG9iai0+dHlwZSwgb2JqLT5sb2dpY2FsX2luZGV4LCB0eXBlLCAwKTsKKyAgICAgICAgZmlyc3QgIT0gTlVMTCAmJiBod2xvY19nZXRfYW5jZXN0b3Jfb2JqX2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIG9iai0+dHlwZSwgZmlyc3QpID09IG9iajsKKyAgICAgICAgZmlyc3QgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgZmlyc3QtPnR5cGUsIGZpcnN0KSkKKyAgICB7CisgICAgICAgICsrcmV0dmFsOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfaHdsb2NfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqb2xkTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DKG9sZE1hc2spOworICAgIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICBpbnQgZGVwdGggPSAzOworICAgIGludCBwa2dMZXZlbCA9IDA7CisgICAgaW50IGNvcmVMZXZlbCA9IDE7CisgICAgaW50IHRocmVhZExldmVsID0gMjsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBIYWNrIHRvIHRyeSBhbmQgaW5mZXIgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdXNpbmcgb25seSB0aGUgZGF0YQorICAgICAgICAvLyBhdmFpbGFibGUgZnJvbSBjcHVpZCBvbiB0aGUgY3VycmVudCB0aHJlYWQsIGFuZCBfX2ttcF94cHJvYy4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworCisgICAgICAgIG5Db3Jlc1BlclBrZyA9IF9fa21wX2h3bG9jX2dldF9ub2Jqc191bmRlcl9vYmooaHdsb2NfZ2V0X29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfU09DS0VULCAwKSwgSFdMT0NfT0JKX0NPUkUpOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBfX2ttcF9od2xvY19nZXRfbm9ianNfdW5kZXJfb2JqKGh3bG9jX2dldF9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgSFdMT0NfT0JKX0NPUkUsIDApLCBIV0xPQ19PQkpfUFUpOworICAgICAgICBfX2ttcF9uY29yZXMgPSBfX2ttcF94cHJvYyAvIF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKyAgICAgICAgblBhY2thZ2VzID0gKF9fa21wX3hwcm9jICsgbkNvcmVzUGVyUGtnIC0gMSkgLyBuQ29yZXNQZXJQa2c7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VMb2NDcHVpZEwxMSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gQWxsb2NhdGUgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgQWRkclVuc1BhaXIgKnJldHZhbCA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBfX2ttcF9wdV9vc19pZHggPSAoaW50KilfX2ttcF9hbGxvY2F0ZShzaXplb2YoaW50KSAqIF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgLy8KKyAgICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAgIC8vIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsCisgICAgLy8gbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4gIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0CisgICAgLy8gY29ycmVjdGx5LCBhbmQgcmV0dXJuIGlmIGFmZmluaXR5IGlzIG5vdCBlbmFibGVkLgorICAgIC8vCisKKyAgICBod2xvY19vYmpfdCBwdTsKKyAgICBod2xvY19vYmpfdCBjb3JlOworICAgIGh3bG9jX29ial90IHNvY2tldDsKKyAgICBpbnQgbkFjdGl2ZVRocmVhZHMgPSAwOworICAgIGludCBzb2NrZXRfaWRlbnRpZmllciA9IDA7CisgICAgLy8gcmUtY2FsY3VsYXRlIGdsb2JhbHMgdG8gY291bnQgb25seSBhY2Nlc3NpYmxlIHJlc291cmNlcworICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IG5Db3Jlc1BlclBrZyA9IF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDA7CisgICAgZm9yKHNvY2tldCA9IGh3bG9jX2dldF9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgSFdMT0NfT0JKX1NPQ0tFVCwgMCk7CisgICAgICAgIHNvY2tldCAhPSBOVUxMOworICAgICAgICBzb2NrZXQgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgSFdMT0NfT0JKX1NPQ0tFVCwgc29ja2V0KSwKKyAgICAgICAgc29ja2V0X2lkZW50aWZpZXIrKykKKyAgICB7CisgICAgICAgIGludCBjb3JlX2lkZW50aWZpZXIgPSAwOworICAgICAgICBpbnQgbnVtX2FjdGl2ZV9jb3JlcyA9IDA7CisgICAgICAgIGZvcihjb3JlID0gaHdsb2NfZ2V0X29ial9iZWxvd19ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBzb2NrZXQtPnR5cGUsIHNvY2tldC0+bG9naWNhbF9pbmRleCwgSFdMT0NfT0JKX0NPUkUsIDApOworICAgICAgICAgICAgY29yZSAhPSBOVUxMICYmIGh3bG9jX2dldF9hbmNlc3Rvcl9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgc29ja2V0LT50eXBlLCBjb3JlKSA9PSBzb2NrZXQ7CisgICAgICAgICAgICBjb3JlID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIEhXTE9DX09CSl9DT1JFLCBjb3JlKSwKKyAgICAgICAgICAgIGNvcmVfaWRlbnRpZmllcisrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcHVfaWRlbnRpZmllciA9IDA7CisgICAgICAgICAgICBpbnQgbnVtX2FjdGl2ZV90aHJlYWRzID0gMDsKKyAgICAgICAgICAgIGZvcihwdSA9IGh3bG9jX2dldF9vYmpfYmVsb3dfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgY29yZS0+dHlwZSwgY29yZS0+bG9naWNhbF9pbmRleCwgSFdMT0NfT0JKX1BVLCAwKTsKKyAgICAgICAgICAgICAgICBwdSAhPSBOVUxMICYmIGh3bG9jX2dldF9hbmNlc3Rvcl9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgY29yZS0+dHlwZSwgcHUpID09IGNvcmU7CisgICAgICAgICAgICAgICAgcHUgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgSFdMT0NfT0JKX1BVLCBwdSksCisgICAgICAgICAgICAgICAgcHVfaWRlbnRpZmllcisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZHJlc3MgYWRkcigzKTsKKyAgICAgICAgICAgICAgICBpZighIEtNUF9DUFVfSVNTRVQocHUtPm9zX2luZGV4LCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgIC8vIHNraXAgaW5hY3RpdmUgKGluYWNjZXNzaWJsZSkgdW5pdAorICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIkh3bG9jIGluc2VydGluZyAlZCAoJWQpICVkICglZCkgJWQgKCVkKSBpbnRvIGFkZHJlc3Myb3NcbiIsCisgICAgICAgICAgICAgICAgICAgIHNvY2tldC0+b3NfaW5kZXgsIHNvY2tldC0+bG9naWNhbF9pbmRleCwgY29yZS0+b3NfaW5kZXgsIGNvcmUtPmxvZ2ljYWxfaW5kZXgsIHB1LT5vc19pbmRleCxwdS0+bG9naWNhbF9pbmRleCkpOworICAgICAgICAgICAgICAgIGFkZHIubGFiZWxzWzBdID0gc29ja2V0X2lkZW50aWZpZXI7IC8vIHBhY2thZ2UKKyAgICAgICAgICAgICAgICBhZGRyLmxhYmVsc1sxXSA9IGNvcmVfaWRlbnRpZmllcjsgLy8gY29yZQorICAgICAgICAgICAgICAgIGFkZHIubGFiZWxzWzJdID0gcHVfaWRlbnRpZmllcjsgLy8gcHUKKyAgICAgICAgICAgICAgICByZXR2YWxbbkFjdGl2ZVRocmVhZHNdID0gQWRkclVuc1BhaXIoYWRkciwgcHUtPm9zX2luZGV4KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wdV9vc19pZHhbbkFjdGl2ZVRocmVhZHNdID0gcHUtPm9zX2luZGV4OyAvLyBrZWVwIG9zIGluZGV4IGZvciBlYWNoIGFjdGl2ZSBwdQorICAgICAgICAgICAgICAgIG5BY3RpdmVUaHJlYWRzKys7CisgICAgICAgICAgICAgICAgKytudW1fYWN0aXZlX3RocmVhZHM7IC8vIGNvdW50IGFjdGl2ZSB0aHJlYWRzIHBlciBjb3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtX2FjdGl2ZV90aHJlYWRzKSB7IC8vIHdlcmUgdGhlcmUgYW55IGFjdGl2ZSB0aHJlYWRzIG9uIHRoZSBjb3JlPworICAgICAgICAgICAgICAgICsrX19rbXBfbmNvcmVzOyAgICAgICAvLyBjb3VudCB0b3RhbCBhY3RpdmUgY29yZXMKKyAgICAgICAgICAgICAgICArK251bV9hY3RpdmVfY29yZXM7ICAgLy8gY291bnQgYWN0aXZlIGNvcmVzIHBlciBzb2NrZXQKKyAgICAgICAgICAgICAgICBpZiAobnVtX2FjdGl2ZV90aHJlYWRzID4gX19rbXBfblRocmVhZHNQZXJDb3JlKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBudW1fYWN0aXZlX3RocmVhZHM7IC8vIGNhbGMgbWF4aW11bQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChudW1fYWN0aXZlX2NvcmVzKSB7ICAgICAgIC8vIHdlcmUgdGhlcmUgYW55IGFjdGl2ZSBjb3JlcyBvbiB0aGUgc29ja2V0PworICAgICAgICAgICAgKytuUGFja2FnZXM7ICAgICAgICAgICAgICAvLyBjb3VudCB0b3RhbCBhY3RpdmUgcGFja2FnZXMKKyAgICAgICAgICAgIGlmIChudW1fYWN0aXZlX2NvcmVzID4gbkNvcmVzUGVyUGtnKQorICAgICAgICAgICAgICAgIG5Db3Jlc1BlclBrZyA9IG51bV9hY3RpdmVfY29yZXM7IC8vIGNhbGMgbWF4aW11bQorICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHRocmVhZCBjb250ZXh0IHRvIGJpbmQgdG8sIHJldHVybiBub3cuCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKG5BY3RpdmVUaHJlYWRzID09IF9fa21wX2F2YWlsX3Byb2MpOworICAgIEtNUF9BU1NFUlQobkFjdGl2ZVRocmVhZHMgPiAwKTsKKyAgICBpZiAobkFjdGl2ZVRocmVhZHMgPT0gMSkgeworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSAxOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlVzaW5nSHdsb2MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9ybSBhbiBBZGRyZXNzIG9iamVjdCB3aGljaCBvbmx5IGluY2x1ZGVzIHRoZSBwYWNrYWdlIGxldmVsLgorICAgICAgICAvLworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gcmV0dmFsWzBdLmZpcnN0LmxhYmVsc1twa2dMZXZlbF07CisgICAgICAgIHJldHZhbFswXS5maXJzdCA9IGFkZHI7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgICphZGRyZXNzMm9zID0gcmV0dmFsOworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gU29ydCB0aGUgdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgICAgLy8KKyAgICBxc29ydChyZXR2YWwsIG5BY3RpdmVUaHJlYWRzLCBzaXplb2YoKnJldHZhbCksIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2xhYmVscyk7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWFjaGluZSB0b3BvbG9neSBpcyB1bmlmb3JtCisgICAgLy8KKyAgICB1bnNpZ25lZCB1bmlmb3JtID0gKG5QYWNrYWdlcyAqIG5Db3Jlc1BlclBrZyAqIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9PSBuQWN0aXZlVGhyZWFkcyk7CisKKyAgICAvLworICAgIC8vIFByaW50IHRoZSBtYWNoaW5lIHRvcG9sb2d5IHN1bW1hcnkuCisgICAgLy8KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIG1hc2tbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhtYXNrLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdId2xvYywgIktNUF9BRkZJTklUWSIpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgaWYgKHVuaWZvcm0pIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKworICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVkIiwgblBhY2thZ2VzKTsKKyAgICAgICAgLy9mb3IgKGxldmVsID0gMTsgbGV2ZWwgPD0gcGtnTGV2ZWw7IGxldmVsKyspIHsKKyAgICAgICAgLy8gICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiIHggJWQiLCBtYXhDdFtsZXZlbF0pOworICAgICAgIC8vIH0KKyAgICAgICAgS01QX0lORk9STShUb3BvbG9neUV4dHJhLCAiS01QX0FGRklOSVRZIiwgYnVmLnN0ciwgbkNvcmVzUGVyUGtnLAorICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGaW5kIGFueSBsZXZlbHMgd2l0aCByYWRpaXggMSwgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcAorICAgIC8vIChleGNlcHQgZm9yIHRoZSBwYWNrYWdlIGxldmVsKS4KKyAgICAvLworICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfcmVtb3ZlX3JhZGl4X29uZV9sZXZlbHMocmV0dmFsLCBuQWN0aXZlVGhyZWFkcywgZGVwdGgsICZwa2dMZXZlbCwgJmNvcmVMZXZlbCwgJnRocmVhZExldmVsKTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvcmVMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fY29yZSkpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neShyZXR2YWwsIG5BY3RpdmVUaHJlYWRzLCBkZXB0aCwgcGtnTGV2ZWwsCisgICAgICAgICAgY29yZUxldmVsLCB0aHJlYWRMZXZlbCk7CisgICAgfQorCisgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICphZGRyZXNzMm9zID0gcmV0dmFsOworICAgIHJldHVybiBkZXB0aDsKK30KKyNlbmRpZiAvLyBLTVBfVVNFX0hXTE9DCisKKy8vCisvLyBJZiB3ZSBkb24ndCBrbm93IGhvdyB0byByZXRyaWV2ZSB0aGUgbWFjaGluZSdzIHByb2Nlc3NvciB0b3BvbG9neSwgb3IKKy8vIGVuY291bnRlciBhbiBlcnJvciBpbiBkb2luZyBzbywgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBmb3JtIGEgImZsYXQiCisvLyBtYXBwaW5nIG9mIG9zIHRocmVhZCBpZCdzIDwtPiBwcm9jZXNzb3IgaWQncy4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpCit7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBFdmVuIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSwgdGhpcyByb3V0aW5lIG1pZ2h0IHN0aWxsCisgICAgLy8gY2FsbGVkIHRvIHNldCBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMKKyAgICAvLyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuCisgICAgLy8KKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gX19rbXBfeHByb2M7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IDE7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkZsYXRUb3BvbG9neSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAgIC8vIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsCisgICAgLy8gbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4gIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0CisgICAgLy8gIGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSBfX2ttcF9hdmFpbF9wcm9jOworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IDE7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgX19rbXBfYWZmaW5fZnVsbE1hc2spOworCisgICAgICAgIEtNUF9JTkZPUk0oQWZmQ2FwYWJsZVVzZUZsYXQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9wdV9vc19pZHggPT0gTlVMTCk7CisgICAgX19rbXBfcHVfb3NfaWR4ID0gKGludCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGludCkgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIGludCBhdmFpbF9jdCA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSB7CisgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIF9fa21wX3B1X29zX2lkeFthdmFpbF9jdCsrXSA9IGk7IC8vIHN1cHBvc2UgaW5kaWNlcyBhcmUgZmxhdAorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ29udHJ1Y3QgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKQorICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKCoqYWRkcmVzczJvcykgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBpbnQgYXZhaWxfY3QgPSAwOworICAgIHVuc2lnbmVkIGludCBpOworICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCB0aGlzIHByb2MgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBtYWNoaW5lIG1vZGVsLgorICAgICAgICAvLworICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcHVfb3NfaWR4W2F2YWlsX2N0XSA9IGk7IC8vIHN1cHBvc2UgaW5kaWNlcyBhcmUgZmxhdAorICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gaTsKKyAgICAgICAgKCphZGRyZXNzMm9zKVthdmFpbF9jdCsrXSA9IEFkZHJVbnNQYWlyKGFkZHIsaSk7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIEtNUF9JTkZPUk0oT1NQcm9jVG9QYWNrYWdlLCAiS01QX0FGRklOSVRZIik7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBPbmx5IHRoZSBwYWNrYWdlIGxldmVsIGlzIG1vZGVsZWQgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLAorICAgICAgICAvLyBzbyB0aGUgI2xldmVscyBvZiBncmFudWxhcml0eSBpcyBlaXRoZXIgMCBvciAxLgorICAgICAgICAvLworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOworfQorCisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKy8vCisvLyBJZiBtdWx0aXBsZSBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXBzIGV4aXN0LCB3ZSBjYW4gY3JlYXRlIGEgMi1sZXZlbAorLy8gdG9wb2xvZ3kgbWFwIHdpdGggdGhlIGdyb3VwcyBhdCBsZXZlbCAwIGFuZCB0aGUgaW5kaXZpZHVhbCBwcm9jcyBhdAorLy8gbGV2ZWwgMS4KKy8vCisvLyBUaGlzIGZhY2lsaXRhdGVzIGxldHRpbmcgdGhlIHRocmVhZHMgZmxvYXQgYW1vbmcgYWxsIHByb2NzIGluIGEgZ3JvdXAsCisvLyBpZiBncmFudWxhcml0eT1ncm91cCAodGhlIGRlZmF1bHQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZ3JvdXBzKS4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfcHJvY19ncm91cF9tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpCit7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIHByb2Nlc3NvciBncm91cHMsIHJldHVybiBub3cuCisgICAgLy8gVGhlIGZsYXQgbWFwcGluZyB3aWxsIGJlIHVzZWQuCisgICAgLy8KKyAgICBpZiAoKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgfHwgKF9fa21wX2dldF9wcm9jX2dyb3VwKF9fa21wX2FmZmluX2Z1bGxNYXNrKSA+PSAwKSkgeworICAgICAgICAvLyBGSVhNRSBzZXQgKm1zZ19pZAorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb250cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoKiphZGRyZXNzMm9zKSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfcHVfb3NfaWR4ID09IE5VTEwpOworICAgIF9fa21wX3B1X29zX2lkeCA9IChpbnQqKV9fa21wX2FsbG9jYXRlKHNpemVvZihpbnQpICogX19rbXBfYXZhaWxfcHJvYyk7CisgICAgaW50IGF2YWlsX2N0ID0gMDsKKyAgICBpbnQgaTsKKyAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIF9fa21wX3B1X29zX2lkeFthdmFpbF9jdF0gPSBpOyAgLy8gc3VwcG9zZSBpbmRpY2VzIGFyZSBmbGF0CisgICAgICAgIEFkZHJlc3MgYWRkcigyKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSBpIC8gKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpOworICAgICAgICBhZGRyLmxhYmVsc1sxXSA9IGkgJSAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSk7CisgICAgICAgICgqYWRkcmVzczJvcylbYXZhaWxfY3QrK10gPSBBZGRyVW5zUGFpcihhZGRyLGkpOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk9TUHJvY1RvR3JvdXAsICJLTVBfQUZGSU5JVFkiLCBpLCBhZGRyLmxhYmVsc1swXSwKKyAgICAgICAgICAgICAgYWRkci5sYWJlbHNbMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2dyb3VwKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lKQorICAgICAgICAgIHx8IChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZ3Jhbl9zdHIgPSBOVUxMOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlKSB7CisgICAgICAgICAgICAgICAgZ3Jhbl9zdHIgPSAiY29yZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgICAgIGdyYW5fc3RyID0gInBhY2thZ2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX25vZGUpIHsKKyAgICAgICAgICAgICAgICBncmFuX3N0ciA9ICJub2RlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdhcm5pbmc6IGNhbid0IHVzZSBhZmZpbml0eSBncmFudWxhcml0eSBcImdyYW5cIiB3aXRoIGdyb3VwIHRvcG9sb2d5IG1ldGhvZCwgdXNpbmcgInRocmVhZCIKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMjsKK30KKworIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworc3RhdGljIGludAorX19rbXBfY3B1aWRfbWFza193aWR0aChpbnQgY291bnQpIHsKKyAgICBpbnQgciA9IDA7CisKKyAgICB3aGlsZSgoMTw8cikgPCBjb3VudCkKKyAgICAgICAgKytyOworICAgIHJldHVybiByOworfQorCisKK2NsYXNzIGFwaWNUaHJlYWRJbmZvIHsKK3B1YmxpYzoKKyAgICB1bnNpZ25lZCBvc0lkOyAgICAgICAgICAgICAgLy8gcGFyYW0gdG8gX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQKKyAgICB1bnNpZ25lZCBhcGljSWQ7ICAgICAgICAgICAgLy8gZnJvbSBjcHVpZCBhZnRlciBiaW5kaW5nCisgICAgdW5zaWduZWQgbWF4Q29yZXNQZXJQa2c7ICAgIC8vICAgICAgIiIKKyAgICB1bnNpZ25lZCBtYXhUaHJlYWRzUGVyUGtnOyAgLy8gICAgICAiIgorICAgIHVuc2lnbmVkIHBrZ0lkOyAgICAgICAgICAgICAvLyBpbmZlcnJlZCBmcm9tIGFib3ZlIHZhbHVlcworICAgIHVuc2lnbmVkIGNvcmVJZDsgICAgICAgICAgICAvLyAgICAgICIiCisgICAgdW5zaWduZWQgdGhyZWFkSWQ7ICAgICAgICAgIC8vICAgICAgIiIKK307CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX2FwaWNUaHJlYWRJbmZvX29zX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgYXBpY1RocmVhZEluZm8gKmFhID0gKGNvbnN0IGFwaWNUaHJlYWRJbmZvICopYTsKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYmIgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKiliOworICAgIGlmIChhYS0+b3NJZCA8IGJiLT5vc0lkKSByZXR1cm4gLTE7CisgICAgaWYgKGFhLT5vc0lkID4gYmItPm9zSWQpIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NtcF9hcGljVGhyZWFkSW5mb19waHlzX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgYXBpY1RocmVhZEluZm8gKmFhID0gKGNvbnN0IGFwaWNUaHJlYWRJbmZvICopYTsKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYmIgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKiliOworICAgIGlmIChhYS0+cGtnSWQgPCBiYi0+cGtnSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPnBrZ0lkID4gYmItPnBrZ0lkKSByZXR1cm4gMTsKKyAgICBpZiAoYWEtPmNvcmVJZCA8IGJiLT5jb3JlSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPmNvcmVJZCA+IGJiLT5jb3JlSWQpIHJldHVybiAxOworICAgIGlmIChhYS0+dGhyZWFkSWQgPCBiYi0+dGhyZWFkSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPnRocmVhZElkID4gYmItPnRocmVhZElkKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworCisvLworLy8gT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUsIHdlIGF0dGVtcHQgdG8gdXNlCisvLyBhbiBhbGdvcml0aG0gd2hpY2ggY3ljbGVzIHRocm91Z2ggdGhlIGF2YWlsYWJsZSBvcyB0aHJlYWRzLCBzZXR0aW5nCisvLyB0aGUgY3VycmVudCB0aHJlYWQncyBhZmZpbml0eSBtYXNrIHRvIHRoYXQgdGhyZWFkLCBhbmQgdGhlbiByZXRyaWV2ZXMKKy8vIHRoZSBBcGljIElkIGZvciBlYWNoIHRocmVhZCBjb250ZXh0IHVzaW5nIHRoZSBjcHVpZCBpbnN0cnVjdGlvbi4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkKK3sKKyAgICBrbXBfY3B1aWQgYnVmOworICAgIGludCByYzsKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIENoZWNrIGlmIGNwdWlkIGxlYWYgNCBpcyBzdXBwb3J0ZWQuCisgICAgLy8KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgICAgICBpZiAoYnVmLmVheCA8IDQpIHsKKyAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9MZWFmNFN1cHBvcnQ7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgIC8vCisgICAgLy8gVGhlIGFsZ29yaXRobSB1c2VkIHN0YXJ0cyBieSBzZXR0aW5nIHRoZSBhZmZpbml0eSB0byBlYWNoIGF2YWlsYWJsZQorICAgIC8vIHRocmVhZCBhbmQgcmV0cmlldmluZyBpbmZvIGZyb20gdGhlIGNwdWlkIGluc3RydWN0aW9uLCBzbyBpZiB3ZSBhcmUKKyAgICAvLyBub3QgY2FwYWJsZSBvZiBjYWxsaW5nIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQKKyAgICAvLyBfa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBlbHNlIC0gdXNlCisgICAgLy8gdGhlIGRlZmF1bHRzIHRoYXQgd2UgY2FsY3VsYXRlZCBmcm9tIGlzc3VpbmcgY3B1aWQgd2l0aG91dCBiaW5kaW5nCisgICAgLy8gdG8gZWFjaCBwcm9jLgorICAgIC8vCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICAvLworICAgICAgICAvLyBIYWNrIHRvIHRyeSBhbmQgaW5mZXIgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdXNpbmcgb25seSB0aGUgZGF0YQorICAgICAgICAvLyBhdmFpbGFibGUgZnJvbSBjcHVpZCBvbiB0aGUgY3VycmVudCB0aHJlYWQsIGFuZCBfX2ttcF94cHJvYy4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEdldCBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcGVyIHBhY2thZ2UgdXNpbmcKKyAgICAgICAgLy8gY3B1aWQoMSkuCisgICAgICAgIC8vCisgICAgICAgIC8vIE9uIHNvbWUgT1MvY2hwcyBjb21iaW5hdGlvbnMgd2hlcmUgSFQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwCisgICAgICAgIC8vIGJ1dCBpcyBkaXNhYmxlZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIDIgb24gYSBzaW5nbGUgY29yZSBjaGlwLgorICAgICAgICAvLyBVc3VhbGx5LCBpdCB3aWxsIGJlIDIgaWYgSFQgaXMgZW5hYmxlZCBhbmQgMSBpZiBIVCBpcyBkaXNhYmxlZC4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDEsIDAsICZidWYpOworICAgICAgICBpbnQgbWF4VGhyZWFkc1BlclBrZyA9IChidWYuZWJ4ID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGlmIChtYXhUaHJlYWRzUGVyUGtnID09IDApIHsKKyAgICAgICAgICAgIG1heFRocmVhZHNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIG51bSBjb3JlcyBwZXIgcGtnIGNvbWVzIGZyb20gY3B1aWQoNCkuCisgICAgICAgIC8vIDEgbXVzdCBiZSBhZGRlZCB0byB0aGUgZW5jb2RlZCB2YWx1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGF1dGhvciBvZiBjcHVfY291bnQuY3BwIHRyZWF0ZWQgdGhpcyBvbmx5IGFuIHVwcGVyIGJvdW5kCisgICAgICAgIC8vIG9uIHRoZSBudW1iZXIgb2YgY29yZXMsIGJ1dCBJIGhhdmVuJ3Qgc2VlbiBhbnkgY2FzZXMgd2hlcmUgaXQKKyAgICAgICAgLy8gd2FzIGdyZWF0ZXIgdGhhbiB0aGUgYWN0dWFsIG51bWJlciBvZiBjb3Jlcywgc28gd2Ugd2lsbCB0cmVhdAorICAgICAgICAvLyBpdCBhcyBleGFjdCBpbiB0aGlzIGJsb2NrIG9mIGNvZGUuCisgICAgICAgIC8vCisgICAgICAgIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGNwdWlkKDQpIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGNoaXAuCisgICAgICAgIC8vIFRvIHNlZSBpZiBjcHVpZChuKSBpcyBzdXBwb3J0ZWQsIGlzc3VlIGNwdWlkKDApIGFuZCBjaGVjayBpZiBlYXgKKyAgICAgICAgLy8gaGFzIHRoZSB2YWx1ZSBuIG9yIGdyZWF0ZXIuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgwLCAwLCAmYnVmKTsKKyAgICAgICAgaWYgKGJ1Zi5lYXggPj0gNCkgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKDQsIDAsICZidWYpOworICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gKChidWYuZWF4ID4+IDI2KSAmIDB4M2YpICsgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5Db3Jlc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gcmVsaWFibHkgdGVsbCBpZiBIVCBpcyBlbmFibGVkIHdpdGhvdXQgaXNzdWluZworICAgICAgICAvLyB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24gZnJvbSBldmVyeSB0aHJlYWQsIGNhbiBjb3JyZWxhdGluZyB0aGUgY3B1aWQKKyAgICAgICAgLy8gaW5mbywgc28gaWYgdGhlIG1hY2hpbmUgaXMgbm90IGFmZmluaXR5IGNhcGFibGUsIHdlIGFzc3VtZSB0aGF0IEhUCisgICAgICAgIC8vIGlzIG9mZi4gIFdlIGhhdmUgc2VlbiBxdWl0ZSBhIGZldyBtYWNoaW5lcyB3aGVyZSBtYXhUaHJlYWRzUGVyUGtnCisgICAgICAgIC8vIGlzIDIsIHlldCB0aGUgbWFjaGluZSBkb2VzIG5vdCBzdXBwb3J0IEhULgorICAgICAgICAvLworICAgICAgICAvLyAtIE9sZGVyIE9TZXMgYXJlIHVzdWFsbHkgZm91bmQgb24gbWFjaGluZXMgd2l0aCBvbGRlciBjaGlwcywgd2hpY2gKKyAgICAgICAgLy8gICBkbyBub3Qgc3VwcG9ydCBIVC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBUaGUgcGVyZm9ybWFuY2UgcGVuYWx0eSBmb3IgbWlzdGFrZW5seSBpZGVudGlmeWluZyBhIG1hY2hpbmUgYXMKKyAgICAgICAgLy8gICBIVCB3aGVuIGl0IGlzbid0ICh3aGljaCByZXN1bHRzIGluIGJsb2NrdGltZSBiZWluZyBpbmNvcnJlY2x5IHNldAorICAgICAgICAvLyAgIHRvIDApIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGVuYWx0eSB3aGVuIGZvciBtaXN0YWtlbmx5IGlkZW50aWZ5aW5nCisgICAgICAgIC8vICAgYSBtYWNoaW5lIGFzIGJlaW5nIDEgdGhyZWFkL2NvcmUgd2hlbiBpdCBpcyByZWFsbHkgSFQgZW5hYmxlZAorICAgICAgICAvLyAgICh3aGljaCByZXN1bHRzIGluIGJsb2NrdGltZSBiZWluZyBpbmNvcnJlY3RseSBzZXQgdG8gYSBwb3NpdGl2ZQorICAgICAgICAvLyAgIHZhbHVlKS4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfbmNvcmVzID0gX19rbXBfeHByb2M7CisgICAgICAgIG5QYWNrYWdlcyA9IChfX2ttcF94cHJvYyArIG5Db3Jlc1BlclBrZyAtIDEpIC8gbkNvcmVzUGVyUGtnOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSAxOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLworICAgIC8vIEZyb20gaGVyZSBvbiwgd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGlzIHNhZmUgdG8gY2FsbAorICAgIC8vIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSgpLAorICAgIC8vIGV2ZW4gaWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmUuCisgICAgLy8KKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqb2xkTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DKG9sZE1hc2spOworICAgIEtNUF9BU1NFUlQob2xkTWFzayAhPSBOVUxMKTsKKyAgICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCBlYWNoIG9mIHRoZSBhdmFpbGFibGUgY29udGV4dHMsIGJpbmRpbmcgdGhlIGN1cnJlbnQgdGhyZWFkCisgICAgLy8gdG8gaXQsIGFuZCBvYnRhaW5pbmcgdGhlIHBlcnRpbmVudCBpbmZvcm1hdGlvbiB1c2luZyB0aGUgY3B1aWQgaW5zdHIuCisgICAgLy8KKyAgICAvLyBUaGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gaXM6CisgICAgLy8KKyAgICAvLyBBcGljIElkOiBCaXRzIDI0OjMxIG9mIGVieCBhZnRlciBpc3N1aW5nIGNwdWlkKDEpIC0gZWFjaCB0aHJlYWQgY29udGV4dAorICAgIC8vICAgIGhhcyBhIHVuaXFpZSBBcGljIElkLCB3aGljaCBpcyBvZiB0aGUgZm9ybSBwa2cjIDogY29yZSMgOiB0aHJlYWQjLgorICAgIC8vCisgICAgLy8gTWF4IFRocmVhZHMgUGVyIFBrZzogQml0cyAxNjoyMyBvZiBlYnggYWZ0ZXIgaXNzdWluZyBjcHVpZCgxKS4gIFRoZQorICAgIC8vICAgIHZhbHVlIG9mIHRoaXMgZmllbGQgZGV0ZXJtaW5lcyB0aGUgd2lkdGggb2YgdGhlIGNvcmUjICsgdGhyZWFkIworICAgIC8vICAgIGZpZWxkcyBpbiB0aGUgQXBpYyBJZC4gIEl0IGlzIGFsc28gYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlcgorICAgIC8vICAgIG9mIHRocmVhZHMgcGVyIHBhY2thZ2UsIGJ1dCBpdCBoYXMgYmVlbiB2ZXJpZmllZCB0aGF0IHNpdHVhdGlvbnMKKyAgICAvLyAgICBoYXBwZW4gd2VyZSBpdCBpcyBub3QgZXhhY3QuICBJbiBwYXJ0aWN1bGFyLCBvbiBjZXJ0YWluIE9TL2NoaXAKKyAgICAvLyAgICBjb21iaW5hdGlvbnMgd2hlcmUgSW50ZWwoUikgSHlwZXItVGhyZWFkaW5nIFRlY2hub2xvZ3kgaXMgc3VwcG9ydGVkCisgICAgLy8gICAgYnkgdGhlIGNoaXAgYnV0IGhhcworICAgIC8vICAgIGJlZW4gZGlzYWJsZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHdpbGwgYmUgMiAoZm9yIGEgc2luZ2xlIGNvcmUKKyAgICAvLyAgICBjaGlwKS4gIE9uIG90aGVyIE9TL2NoaXAgY29tYmluYXRpb25zIHN1cHBvcnRpbmcKKyAgICAvLyAgICBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSwgdGhlIHZhbHVlIG9mCisgICAgLy8gICAgdGhpcyBmaWVsZCB3aWxsIGJlIDEgd2hlbiBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSBpcworICAgIC8vICAgIGRpc2FibGVkIGFuZCAyIHdoZW4gaXQgaXMgZW5hYmxlZC4KKyAgICAvLworICAgIC8vIE1heCBDb3JlcyBQZXIgUGtnOiAgQml0cyAyNjozMSBvZiBlYXggYWZ0ZXIgaXNzdWluZyBjcHVpZCg0KS4gIFRoZQorICAgIC8vICAgIHZhbHVlIG9mIHRoaXMgZmllbGQgKCsxKSBkZXRlcm1pbmVzIHRoZSB3aWR0aCBvZiB0aGUgY29yZSMgZmllbGQgaW4KKyAgICAvLyAgICB0aGUgQXBpYyBJZC4gIFRoZSBjb21tZW50cyBpbiAiY3B1Y291bnQuY3BwIiBzYXkgdGhhdCB0aGlzIHZhbHVlIGlzCisgICAgLy8gICAgYW4gdXBwZXIgYm91bmQsIGJ1dCB0aGUgSUEtMzIgYXJjaGl0ZWN0dXJlIG1hbnVhbCBzYXlzIHRoYXQgaXQgaXMKKyAgICAvLyAgICBleGFjdGx5IHRoZSBudW1iZXIgb2YgY29yZXMgcGVyIHBhY2thZ2UsIGFuZCBJIGhhdmVuJ3Qgc2VlbiBhbnkKKyAgICAvLyAgICBjYXNlIHdoZXJlIGl0IHdhc24ndC4KKyAgICAvLworICAgIC8vIEZyb20gdGhpcyBpbmZvcm1hdGlvbiwgZGVkdWNlIHRoZSBwYWNrYWdlIElkLCBjb3JlIElkLCBhbmQgdGhyZWFkIElkLAorICAgIC8vIGFuZCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIHRoZSBhcGljVGhyZWFkSW5mbyBzdHJ1Y3QuCisgICAgLy8KKyAgICB1bnNpZ25lZCBpOworICAgIGFwaWNUaHJlYWRJbmZvICp0aHJlYWRJbmZvID0gKGFwaWNUaHJlYWRJbmZvICopX19rbXBfYWxsb2NhdGUoCisgICAgICBfX2ttcF9hdmFpbF9wcm9jICogc2l6ZW9mKGFwaWNUaHJlYWRJbmZvKSk7CisgICAgdW5zaWduZWQgbkFwaWNzID0gMDsKKyAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKGludCluQXBpY3MgPCBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgICAgICBfX2ttcF9hZmZpbml0eV9kaXNwYXRjaC0+YmluZF90aHJlYWQoaSk7CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5vc0lkID0gaTsKKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgYXBpYyBpZCBhbmQgbWF4IHRocmVhZHMgcGVyIHBrZyBjb21lIGZyb20gY3B1aWQoMSkuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgxLCAwLCAmYnVmKTsKKyAgICAgICAgaWYgKCgoYnVmLmVkeCA+PiA5KSAmIDEpID09IDApIHsKKyAgICAgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9BcGljTm90UHJlc2VudDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID0gKGJ1Zi5lYnggPj4gMjQpICYgMHhmZjsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPSAoYnVmLmVieCA+PiAxNikgJiAweGZmOworICAgICAgICBpZiAodGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPT0gMCkgeworICAgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTWF4IGNvcmVzIHBlciBwa2cgY29tZXMgZnJvbSBjcHVpZCg0KS4KKyAgICAgICAgLy8gMSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBlbmNvZGVkIHZhbHVlLgorICAgICAgICAvLworICAgICAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBjaGVjayBpZiBjcHVpZCg0KSBpcyBzdXBwb3J0ZWQgb24gdGhpcyBjaGlwLgorICAgICAgICAvLyBUbyBzZWUgaWYgY3B1aWQobikgaXMgc3VwcG9ydGVkLCBpc3N1ZSBjcHVpZCgwKSBhbmQgY2hlY2sgaWYgZWF4CisgICAgICAgIC8vIGhhcyB0aGUgdmFsdWUgbiBvciBncmVhdGVyLgorICAgICAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMCwgMCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWF4ID49IDQpIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCg0LCAwLCAmYnVmKTsKKyAgICAgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5tYXhDb3Jlc1BlclBrZyA9ICgoYnVmLmVheCA+PiAyNikgJiAweDNmKSArIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4Q29yZXNQZXJQa2cgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW5mZXIgdGhlIHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQgdXNpbmcgb25seSB0aGUgaW5mbworICAgICAgICAvLyBvYnRhaW5lZCBsb2NhbGx5LgorICAgICAgICAvLworICAgICAgICBpbnQgd2lkdGhDVCA9IF9fa21wX2NwdWlkX21hc2tfd2lkdGgoCisgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cpOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ucGtnSWQgPSB0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID4+IHdpZHRoQ1Q7CisKKyAgICAgICAgaW50IHdpZHRoQyA9IF9fa21wX2NwdWlkX21hc2tfd2lkdGgoCisgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heENvcmVzUGVyUGtnKTsKKyAgICAgICAgaW50IHdpZHRoVCA9IHdpZHRoQ1QgLSB3aWR0aEM7CisgICAgICAgIGlmICh3aWR0aFQgPCAwKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSSd2ZSBuZXZlciBzZWVuIHRoaXMgb25lIGhhcHBlbiwgYnV0IEkgc3VwcG9zZSBpdCBjb3VsZCwgaWYKKyAgICAgICAgICAgIC8vIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBvbiBhIGNoaXAgd2FzIHJlYWxseSBzY3Jld2VkIHVwLgorICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHJlc3RvcmUgdGhlIGFmZmluaXR5IG1hc2sgYmVmb3JlIHRoZSB0YWlsIGNhbGwuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWFza0MgPSAoMSA8PCB3aWR0aEMpIC0gMTsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLmNvcmVJZCA9ICh0aHJlYWRJbmZvW25BcGljc10uYXBpY0lkID4+IHdpZHRoVCkKKyAgICAgICAgICAmbWFza0M7CisKKyAgICAgICAgaW50IG1hc2tUID0gKDEgPDwgd2lkdGhUKSAtIDE7CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS50aHJlYWRJZCA9IHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgJm1hc2tUOworCisgICAgICAgIG5BcGljcysrOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UndmUgY29sbGVjdGVkIGFsbCB0aGUgaW5mbyB3ZSBuZWVkLgorICAgIC8vIFJlc3RvcmUgdGhlIG9sZCBhZmZpbml0eSBtYXNrIGZvciB0aGlzIHRocmVhZC4KKyAgICAvLworICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgZm9ybSBhbiBBZGRyZXNzIG9iamVjdAorICAgIC8vIHdpdGggZGVwdGggMSBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IChvciwgaWYgYWZmaW5pdHkgaXMgb2ZmLCBzZXQKKyAgICAvLyBhZGRyZXNzMm9zIHRvIE5VTEwgYW5kIHJldHVybikuCisgICAgLy8KKyAgICAvLyBJZiBpdCBpcyBjb25maWd1cmVkIHRvIG9taXQgdGhlIHBhY2thZ2UgbGV2ZWwgd2hlbiB0aGVyZSBpcyBvbmx5IGEKKyAgICAvLyBzaW5nbGUgcGFja2FnZSwgdGhlIGxvZ2ljIGF0IHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIHdvbid0IHdvcmsgaWYKKyAgICAvLyB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRocmVhZCAtIGl0IHdvdWxkIHRyeSB0byBmb3JtIGFuIEFkZHJlc3MKKyAgICAvLyBvYmplY3Qgd2l0aCBkZXB0aCAwLgorICAgIC8vCisgICAgS01QX0FTU0VSVChuQXBpY3MgPiAwKTsKKyAgICBpZiAobkFwaWNzID09IDEpIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gMTsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBvbGRNYXNrKTsKKworICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKilfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpKTsKKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IHRocmVhZEluZm9bMF0ucGtnSWQ7CisgICAgICAgICgqYWRkcmVzczJvcylbMF0gPSBBZGRyVW5zUGFpcihhZGRyLCB0aHJlYWRJbmZvWzBdLm9zSWQpOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neSgqYWRkcmVzczJvcywgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTb3J0IHRoZSB0aHJlYWRJbmZvIHRhYmxlIGJ5IHBoeXNpY2FsIElkLgorICAgIC8vCisgICAgcXNvcnQodGhyZWFkSW5mbywgbkFwaWNzLCBzaXplb2YoKnRocmVhZEluZm8pLAorICAgICAgX19rbXBfYWZmaW5pdHlfY21wX2FwaWNUaHJlYWRJbmZvX3BoeXNfaWQpOworCisgICAgLy8KKyAgICAvLyBUaGUgdGFibGUgaXMgbm93IHNvcnRlZCBieSBwa2dJZCAvIGNvcmVJZCAvIHRocmVhZElkLCBidXQgd2UgcmVhbGx5CisgICAgLy8gZG9uJ3Qga25vdyB0aGUgcmFkaXggb2YgYW55IG9mIHRoZSBmaWVsZHMuICBwa2dJZCdzIG1heSBiZSBzcGFyc2VseQorICAgIC8vIGFzc2lnbmVkIGFtb25nIHRoZSBjaGlwcyBvbiBhIHN5c3RlbS4gIEFsdGhvdWdoIGNvcmVJZCdzIGFyZSB1c3VhbGx5CisgICAgLy8gYXNzaWduZWQgWzAgLi4gY29yZXNQZXJQa2ctMV0gYW5kIHRocmVhZElkJ3MgYXJlIHVzdWFsbHkgYXNzaWduZWQKKyAgICAvLyBbMC4udGhyZWFkc1BlckNvcmUtMV0sIHdlIGRvbid0IHdhbnQgdG8gbWFrZSBhbnkgc3VjaCBhc3N1bXB0aW9ucy4KKyAgICAvLworICAgIC8vIEZvciB0aGF0IG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGF0IGNvcmVzUGVyUGtnIGFuZCB0aHJlYWRzUGVyQ29yZQorICAgIC8vIChvciB0aGUgdG90YWwgIyBwYWNrYWdlcykgYXJlIGF0IHRoaXMgcG9pbnQgLSB3ZSB3YW50IHRvIGRldGVybWluZQorICAgIC8vIHRoYXQgbm93LiAgV2Ugb25seSBoYXZlIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBmaXJzdCB0d28gZmlndXJlcy4KKyAgICAvLworICAgIC8vIFdlIGFsc28gcGVyZm9ybSBhIGNvbnNpc3RlbmN5IGNoZWNrIGF0IHRoaXMgcG9pbnQ6IHRoZSB2YWx1ZXMgcmV0dXJuZWQKKyAgICAvLyBieSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24gZm9yIGFueSB0aHJlYWQgYm91bmQgdG8gYSBnaXZlbiBwYWNrYWdlIGhhZAorICAgIC8vIGJldHRlciByZXR1cm4gdGhlIHNhbWUgaW5mbyBmb3IgbWF4VGhyZWFkc1BlclBrZyBhbmQgbWF4Q29yZXNQZXJQa2cuCisgICAgLy8KKyAgICBuUGFja2FnZXMgPSAxOworICAgIG5Db3Jlc1BlclBrZyA9IDE7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gMTsKKyAgICB1bnNpZ25lZCBuQ29yZXMgPSAxOworCisgICAgdW5zaWduZWQgcGtnQ3QgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgcmFkaWkKKyAgICB1bnNpZ25lZCBsYXN0UGtnSWQgPSB0aHJlYWRJbmZvWzBdLnBrZ0lkOworICAgIHVuc2lnbmVkIGNvcmVDdCA9IDE7CisgICAgdW5zaWduZWQgbGFzdENvcmVJZCA9IHRocmVhZEluZm9bMF0uY29yZUlkOworICAgIHVuc2lnbmVkIHRocmVhZEN0ID0gMTsKKyAgICB1bnNpZ25lZCBsYXN0VGhyZWFkSWQgPSB0aHJlYWRJbmZvWzBdLnRocmVhZElkOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRyYS1wa2cgY29uc2lzdCBjaGVja3MKKyAgICB1bnNpZ25lZCBwcmV2TWF4Q29yZXNQZXJQa2cgPSB0aHJlYWRJbmZvWzBdLm1heENvcmVzUGVyUGtnOworICAgIHVuc2lnbmVkIHByZXZNYXhUaHJlYWRzUGVyUGtnID0gdGhyZWFkSW5mb1swXS5tYXhUaHJlYWRzUGVyUGtnOworCisgICAgZm9yIChpID0gMTsgaSA8IG5BcGljczsgaSsrKSB7CisgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldLnBrZ0lkICE9IGxhc3RQa2dJZCkgeworICAgICAgICAgICAgbkNvcmVzKys7CisgICAgICAgICAgICBwa2dDdCsrOworICAgICAgICAgICAgbGFzdFBrZ0lkID0gdGhyZWFkSW5mb1tpXS5wa2dJZDsKKyAgICAgICAgICAgIGlmICgoaW50KWNvcmVDdCA+IG5Db3Jlc1BlclBrZykgbkNvcmVzUGVyUGtnID0gY29yZUN0OworICAgICAgICAgICAgY29yZUN0ID0gMTsKKyAgICAgICAgICAgIGxhc3RDb3JlSWQgPSB0aHJlYWRJbmZvW2ldLmNvcmVJZDsKKyAgICAgICAgICAgIGlmICgoaW50KXRocmVhZEN0ID4gX19rbXBfblRocmVhZHNQZXJDb3JlKSBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSB0aHJlYWRDdDsKKyAgICAgICAgICAgIHRocmVhZEN0ID0gMTsKKyAgICAgICAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZGlmZmVyZW50IHBhY2thZ2UsIHNvIGdvIG9uIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbgorICAgICAgICAgICAgLy8gd2l0aG91dCBkb2luZyBhbnkgY29uc2lzdGVuY3kgY2hlY2tzLiAgUmVzZXQgdGhlIGNvbnNpc3RlbmN5CisgICAgICAgICAgICAvLyBjaGVjayB2YXJzLCB0aG91Z2guCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcHJldk1heENvcmVzUGVyUGtnID0gdGhyZWFkSW5mb1tpXS5tYXhDb3Jlc1BlclBrZzsKKyAgICAgICAgICAgIHByZXZNYXhUaHJlYWRzUGVyUGtnID0gdGhyZWFkSW5mb1tpXS5tYXhUaHJlYWRzUGVyUGtnOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhyZWFkSW5mb1tpXS5jb3JlSWQgIT0gbGFzdENvcmVJZCkgeworICAgICAgICAgICAgbkNvcmVzKys7CisgICAgICAgICAgICBjb3JlQ3QrKzsKKyAgICAgICAgICAgIGxhc3RDb3JlSWQgPSB0aHJlYWRJbmZvW2ldLmNvcmVJZDsKKyAgICAgICAgICAgIGlmICgoaW50KXRocmVhZEN0ID4gX19rbXBfblRocmVhZHNQZXJDb3JlKSBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSB0aHJlYWRDdDsKKyAgICAgICAgICAgIHRocmVhZEN0ID0gMTsKKyAgICAgICAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGhyZWFkSW5mb1tpXS50aHJlYWRJZCAhPSBsYXN0VGhyZWFkSWQpIHsKKyAgICAgICAgICAgIHRocmVhZEN0Kys7CisgICAgICAgICAgICBsYXN0VGhyZWFkSWQgPSB0aHJlYWRJbmZvW2ldLnRocmVhZElkOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTGVnYWN5QXBpY0lEc05vdFVuaXF1ZTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIHRvIG1ha2UgY2VydGFpbiB0aGF0IHRoZSBtYXhDb3Jlc1BlclBrZyBhbmQgbWF4VGhyZWFkc1BlclBrZworICAgICAgICAvLyBmaWVsZHMgYWdyZWUgYmV0d2VlbiBhbGwgdGhlIHRocmVhZHMgYm91bmRzIHRvIGEgZ2l2ZW4gcGFja2FnZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKChwcmV2TWF4Q29yZXNQZXJQa2cgIT0gdGhyZWFkSW5mb1tpXS5tYXhDb3Jlc1BlclBrZykKKyAgICAgICAgICB8fCAocHJldk1heFRocmVhZHNQZXJQa2cgIT0gdGhyZWFkSW5mb1tpXS5tYXhUaHJlYWRzUGVyUGtnKSkgeworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW5jb25zaXN0ZW50Q3B1aWRJbmZvOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIG5QYWNrYWdlcyA9IHBrZ0N0OworICAgIGlmICgoaW50KWNvcmVDdCA+IG5Db3Jlc1BlclBrZykgbkNvcmVzUGVyUGtnID0gY29yZUN0OworICAgIGlmICgoaW50KXRocmVhZEN0ID4gX19rbXBfblRocmVhZHNQZXJDb3JlKSBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSB0aHJlYWRDdDsKKworICAgIC8vCisgICAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgICAvLyBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9uY29yZXMgPSBuQ29yZXM7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9wdV9vc19pZHggPT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChuQXBpY3MgPT0gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgX19rbXBfcHVfb3NfaWR4ID0gKGludCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGludCkgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkFwaWNzOyArK2kpIHsKKyAgICAgICAgX19rbXBfcHVfb3NfaWR4W2ldID0gdGhyZWFkSW5mb1tpXS5vc0lkOworICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBkZXRlcm1pbmVkIHRoZSBudW1iZXIgb2YgcGFja2FnZXMsIHRoZSBudW1iZXIgb2YgY29yZXMKKyAgICAvLyBwZXIgcGFja2FnZSwgYW5kIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgY29yZSwgd2UgY2FuIGNvbnN0cnVjdCB0aGUKKyAgICAvLyBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgaW50IHBrZ0xldmVsID0gMDsKKyAgICBpbnQgY29yZUxldmVsID0gKG5Db3Jlc1BlclBrZyA8PSAxKSA/IC0xIDogMTsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAoX19rbXBfblRocmVhZHNQZXJDb3JlIDw9IDEpID8gLTEgOiAoKGNvcmVMZXZlbCA+PSAwKSA/IDIgOiAxKTsKKyAgICB1bnNpZ25lZCBkZXB0aCA9IChwa2dMZXZlbCA+PSAwKSArIChjb3JlTGV2ZWwgPj0gMCkgKyAodGhyZWFkTGV2ZWwgPj0gMCk7CisKKyAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBuQXBpY3MpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5BcGljczsgKytpKSB7CisgICAgICAgIEFkZHJlc3MgYWRkcihkZXB0aCk7CisgICAgICAgIHVuc2lnbmVkIG9zID0gdGhyZWFkSW5mb1tpXS5vc0lkOworICAgICAgICBpbnQgZCA9IDA7CisKKyAgICAgICAgaWYgKHBrZ0xldmVsID49IDApIHsKKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2QrK10gPSB0aHJlYWRJbmZvW2ldLnBrZ0lkOworICAgICAgICB9CisgICAgICAgIGlmIChjb3JlTGV2ZWwgPj0gMCkgeworICAgICAgICAgICAgYWRkci5sYWJlbHNbZCsrXSA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICB9CisgICAgICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkKytdID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKyAgICAgICAgfQorICAgICAgICAoKmFkZHJlc3Myb3MpW2ldID0gQWRkclVuc1BhaXIoYWRkciwgb3MpOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKQorICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgoY29yZUxldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBrZ0xldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCBuQXBpY3MsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICByZXR1cm4gZGVwdGg7Cit9CisKKworLy8KKy8vIEludGVsKFIpIG1pY3JvYXJjaGl0ZWN0dXJlIGNvZGUgbmFtZSBOZWhhbGVtLCBEdW5uaW5ndG9uIGFuZCBsYXRlcgorLy8gYXJjaGl0ZWN0dXJlcyBzdXBwb3J0IGEgbmV3ZXIgaW50ZXJmYWNlIGZvciBzcGVjaWZ5aW5nIHRoZSB4MkFQSUMgSWRzLAorLy8gYmFzZWQgb24gY3B1aWQgbGVhZiAxMS4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgIGttcF9jcHVpZCBidWY7CisKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiBjcHVpZCBsZWFmIDExIGlzIHN1cHBvcnRlZC4KKyAgICAvLworICAgIF9fa21wX3g4Nl9jcHVpZCgwLCAwLCAmYnVmKTsKKyAgICBpZiAoYnVmLmVheCA8IDExKSB7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9MZWFmMTFTdXBwb3J0OworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgMCwgJmJ1Zik7CisgICAgaWYgKGJ1Zi5lYnggPT0gMCkgeworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX05vTGVhZjExU3VwcG9ydDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGxldmVscyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neS4gIFdoaWxlIHdlJ3JlIGF0IGl0LAorICAgIC8vIGdldCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIF9fa21wX25UaHJlYWRzUGVyQ29yZSAmIG5Db3Jlc1BlclBrZy4gIFdlIHdpbGwKKyAgICAvLyB0cnkgdG8gZ2V0IG1vcmUgYWNjdXJhdGUgdmFsdWVzIGxhdGVyIGJ5IGV4cGxpY2l0bHkgY291bnRpbmcgdGhlbSwKKyAgICAvLyBidXQgZ2V0IHJlYXNvbmFibGUgZGVmYXVsdHMgbm93LCBpbiBjYXNlIHdlIHJldHVybiBlYXJseS4KKyAgICAvLworICAgIGludCBsZXZlbDsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAtMTsKKyAgICBpbnQgY29yZUxldmVsID0gLTE7CisgICAgaW50IHBrZ0xldmVsID0gLTE7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gblBhY2thZ2VzID0gMTsKKworICAgIGZvciAobGV2ZWwgPSAwOzsgbGV2ZWwrKykgeworICAgICAgICBpZiAobGV2ZWwgPiAzMSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEZJWE1FOiBIYWNrIGZvciBEUEQyMDAxNjMxODAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiBsZXZlbCBpcyBiaWcgdGhlbiBzb21ldGhpbmcgd2VudCB3cm9uZyAtPiBleGl0aW5nCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlcmUgY291bGQgYWN0dWFsbHkgYmUgMzIgdmFsaWQgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5LAorICAgICAgICAgICAgLy8gYnV0IHNvIGZhciwgdGhlIG9ubHkgbWFjaGluZSB3ZSBoYXZlIHNlZW4gd2hpY2ggZG9lcyBub3QgZXhpdAorICAgICAgICAgICAgLy8gdGhpcyBsb29wIGJlZm9yZSBpdGVyYXRpb24gMzIgaGFzIGZ1YmFyIHgyQVBJQyBzZXR0aW5ncy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGb3Igbm93LCBqdXN0IHJlamVjdCB0aGlzIGNhc2UgYmFzZWQgdXBvbiBsb29wIHRyaXAgY291bnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgbGV2ZWwsICZidWYpOworICAgICAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICAgICAgICBpZiAocGtnTGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXaWxsIGluZmVyIG5QYWNrYWdlcyBmcm9tIF9fa21wX3hwcm9jCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBwa2dMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQga2luZCA9IChidWYuZWN4ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaWYgKGtpbmQgPT0gMSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNNVCBsZXZlbAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHRocmVhZExldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBjb3JlTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIHBrZ0xldmVsID0gLTE7CisgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBidWYuZWJ4ICYgMHhmZmZmOworICAgICAgICAgICAgaWYgKF9fa21wX25UaHJlYWRzUGVyQ29yZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChraW5kID09IDIpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBjb3JlIGxldmVsCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY29yZUxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBwa2dMZXZlbCA9IC0xOworICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gYnVmLmVieCAmIDB4ZmZmZjsKKyAgICAgICAgICAgIGlmIChuQ29yZXNQZXJQa2cgPT0gMCkgeworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPD0gMCkgeworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGtnTGV2ZWwgPj0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGtnTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIG5QYWNrYWdlcyA9IGJ1Zi5lYnggJiAweGZmZmY7CisgICAgICAgICAgICBpZiAoblBhY2thZ2VzID09IDApIHsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGludCBkZXB0aCA9IGxldmVsOworCisgICAgLy8KKyAgICAvLyBJbiB0aGUgYWJvdmUgbG9vcCwgImxldmVsIiB3YXMgY291bnRlZCBmcm9tIHRoZSBmaW5lc3QgbGV2ZWwgKHVzdWFsbHkKKyAgICAvLyB0aHJlYWQpIHRvIHRoZSBjb2Fyc2VzdC4gIFRoZSBjYWxsZXIgZXhwZWN0cyB0aGF0IHdlIHdpbGwgcGxhY2UgdGhlCisgICAgLy8gbGFiZWxzIGluICgqYWRkcmVzczJvcylbXS5maXJzdC5sYWJlbHNbXSBpbiB0aGUgaW52ZXJzZSBvcmRlciwgc28KKyAgICAvLyB3ZSBuZWVkIHRvIGludmVydCB0aGUgdmFycyBzYXlpbmcgd2hpY2ggbGV2ZWwgbWVhbnMgd2hhdC4KKyAgICAvLworICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgIHRocmVhZExldmVsID0gZGVwdGggLSB0aHJlYWRMZXZlbCAtIDE7CisgICAgfQorICAgIGlmIChjb3JlTGV2ZWwgPj0gMCkgeworICAgICAgICBjb3JlTGV2ZWwgPSBkZXB0aCAtIGNvcmVMZXZlbCAtIDE7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQocGtnTGV2ZWwgPj0gMCk7CisgICAgcGtnTGV2ZWwgPSBkZXB0aCAtIHBrZ0xldmVsIC0gMTsKKworICAgIC8vCisgICAgLy8gVGhlIGFsZ29yaXRobSB1c2VkIHN0YXJ0cyBieSBzZXR0aW5nIHRoZSBhZmZpbml0eSB0byBlYWNoIGF2YWlsYWJsZQorICAgIC8vIHRocmVhZCBhbmQgcmV0cmlldmluZyBpbmZvIGZyb20gdGhlIGNwdWlkIGluc3RydWN0aW9uLCBzbyBpZiB3ZSBhcmUKKyAgICAvLyBub3QgY2FwYWJsZSBvZiBjYWxsaW5nIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQKKyAgICAvLyBfa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBlbHNlIC0gdXNlCisgICAgLy8gdGhlIGRlZmF1bHRzIHRoYXQgd2UgY2FsY3VsYXRlZCBmcm9tIGlzc3VpbmcgY3B1aWQgd2l0aG91dCBiaW5kaW5nCisgICAgLy8gdG8gZWFjaCBwcm9jLgorICAgIC8vCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkKKyAgICB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEhhY2sgdG8gdHJ5IGFuZCBpbmZlciB0aGUgbWFjaGluZSB0b3BvbG9neSB1c2luZyBvbmx5IHRoZSBkYXRhCisgICAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIGNwdWlkIG9uIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIF9fa21wX3hwcm9jLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisKKyAgICAgICAgX19rbXBfbmNvcmVzID0gX19rbXBfeHByb2MgLyBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisgICAgICAgIG5QYWNrYWdlcyA9IChfX2ttcF94cHJvYyArIG5Db3Jlc1BlclBrZyAtIDEpIC8gbkNvcmVzUGVyUGtnOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWRMMTEsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLworICAgIC8vIEZyb20gaGVyZSBvbiwgd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGlzIHNhZmUgdG8gY2FsbAorICAgIC8vIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSgpLAorICAgIC8vIGV2ZW4gaWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmUuCisgICAgLy8KKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqb2xkTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DKG9sZE1hc2spOworICAgIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIEFsbG9jYXRlIHRoZSBkYXRhIHN0cnVjdHVyZSB0byBiZSByZXR1cm5lZC4KKyAgICAvLworICAgIEFkZHJVbnNQYWlyICpyZXR2YWwgPSAoQWRkclVuc1BhaXIgKikKKyAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggZWFjaCBvZiB0aGUgYXZhaWxhYmxlIGNvbnRleHRzLCBiaW5kaW5nIHRoZSBjdXJyZW50IHRocmVhZAorICAgIC8vIHRvIGl0LCBhbmQgb2J0YWluaW5nIHRoZSBwZXJ0aW5lbnQgaW5mb3JtYXRpb24gdXNpbmcgdGhlIGNwdWlkIGluc3RyLgorICAgIC8vCisgICAgdW5zaWduZWQgaW50IHByb2M7CisgICAgaW50IG5BcGljcyA9IDA7CisgICAgS01QX0NQVV9TRVRfSVRFUkFURShwcm9jLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykgeworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG5BcGljcyA8IF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgICAgIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5iaW5kX3RocmVhZChwcm9jKTsKKworICAgICAgICAvLworICAgICAgICAvLyBFeHRyYWNoIHRoZSBsYWJlbHMgZm9yIGVhY2ggbGV2ZWwgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwCisgICAgICAgIC8vIGZyb20gdGhlIEFwaWMgSUQuCisgICAgICAgIC8vCisgICAgICAgIEFkZHJlc3MgYWRkcihkZXB0aCk7CisgICAgICAgIGludCBwcmV2X3NoaWZ0ID0gMDsKKworICAgICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKDExLCBsZXZlbCwgJmJ1Zik7CisgICAgICAgICAgICB1bnNpZ25lZCBhcGljSWQgPSBidWYuZWR4OworICAgICAgICAgICAgaWYgKGJ1Zi5lYnggPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChsZXZlbCAhPSBkZXB0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0luY29uc2lzdGVudENwdWlkSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRyLmxhYmVsc1tkZXB0aCAtIGxldmVsIC0gMV0gPSBhcGljSWQgPj4gcHJldl9zaGlmdDsKKyAgICAgICAgICAgICAgICBsZXZlbCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNoaWZ0ID0gYnVmLmVheCAmIDB4MWY7CisgICAgICAgICAgICBpbnQgbWFzayA9ICgxIDw8IHNoaWZ0KSAtIDE7CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkZXB0aCAtIGxldmVsIC0gMV0gPSAoYXBpY0lkICYgbWFzaykgPj4gcHJldl9zaGlmdDsKKyAgICAgICAgICAgIHByZXZfc2hpZnQgPSBzaGlmdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobGV2ZWwgIT0gZGVwdGgpIHsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW5jb25zaXN0ZW50Q3B1aWRJbmZvOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcmV0dmFsW25BcGljc10gPSBBZGRyVW5zUGFpcihhZGRyLCBwcm9jKTsKKyAgICAgICAgbkFwaWNzKys7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXZSd2ZSBjb2xsZWN0ZWQgYWxsIHRoZSBpbmZvIHdlIG5lZWQuCisgICAgLy8gUmVzdG9yZSB0aGUgb2xkIGFmZmluaXR5IG1hc2sgZm9yIHRoaXMgdGhyZWFkLgorICAgIC8vCisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSB0aHJlYWQgY29udGV4dCB0byBiaW5kIHRvLCByZXR1cm4gbm93LgorICAgIC8vCisgICAgS01QX0FTU0VSVChuQXBpY3MgPiAwKTsKKyAgICBpZiAobkFwaWNzID09IDEpIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gMTsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBvbGRNYXNrKTsKKworICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWRMMTEsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9ybSBhbiBBZGRyZXNzIG9iamVjdCB3aGljaCBvbmx5IGluY2x1ZGVzIHRoZSBwYWNrYWdlIGxldmVsLgorICAgICAgICAvLworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gcmV0dmFsWzBdLmZpcnN0LmxhYmVsc1twa2dMZXZlbF07CisgICAgICAgIHJldHZhbFswXS5maXJzdCA9IGFkZHI7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgICphZGRyZXNzMm9zID0gcmV0dmFsOworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gU29ydCB0aGUgdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgICAgLy8KKyAgICBxc29ydChyZXR2YWwsIG5BcGljcywgc2l6ZW9mKCpyZXR2YWwpLCBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19sYWJlbHMpOworCisgICAgLy8KKyAgICAvLyBGaW5kIHRoZSByYWRpeCBhdCBlYWNoIG9mIHRoZSBsZXZlbHMuCisgICAgLy8KKyAgICB1bnNpZ25lZCAqdG90YWxzID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqY291bnRzID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqbWF4Q3QgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICpsYXN0ID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICB0b3RhbHNbbGV2ZWxdID0gMTsKKyAgICAgICAgbWF4Q3RbbGV2ZWxdID0gMTsKKyAgICAgICAgY291bnRzW2xldmVsXSA9IDE7CisgICAgICAgIGxhc3RbbGV2ZWxdID0gcmV0dmFsWzBdLmZpcnN0LmxhYmVsc1tsZXZlbF07CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGcm9tIGhlcmUgb24sIHRoZSBpdGVyYXRpb24gdmFyaWFibGUgImxldmVsIiBydW5zIGZyb20gdGhlIGZpbmVzdAorICAgIC8vIGxldmVsIHRvIHRoZSBjb2Fyc2VzdCwgaS5lLiB3ZSBpdGVyYXRlIGZvcndhcmQgdGhyb3VnaAorICAgIC8vICgqYWRkcmVzczJvcylbXS5maXJzdC5sYWJlbHNbXSAtIGluIHRoZSBwcmV2aW91cyBsb29wcywgd2UgaXRlcmF0ZWQKKyAgICAvLyBiYWNrd2FyZHMuCisgICAgLy8KKyAgICBmb3IgKHByb2MgPSAxOyAoaW50KXByb2MgPCBuQXBpY3M7IHByb2MrKykgeworICAgICAgICBpbnQgbGV2ZWw7CisgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgICAgICBpZiAocmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF0gIT0gbGFzdFtsZXZlbF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSBsZXZlbCArIDE7IGogPCBkZXB0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsc1tqXSsrOworICAgICAgICAgICAgICAgICAgICBjb3VudHNbal0gPSAxOworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbGluZSBiZWxvdyBjYXVzZXMgcHJpbnRpbmcgaW5jb3JyZWN0IHRvcG9sb2d5IGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlIG1heCB2YWx1ZSBmb3Igc29tZSBsZXZlbCAobWF4Q3RbbGV2ZWxdKSBpcyBlbmNvdW50ZXJlZCBlYXJsaWVyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBsZXNzIHZhbHVlIHdoaWxlIGdvaW5nIHRocm91Z2ggdGhlIGFycmF5LgorICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgbGV0IHBrZzAgaGFzIDQgY29yZXMgYW5kIHBrZzEgaGFzIDIgY29yZXMuIFRoZW4gbWF4Q3RbMV0gPT0gMgorICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZWFzIGl0IG11c3QgYmUgNC4KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyEhISBDaGVjayBpZiBpdCBjYW4gYmUgY29tbWVudGVkIHNhZmVseQorICAgICAgICAgICAgICAgICAgICAvL21heEN0W2pdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFtqXSA9IHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbal07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvdGFsc1tsZXZlbF0rKzsKKyAgICAgICAgICAgICAgICBjb3VudHNbbGV2ZWxdKys7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50c1tsZXZlbF0gPiBtYXhDdFtsZXZlbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4Q3RbbGV2ZWxdID0gY291bnRzW2xldmVsXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdFtsZXZlbF0gPSByZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2xldmVsXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID09IGRlcHRoIC0gMSkgeworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUobGFzdCk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfeDJBcGljSURzTm90VW5pcXVlOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgICAvLyBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAvLworICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG1heEN0W3RocmVhZExldmVsXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDE7CisgICAgfQorICAgIG5QYWNrYWdlcyA9IHRvdGFsc1twa2dMZXZlbF07CisKKyAgICBpZiAoY29yZUxldmVsID49IDApIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gdG90YWxzW2NvcmVMZXZlbF07CisgICAgICAgIG5Db3Jlc1BlclBrZyA9IG1heEN0W2NvcmVMZXZlbF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXM7CisgICAgICAgIG5Db3Jlc1BlclBrZyA9IDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgaXMgdW5pZm9ybQorICAgIC8vCisgICAgdW5zaWduZWQgcHJvZCA9IG1heEN0WzBdOworICAgIGZvciAobGV2ZWwgPSAxOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgcHJvZCAqPSBtYXhDdFtsZXZlbF07CisgICAgfQorICAgIGJvb2wgdW5pZm9ybSA9IChwcm9kID09IHRvdGFsc1tsZXZlbCAtIDFdKTsKKworICAgIC8vCisgICAgLy8gUHJpbnQgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgc3VtbWFyeS4KKyAgICAvLworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgbWFza1tLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKG1hc2ssIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWRMMTEsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIG1hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIG1hc2spOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgIGlmICh1bmlmb3JtKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisKKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmKTsKKworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlZCIsIHRvdGFsc1swXSk7CisgICAgICAgIGZvciAobGV2ZWwgPSAxOyBsZXZlbCA8PSBwa2dMZXZlbDsgbGV2ZWwrKykgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiIHggJWQiLCBtYXhDdFtsZXZlbF0pOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3lFeHRyYSwgIktNUF9BRkZJTklUWSIsIGJ1Zi5zdHIsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3B1X29zX2lkeCA9PSBOVUxMKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG5BcGljcyA9PSBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBfX2ttcF9wdV9vc19pZHggPSAoaW50KilfX2ttcF9hbGxvY2F0ZShzaXplb2YoaW50KSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGZvciAocHJvYyA9IDA7IChpbnQpcHJvYyA8IG5BcGljczsgKytwcm9jKSB7CisgICAgICAgIF9fa21wX3B1X29zX2lkeFtwcm9jXSA9IHJldHZhbFtwcm9jXS5zZWNvbmQ7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgX19rbXBfZnJlZShsYXN0KTsKKyAgICAgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICAgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGaW5kIGFueSBsZXZlbHMgd2l0aCByYWRpaXggMSwgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcAorICAgIC8vIChleGNlcHQgZm9yIHRoZSBwYWNrYWdlIGxldmVsKS4KKyAgICAvLworICAgIGludCBuZXdfZGVwdGggPSAwOworICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgIGlmICgobWF4Q3RbbGV2ZWxdID09IDEpICYmIChsZXZlbCAhPSBwa2dMZXZlbCkpIHsKKyAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbmV3X2RlcHRoKys7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJZiB3ZSBhcmUgcmVtb3ZpbmcgYW55IGxldmVscywgYWxsb2NhdGUgYSBuZXcgdmVjdG9yIHRvIHJldHVybiwKKyAgICAvLyBhbmQgY29weSB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gdG8gaXQuCisgICAgLy8KKyAgICBpZiAobmV3X2RlcHRoICE9IGRlcHRoKSB7CisgICAgICAgIEFkZHJVbnNQYWlyICpuZXdfcmV0dmFsID0gKEFkZHJVbnNQYWlyICopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIG5BcGljcyk7CisgICAgICAgIGZvciAocHJvYyA9IDA7IChpbnQpcHJvYyA8IG5BcGljczsgcHJvYysrKSB7CisgICAgICAgICAgICBBZGRyZXNzIGFkZHIobmV3X2RlcHRoKTsKKyAgICAgICAgICAgIG5ld19yZXR2YWxbcHJvY10gPSBBZGRyVW5zUGFpcihhZGRyLCByZXR2YWxbcHJvY10uc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbmV3X2xldmVsID0gMDsKKyAgICAgICAgaW50IG5ld1BrZ0xldmVsID0gLTE7CisgICAgICAgIGludCBuZXdDb3JlTGV2ZWwgPSAtMTsKKyAgICAgICAgaW50IG5ld1RocmVhZExldmVsID0gLTE7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgaWYgKChtYXhDdFtsZXZlbF0gPT0gMSkKKyAgICAgICAgICAgICAgJiYgKGxldmVsICE9IHBrZ0xldmVsKSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgbGV2ZWwuIE5ldmVyIHJlbW92ZSB0aGUgcGFja2FnZSBsZXZlbAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gcGtnTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBuZXdQa2dMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsID09IGNvcmVMZXZlbCkgeworICAgICAgICAgICAgICAgIG5ld0NvcmVMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsID09IHRocmVhZExldmVsKSB7CisgICAgICAgICAgICAgICAgbmV3VGhyZWFkTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAocHJvYyA9IDA7IChpbnQpcHJvYyA8IG5BcGljczsgcHJvYysrKSB7CisgICAgICAgICAgICAgICAgbmV3X3JldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbmV3X2xldmVsXQorICAgICAgICAgICAgICAgICAgPSByZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2xldmVsXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld19sZXZlbCsrOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICByZXR2YWwgPSBuZXdfcmV0dmFsOworICAgICAgICBkZXB0aCA9IG5ld19kZXB0aDsKKyAgICAgICAgcGtnTGV2ZWwgPSBuZXdQa2dMZXZlbDsKKyAgICAgICAgY29yZUxldmVsID0gbmV3Q29yZUxldmVsOworICAgICAgICB0aHJlYWRMZXZlbCA9IG5ld1RocmVhZExldmVsOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvcmVMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fY29yZSkpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neShyZXR2YWwsIG5BcGljcywgZGVwdGgsIHBrZ0xldmVsLAorICAgICAgICAgIGNvcmVMZXZlbCwgdGhyZWFkTGV2ZWwpOworICAgIH0KKworICAgIF9fa21wX2ZyZWUobGFzdCk7CisgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgKmFkZHJlc3Myb3MgPSByZXR2YWw7CisgICAgcmV0dXJuIGRlcHRoOworfQorCisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisKKyNkZWZpbmUgb3NJZEluZGV4ICAgICAgIDAKKyNkZWZpbmUgdGhyZWFkSWRJbmRleCAgIDEKKyNkZWZpbmUgY29yZUlkSW5kZXggICAgIDIKKyNkZWZpbmUgcGtnSWRJbmRleCAgICAgIDMKKyNkZWZpbmUgbm9kZUlkSW5kZXggICAgIDQKKwordHlwZWRlZiB1bnNpZ25lZCAqUHJvY0NwdUluZm87CitzdGF0aWMgdW5zaWduZWQgbWF4SW5kZXggPSBwa2dJZEluZGV4OworCisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NtcF9Qcm9jQ3B1SW5mb19vc19pZChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IHVuc2lnbmVkICphYSA9IChjb25zdCB1bnNpZ25lZCAqKWE7CisgICAgY29uc3QgdW5zaWduZWQgKmJiID0gKGNvbnN0IHVuc2lnbmVkICopYjsKKyAgICBpZiAoYWFbb3NJZEluZGV4XSA8IGJiW29zSWRJbmRleF0pIHJldHVybiAtMTsKKyAgICBpZiAoYWFbb3NJZEluZGV4XSA+IGJiW29zSWRJbmRleF0pIHJldHVybiAxOworICAgIHJldHVybiAwOworfTsKKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfUHJvY0NwdUluZm9fcGh5c19pZChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIHVuc2lnbmVkIGk7CisgICAgY29uc3QgdW5zaWduZWQgKmFhID0gKigoY29uc3QgdW5zaWduZWQgKiopYSk7CisgICAgY29uc3QgdW5zaWduZWQgKmJiID0gKigoY29uc3QgdW5zaWduZWQgKiopYik7CisgICAgZm9yIChpID0gbWF4SW5kZXg7IDsgaS0tKSB7CisgICAgICAgIGlmIChhYVtpXSA8IGJiW2ldKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChhYVtpXSA+IGJiW2ldKSByZXR1cm4gMTsKKyAgICAgICAgaWYgKGkgPT0gb3NJZEluZGV4KSBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLy8KKy8vIFBhcnNlIC9wcm9jL2NwdWluZm8gKG9yIGFuIGFsdGVybmF0ZSBmaWxlIGluIHRoZSBzYW1lIGZvcm1hdCkgdG8gb2J0YWluIHRoZQorLy8gYWZmaW5pdHkgbWFwLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsIGludCAqbGluZSwKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkLCBGSUxFICpmKQoreworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gU2NhbiBvZiB0aGUgZmlsZSwgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgInByb2Nlc3NvciIgKG9zSWQpIGZpZWxkcywKKyAgICAvLyBhbmQgZmluZCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiA8bj4gZm9yIGEgbm9kZV88bj4gZmllbGQuCisgICAgLy8KKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIHVuc2lnbmVkIG51bV9yZWNvcmRzID0gMDsKKyAgICB3aGlsZSAoISBmZW9mKGYpKSB7CisgICAgICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMTsKKyAgICAgICAgaWYgKCEgZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIGVycm9ycyBwcmVzdW1hYmx5IGJlY2F1c2Ugb2YgRU9GCisgICAgICAgICAgICAvLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIHMxW10gPSAicHJvY2Vzc29yIjsKKyAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMSwgc2l6ZW9mKHMxKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgIG51bV9yZWNvcmRzKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FIC0gdGhpcyB3aWxsIG1hdGNoICJub2RlXzxuPiA8Z2FyYmFnZT4iCisgICAgICAgIC8vCisgICAgICAgIHVuc2lnbmVkIGxldmVsOworICAgICAgICBpZiAoS01QX1NTQ0FORihidWYsICJub2RlXyVkIGlkIiwgJmxldmVsKSA9PSAxKSB7CisgICAgICAgICAgICBpZiAobm9kZUlkSW5kZXggKyBsZXZlbCA+PSBtYXhJbmRleCkgeworICAgICAgICAgICAgICAgIG1heEluZGV4ID0gbm9kZUlkSW5kZXggKyBsZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDaGVjayBmb3IgZW1wdHkgZmlsZSAvIG5vIHZhbGlkIHByb2Nlc3NvciByZWNvcmRzLCBvciB0b28gbWFueS4KKyAgICAvLyBUaGUgbnVtYmVyIG9mIHJlY29yZHMgY2FuJ3QgZXhjZWVkIHRoZSBudW1iZXIgb2YgdmFsaWQgYml0cyBpbiB0aGUKKyAgICAvLyBhZmZpbml0eSBtYXNrLgorICAgIC8vCisgICAgaWYgKG51bV9yZWNvcmRzID09IDApIHsKKyAgICAgICAgKmxpbmUgPSAwOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX05vUHJvY1JlY29yZHM7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG51bV9yZWNvcmRzID4gKHVuc2lnbmVkKV9fa21wX3hwcm9jKSB7CisgICAgICAgICpsaW5lID0gMDsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ub29NYW55UHJvY1JlY29yZHM7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNldCB0aGUgZmlsZSBwb2ludGVyIGJhY2sgdG8gdGhlIGJlZ2dpbm5pbmcsIHNvIHRoYXQgd2UgY2FuIHNjYW4gdGhlCisgICAgLy8gZmlsZSBhZ2FpbiwgdGhpcyB0aW1lIHBlcmZvcm1pbmcgYSBmdWxsIHBhcnNlIG9mIHRoZSBkYXRhLgorICAgIC8vIEFsbG9jYXRlIGEgdmVjdG9yIG9mIFByb2NDcHVJbmZvIG9iamVjdCwgd2hlcmUgd2Ugd2lsbCBwbGFjZSB0aGUgZGF0YS4KKyAgICAvLyBBZGRpbmcgYW4gZXh0cmEgZWxlbWVudCBhdCB0aGUgZW5kIGFsbG93cyB1cyB0byByZW1vdmUgYSBsb3Qgb2YgZXh0cmEKKyAgICAvLyBjaGVja3MgZm9yIHRlcm1pbmF0aW9uIGNvbmRpdGlvbnMuCisgICAgLy8KKyAgICBpZiAoZnNlZWsoZiwgMCwgU0VFS19TRVQpICE9IDApIHsKKyAgICAgICAgKmxpbmUgPSAwOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0NhbnRSZXdpbmRDcHVpbmZvOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBBbGxvY2F0ZSB0aGUgYXJyYXkgb2YgcmVjb3JkcyB0byBzdG9yZSB0aGUgcHJvYyBpbmZvIGluLiAgVGhlIGR1bW15CisgICAgLy8gZWxlbWVudCBhdCB0aGUgZW5kIG1ha2VzIHRoZSBsb2dpYyBpbiBmaWxsaW5nIHRoZW0gb3V0IGVhc2llciB0byBjb2RlLgorICAgIC8vCisgICAgdW5zaWduZWQgKip0aHJlYWRJbmZvID0gKHVuc2lnbmVkICoqKV9fa21wX2FsbG9jYXRlKChudW1fcmVjb3JkcyArIDEpCisgICAgICAqIHNpemVvZih1bnNpZ25lZCAqKSk7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG51bV9yZWNvcmRzOyBpKyspIHsKKyAgICAgICAgdGhyZWFkSW5mb1tpXSA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpCisgICAgICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB9CisKKyNkZWZpbmUgQ0xFQU5VUF9USFJFQURfSU5GTyBcCisgICAgZm9yIChpID0gMDsgaSA8PSBudW1fcmVjb3JkczsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mb1tpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKworICAgIC8vCisgICAgLy8gQSB2YWx1ZSBvZiBVSU5UX01BWCBtZWFucyB0aGF0IHdlIGRpZG4ndCBmaW5kIHRoZSBmaWVsZAorICAgIC8vCisgICAgdW5zaWduZWQgX19pbmRleDsKKworI2RlZmluZSBJTklUX1BST0NfSU5GTyhwKSBcCisgICAgZm9yIChfX2luZGV4ID0gMDsgX19pbmRleCA8PSBtYXhJbmRleDsgX19pbmRleCsrKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIChwKVtfX2luZGV4XSA9IFVJTlRfTUFYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8PSBudW1fcmVjb3JkczsgaSsrKSB7CisgICAgICAgIElOSVRfUFJPQ19JTkZPKHRocmVhZEluZm9baV0pOworICAgIH0KKworICAgIHVuc2lnbmVkIG51bV9hdmFpbCA9IDA7CisgICAgKmxpbmUgPSAwOworICAgIHdoaWxlICghIGZlb2YoZikpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ3JlYXRlIGFuIGlubmVyIHNjb3BpbmcgbGV2ZWwsIHNvIHRoYXQgYWxsIHRoZSBnb3RvIHRhcmdldHMgYXQgdGhlCisgICAgICAgIC8vIGVuZCBvZiB0aGUgbG9vcCBhcHBlYXIgaW4gYW4gb3V0ZXIgc2NvcGluZyBsZXZlbC4gIFRoaXMgYXZvaWRzCisgICAgICAgIC8vIHdhcm5pbmdzIGFib3V0IGp1bXBpbmcgcGFzdCBhbiBpbml0aWFsaXphdGlvbiB0byBhIHRhcmdldCBpbiB0aGUKKyAgICAgICAgLy8gc2FtZSBibG9jay4KKyAgICAgICAgLy8KKyAgICAgICAgeworICAgICAgICAgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAxOworICAgICAgICAgICAgYm9vbCBsb25nX2xpbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICghIGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBSZWFkIGVycm9ycyBwcmVzdW1hYmx5IGJlY2F1c2Ugb2YgRU9GCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyB2YWxpZCBkYXRhIGluIHRocmVhZEluZm9bbnVtX2F2YWlsXSwgdGhlbiBmYWtlCisgICAgICAgICAgICAgICAgLy8gYSBibGFuayBsaW5lIGluIGVuc3VyZSB0aGF0IHRoZSBsYXN0IGFkZHJlc3MgZ2V0cyBwYXJzZWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBib29sIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtYXhJbmRleDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1baV0gIT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoISB2YWxpZCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmWzBdID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJ1ZltzaXplb2YoYnVmKSAtIDFdKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBUaGUgbGluZSBpcyBsb25nZXIgdGhhbiB0aGUgYnVmZmVyLiAgU2V0IGEgZmxhZyBhbmQgZG9uJ3QKKyAgICAgICAgICAgICAgICAvLyBlbWl0IGFuIGVycm9yIGlmIHdlIHdlcmUgZ29pbmcgdG8gaWdub3JlIHRoZSBsaW5lLCBhbnl3YXkuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBsb25nX2xpbmUgPSB0cnVlOworCisjZGVmaW5lIENIRUNLX0xJTkUgXAorICAgIGlmIChsb25nX2xpbmUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0xvbmdMaW5lQ3B1aW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqbGluZSkrKzsKKworICAgICAgICAgICAgY2hhciBzMVtdID0gInByb2Nlc3NvciI7CisgICAgICAgICAgICBpZiAoc3RybmNtcChidWYsIHMxLCBzaXplb2YoczEpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczEpIC0gMSwgJzonKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChLTVBfU1NDQU5GKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0gIT0gVUlOVF9NQVgpIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdID0gdmFsOworI2lmIEtNUF9PU19MSU5VWCAmJiBVU0VfU1lTRlNfSU5GTworICAgICAgICAgICAgICAgIGNoYXIgcGF0aFsyNTZdOworICAgICAgICAgICAgICAgIEtNUF9TTlBSSU5URihwYXRoLCBzaXplb2YocGF0aCksCisgICAgICAgICAgICAgICAgICAgICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUldS90b3BvbG9neS9waHlzaWNhbF9wYWNrYWdlX2lkIiwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0pOworICAgICAgICAgICAgICAgIF9fa21wX3JlYWRfZnJvbV9maWxlKHBhdGgsICIldSIsICZ0aHJlYWRJbmZvW251bV9hdmFpbF1bcGtnSWRJbmRleF0pOworCisgICAgICAgICAgICAgICAgS01QX1NOUFJJTlRGKHBhdGgsIHNpemVvZihwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSV1L3RvcG9sb2d5L2NvcmVfaWQiLAorICAgICAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVhZF9mcm9tX2ZpbGUocGF0aCwgIiV1IiwgJnRocmVhZEluZm9bbnVtX2F2YWlsXVtjb3JlSWRJbmRleF0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworI2Vsc2UKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgczJbXSA9ICJwaHlzaWNhbCBpZCI7CisgICAgICAgICAgICBpZiAoc3RybmNtcChidWYsIHMyLCBzaXplb2YoczIpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczIpIC0gMSwgJzonKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChLTVBfU1NDQU5GKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW3BrZ0lkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bcGtnSWRJbmRleF0gPSB2YWw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIHMzW10gPSAiY29yZSBpZCI7CisgICAgICAgICAgICBpZiAoc3RybmNtcChidWYsIHMzLCBzaXplb2YoczMpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczMpIC0gMSwgJzonKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChLTVBfU1NDQU5GKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW2NvcmVJZEluZGV4XSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW2NvcmVJZEluZGV4XSA9IHZhbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgVVNFX1NZU0ZTX0lORk8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgczRbXSA9ICJ0aHJlYWQgaWQiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzNCwgc2l6ZW9mKHM0KSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHM0KSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoS01QX1NTQ0FORihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVt0aHJlYWRJZEluZGV4XSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW3RocmVhZElkSW5kZXhdID0gdmFsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgbGV2ZWw7CisgICAgICAgICAgICBpZiAoS01QX1NTQ0FORihidWYsICJub2RlXyVkIGlkIiwgJmxldmVsKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzNCkgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKEtNUF9TU0NBTkYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpIGdvdG8gbm9fdmFsOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobm9kZUlkSW5kZXggKyBsZXZlbCA8PSBtYXhJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtub2RlSWRJbmRleCArIGxldmVsXSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW25vZGVJZEluZGV4ICsgbGV2ZWxdID0gdmFsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgZGlkbid0IHJlY29nbml6ZSB0aGUgbGVhZGluZyB0b2tlbiBvbiB0aGUgbGluZS4KKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBsb3RzIG9mIGxlYWRpbmcgdG9rZW5zIHRoYXQgd2UgZG9uJ3QgcmVjb2duaXplIC0KKyAgICAgICAgICAgIC8vIGlmIHRoZSBsaW5lIGlzbid0IGVtcHR5LCBnbyBvbiB0byB0aGUgbmV4dCBsaW5lLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgoKmJ1ZiAhPSAwKSAmJiAoKmJ1ZiAhPSAnXG4nKSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmUgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlciwgcmVhZCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgLy8gdW50aWwgd2UgZmluZCBhIG5ld2xpbmUuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAobG9uZ19saW5lKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgoY2ggPSBmZ2V0YyhmKSkgIT0gRU9GKSAmJiAoY2ggIT0gJ1xuJykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEEgbmV3bGluZSBoYXMgc2lnbmFsbGVkIHRoZSBlbmQgb2YgdGhlIHByb2Nlc3NvciByZWNvcmQuCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGFyZW4ndCB0b28gbWFueSBwcm9jcyBzcGVjaWZpZWQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKChpbnQpbnVtX2F2YWlsID09IF9fa21wX3hwcm9jKSB7CisgICAgICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX1Rvb01hbnlFbnRyaWVzOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBtaXNzaW5nIGZpZWxkcy4gIFRoZSBvc0lkIGZpZWxkIG11c3QgYmUgdGhlcmUsIGFuZCB3ZQorICAgICAgICAgICAgLy8gY3VycmVudGx5IHJlcXVpcmUgdGhhdCB0aGUgcGh5c2ljYWwgaWQgZmllbGQgaXMgc3BlY2lmaWVkLCBhbHNvLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9NaXNzaW5nUHJvY0ZpZWxkOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvWzBdW3BrZ0lkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX01pc3NpbmdQaHlzaWNhbElERmllbGQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHByb2MgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBtYWNoaW5lIG1vZGVsLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQodGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0sIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgICAgICAgICAgIElOSVRfUFJPQ19JTkZPKHRocmVhZEluZm9bbnVtX2F2YWlsXSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgc3VjY2Vzc2Z1bCBwYXJzZSBvZiB0aGlzIHByb2MncyBpbmZvLgorICAgICAgICAgICAgLy8gSW5jcmVtZW50IHRoZSBjb3VudGVyLCBhbmQgcHJlcGFyZSBmb3IgdGhlIG5leHQgcHJvYy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBudW1fYXZhaWwrKzsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobnVtX2F2YWlsIDw9IG51bV9yZWNvcmRzKTsKKyAgICAgICAgICAgIElOSVRfUFJPQ19JTkZPKHRocmVhZEluZm9bbnVtX2F2YWlsXSk7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbm9fdmFsOgorICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX01pc3NpbmdWYWxDcHVpbmZvOworICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgZHVwX2ZpZWxkOgorICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0R1cGxpY2F0ZUZpZWxkQ3B1aW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqbGluZSA9IDA7CisKKyMgaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgdW5zaWduZWQgdGVhbVNpemUgPSAwOworIyBlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgIC8vIGNoZWNrIGZvciBudW1fcmVjb3JkcyA9PSBfX2ttcF94cHJvYyA/Pz8KKworICAgIC8vCisgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSB0aHJlYWQgY29udGV4dCB0byBiaW5kIHRvLCBmb3JtIGFuIEFkZHJlc3Mgb2JqZWN0CisgICAgLy8gd2l0aCBkZXB0aCAxIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgKG9yLCBpZiBhZmZpbml0eSBpcyBvZmYsIHNldAorICAgIC8vIGFkZHJlc3Myb3MgdG8gTlVMTCBhbmQgcmV0dXJuKS4KKyAgICAvLworICAgIC8vIElmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gb21pdCB0aGUgcGFja2FnZSBsZXZlbCB3aGVuIHRoZXJlIGlzIG9ubHkgYQorICAgIC8vIHNpbmdsZSBwYWNrYWdlLCB0aGUgbG9naWMgYXQgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUgd29uJ3Qgd29yayBpZgorICAgIC8vIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGhyZWFkIC0gaXQgd291bGQgdHJ5IHRvIGZvcm0gYW4gQWRkcmVzcworICAgIC8vIG9iamVjdCB3aXRoIGRlcHRoIDAuCisgICAgLy8KKyAgICBLTVBfQVNTRVJUKG51bV9hdmFpbCA+IDApOworICAgIEtNUF9BU1NFUlQobnVtX2F2YWlsIDw9IG51bV9yZWNvcmRzKTsKKyAgICBpZiAobnVtX2F2YWlsID09IDEpIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gMTsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gblBhY2thZ2VzID0gMTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkNhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiMSIpOworICAgICAgICAgICAgZm9yIChpbmRleCA9IG1heEluZGV4IC0gMTsgaW5kZXggPiBwa2dJZEluZGV4OyBpbmRleC0tKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiIHggMSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neUV4dHJhLCAiS01QX0FGRklOSVRZIiwgYnVmLnN0ciwgMSwgMSwgMSk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSk7CisgICAgICAgIEFkZHJlc3MgYWRkcigxKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSB0aHJlYWRJbmZvWzBdW3BrZ0lkSW5kZXhdOworICAgICAgICAoKmFkZHJlc3Myb3MpWzBdID0gQWRkclVuc1BhaXIoYWRkciwgdGhyZWFkSW5mb1swXVtvc0lkSW5kZXhdKTsKKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIDEsIDEsIDAsIC0xLCAtMSk7CisgICAgICAgIH0KKworICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIHRocmVhZEluZm8gdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgICAgLy8KKyAgICBxc29ydCh0aHJlYWRJbmZvLCBudW1fYXZhaWwsIHNpemVvZigqdGhyZWFkSW5mbyksCisgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfUHJvY0NwdUluZm9fcGh5c19pZCk7CisKKyAgICAvLworICAgIC8vIFRoZSB0YWJsZSBpcyBub3cgc29ydGVkIGJ5IHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQsIGJ1dCB3ZSByZWFsbHkKKyAgICAvLyBkb24ndCBrbm93IHRoZSByYWRpeCBvZiBhbnkgb2YgdGhlIGZpZWxkcy4gIHBrZ0lkJ3MgbWF5IGJlIHNwYXJzZWx5CisgICAgLy8gYXNzaWduZWQgYW1vbmcgdGhlIGNoaXBzIG9uIGEgc3lzdGVtLiAgQWx0aG91Z2ggY29yZUlkJ3MgYXJlIHVzdWFsbHkKKyAgICAvLyBhc3NpZ25lZCBbMCAuLiBjb3Jlc1BlclBrZy0xXSBhbmQgdGhyZWFkSWQncyBhcmUgdXN1YWxseSBhc3NpZ25lZAorICAgIC8vIFswLi50aHJlYWRzUGVyQ29yZS0xXSwgd2UgZG9uJ3Qgd2FudCB0byBtYWtlIGFueSBzdWNoIGFzc3VtcHRpb25zLgorICAgIC8vCisgICAgLy8gRm9yIHRoYXQgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoYXQgY29yZXNQZXJQa2cgYW5kIHRocmVhZHNQZXJDb3JlCisgICAgLy8gKG9yIHRoZSB0b3RhbCAjIHBhY2thZ2VzKSBhcmUgYXQgdGhpcyBwb2ludCAtIHdlIHdhbnQgdG8gZGV0ZXJtaW5lCisgICAgLy8gdGhhdCBub3cuICBXZSBvbmx5IGhhdmUgYW4gdXBwZXIgYm91bmQgb24gdGhlIGZpcnN0IHR3byBmaWd1cmVzLgorICAgIC8vCisgICAgdW5zaWduZWQgKmNvdW50cyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICptYXhDdCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIHVuc2lnbmVkICp0b3RhbHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqbGFzdElkID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisKKyAgICBib29sIGFzc2lnbl90aHJlYWRfaWRzID0gZmFsc2U7CisgICAgdW5zaWduZWQgdGhyZWFkSWRDdDsKKyAgICB1bnNpZ25lZCBpbmRleDsKKworICAgIHJlc3RhcnRfcmFkaXhfY2hlY2s6CisgICAgdGhyZWFkSWRDdCA9IDA7CisKKyAgICAvLworICAgIC8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXIgYXJyYXlzIHdpdGggZGF0YSBmcm9tIHRocmVhZEluZm9bMF0uCisgICAgLy8KKyAgICBpZiAoYXNzaWduX3RocmVhZF9pZHMpIHsKKyAgICAgICAgaWYgKHRocmVhZEluZm9bMF1bdGhyZWFkSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgIHRocmVhZEluZm9bMF1bdGhyZWFkSWRJbmRleF0gPSB0aHJlYWRJZEN0Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGhyZWFkSWRDdCA8PSB0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdKSB7CisgICAgICAgICAgICB0aHJlYWRJZEN0ID0gdGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDw9IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgIGNvdW50c1tpbmRleF0gPSAxOworICAgICAgICBtYXhDdFtpbmRleF0gPSAxOworICAgICAgICB0b3RhbHNbaW5kZXhdID0gMTsKKyAgICAgICAgbGFzdElkW2luZGV4XSA9IHRocmVhZEluZm9bMF1baW5kZXhdOzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFJ1biB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBPUyBwcm9jcy4KKyAgICAvLworICAgIGZvciAoaSA9IDE7IGkgPCBudW1fYXZhaWw7IGkrKykgeworICAgICAgICAvLworICAgICAgICAvLyBGaW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGluZGV4IHdob3NlIGlkIGRpZmZlcnMKKyAgICAgICAgLy8gZnJvbSB0aGUgaWQgZm9yIHRoZSBwcmV2aW91cyBPUyBwcm9jLgorICAgICAgICAvLworICAgICAgICBmb3IgKGluZGV4ID0gbWF4SW5kZXg7IGluZGV4ID49IHRocmVhZElkSW5kZXg7IGluZGV4LS0pIHsKKyAgICAgICAgICAgIGlmIChhc3NpZ25fdGhyZWFkX2lkcyAmJiAoaW5kZXggPT0gdGhyZWFkSWRJbmRleCkpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEF1dG8tYXNzaWduIHRoZSB0aHJlYWQgaWQgZmllbGQgaWYgaXQgd2Fzbid0IHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gPSB0aHJlYWRJZEN0Kys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBBcGFycmVudGx5IHRoZSB0aHJlYWQgaWQgZmllbGQgd2FzIHNwZWNpZmllZCBmb3Igc29tZQorICAgICAgICAgICAgICAgIC8vIGVudHJpZXMgYW5kIG5vdCBvdGhlcnMuICBTdGFydCB0aGUgdGhyZWFkIGlkIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAvLyBvZmYgYXQgdGhlIG5leHQgaGlnaGVyIHRocmVhZCBpZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRocmVhZElkQ3QgPD0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRJZEN0ID0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRocmVhZEluZm9baV1baW5kZXhdICE9IGxhc3RJZFtpbmRleF0pIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFJ1biB0aHJvdWdoIGFsbCBpbmRpY2VzIHdoaWNoIGFyZSBsZXNzIHNpZ25pZmljYW50LAorICAgICAgICAgICAgICAgIC8vIGFuZCByZXNldCB0aGUgY291bnRzIHRvIDEuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBBdCBhbGwgbGV2ZWxzIHVwIHRvIGFuZCBpbmNsdWRpbmcgaW5kZXgsIHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHRvdGFscyBhbmQgcmVjb3JkIHRoZSBsYXN0IGlkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgyOworICAgICAgICAgICAgICAgIGZvciAoaW5kZXgyID0gdGhyZWFkSWRJbmRleDsgaW5kZXgyIDwgaW5kZXg7IGluZGV4MisrKSB7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsc1tpbmRleDJdKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudHNbaW5kZXgyXSA+IG1heEN0W2luZGV4Ml0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEN0W2luZGV4Ml0gPSBjb3VudHNbaW5kZXgyXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb3VudHNbaW5kZXgyXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGxhc3RJZFtpbmRleDJdID0gdGhyZWFkSW5mb1tpXVtpbmRleDJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb3VudHNbaW5kZXhdKys7CisgICAgICAgICAgICAgICAgdG90YWxzW2luZGV4XSsrOworICAgICAgICAgICAgICAgIGxhc3RJZFtpbmRleF0gPSB0aHJlYWRJbmZvW2ldW2luZGV4XTsKKworICAgICAgICAgICAgICAgIGlmIChhc3NpZ25fdGhyZWFkX2lkcyAmJiAoaW5kZXggPiB0aHJlYWRJZEluZGV4KSkgeworCisjIGlmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCB0ZWFtIHNpemUgaXMgdGhlIHRvdGFsICN0aHJlYWRzIGluIHRoZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgIC8vIG1pbnVzIDEgdGhyZWFkIGZvciBldmVyeSBjb3JlIHRoYXQgaGFzIDMgb3IgbW9yZSB0aHJlYWRzLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB0ZWFtU2l6ZSArPSAoIHRocmVhZElkQ3QgPD0gMiApID8gKCB0aHJlYWRJZEN0ICkgOiAoIHRocmVhZElkQ3QgLSAxICk7CisjIGVuZGlmIC8vIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIHRocmVhZCBjb3VudGVyLCBhcyB3ZSBhcmUgb24gYSBuZXcgY29yZS4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSWRDdCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gQXV0by1hc3NpZ24gdGhlIHRocmVhZCBpZCBmaWVsZCBpZiBpdCB3YXNuJ3Qgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9IHRocmVhZElkQ3QrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIEFwYXJyZW50bHkgdGhlIHRocmVhZCBpZCBmaWVsZCB3YXMgc3BlY2lmaWVkIGZvciBzb21lCisgICAgICAgICAgICAgICAgICAgIC8vIGVudHJpZXMgYW5kIG5vdCBvdGhlcnMuICBTdGFydCB0aGUgdGhyZWFkIGlkIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gb2ZmIGF0IHRoZSBuZXh0IGhpZ2hlciB0aHJlYWQgaWQuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRocmVhZElkQ3QgPD0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkSWRDdCA9IHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gKyAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbmRleCA8IHRocmVhZElkSW5kZXgpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB0aHJlYWQgaWRzIHdlcmUgc3BlY2lmaWVkLCBpdCBpcyBhbiBlcnJvciBpZiB0aGV5IGFyZSBub3QKKyAgICAgICAgICAgIC8vIHVuaXF1ZS4gIEFsc28sIGNoZWNrIHRoYXQgd2Ugd2F2ZW4ndCBhbHJlYWR5IHJlc3RhcnRlZCB0aGUKKyAgICAgICAgICAgIC8vIGxvb3AgKHRvIGJlIHNhZmUgLSBzaG91bGRuJ3QgbmVlZCB0bykuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCh0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdICE9IFVJTlRfTUFYKQorICAgICAgICAgICAgICB8fCBhc3NpZ25fdGhyZWFkX2lkcykgeworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUobGFzdElkKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9QaHlzaWNhbElEc05vdFVuaXF1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB0aGUgdGhyZWFkIGlkcyB3ZXJlIG5vdCBzcGVjaWZpZWQgYW5kIHdlIHNlZSBlbnRyaWVzCisgICAgICAgICAgICAvLyBlbnRyaWVzIHRoYXQgYXJlIGR1cGxpY2F0ZXMsIHN0YXJ0IHRoZSBsb29wIG92ZXIgYW5kCisgICAgICAgICAgICAvLyBhc3NpZ24gdGhlIHRocmVhZCBpZHMgbWFudWFsbHkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgYXNzaWduX3RocmVhZF9pZHMgPSB0cnVlOworICAgICAgICAgICAgZ290byByZXN0YXJ0X3JhZGl4X2NoZWNrOworICAgICAgICB9CisgICAgfQorCisjIGlmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICAgIC8vCisgICAgLy8gVGhlIGRlZmF1bHQgdGVhbSBzaXplIGlzIHRoZSB0b3RhbCAjdGhyZWFkcyBpbiB0aGUgbWFjaGluZQorICAgIC8vIG1pbnVzIDEgdGhyZWFkIGZvciBldmVyeSBjb3JlIHRoYXQgaGFzIDMgb3IgbW9yZSB0aHJlYWRzLgorICAgIC8vCisgICAgdGVhbVNpemUgKz0gKCB0aHJlYWRJZEN0IDw9IDIgKSA/ICggdGhyZWFkSWRDdCApIDogKCB0aHJlYWRJZEN0IC0gMSApOworIyBlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgIGZvciAoaW5kZXggPSB0aHJlYWRJZEluZGV4OyBpbmRleCA8PSBtYXhJbmRleDsgaW5kZXgrKykgeworICAgICAgICBpZiAoY291bnRzW2luZGV4XSA+IG1heEN0W2luZGV4XSkgeworICAgICAgICAgICAgbWF4Q3RbaW5kZXhdID0gY291bnRzW2luZGV4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG1heEN0W3RocmVhZElkSW5kZXhdOworICAgIG5Db3Jlc1BlclBrZyA9IG1heEN0W2NvcmVJZEluZGV4XTsKKyAgICBuUGFja2FnZXMgPSB0b3RhbHNbcGtnSWRJbmRleF07CisKKyAgICAvLworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWFjaGluZSB0b3BvbG9neSBpcyB1bmlmb3JtCisgICAgLy8KKyAgICB1bnNpZ25lZCBwcm9kID0gdG90YWxzW21heEluZGV4XTsKKyAgICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPCBtYXhJbmRleDsgaW5kZXgrKykgeworICAgICAgIHByb2QgKj0gbWF4Q3RbaW5kZXhdOworICAgIH0KKyAgICBib29sIHVuaWZvcm0gPSAocHJvZCA9PSB0b3RhbHNbdGhyZWFkSWRJbmRleF0pOworCisgICAgLy8KKyAgICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAgIC8vIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsCisgICAgLy8gbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4gIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0CisgICAgLy8gY29ycmVjdGx5LCBhbmQgcmV0dXJuIG5vdyBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAvLworICAgIF9fa21wX25jb3JlcyA9IHRvdGFsc1tjb3JlSWRJbmRleF07CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlQ3B1aW5mbywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICAgICAgaWYgKHVuaWZvcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkNhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmKTsKKworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlZCIsIHRvdGFsc1ttYXhJbmRleF0pOworICAgICAgICBmb3IgKGluZGV4ID0gbWF4SW5kZXggLSAxOyBpbmRleCA+PSBwa2dJZEluZGV4OyBpbmRleC0tKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIgeCAlZCIsIG1heEN0W2luZGV4XSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShUb3BvbG9neUV4dHJhLCAiS01QX0FGRklOSVRZIiwgYnVmLnN0ciwgIG1heEN0W2NvcmVJZEluZGV4XSwKKyAgICAgICAgICBtYXhDdFt0aHJlYWRJZEluZGV4XSwgX19rbXBfbmNvcmVzKTsKKworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorCisjIGlmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICAgIC8vCisgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHRlYW0gc2l6ZS4KKyAgICAvLworICAgIGlmICgoX19rbXBfZGZsdF90ZWFtX250aCA9PSAwKSAmJiAodGVhbVNpemUgPiAwKSkgeworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gdGVhbVNpemU7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcDogc2V0dGluZyBfX2ttcF9kZmx0X3RlYW1fbnRoID0gJWRcbiIsCisgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCkpOworICAgIH0KKyMgZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3B1X29zX2lkeCA9PSBOVUxMKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG51bV9hdmFpbCA9PSBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBfX2ttcF9wdV9vc19pZHggPSAoaW50KilfX2ttcF9hbGxvY2F0ZShzaXplb2YoaW50KSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXZhaWw7ICsraSkgeyAvLyBmaWxsIHRoZSBvcyBpbmRpY2VzCisgICAgICAgIF9fa21wX3B1X29zX2lkeFtpXSA9IHRocmVhZEluZm9baV1bb3NJZEluZGV4XTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUobGFzdElkKTsKKyAgICAgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgICAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICAgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGV2ZWxzIHdoaWNoIGhhdmUgbW9yZSBub2RlcyBhdCB0aGF0IGxldmVsIHRoYW4KKyAgICAvLyBhdCB0aGUgcGFyZW50J3MgbGV2ZWwgKHdpdGggdGhlcmUgYmVpbmcgYW4gaW1wbGljaXQgcm9vdCBub2RlIG9mCisgICAgLy8gdGhlIHRvcCBsZXZlbCkuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc2F5aW5nIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3QKKyAgICAvLyBvbmUgbm9kZSBhdCB0aGlzIGxldmVsIHdoaWNoIGhhcyBhIHNpYmxpbmcuICBUaGVzZSBsZXZlbHMgYXJlIGluIHRoZQorICAgIC8vIG1hcCwgYW5kIHRoZSBwYWNrYWdlIGxldmVsIGlzIGFsd2F5cyBpbiB0aGUgbWFwLgorICAgIC8vCisgICAgYm9vbCAqaW5NYXAgPSAoYm9vbCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpICogc2l6ZW9mKGJvb2wpKTsKKyAgICBpbnQgbGV2ZWwgPSAwOworICAgIGZvciAoaW5kZXggPSB0aHJlYWRJZEluZGV4OyBpbmRleCA8IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgIEtNUF9BU1NFUlQodG90YWxzW2luZGV4XSA+PSB0b3RhbHNbaW5kZXggKyAxXSk7CisgICAgICAgIGluTWFwW2luZGV4XSA9ICh0b3RhbHNbaW5kZXhdID4gdG90YWxzW2luZGV4ICsgMV0pOworICAgIH0KKyAgICBpbk1hcFttYXhJbmRleF0gPSAodG90YWxzW21heEluZGV4XSA+IDEpOworICAgIGluTWFwW3BrZ0lkSW5kZXhdID0gdHJ1ZTsKKworICAgIGludCBkZXB0aCA9IDA7CisgICAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDw9IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgICAgIGlmIChpbk1hcFtpbmRleF0pIHsKKyAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0FTU0VSVChkZXB0aCA+IDApOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3QgdGhlIGRhdGEgc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpICogbnVtX2F2YWlsKTsKKyAgICBpbnQgcGtnTGV2ZWwgPSAtMTsKKyAgICBpbnQgY29yZUxldmVsID0gLTE7CisgICAgaW50IHRocmVhZExldmVsID0gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2F2YWlsOyArK2kpIHsKKyAgICAgICAgQWRkcmVzcyBhZGRyKGRlcHRoKTsKKyAgICAgICAgdW5zaWduZWQgb3MgPSB0aHJlYWRJbmZvW2ldW29zSWRJbmRleF07CisgICAgICAgIGludCBzcmNfaW5kZXg7CisgICAgICAgIGludCBkc3RfaW5kZXggPSAwOworCisgICAgICAgIGZvciAoc3JjX2luZGV4ID0gbWF4SW5kZXg7IHNyY19pbmRleCA+PSB0aHJlYWRJZEluZGV4OyBzcmNfaW5kZXgtLSkgeworICAgICAgICAgICAgaWYgKCEgaW5NYXBbc3JjX2luZGV4XSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkci5sYWJlbHNbZHN0X2luZGV4XSA9IHRocmVhZEluZm9baV1bc3JjX2luZGV4XTsKKyAgICAgICAgICAgIGlmIChzcmNfaW5kZXggPT0gcGtnSWRJbmRleCkgeworICAgICAgICAgICAgICAgIHBrZ0xldmVsID0gZHN0X2luZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2luZGV4ID09IGNvcmVJZEluZGV4KSB7CisgICAgICAgICAgICAgICAgY29yZUxldmVsID0gZHN0X2luZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2luZGV4ID09IHRocmVhZElkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRMZXZlbCA9IGRzdF9pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdF9pbmRleCsrOworICAgICAgICB9CisgICAgICAgICgqYWRkcmVzczJvcylbaV0gPSBBZGRyVW5zUGFpcihhZGRyLCBvcyk7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTZXQgdGhlIGdyYW51bGFyaXR5IGxldmVsIGJhc2VkIG9uIHdoYXQgbGV2ZWxzIGFyZSBtb2RlbGVkCisgICAgICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICAgICAgLy8KKyAgICAgICAgdW5zaWduZWQgc3JjX2luZGV4OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIGZvciAoc3JjX2luZGV4ID0gdGhyZWFkSWRJbmRleDsgc3JjX2luZGV4IDw9IG1heEluZGV4OyBzcmNfaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKCEgaW5NYXBbc3JjX2luZGV4XSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChzcmNfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBjYXNlIHRocmVhZElkSW5kZXg6CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3RocmVhZCkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgY29yZUlkSW5kZXg6CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX2NvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHBrZ0lkSW5kZXg6CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neSgqYWRkcmVzczJvcywgbnVtX2F2YWlsLCBkZXB0aCwgcGtnTGV2ZWwsCisgICAgICAgICAgY29yZUxldmVsLCB0aHJlYWRMZXZlbCk7CisgICAgfQorCisgICAgX19rbXBfZnJlZShpbk1hcCk7CisgICAgX19rbXBfZnJlZShsYXN0SWQpOworICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICByZXR1cm4gZGVwdGg7Cit9CisKKworLy8KKy8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgdGFibGUgb2YgYWZmaW5pdHkgbWFza3MsIGluZGV4ZWQgYnkgT1MgdGhyZWFkIElELgorLy8gVGhpcyByb3V0aW5lIGhhbmRsZXMgT1InaW5nIHRvZ2V0aGVyIGFsbCB0aGUgYWZmaW5pdHkgbWFza3Mgb2YgdGhyZWFkcworLy8gdGhhdCBhcmUgc3VmZmljaWVudGx5IGNsb3NlLCBpZiBncmFudWxhcml0eSA+IGZpbmUuCisvLworc3RhdGljIGttcF9hZmZpbl9tYXNrX3QgKgorX19rbXBfY3JlYXRlX21hc2tzKHVuc2lnbmVkICptYXhJbmRleCwgdW5zaWduZWQgKm51bVVuaXF1ZSwKKyAgQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsIHVuc2lnbmVkIG51bUFkZHJzKQoreworICAgIC8vCisgICAgLy8gRmlyc3QgZm9ybSBhIHRhYmxlIG9mIGFmZmluaXR5IG1hc2tzIGluIG9yZGVyIG9mIE9TIHRocmVhZCBpZC4KKyAgICAvLworICAgIHVuc2lnbmVkIGRlcHRoOworICAgIHVuc2lnbmVkIG1heE9zSWQ7CisgICAgdW5zaWduZWQgaTsKKworICAgIEtNUF9BU1NFUlQobnVtQWRkcnMgPiAwKTsKKyAgICBkZXB0aCA9IGFkZHJlc3Myb3NbMF0uZmlyc3QuZGVwdGg7CisKKyAgICBtYXhPc0lkID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQWRkcnM7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBvc0lkID0gYWRkcmVzczJvc1tpXS5zZWNvbmQ7CisgICAgICAgIGlmIChvc0lkID4gbWF4T3NJZCkgeworICAgICAgICAgICAgbWF4T3NJZCA9IG9zSWQ7CisgICAgICAgIH0KKyAgICB9CisgICAga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrOworICAgIEtNUF9DUFVfQUxMT0NfQVJSQVkob3NJZDJNYXNrLCAobWF4T3NJZCsxKSk7CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIGFkZHJlc3Myb3MgdGFibGUgYWNjb3JkaW5nIHRvIHBoeXNpY2FsIG9yZGVyLiAgRG9pbmcgc28KKyAgICAvLyB3aWxsIHB1dCBhbGwgdGhyZWFkcyBvbiB0aGUgc2FtZSBjb3JlL3BhY2thZ2Uvbm9kZSBpbiBjb25zZWN1dGl2ZQorICAgIC8vIGxvY2F0aW9ucy4KKyAgICAvLworICAgIHFzb3J0KGFkZHJlc3Myb3MsIG51bUFkZHJzLCBzaXplb2YoKmFkZHJlc3Myb3MpLAorICAgICAgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKworICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPj0gMCk7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgJiYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID4gMCkpIHsKKyAgICAgICAgS01QX0lORk9STShUaHJlYWRzTWlncmF0ZSwgIktNUF9BRkZJTklUWSIsICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyk7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA+PSAoaW50KWRlcHRoKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmVGhyZWFkc01heU1pZ3JhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCB0aGUgdGFibGUsIGZvcm1pbmcgdGhlIG1hc2tzIGZvciBhbGwgdGhyZWFkcyBvbiBlYWNoCisgICAgLy8gY29yZS4gIFRocmVhZHMgb24gdGhlIHNhbWUgY29yZSB3aWxsIGhhdmUgaWRlbnRpY2FsICJBZGRyZXNzIgorICAgIC8vIG9iamVjdHMsIG5vdCBjb25zaWRlcmluZyB0aGUgbGFzdCBsZXZlbCwgd2hpY2ggbXVzdCBiZSB0aGUgdGhyZWFkCisgICAgLy8gaWQuICBBbGwgdGhyZWFkcyBvbiBhIGNvcmUgd2lsbCBhcHBlYXIgY29uc2VjdXRpdmVseS4KKyAgICAvLworICAgIHVuc2lnbmVkIHVuaXF1ZSA9IDA7CisgICAgdW5zaWduZWQgaiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleCBvZiAxc3QgdGhyZWFkIG9uIGNvcmUKKyAgICB1bnNpZ25lZCBsZWFkZXIgPSAwOworICAgIEFkZHJlc3MgKmxlYWRlckFkZHIgPSAmKGFkZHJlc3Myb3NbMF0uZmlyc3QpOworICAgIGttcF9hZmZpbl9tYXNrX3QgKnN1bTsKKyAgICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKHN1bSk7CisgICAgS01QX0NQVV9aRVJPKHN1bSk7CisgICAgS01QX0NQVV9TRVQoYWRkcmVzczJvc1swXS5zZWNvbmQsIHN1bSk7CisgICAgZm9yIChpID0gMTsgaSA8IG51bUFkZHJzOyBpKyspIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgaXMgc3VmZmljaWVudGx5IGNsb3NlIHRvIHRoZSBsZWFkZXIgKHdpdGhpbiB0aGUKKyAgICAgICAgLy8gZ3JhbnVsYXJpdHkgc2V0dGluZyksIHRoZW4gc2V0IHRoZSBiaXQgZm9yIHRoaXMgb3MgdGhyZWFkIGluIHRoZQorICAgICAgICAvLyBhZmZpbml0eSBtYXNrIGZvciB0aGlzIGdyb3VwLCBhbmQgZ28gb24gdG8gdGhlIG5leHQgdGhyZWFkLgorICAgICAgICAvLworICAgICAgICBpZiAobGVhZGVyQWRkci0+aXNDbG9zZShhZGRyZXNzMm9zW2ldLmZpcnN0LAorICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKSkgeworICAgICAgICAgICAgS01QX0NQVV9TRVQoYWRkcmVzczJvc1tpXS5zZWNvbmQsIHN1bSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZvciBldmVyeSB0aHJlYWQgaW4gdGhpcyBncm91cCwgY29weSB0aGUgbWFzayB0byB0aGUgdGhyZWFkJ3MKKyAgICAgICAgLy8gZW50cnkgaW4gdGhlIG9zSWQyTWFzayB0YWJsZS4gIE1hcmsgdGhlIGZpcnN0IGFkZHJlc3MgYXMgYQorICAgICAgICAvLyBsZWFkZXIuCisgICAgICAgIC8vCisgICAgICAgIGZvciAoOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBvc0lkID0gYWRkcmVzczJvc1tqXS5zZWNvbmQ7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG9zSWQgPD0gbWF4T3NJZCk7CisgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG9zSWQpOworICAgICAgICAgICAgS01QX0NQVV9DT1BZKG1hc2ssIHN1bSk7CisgICAgICAgICAgICBhZGRyZXNzMm9zW2pdLmZpcnN0LmxlYWRlciA9IChqID09IGxlYWRlcik7CisgICAgICAgIH0KKyAgICAgICAgdW5pcXVlKys7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU3RhcnQgYSBuZXcgbWFzay4KKyAgICAgICAgLy8KKyAgICAgICAgbGVhZGVyID0gaTsKKyAgICAgICAgbGVhZGVyQWRkciA9ICYoYWRkcmVzczJvc1tpXS5maXJzdCk7CisgICAgICAgIEtNUF9DUFVfWkVSTyhzdW0pOworICAgICAgICBLTVBfQ1BVX1NFVChhZGRyZXNzMm9zW2ldLnNlY29uZCwgc3VtKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEZvciBldmVyeSB0aHJlYWQgaW4gbGFzdCBncm91cCwgY29weSB0aGUgbWFzayB0byB0aGUgdGhyZWFkJ3MKKyAgICAvLyBlbnRyeSBpbiB0aGUgb3NJZDJNYXNrIHRhYmxlLgorICAgIC8vCisgICAgZm9yICg7IGogPCBpOyBqKyspIHsKKyAgICAgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3Nbal0uc2Vjb25kOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG9zSWQgPD0gbWF4T3NJZCk7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2sgPSBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgb3NJZCk7CisgICAgICAgIEtNUF9DUFVfQ09QWShtYXNrLCBzdW0pOworICAgICAgICBhZGRyZXNzMm9zW2pdLmZpcnN0LmxlYWRlciA9IChqID09IGxlYWRlcik7CisgICAgfQorICAgIHVuaXF1ZSsrOworICAgIEtNUF9DUFVfRlJFRV9GUk9NX1NUQUNLKHN1bSk7CisKKyAgICAqbWF4SW5kZXggPSBtYXhPc0lkOworICAgICpudW1VbmlxdWUgPSB1bmlxdWU7CisgICAgcmV0dXJuIG9zSWQyTWFzazsKK30KKworCisvLworLy8gU3R1ZmYgZm9yIHRoZSBhZmZpbml0eSBwcm9jbGlzdCBwYXJzZXJzLiAgSXQncyBlYXNpZXIgdG8gZGVjbGFyZSB0aGVzZSB2YXJzCisvLyBhcyBmaWxlLXN0YXRpYyB0aGFuIHRvIHRyeSBhbmQgcGFzcyB0aGVtIHRocm91Z2ggdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb2YKKy8vIHRoZSByZWN1cnNpdmUtZGVzY2VudCBPTVBfUExBQ0VTIHBhcnNlci4KKy8vCitzdGF0aWMga21wX2FmZmluX21hc2tfdCAqbmV3TWFza3M7CitzdGF0aWMgaW50IG51bU5ld01hc2tzOworc3RhdGljIGludCBuZXh0TmV3TWFzazsKKworI2RlZmluZSBBRERfTUFTSyhfbWFzaykgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobmV4dE5ld01hc2sgPj0gbnVtTmV3TWFza3MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbnVtTmV3TWFza3MgKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCogdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9JTlRFUk5BTF9BTExPQ19BUlJBWSh0ZW1wLCBudW1OZXdNYXNrcyk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKGk9MDtpPG51bU5ld01hc2tzLzI7aSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIHNyYyAgPSBLTVBfQ1BVX0lOREVYKG5ld01hc2tzLCBpKTsgICAgXAorICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIGRlc3QgPSBLTVBfQ1BVX0lOREVYKHRlbXAsIGkpOyAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9JTlRFUk5BTF9GUkVFX0FSUkFZKG5ld01hc2tzLCBudW1OZXdNYXNrcy8yKTsgICAgICAgXAorICAgICAgICAgICAgbmV3TWFza3MgPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ1BVX0NPUFkoS01QX0NQVV9JTkRFWChuZXdNYXNrcywgbmV4dE5ld01hc2spLCAoX21hc2spKTsgICAgXAorICAgICAgICBuZXh0TmV3TWFzaysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBBRERfTUFTS19PU0lEKF9vc0lkLF9vc0lkMk1hc2ssX21heE9zSWQpIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCgoX29zSWQpID4gX21heE9zSWQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKChfb3NJZCksIEtNUF9DUFVfSU5ERVgoKF9vc0lkMk1hc2spLCAoX29zSWQpKSkpKSB7IFwKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAgICAgIFwKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBfb3NJZCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFERF9NQVNLKEtNUF9DUFVfSU5ERVgoX29zSWQyTWFzaywgKF9vc0lkKSkpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworLy8KKy8vIFJlLXBhcnNlIHRoZSBwcm9jbGlzdCAoZm9yIHRoZSBleHBsaWNpdCBhZmZpbml0eSB0eXBlKSwgYW5kIGZvcm0gdGhlIGxpc3QKKy8vIG9mIGFmZmluaXR5IG5ld01hc2tzIGluZGV4ZWQgYnkgZ3RpZC4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wcm9jbGlzdChrbXBfYWZmaW5fbWFza190ICoqb3V0X21hc2tzLAorICB1bnNpZ25lZCBpbnQgKm91dF9udW1NYXNrcywgY29uc3QgY2hhciAqcHJvY2xpc3QsCisgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywgaW50IG1heE9zSWQpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgY2hhciAqc2NhbiA9IHByb2NsaXN0OworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBwcm9jbGlzdDsKKworICAgIC8vCisgICAgLy8gV2UgdXNlIG1hbGxvYygpIGZvciB0aGUgdGVtcG9yYXJ5IG1hc2sgdmVjdG9yLAorICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSByZWFsbG9jKCkgdG8gZXh0ZW5kIGl0LgorICAgIC8vCisgICAgbnVtTmV3TWFza3MgPSAyOworICAgIEtNUF9DUFVfSU5URVJOQUxfQUxMT0NfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKKyAgICBuZXh0TmV3TWFzayA9IDA7CisgICAga21wX2FmZmluX21hc2tfdCAqc3VtTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DKHN1bU1hc2spOworICAgIGludCBzZXRTaXplID0gMDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBlbmQsIHN0cmlkZTsKKworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpuZXh0ID09ICd7JykgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIHNldFNpemUgPSAwOworICAgICAgICAgICAgbmV4dCsrOyAgICAgLy8gc2tpcCAneycKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gJzAnKSAmJiAoKm5leHQgPD0gJzknKSwKKyAgICAgICAgICAgICAgImJhZCBwcm9jbGlzdCIpOworICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKG51bSA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ29weSB0aGUgbWFzayBmb3IgdGhhdCBvc0lkIHRvIHRoZSBzdW0gKHVuaW9uKSBtYXNrLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgobnVtID4gbWF4T3NJZCkgfHwKKyAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChudW0sIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBudW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1pFUk8oc3VtTWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0NPUFkoc3VtTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpOworICAgICAgICAgICAgICAgIHNldFNpemUgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBuZXh0Kys7ICAgICAvLyBza2lwICd9JworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbmV4dCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gJzAnKSAmJiAoKm5leHQgPD0gJzknKSwKKyAgICAgICAgICAgICAgICAgICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUMihudW0gPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBtYXNrIGZvciB0aGF0IG9zSWQgdG8gdGhlIHN1bSBtYXNrLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChudW0sIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBudW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHN1bU1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXRTaXplID4gMCkgeworICAgICAgICAgICAgICAgIEFERF9NQVNLKHN1bU1hc2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gJzAnKSAmJiAoKm5leHQgPD0gJzknKSwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0YXJ0ID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQyKHN0YXJ0ID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBhIHJhbmdlLCB0aGVuIGFkZCBhIG1hc2sgdG8gdGhlIGxpc3QgYW5kIGdvIG9uLgorICAgICAgICAvLworICAgICAgICBpZiAoKm5leHQgIT0gJy0nKSB7CisgICAgICAgICAgICBBRERfTUFTS19PU0lEKHN0YXJ0LCBvc0lkMk1hc2ssIG1heE9zSWQpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgaXMgYSByYW5nZS4gIFNraXAgb3ZlciB0aGUgJy0nIGFuZCByZWFkIGluIHRoZSAybmQgaW50LgorICAgICAgICAvLworICAgICAgICBuZXh0Kys7ICAgICAgICAgLy8gc2tpcCAnLScKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgZW5kID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQyKGVuZCA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBhIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgc3RyaWRlID0gMTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICc6JykgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEEgc3RyaWRlIGlzIHNwZWNpZmllZC4gIFNraXAgb3ZlciB0aGUgJzoiIGFuZCByZWFkIHRoZSAzcmQgaW50LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgICAgLy8gc2tpcCAnOicKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduID0gLTE7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gICcwJykgJiYgKCpuZXh0IDw9ICc5JyksCisgICAgICAgICAgICAgICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVDIoc3RyaWRlID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIERvIHNvbWUgcmFuZ2UgY2hlY2tzLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUMihzdHJpZGUgIT0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgaWYgKHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKHN0YXJ0IDw9IGVuZCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKHN0YXJ0ID49IGVuZCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQVNTRVJUMigoZW5kIC0gc3RhcnQpIC8gc3RyaWRlIDw9IDY1NTM2LCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEFkZCB0aGUgbWFzayBmb3IgZWFjaCBPUyBwcm9jICMgdG8gdGhlIGxpc3QuCisgICAgICAgIC8vCisgICAgICAgIGlmIChzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgQUREX01BU0tfT1NJRChzdGFydCwgb3NJZDJNYXNrLCBtYXhPc0lkKTsKKyAgICAgICAgICAgICAgICBzdGFydCArPSBzdHJpZGU7CisgICAgICAgICAgICB9IHdoaWxlIChzdGFydCA8PSBlbmQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIEFERF9NQVNLX09TSUQoc3RhcnQsIG9zSWQyTWFzaywgbWF4T3NJZCk7CisgICAgICAgICAgICAgICAgc3RhcnQgKz0gc3RyaWRlOworICAgICAgICAgICAgfSB3aGlsZSAoc3RhcnQgPj0gZW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfQorICAgICAgICBzY2FuID0gbmV4dDsKKyAgICB9CisKKyAgICAqb3V0X251bU1hc2tzID0gbmV4dE5ld01hc2s7CisgICAgaWYgKG5leHROZXdNYXNrID09IDApIHsKKyAgICAgICAgKm91dF9tYXNrcyA9IE5VTEw7CisgICAgICAgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEtNUF9DUFVfQUxMT0NfQVJSQVkoKCpvdXRfbWFza3MpLCBuZXh0TmV3TWFzayk7CisgICAgZm9yKGkgPSAwOyBpIDwgbmV4dE5ld01hc2s7IGkrKykgeworICAgICAgICBrbXBfYWZmaW5fbWFza190KiBzcmMgID0gS01QX0NQVV9JTkRFWChuZXdNYXNrcywgaSk7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIGRlc3QgPSBLTVBfQ1BVX0lOREVYKCgqb3V0X21hc2tzKSwgaSk7CisgICAgICAgIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpOworICAgIH0KKyAgICBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKKyAgICBLTVBfQ1BVX0ZSRUUoc3VtTWFzayk7Cit9CisKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlLXBhcnNlIHRoZSBPTVBfUExBQ0VTIHByb2MgaWQgbGlzdCwgZm9ybWluZyB0aGUgbmV3TWFza3MgZm9yIHRoZSBkaWZmZXJlbnQKK3BsYWNlcy4gIEFnYWluLCBIZXJlIGlzIHRoZSBncmFtbWFyOgorCitwbGFjZV9saXN0IDo9IHBsYWNlCitwbGFjZV9saXN0IDo9IHBsYWNlICwgcGxhY2VfbGlzdAorcGxhY2UgOj0gbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0gOiBzaWduZWQKK3BsYWNlIDo9IHsgc3VicGxhY2VsaXN0IH0KK3BsYWNlIDo9ICEgcGxhY2UgICAgICAgICAgICAgICAgICAvLyAobG93ZXN0IHByaW9yaXR5KQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZSAsIHN1YnBsYWNlX2xpc3QKK3N1YnBsYWNlIDo9IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0gOiBzaWduZWQKK3NpZ25lZCA6PSBudW0KK3NpZ25lZCA6PSArIHNpZ25lZAorc2lnbmVkIDo9IC0gc2lnbmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQKK19fa21wX3Byb2Nlc3Nfc3VicGxhY2VfbGlzdChjb25zdCBjaGFyICoqc2Nhbiwga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLAorICBpbnQgbWF4T3NJZCwga21wX2FmZmluX21hc2tfdCAqdGVtcE1hc2ssIGludCAqc2V0U2l6ZSkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGNvdW50LCBzdHJpZGUsIGk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBpbiB0aGUgc3RhcnRpbmcgcHJvYyBpZAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSwKKyAgICAgICAgICAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0YXJ0ID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScgfHwgKipzY2FuID09ICcsJykgeworICAgICAgICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQoc3RhcnQsIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpKSkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKTsKKyAgICAgICAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9BU1NFUlQyKCoqc2NhbiA9PSAnOicsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBjb3VudCBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nIHx8ICoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKHN0YXJ0LCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBkb24ndCBwcm9saWZlcmF0ZSB3YXJuaW5ncyBmb3IgbGFyZ2UgY291bnQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpOworICAgICAgICAgICAgICAgICAgICBzdGFydCsrOworICAgICAgICAgICAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQVNTRVJUMigqKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICcrJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduICo9IC0xOworICAgICAgICAgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnLScKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBLTVBfQVNTRVJUMigoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpLAorICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nIHx8ICoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKHN0YXJ0LCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBkb24ndCBwcm9saWZlcmF0ZSB3YXJuaW5ncyBmb3IgbGFyZ2UgY291bnQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpOworICAgICAgICAgICAgICAgICAgICBzdGFydCArPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICgqc2V0U2l6ZSkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS01QX0FTU0VSVDIoMCwgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfcHJvY2Vzc19wbGFjZShjb25zdCBjaGFyICoqc2Nhbiwga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLAorICBpbnQgbWF4T3NJZCwga21wX2FmZmluX21hc2tfdCAqdGVtcE1hc2ssIGludCAqc2V0U2l6ZSkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgLy8KKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJ3snICchJyBhbmQgbnVtCisgICAgLy8KKyAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICBpZiAoKipzY2FuID09ICd7JykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAneycKKyAgICAgICAgX19rbXBfcHJvY2Vzc19zdWJwbGFjZV9saXN0KHNjYW4sIG9zSWQyTWFzaywgbWF4T3NJZCAsIHRlbXBNYXNrLAorICAgICAgICAgIHNldFNpemUpOworICAgICAgICBLTVBfQVNTRVJUMigqKnNjYW4gPT0gJ30nLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICd9JworICAgIH0KKyAgICBlbHNlIGlmICgqKnNjYW4gPT0gJyEnKSB7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICchJworICAgICAgICBfX2ttcF9wcm9jZXNzX3BsYWNlKHNjYW4sIG9zSWQyTWFzaywgbWF4T3NJZCwgdGVtcE1hc2ssIHNldFNpemUpOworICAgICAgICBLTVBfQ1BVX0NPTVBMRU1FTlQobWF4T3NJZCwgdGVtcE1hc2spOworICAgIH0KKyAgICBlbHNlIGlmICgoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpKSB7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGludCBudW0gPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQobnVtID49IDApOworICAgICAgICBpZiAoKG51bSA+IG1heE9zSWQpIHx8CisgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChudW0sIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKSkpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBudW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0NQVV9VTklPTih0ZW1wTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpOworICAgICAgICAgICAgKCpzZXRTaXplKSsrOworICAgICAgICB9CisgICAgICAgICpzY2FuID0gbmV4dDsgIC8vIHNraXAgbnVtCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfQVNTRVJUMigwLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgfQorfQorCisKKy8vc3RhdGljIHZvaWQKK3ZvaWQKK19fa21wX2FmZmluaXR5X3Byb2Nlc3NfcGxhY2VsaXN0KGttcF9hZmZpbl9tYXNrX3QgKipvdXRfbWFza3MsCisgIHVuc2lnbmVkIGludCAqb3V0X251bU1hc2tzLCBjb25zdCBjaGFyICpwbGFjZWxpc3QsCisgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywgaW50IG1heE9zSWQpCit7CisgICAgaW50IGksaixjb3VudCxzdHJpZGUsc2lnbjsKKyAgICBjb25zdCBjaGFyICpzY2FuID0gcGxhY2VsaXN0OworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBwbGFjZWxpc3Q7CisKKyAgICBudW1OZXdNYXNrcyA9IDI7CisgICAgS01QX0NQVV9JTlRFUk5BTF9BTExPQ19BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworICAgIG5leHROZXdNYXNrID0gMDsKKworICAgIC8vIHRlbXBNYXNrIGlzIG1vZGlmaWVkIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBvciBpbml0aWFsCisgICAgLy8gICBwbGFjZSB0byBmb3JtIHRoZSBjdXJyZW50IHBsYWNlCisgICAgLy8gcHJldmlvdXNNYXNrIGNvbnRhaW5zIHRoZSBwcmV2aW91cyBwbGFjZQorICAgIGttcF9hZmZpbl9tYXNrX3QgKnRlbXBNYXNrOworICAgIGttcF9hZmZpbl9tYXNrX3QgKnByZXZpb3VzTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DKHRlbXBNYXNrKTsKKyAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgIEtNUF9DUFVfQUxMT0MocHJldmlvdXNNYXNrKTsKKyAgICBLTVBfQ1BVX1pFUk8ocHJldmlvdXNNYXNrKTsKKyAgICBpbnQgc2V0U2l6ZSA9IDA7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIF9fa21wX3Byb2Nlc3NfcGxhY2UoJnNjYW4sIG9zSWQyTWFzaywgbWF4T3NJZCwgdGVtcE1hc2ssICZzZXRTaXplKTsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnIHx8ICpzY2FuID09ICcsJykgeworICAgICAgICAgICAgaWYgKHNldFNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgQUREX01BU0sodGVtcE1hc2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0NQVV9aRVJPKHRlbXBNYXNrKTsKKyAgICAgICAgICAgIHNldFNpemUgPSAwOworICAgICAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9BU1NFUlQyKCpzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBzY2FuKys7ICAgICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGNvdW50IHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBLTVBfQVNTRVJUMigoKnNjYW4gPj0gJzAnKSAmJiAoKnNjYW4gPD0gJzknKSwKKyAgICAgICAgICAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJyB8fCAqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHN0cmlkZSA9ICsxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICAgICBzY2FuKys7ICAgICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHNpZ24gPSArMTsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbisrOyAvLyBza2lwICcrJworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCpzY2FuID09ICctJykgeworICAgICAgICAgICAgICAgICAgICBzaWduICo9IC0xOworICAgICAgICAgICAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJy0nCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgICAgICBLTVBfQVNTRVJUMigoKnNjYW4gPj0gJzAnKSAmJiAoKnNjYW4gPD0gJzknKSwKKyAgICAgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIHN0cmlkZSAqPSBzaWduOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHBsYWNlcyBkZXRlcm1pbmVkIGJ5IGluaXRpYWxfcGxhY2UgOiBjb3VudCA6IHN0cmlkZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHNldFNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IHBsYWNlLCB0aGVuIGJ1aWxkIHRoZSBuZXh0IHBsYWNlICh0ZW1wTWFzaykgZnJvbSB0aGF0CisgICAgICAgICAgICBLTVBfQ1BVX0NPUFkocHJldmlvdXNNYXNrLCB0ZW1wTWFzayk7CisgICAgICAgICAgICBBRERfTUFTSyhwcmV2aW91c01hc2spOworICAgICAgICAgICAgS01QX0NQVV9aRVJPKHRlbXBNYXNrKTsKKyAgICAgICAgICAgIHNldFNpemUgPSAwOworICAgICAgICAgICAgS01QX0NQVV9TRVRfSVRFUkFURShqLCBwcmV2aW91c01hc2spIHsKKyAgICAgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGosIHByZXZpb3VzTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoaitzdHJpZGUgPiBtYXhPc0lkKSB8fCAoaitzdHJpZGUgPCAwKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChqLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHx8CisgICAgICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKGorc3RyaWRlLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgaitzdHJpZGUpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgJiYgaSA8IGNvdW50IC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgaitzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVChqK3N0cmlkZSwgdGVtcE1hc2spOworICAgICAgICAgICAgICAgIHNldFNpemUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgICAgICBzZXRTaXplID0gMDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICB9CisKKyAgICAqb3V0X251bU1hc2tzID0gbmV4dE5ld01hc2s7CisgICAgaWYgKG5leHROZXdNYXNrID09IDApIHsKKyAgICAgICAgKm91dF9tYXNrcyA9IE5VTEw7CisgICAgICAgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEtNUF9DUFVfQUxMT0NfQVJSQVkoKCpvdXRfbWFza3MpLCBuZXh0TmV3TWFzayk7CisgICAgS01QX0NQVV9GUkVFKHRlbXBNYXNrKTsKKyAgICBLTVBfQ1BVX0ZSRUUocHJldmlvdXNNYXNrKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBuZXh0TmV3TWFzazsgaSsrKSB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIHNyYyAgPSBLTVBfQ1BVX0lOREVYKG5ld01hc2tzLCBpKTsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCogZGVzdCA9IEtNUF9DUFVfSU5ERVgoKCpvdXRfbWFza3MpLCBpKTsKKyAgICAgICAgS01QX0NQVV9DT1BZKGRlc3QsIHNyYyk7CisgICAgfQorICAgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworfQorCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyN1bmRlZiBBRERfTUFTSworI3VuZGVmIEFERF9NQVNLX09TSUQKKworc3RhdGljIHZvaWQKK19fa21wX2FwcGx5X3RocmVhZF9wbGFjZXMoQWRkclVuc1BhaXIgKipwQWRkciwgaW50IGRlcHRoKQoreworICAgIGludCBpLCBqLCBrLCBuX29sZCA9IDAsIG5fbmV3ID0gMCwgcHJvY19udW0gPSAwOworICAgIGlmIChfX2ttcF9wbGFjZV9udW1fc29ja2V0cyA9PSAwICYmCisgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9PSAwICYmCisgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID09IDAgKQorICAgICAgICBnb3RvIF9leGl0OyAgIC8vIG5vIHRvcG9sb2d5IGxpbWl0aW5nIGFjdGlvbnMgcmVxdWVzdGVkLCBleGl0CisgICAgaWYgKF9fa21wX3BsYWNlX251bV9zb2NrZXRzID09IDApCisgICAgICAgIF9fa21wX3BsYWNlX251bV9zb2NrZXRzID0gblBhY2thZ2VzOyAgICAvLyB1c2UgYWxsIGF2YWlsYWJsZSBzb2NrZXRzCisgICAgaWYgKF9fa21wX3BsYWNlX251bV9jb3JlcyA9PSAwKQorICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBuQ29yZXNQZXJQa2c7ICAgLy8gdXNlIGFsbCBhdmFpbGFibGUgY29yZXMKKyAgICBpZiAoX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPT0gMCB8fAorICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA+IF9fa21wX25UaHJlYWRzUGVyQ29yZSkKKyAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7IC8vIHVzZSBhbGwgSFcgY29udGV4dHMKKworICAgIGlmICggIV9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFmZkhXU3Vic2V0Tm9uVW5pZm9ybSApOworICAgICAgICBnb3RvIF9leGl0OyAvLyBkb24ndCBzdXBwb3J0IG5vbi11bmlmb3JtIHRvcG9sb2d5CisgICAgfQorICAgIGlmICggZGVwdGggPiAzICkgeworICAgICAgICBLTVBfV0FSTklORyggQWZmSFdTdWJzZXROb25UaHJlZUxldmVsICk7CisgICAgICAgIGdvdG8gX2V4aXQ7IC8vIGRvbid0IHN1cHBvcnQgbm90LTMtbGV2ZWwgdG9wb2xvZ3kKKyAgICB9CisgICAgaWYgKF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQgKyBfX2ttcF9wbGFjZV9udW1fc29ja2V0cyA+IG5QYWNrYWdlcykgeworICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldE1hbnlTb2NrZXRzKTsKKyAgICAgICAgZ290byBfZXhpdDsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCArIF9fa21wX3BsYWNlX251bV9jb3JlcyA+IG5Db3Jlc1BlclBrZyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFmZkhXU3Vic2V0TWFueUNvcmVzICk7CisgICAgICAgIGdvdG8gX2V4aXQ7CisgICAgfQorCisgICAgQWRkclVuc1BhaXIgKm5ld0FkZHI7CisgICAgaWYgKHBBZGRyKSAvLyBwQWRkciBpcyBOVUxMIGluIGNhc2Ugb2YgYWZmaW5pdHlfbm9uZQorICAgICAgICBuZXdBZGRyID0gKEFkZHJVbnNQYWlyICopX19rbXBfYWxsb2NhdGUoIHNpemVvZihBZGRyVW5zUGFpcikgKgorICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgKiBfX2ttcF9wbGFjZV9udW1fY29yZXMgKiBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgblBhY2thZ2VzOyArK2kpIHsKKyAgICAgICAgaWYgKGkgPCBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0IHx8CisgICAgICAgICAgICBpID49IF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQgKyBfX2ttcF9wbGFjZV9udW1fc29ja2V0cykgeworICAgICAgICAgICAgbl9vbGQgKz0gbkNvcmVzUGVyUGtnICogX19rbXBfblRocmVhZHNQZXJDb3JlOyAvLyBza2lwIG5vdC1yZXF1ZXN0ZWQgc29ja2V0CisgICAgICAgICAgICBpZiAoX19rbXBfcHVfb3NfaWR4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbkNvcmVzUGVyUGtnOyArK2opIHsgLy8gd2FsayB0aHJvdWdoIHNraXBwZWQgc29ja2V0CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBfX2ttcF9uVGhyZWFkc1BlckNvcmU7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9DTFIoX19rbXBfcHVfb3NfaWR4W3Byb2NfbnVtXSwgX19rbXBfYWZmaW5fZnVsbE1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgKytwcm9jX251bTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuQ29yZXNQZXJQa2c7ICsraikgeyAvLyB3YWxrIHRocm91Z2ggcmVxdWVzdGVkIHNvY2tldAorICAgICAgICAgICAgICAgIGlmIChqIDwgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgfHwKKyAgICAgICAgICAgICAgICAgICAgaiA+PSBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCArIF9fa21wX3BsYWNlX251bV9jb3JlcykgeworICAgICAgICAgICAgICAgICAgICBuX29sZCArPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7IC8vIHNraXAgbm90LXJlcXVlc3RlZCBjb3JlCisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9wdV9vc19pZHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IF9fa21wX25UaHJlYWRzUGVyQ29yZTsgKytrKSB7IC8vIHdhbGsgdGhyb3VnaCBza2lwcGVkIGNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0NMUihfX2ttcF9wdV9vc19pZHhbcHJvY19udW1dLCBfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwcm9jX251bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBfX2ttcF9uVGhyZWFkc1BlckNvcmU7ICsraykgeyAvLyB3YWxrIHRocm91Z2ggcmVxdWVzdGVkIGNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrIDwgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkZHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FkZHJbbl9uZXddID0gKCpwQWRkcilbbl9vbGRdOyAvLyBjb2xsZWN0IHJlcXVlc3RlZCB0aHJlYWQncyBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9uZXcrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX3B1X29zX2lkeCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0NMUihfX2ttcF9wdV9vc19pZHhbcHJvY19udW1dLCBfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuX29sZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgKytwcm9jX251bTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKG5fb2xkID09IG5QYWNrYWdlcyAqIG5Db3Jlc1BlclBrZyAqIF9fa21wX25UaHJlYWRzUGVyQ29yZSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChuX25ldyA9PSBfX2ttcF9wbGFjZV9udW1fc29ja2V0cyAqIF9fa21wX3BsYWNlX251bV9jb3JlcyAqCisgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSk7CisKKyAgICBuUGFja2FnZXMgPSBfX2ttcF9wbGFjZV9udW1fc29ja2V0czsgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVjdCBuUGFja2FnZXMKKyAgICBuQ29yZXNQZXJQa2cgPSBfX2ttcF9wbGFjZV9udW1fY29yZXM7ICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVjdCBuQ29yZXNQZXJQa2cKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZTsgLy8gY29ycmVjdCBfX2ttcF9uVGhyZWFkc1BlckNvcmUKKyAgICBfX2ttcF9hdmFpbF9wcm9jID0gbl9uZXc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVjdCBhdmFpbF9wcm9jCisgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzICogX19rbXBfcGxhY2VfbnVtX2NvcmVzOyAgICAgICAgIC8vIGNvcnJlY3QgbmNvcmVzCisKKyAgICBpZiAocEFkZHIpIHsKKyAgICAgICAgX19rbXBfZnJlZSggKnBBZGRyICk7CisgICAgICAgICpwQWRkciA9IG5ld0FkZHI7ICAgICAgLy8gcmVwbGFjZSBvbGQgdG9wb2xvZ3kgd2l0aCBuZXcgb25lCisgICAgfQorX2V4aXQ6CisgICAgaWYgKF9fa21wX3B1X29zX2lkeCAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoX19rbXBfcHVfb3NfaWR4KTsKKyAgICAgICAgX19rbXBfcHVfb3NfaWR4ID0gTlVMTDsKKyAgICB9Cit9CisKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGZpZ3VyZXMgb3V0IHRoZSBkZWVwZXN0IGxldmVsIGF0IHdoaWNoIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjbHVzdGVyL2NvcmUKKy8vIHdpdGggbW9yZSB0aGFuIG9uZSBwcm9jZXNzaW5nIHVuaXQgYm91bmQgdG8gaXQuCisvLworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfZmluZF9jb3JlX2xldmVsKGNvbnN0IEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLCBpbnQgbnByb2NzLCBpbnQgYm90dG9tX2xldmVsKQoreworICAgIGludCBjb3JlX2xldmVsID0gMDsKKworICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnByb2NzOyBpKysgKSB7CisgICAgICAgIGZvciggaW50IGogPSBib3R0b21fbGV2ZWw7IGogPiAwOyBqLS0gKSB7CisgICAgICAgICAgICBpZiggYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbal0gPiAwICkgeworICAgICAgICAgICAgICAgIGlmKCBjb3JlX2xldmVsIDwgKCBqIC0gMSApICkgeworICAgICAgICAgICAgICAgICAgICBjb3JlX2xldmVsID0gaiAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3JlX2xldmVsOworfQorCisvLworLy8gVGhpcyBmdW5jdGlvbiBjb3VudHMgbnVtYmVyIG9mIGNsdXN0ZXJzL2NvcmVzIGF0IGdpdmVuIGxldmVsLgorLy8KK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfY29tcHV0ZV9uY29yZXMoY29uc3QgQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsIGludCBucHJvY3MsIGludCBib3R0b21fbGV2ZWwsIGludCBjb3JlX2xldmVsKQoreworICAgIGludCBuY29yZXMgPSAwOworICAgIGludCBpLCBqOworCisgICAgaiA9IGJvdHRvbV9sZXZlbDsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnByb2NzOyBpKysgKSB7CisgICAgICAgIGZvciAoIGogPSBib3R0b21fbGV2ZWw7IGogPiBjb3JlX2xldmVsOyBqLS0gKSB7CisgICAgICAgICAgICBpZiggKCBpICsgMSApIDwgbnByb2NzICkgeworICAgICAgICAgICAgICAgIGlmKCBhZGRyZXNzMm9zW2kgKyAxXS5maXJzdC5sYWJlbHNbal0gPiAwICkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoIGogPT0gY29yZV9sZXZlbCApIHsKKyAgICAgICAgICAgIG5jb3JlcysrOworICAgICAgICB9CisgICAgfQorICAgIGlmKCBqID4gY29yZV9sZXZlbCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW4gY2FzZSBvZiAoIG5wcm9jcyA8IF9fa21wX2F2YWlsX3Byb2MgKSB3ZSBtYXkgZW5kIHRvbyBkZWVwIGFuZCBtaXNzIG9uZSBjb3JlLgorICAgICAgICAvLyBNYXkgb2NjdXIgd2hlbiBjYWxsZWQgZnJvbSBfX2ttcF9hZmZpbml0eV9maW5kX2NvcmUoKS4KKyAgICAgICAgLy8KKyAgICAgICAgbmNvcmVzKys7CisgICAgfQorICAgIHJldHVybiBuY29yZXM7Cit9CisKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRvIHdoaWNoIGNsdXN0ZXIvY29yZSBnaXZlbiBwcm9jZXNzaW5nIHVuaXQgaXMgYm91bmQuCisvLworc3RhdGljIGludCBfX2ttcF9hZmZpbml0eV9maW5kX2NvcmUoY29uc3QgQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsIGludCBwcm9jLCBpbnQgYm90dG9tX2xldmVsLCBpbnQgY29yZV9sZXZlbCkKK3sKKyAgICByZXR1cm4gX19rbXBfYWZmaW5pdHlfY29tcHV0ZV9uY29yZXMoYWRkcmVzczJvcywgcHJvYyArIDEsIGJvdHRvbV9sZXZlbCwgY29yZV9sZXZlbCkgLSAxOworfQorCisvLworLy8gVGhpcyBmdW5jdGlvbiBmaW5kcyBtYXhpbWFsIG51bWJlciBvZiBwcm9jZXNzaW5nIHVuaXRzIGJvdW5kIHRvIGEgY2x1c3Rlci9jb3JlIGF0IGdpdmVuIGxldmVsLgorLy8KK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfbWF4X3Byb2NfcGVyX2NvcmUoY29uc3QgQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsIGludCBucHJvY3MsIGludCBib3R0b21fbGV2ZWwsIGludCBjb3JlX2xldmVsKQoreworICAgIGludCBtYXhwcm9jcGVyY29yZSA9IDA7CisKKyAgICBpZiggY29yZV9sZXZlbCA8IGJvdHRvbV9sZXZlbCApIHsKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBucHJvY3M7IGkrKyApIHsKKyAgICAgICAgICAgIGludCBwZXJjb3JlID0gYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbY29yZV9sZXZlbCArIDFdICsgMTsKKworICAgICAgICAgICAgaWYoIHBlcmNvcmUgPiBtYXhwcm9jcGVyY29yZSApIHsKKyAgICAgICAgICAgICAgICBtYXhwcm9jcGVyY29yZSA9IHBlcmNvcmU7CisgICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1heHByb2NwZXJjb3JlID0gMTsKKyAgICB9CisgICAgcmV0dXJuIG1heHByb2NwZXJjb3JlOworfQorCitzdGF0aWMgQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MgPSBOVUxMOworc3RhdGljIGludCAgICAgICAgICAgKiBwcm9jYXJyID0gTlVMTDsKK3N0YXRpYyBpbnQgICAgIF9fa21wX2FmZl9kZXB0aCA9IDA7CisKKyNkZWZpbmUgS01QX0VYSVRfQUZGX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7IFwKKyAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hcHBseV90aHJlYWRfcGxhY2VzKE5VTEwsIDApOyAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm47CisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2NoaWxkX251bShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IEFkZHJlc3MgKmFhID0gKGNvbnN0IEFkZHJlc3MgKikmKCgoQWRkclVuc1BhaXIgKilhKQorICAgICAgLT5maXJzdCk7CisgICAgY29uc3QgQWRkcmVzcyAqYmIgPSAoY29uc3QgQWRkcmVzcyAqKSYoKChBZGRyVW5zUGFpciAqKWIpCisgICAgICAtPmZpcnN0KTsKKyAgICB1bnNpZ25lZCBkZXB0aCA9IGFhLT5kZXB0aDsKKyAgICB1bnNpZ25lZCBpOworICAgIEtNUF9ERUJVR19BU1NFUlQoZGVwdGggPT0gYmItPmRlcHRoKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCh1bnNpZ25lZClfX2ttcF9hZmZpbml0eV9jb21wYWN0IDw9IGRlcHRoKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPj0gMCk7CisgICAgZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZClfX2ttcF9hZmZpbml0eV9jb21wYWN0OyBpKyspIHsKKyAgICAgICAgaW50IGogPSBkZXB0aCAtIGkgLSAxOworICAgICAgICBpZiAoYWEtPmNoaWxkTnVtc1tqXSA8IGJiLT5jaGlsZE51bXNbal0pIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPiBiYi0+Y2hpbGROdW1zW2pdKSByZXR1cm4gMTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgICAgIGludCBqID0gaSAtIF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdIDwgYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoYWEtPmNoaWxkTnVtc1tqXSA+IGJiLT5jaGlsZE51bXNbal0pIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplKHZvaWQpCit7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X21hc2tzICE9IE5VTEwpIHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbl9mdWxsTWFzayAhPSBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ3JlYXRlIHRoZSAiZnVsbCIgbWFzayAtIHRoaXMgZGVmaW5lcyBhbGwgb2YgdGhlIHByb2Nlc3NvcnMgdGhhdCB3ZQorICAgIC8vIGNvbnNpZGVyIHRvIGJlIGluIHRoZSBtYWNoaW5lIG1vZGVsLiAgSWYgcmVzcGVjdCBpcyBzZXQsIHRoZW4gaXQgaXMKKyAgICAvLyB0aGUgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MgYWZmaW5pdHkgbWFzay4gIE90aGVyd2lzZSwgaXQgaXMgYWxsCisgICAgLy8gcHJvY2Vzc29ycyB0aGF0IHdlIGtub3cgYWJvdXQgb24gdGhlIG1hY2hpbmUuCisgICAgLy8KKyAgICBpZiAoX19rbXBfYWZmaW5fZnVsbE1hc2sgPT0gTlVMTCkgeworICAgICAgICBLTVBfQ1BVX0FMTE9DKF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICB9CisgICAgaWYgKEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShfX2ttcF9hZmZpbl9mdWxsTWFzaywgVFJVRSk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHVuc2lnbmVkIGk7CisgICAgICAgICAgICBfX2ttcF9hdmFpbF9wcm9jID0gMDsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spIHsKKyAgICAgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYXZhaWxfcHJvYysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fa21wX2F2YWlsX3Byb2MgPiBfX2ttcF94cHJvYykgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEVycm9ySW5pdGlhbGl6ZUFmZmluaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9lbnRpcmVfbWFjaGluZV9tYXNrKF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBkZXB0aCA9IC0xOworICAgIGttcF9pMThuX2lkX3QgbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHNldHRpbmcgS01QX0NQVUlORk9fRklMRSA9PgorICAgIC8vIEtNUF9UT1BPTE9HWV9NRVRIT0Q9Y3B1aW5mbworICAgIC8vCisgICAgaWYgKChfX2ttcF9jcHVpbmZvX2ZpbGUgIT0gTlVMTCkgJiYKKyAgICAgIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsKSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNvZGUgcGF0aCwgZXJyb3JzIGFyZSBub3QgZmF0YWwgLSB3ZSBqdXN0IHRyeSB1c2luZworICAgICAgICAvLyBhbm90aGVyIG1ldGhvZC4gIFdlIG9ubHkgZW1pdCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBhZmZpbml0eSBpcyBvbiwKKyAgICAgICAgLy8gb3IgdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQsIGFuIHRoZSBub3dhcm5pbmdzIGZsYWcgd2FzIG5vdCBzZXQuCisgICAgICAgIC8vCisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSA9IE5VTEw7CisgICAgICAgIGludCBsaW5lID0gMDsKKyMgaWYgS01QX1VTRV9IV0xPQworICAgICAgICBpZiAoZGVwdGggPCAwICYmIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5nZXRfYXBpX3R5cGUoKSA9PSBLTVBBZmZpbml0eTo6SFdMT0MpIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2luZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighX19rbXBfaHdsb2NfZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9od2xvY19tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9FWElUX0FGRl9OT05FOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZihkZXB0aCA8IDAgJiYgX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZklnbm9yaW5nSHdsb2MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSWdub3JpbmdId2xvYywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjIGVuZGlmCisKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZJbmZvU3RyLCAiS01QX0FGRklOSVRZIiwgS01QX0kxOE5fU1RSKERlY29kaW5neDJBUElDKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IE5VTEw7CisgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZJbmZvU3RyU3RyLCAiS01QX0FGRklOSVRZIiwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JMThOX1NUUihEZWNvZGluZ0xlZ2FjeUFQSUMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0ciwgIktNUF9BRkZJTklUWSIsIEtNUF9JMThOX1NUUihEZWNvZGluZ0xlZ2FjeUFQSUMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0VYSVRfQUZGX05PTkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjIGlmIEtNUF9PU19MSU5VWAorCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmU3RyUGFyc2VGaWxlbmFtZSwgIktNUF9BRkZJTklUWSIsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpLCAiL3Byb2MvY3B1aW5mbyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZQYXJzZUZpbGVuYW1lLCAiS01QX0FGRklOSVRZIiwgIi9wcm9jL2NwdWluZm8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZJTEUgKmYgPSBmb3BlbigiL3Byb2MvY3B1aW5mbyIsICJyIik7CisgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbXNnX2lkID0ga21wX2kxOG5fc3RyX0NhbnRPcGVuQ3B1aW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9ICIvcHJvYy9jcHVpbmZvIjsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcCgmYWRkcmVzczJvcywgJmxpbmUsICZtc2dfaWQsIGYpOworICAgICAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworIyBlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworICAgICAgICBpZiAoKGRlcHRoIDwgMCkgJiYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmV2luZG93c1Byb2NHcm91cE1hcCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9wcm9jX2dyb3VwX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGRlcHRoICE9IDApOworICAgICAgICB9CisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgJiYgKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKSkgeworICAgICAgICAgICAgICAgIGlmIChmaWxlX25hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVzaW5nRmxhdE9TLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVzaW5nRmxhdE9TRmlsZSwgZmlsZV9uYW1lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVzaW5nRmxhdE9TRmlsZUxpbmUsIGZpbGVfbmFtZSwgbGluZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZJWE1FIC0gcHJpbnQgbXNnIGlmIG1zZ19pZCA9IGttcF9pMThuX251bGwgPz8/CisKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9ICIiOworICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggPiAwKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGF0IGEgcGFyaWN1bGFyIHRvcG9sb2d5IGRpc2NvdmVyeSBtZXRob2QKKyAgICAvLyBpcyB0byBiZSB1c2VkLCB0aGVuIHdlIGFib3J0IGlmIHRoYXQgbWV0aG9kIGZhaWxzLiAgVGhlIGV4Y2VwdGlvbiBpcworICAgIC8vIGdyb3VwIGFmZmluaXR5LCB3aGljaCBtaWdodCBoYXZlIGJlZW4gaW1wbGljaXRseSBzZXQuCisgICAgLy8KKworIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0ciwgIktNUF9BRkZJTklUWSIsCisgICAgICAgICAgICAgIEtNUF9JMThOX1NUUihEZWNvZGluZ3gyQVBJQykpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9FWElUX0FGRl9OT05FOworICAgICAgICB9CisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobXNnX2lkICE9IGttcF9pMThuX251bGwpOworICAgICAgICAgICAgS01QX0ZBVEFMKE1zZ0V4aXRpbmcsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLAorICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgIH0KKworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9FWElUX0FGRl9OT05FOworICAgICAgICB9CisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobXNnX2lkICE9IGttcF9pMThuX251bGwpOworICAgICAgICAgICAgS01QX0ZBVEFMKE1zZ0V4aXRpbmcsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbykgeworICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICAgICAgaWYgKF9fa21wX2NwdWluZm9fZmlsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmaWxlbmFtZSA9IF9fa21wX2NwdWluZm9fZmlsZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZpbGVuYW1lID0gIi9wcm9jL2NwdWluZm8iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmUGFyc2VGaWxlbmFtZSwgIktNUF9BRkZJTklUWSIsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEZJTEUgKmYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgICAgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGNvZGUgPSBlcnJubzsKKyAgICAgICAgICAgIGlmIChfX2ttcF9jcHVpbmZvX2ZpbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKENhbnRPcGVuRmlsZUZvclJlYWRpbmcsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVChOYW1lQ29tZXNGcm9tX0NQVUlORk9fRklMRSksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKENhbnRPcGVuRmlsZUZvclJlYWRpbmcsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBsaW5lID0gMDsKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoJmFkZHJlc3Myb3MsICZsaW5lLCAmbXNnX2lkLCBmKTsKKyAgICAgICAgZmNsb3NlKGYpOworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIGlmIChsaW5lID4gMCkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTChGaWxlTGluZU1zZ0V4aXRpbmcsIGZpbGVuYW1lLCBsaW5lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoRmlsZU1zZ0V4aXRpbmcsIGZpbGVuYW1lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICAgICAgS01QX0FTU0VSVChkZXB0aCA9PSAwKTsKKyAgICAgICAgICAgIEtNUF9FWElUX0FGRl9OT05FOworICAgICAgICB9CisgICAgfQorCisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZldpbmRvd3NQcm9jR3JvdXBNYXAsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3Byb2NfZ3JvdXBfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgS01QX0FTU0VSVChkZXB0aCAhPSAwKTsKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCk7CisgICAgICAgICAgICBLTVBfRkFUQUwoTXNnRXhpdGluZywgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICB9CisgICAgfQorCisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdGbGF0T1MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2ZsYXRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9FWElUX0FGRl9OT05FOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZCBub3QgZmFpbAorICAgICAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyAhPSBOVUxMKTsKKyAgICB9CisKKyMgaWYgS01QX1VTRV9IV0xPQworICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9od2xvYykgeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5nZXRfYXBpX3R5cGUoKSA9PSBLTVBBZmZpbml0eTo6SFdMT0MpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZVc2luZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfaHdsb2NfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIEtNUF9FWElUX0FGRl9OT05FOworICAgICAgICB9CisgICAgfQorIyBlbmRpZiAvLyBLTVBfVVNFX0hXTE9DCisKKyAgICBpZiAoYWRkcmVzczJvcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoRXJyb3JJbml0aWFsaXplQWZmaW5pdHkpOworICAgICAgICB9CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX19rbXBfYXBwbHlfdGhyZWFkX3BsYWNlcygmYWRkcmVzczJvcywgZGVwdGgpOworCisgICAgLy8KKyAgICAvLyBDcmVhdGUgdGhlIHRhYmxlIG9mIG1hc2tzLCBpbmRleGVkIGJ5IHRocmVhZCBJZC4KKyAgICAvLworICAgIHVuc2lnbmVkIG1heEluZGV4OworICAgIHVuc2lnbmVkIG51bVVuaXF1ZTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2sgPSBfX2ttcF9jcmVhdGVfbWFza3MoJm1heEluZGV4LCAmbnVtVW5pcXVlLAorICAgICAgYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID09IDApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgoaW50KW51bVVuaXF1ZSA9PSBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNldCB0aGUgY2hpbGROdW1zIHZlY3RvciBpbiBhbGwgQWRkcmVzcyBvYmplY3RzLiAgVGhpcyBtdXN0IGJlIGRvbmUKKyAgICAvLyBiZWZvcmUgd2UgY2FuIHNvcnQgdXNpbmcgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfY2hpbGRfbnVtKCksCisgICAgLy8gd2hpY2ggdGFrZXMgaW50byBhY2NvdW50IHRoZSBzZXR0aW5nIG9mIF9fa21wX2FmZmluaXR5X2NvbXBhY3QuCisgICAgLy8KKyAgICBfX2ttcF9hZmZpbml0eV9hc3NpZ25fY2hpbGRfbnVtcyhhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgIHN3aXRjaCAoX19rbXBfYWZmaW5pdHlfdHlwZSkgeworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfZXhwbGljaXQ6CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgIT0gTlVMTCk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ludGVsKQorIyBlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jZXNzX3Byb2NsaXN0KCZfX2ttcF9hZmZpbml0eV9tYXNrcywKKyAgICAgICAgICAgICAgJl9fa21wX2FmZmluaXR5X251bV9tYXNrcywgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsIG9zSWQyTWFzaywKKyAgICAgICAgICAgICAgbWF4SW5kZXgpOworICAgICAgICB9CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wbGFjZWxpc3QoJl9fa21wX2FmZmluaXR5X21hc2tzLAorICAgICAgICAgICAgICAmX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzLCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCwgb3NJZDJNYXNrLAorICAgICAgICAgICAgICBtYXhJbmRleCk7CisgICAgICAgIH0KKyMgZW5kaWYKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmTm9WYWxpZFByb2NJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgb3RoZXIgYWZmaW5pdHkgdHlwZXMgcmVseSBvbiBzb3J0aW5nIHRoZSBBZGRyZXNzZXMgYWNjb3JkaW5nCisgICAgICAgIC8vIHRvIHNvbWUgcGVybXV0YXRpb24gb2YgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdHJlZS4gIFNldAorICAgICAgICAvLyBfX2ttcF9hZmZpbml0eV9jb21wYWN0IGFuZCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgYXBwcm9wcmlhdGVseSwKKyAgICAgICAgLy8gdGhlbiBqdW1wIHRvIGEgY29tbW9uIGNvZGUgZnJhZ21lbnQgdG8gZG8gdGhlIHNvcnQgYW5kIGNyZWF0ZQorICAgICAgICAvLyB0aGUgYXJyYXkgb2YgYWZmaW5pdHkgbWFza3MuCisgICAgICAgIC8vCisKKyAgICAgICAgY2FzZSBhZmZpbml0eV9sb2dpY2FsOgorICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X29mZnNldCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ID0gX19rbXBfblRocmVhZHNQZXJDb3JlICogX19rbXBfYWZmaW5pdHlfb2Zmc2V0CisgICAgICAgICAgICAgICUgX19rbXBfYXZhaWxfcHJvYzsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHNvcnRBZGRyZXNzZXM7CisKKyAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDoKKyAgICAgICAgaWYgKF9fa21wX25UaHJlYWRzUGVyQ29yZSA+IDEpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAxOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPj0gZGVwdGgpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9vZmZzZXQpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCA9IF9fa21wX25UaHJlYWRzUGVyQ29yZSAqIF9fa21wX2FmZmluaXR5X29mZnNldAorICAgICAgICAgICAgICAlIF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfc2NhdHRlcjoKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPj0gZGVwdGgpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IGRlcHRoIC0gMSAtIF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDoKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPj0gZGVwdGgpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSBkZXB0aCAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfYmFsYW5jZWQ6CisgICAgICAgIGlmKCBkZXB0aCA8PSAxICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkJhbGFuY2VkTm90QXZhaWwsICJLTVBfQUZGSU5JVFkiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsgLy8gTm9uLXVuaWZvcm0gdG9wb2xvZ3kKKworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgZGVwdGggZm9yIGZ1cnRoZXIgdXNhZ2UKKyAgICAgICAgICAgIF9fa21wX2FmZl9kZXB0aCA9IGRlcHRoOworCisgICAgICAgICAgICBpbnQgY29yZV9sZXZlbCA9IF9fa21wX2FmZmluaXR5X2ZpbmRfY29yZV9sZXZlbChhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLCBkZXB0aCAtIDEpOworICAgICAgICAgICAgaW50IG5jb3JlcyA9IF9fa21wX2FmZmluaXR5X2NvbXB1dGVfbmNvcmVzKGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MsIGRlcHRoIC0gMSwgY29yZV9sZXZlbCk7CisgICAgICAgICAgICBpbnQgbWF4cHJvY3BlcmNvcmUgPSBfX2ttcF9hZmZpbml0eV9tYXhfcHJvY19wZXJfY29yZShhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLCBkZXB0aCAtIDEsIGNvcmVfbGV2ZWwpOworCisgICAgICAgICAgICBpbnQgbnByb2MgPSBuY29yZXMgKiBtYXhwcm9jcGVyY29yZTsKKyAgICAgICAgICAgIGlmKCAoIG5wcm9jIDwgMiApIHx8ICggbnByb2MgPCBfX2ttcF9hdmFpbF9wcm9jICkgKSB7CisgICAgICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZCYWxhbmNlZE5vdEF2YWlsLCAiS01QX0FGRklOSVRZIiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb2NhcnIgPSAoIGludCAqIClfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBpbnQgKSAqIG5wcm9jICk7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgcHJvY2FyclsgaSBdID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBsYXN0Y29yZSA9IC0xOworICAgICAgICAgICAgaW50IGlubGFzdGNvcmUgPSAwOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9hdmFpbF9wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaW50IHByb2MgPSBhZGRyZXNzMm9zWyBpIF0uc2Vjb25kOworICAgICAgICAgICAgICAgIGludCBjb3JlID0gX19rbXBfYWZmaW5pdHlfZmluZF9jb3JlKGFkZHJlc3Myb3MsIGksIGRlcHRoIC0gMSwgY29yZV9sZXZlbCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGNvcmUgPT0gbGFzdGNvcmUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlubGFzdGNvcmUrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbmxhc3Rjb3JlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdGNvcmUgPSBjb3JlOworCisgICAgICAgICAgICAgICAgcHJvY2FyclsgY29yZSAqIG1heHByb2NwZXJjb3JlICsgaW5sYXN0Y29yZSBdID0gcHJvYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzb3J0QWRkcmVzc2VzOgorICAgICAgICAvLworICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgZ3RpZC0+YWZmaW5pdHkgbWFzayB0YWJsZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2R1cHMpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSBudW1VbmlxdWU7CisgICAgICAgIH0KKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdICE9IHByb2NfYmluZF9pbnRlbCApCisgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID4gMCApCisgICAgICAgICAgJiYgKCAodW5zaWduZWQpX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA8IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyApICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlczsKKyAgICAgICAgfQorIyBlbmRpZgorCisgICAgICAgIEtNUF9DUFVfQUxMT0NfQVJSQVkoX19rbXBfYWZmaW5pdHlfbWFza3MsIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU29ydCB0aGUgYWRkcmVzczJvcyB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2V0dGluZyBvZgorICAgICAgICAvLyBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCB0aGVuIGZpbGwgb3V0IF9fa21wX2FmZmluaXR5X21hc2tzLgorICAgICAgICAvLworICAgICAgICBxc29ydChhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLCBzaXplb2YoKmFkZHJlc3Myb3MpLAorICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2NoaWxkX251bSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgdW5zaWduZWQgajsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgX19rbXBfYXZhaWxfcHJvYzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCghIF9fa21wX2FmZmluaXR5X2R1cHMpICYmICghIGFkZHJlc3Myb3NbaV0uZmlyc3QubGVhZGVyKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3NbaV0uc2Vjb25kOworICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKnNyYyA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICpkZXN0CisgICAgICAgICAgICAgICAgICA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIGopOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoS01QX0NQVV9JU1NFVChvc0lkLCBzcmMpKTsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKTsKKyAgICAgICAgICAgICAgICBpZiAoKytqID49IF9fa21wX2FmZmluaXR5X251bV9tYXNrcykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGogPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICBLTVBfQVNTRVJUMigwLCAiVW5leHBlY3RlZCBhZmZpbml0eSBzZXR0aW5nIik7CisgICAgfQorCisgICAgS01QX0NQVV9GUkVFX0FSUkFZKG9zSWQyTWFzaywgbWF4SW5kZXgrMSk7CisgICAgbWFjaGluZV9oaWVyYXJjaHkuaW5pdChhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jKTsKK30KKyN1bmRlZiBLTVBfRVhJVF9BRkZfTk9ORQorCisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2luaXRpYWxpemUodm9pZCkKK3sKKyAgICAvLworICAgIC8vIE11Y2ggb2YgdGhlIGNvZGUgYWJvdmUgd2FzIHdyaXR0ZW4gYXNzdW1taW5nIHRoYXQgaWYgYSBtYWNoaW5lIHdhcyBub3QKKyAgICAvLyBhZmZpbml0eSBjYXBhYmxlLCB0aGVuIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZS4gIFdlIG5vdworICAgIC8vIGV4cGxpY2l0bHkgcmVwcmVzZW50IHRoaXMgYXMgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZC4KKyAgICAvLworICAgIC8vIFRoZXJlIGFyZSB0b28gbWFueSBjaGVja3MgZm9yIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZQorICAgIC8vIGluIHRoaXMgY29kZS4gIEluc3RlYWQgb2YgdHJ5aW5nIHRvIGNoYW5nZSB0aGVtIGFsbCwgY2hlY2sgaWYKKyAgICAvLyBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkLCBhbmQgaWYgc28sIHNsYW0gaXQgd2l0aAorICAgIC8vIGFmZmluaXR5X25vbmUsIGNhbGwgdGhlIHJlYWwgaW5pdGlhbGl6YXRpb24gcm91dGluZSwgdGhlbiByZXN0b3JlCisgICAgLy8gX19rbXBfYWZmaW5pdHlfdHlwZSB0byBhZmZpbml0eV9kaXNhYmxlZC4KKyAgICAvLworICAgIGludCBkaXNhYmxlZCA9IChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkKTsKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIEtNUF9BU1NFUlQoZGlzYWJsZWQpOworICAgIH0KKyAgICBpZiAoZGlzYWJsZWQpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgfQorICAgIF9fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplKCk7CisgICAgaWYgKGRpc2FibGVkKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyAgICB9Cit9CisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKHZvaWQpCit7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X21hc2tzICE9IE5VTEwpIHsKKyAgICAgICAgS01QX0NQVV9GUkVFX0FSUkFZKF9fa21wX2FmZmluaXR5X21hc2tzLCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpOworICAgICAgICBfX2ttcF9hZmZpbml0eV9tYXNrcyA9IE5VTEw7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbl9mdWxsTWFzayAhPSBOVUxMKSB7CisgICAgICAgIEtNUF9DUFVfRlJFRShfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisgICAgICAgIF9fa21wX2FmZmluX2Z1bGxNYXNrID0gTlVMTDsKKyAgICB9CisgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gMDsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID0gMDsKKyMgZW5kaWYKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9mcmVlKF9fa21wX2FmZmluaXR5X3Byb2NsaXN0KTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgPSBOVUxMOworICAgIH0KKyAgICBpZiggYWRkcmVzczJvcyAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9mcmVlKCBhZGRyZXNzMm9zICk7CisgICAgICAgIGFkZHJlc3Myb3MgPSBOVUxMOworICAgIH0KKyAgICBpZiggcHJvY2FyciAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9mcmVlKCBwcm9jYXJyICk7CisgICAgICAgIHByb2NhcnIgPSBOVUxMOworICAgIH0KKyMgaWYgS01QX1VTRV9IV0xPQworICAgIGlmIChfX2ttcF9od2xvY190b3BvbG9neSAhPSBOVUxMKSB7CisgICAgICAgIGh3bG9jX3RvcG9sb2d5X2Rlc3Ryb3koX19rbXBfaHdsb2NfdG9wb2xvZ3kpOworICAgICAgICBfX2ttcF9od2xvY190b3BvbG9neSA9IE5VTEw7CisgICAgfQorIyBlbmRpZgorICAgIEtNUEFmZmluaXR5OjpkZXN0cm95X2FwaSgpOworfQorCisKK3ZvaWQKK19fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soaW50IGd0aWQsIGludCBpc2Ffcm9vdCkKK3sKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrbXBfaW5mb190ICp0aCA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0pOworICAgIGlmICh0aC0+dGgudGhfYWZmaW5fbWFzayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9DUFVfQUxMT0ModGgtPnRoLnRoX2FmZmluX21hc2spOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0NQVV9aRVJPKHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvcHkgdGhlIHRocmVhZCBtYXNrIHRvIHRoZSBrbXBfaW5mb190IHN0cnVjdXR1cmUuCisgICAgLy8gSWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lLCBjb3B5IHRoZSAiZnVsbCIgbWFzaywgaS5lLiBvbmUKKyAgICAvLyB0aGF0IGhhcyBhbGwgb2YgdGhlIE9TIHByb2MgaWRzIHNldCwgb3IgaWYgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrCisgICAgLy8gaXMgc2V0LCB0aGVuIHRoZSBmdWxsIG1hc2sgaXMgdGhlIHNhbWUgYXMgdGhlIG1hc2sgb2YgdGhlIGluaXRpYWxpemF0aW9uCisgICAgLy8gdGhyZWFkLgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzazsKKyAgICBpbnQgaTsKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ludGVsKQorIyBlbmRpZgorICAgIHsKKyAgICAgICAgaWYgKChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHx8IChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2JhbGFuY2VkKQorICAgICAgICAgICkgeworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgICAgICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorIyBlbmRpZgorICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbl9mdWxsTWFzayAhPSBOVUxMKTsKKyAgICAgICAgICAgIGkgPSBLTVBfUExBQ0VfQUxMOworICAgICAgICAgICAgbWFzayA9IF9fa21wX2FmZmluX2Z1bGxNYXNrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID4gMCApOworICAgICAgICAgICAgaSA9IChndGlkICsgX19rbXBfYWZmaW5pdHlfb2Zmc2V0KSAlIF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKKyAgICAgICAgICAgIG1hc2sgPSBLTVBfQ1BVX0lOREVYKF9fa21wX2FmZmluaXR5X21hc2tzLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCghIGlzYV9yb290KQorICAgICAgICAgIHx8IChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ZhbHNlKSkgeworIyAgaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyMgIGVuZGlmCisgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluX2Z1bGxNYXNrICE9IE5VTEwpOworICAgICAgICAgICAgaSA9IEtNUF9QTEFDRV9BTEw7CisgICAgICAgICAgICBtYXNrID0gX19rbXBfYWZmaW5fZnVsbE1hc2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gaW50IGkgPSBzb21lIGhhc2ggZnVuY3Rpb24gb3IganVzdCBhIGNvdW50ZXIgdGhhdCBkb2Vzbid0CisgICAgICAgICAgICAvLyBhbHdheXMgc3RhcnQgYXQgMC4gIFVzZSBndGlkIGZvciBub3cuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID4gMCApOworICAgICAgICAgICAgaSA9IChndGlkICsgX19rbXBfYWZmaW5pdHlfb2Zmc2V0KSAlIF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKKyAgICAgICAgICAgIG1hc2sgPSBLTVBfQ1BVX0lOREVYKF9fa21wX2FmZmluaXR5X21hc2tzLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyMgZW5kaWYKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRoLT50aC50aF9jdXJyZW50X3BsYWNlID0gaTsKKyAgICBpZiAoaXNhX3Jvb3QpIHsKKyAgICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IGk7CisgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IDA7CisgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMTsKKyAgICB9CisKKyAgICBpZiAoaSA9PSBLTVBfUExBQ0VfQUxMKSB7CisgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrOiBiaW5kaW5nIFQjJWQgdG8gYWxsIHBsYWNlc1xuIiwKKyAgICAgICAgICBndGlkKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIHBsYWNlICVkXG4iLAorICAgICAgICAgIGd0aWQsIGkpKTsKKyAgICB9CisjIGVsc2UKKyAgICBpZiAoaSA9PSAtMSkgeworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIF9fa21wX2FmZmluX2Z1bGxNYXNrXG4iLAorICAgICAgICAgIGd0aWQpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrOiBiaW5kaW5nIFQjJWQgdG8gbWFzayAlZFxuIiwKKyAgICAgICAgICBndGlkLCBpKSk7CisgICAgfQorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgS01QX0NQVV9DT1BZKHRoLT50aC50aF9hZmZpbl9tYXNrLCBtYXNrKTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgdGgtPnRoLnRoX2FmZmluX21hc2spOworICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCAoa21wX2ludDMyKWdldHBpZCgpLCBndGlkLAorICAgICAgICAgIGJ1Zik7CisgICAgfQorCisjIGlmIEtNUF9PU19XSU5ET1dTCisgICAgLy8KKyAgICAvLyBPbiBXaW5kb3dzKiBPUywgdGhlIHByb2Nlc3MgYWZmaW5pdHkgbWFzayBtaWdodCBoYXZlIGNoYW5nZWQuCisgICAgLy8gSWYgdGhlIHVzZXIgZGlkbid0IHJlcXVlc3QgYWZmaW5pdHkgYW5kIHRoaXMgY2FsbCBmYWlscywKKyAgICAvLyBqdXN0IGNvbnRpbnVlIHNpbGVudGx5LiAgU2VlIENRMTcxMzkzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUgKSB7CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkodGgtPnRoLnRoX2FmZmluX21hc2ssIEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorIyBlbmRpZgorICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkodGgtPnRoLnRoX2FmZmluX21hc2ssIFRSVUUpOworfQorCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKwordm9pZAorX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlKGludCBndGlkKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrbXBfaW5mb190ICp0aCA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0pOworCisgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9wbGFjZTogYmluZGluZyBUIyVkIHRvIHBsYWNlICVkIChjdXJyZW50IHBsYWNlID0gJWQpXG4iLAorICAgICAgZ3RpZCwgdGgtPnRoLnRoX25ld19wbGFjZSwgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UpKTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbmV3IHBsYWNlIGlzIHdpdGhpbiB0aGlzIHRocmVhZCdzIHBhcnRpdGlvbi4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX2FmZmluX21hc2sgIT0gTlVMTCk7CisgICAgS01QX0FTU0VSVCh0aC0+dGgudGhfbmV3X3BsYWNlID49IDApOworICAgIEtNUF9BU1NFUlQoKHVuc2lnbmVkKXRoLT50aC50aF9uZXdfcGxhY2UgPD0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKTsKKyAgICBpZiAodGgtPnRoLnRoX2ZpcnN0X3BsYWNlIDw9IHRoLT50aC50aF9sYXN0X3BsYWNlKSB7CisgICAgICAgIEtNUF9BU1NFUlQoKHRoLT50aC50aF9uZXdfcGxhY2UgPj0gdGgtPnRoLnRoX2ZpcnN0X3BsYWNlKQorICAgICAgICAgJiYgKHRoLT50aC50aF9uZXdfcGxhY2UgPD0gdGgtPnRoLnRoX2xhc3RfcGxhY2UpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9BU1NFUlQoKHRoLT50aC50aF9uZXdfcGxhY2UgPD0gdGgtPnRoLnRoX2ZpcnN0X3BsYWNlKQorICAgICAgICAgfHwgKHRoLT50aC50aF9uZXdfcGxhY2UgPj0gdGgtPnRoLnRoX2xhc3RfcGxhY2UpKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvcHkgdGhlIHRocmVhZCBtYXNrIHRvIHRoZSBrbXBfaW5mb190IHN0cnVjdXR1cmUsCisgICAgLy8gYW5kIHNldCB0aGlzIHRocmVhZCdzIGFmZmluaXR5LgorICAgIC8vCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsCisgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlKTsKKyAgICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIG1hc2spOworICAgIHRoLT50aC50aF9jdXJyZW50X3BsYWNlID0gdGgtPnRoLnRoX25ld19wbGFjZTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgdGgtPnRoLnRoX2FmZmluX21hc2spOworICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJPTVBfUFJPQ19CSU5EIiwgKGttcF9pbnQzMilnZXRwaWQoKSwKKyAgICAgICAgICBndGlkLCBidWYpOworICAgIH0KKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KHRoLT50aC50aF9hZmZpbl9tYXNrLCBUUlVFKTsKK30KKworIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisKK2ludAorX19rbXBfYXV4X3NldF9hZmZpbml0eSh2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfaW5mb190ICp0aDsKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgICAgIF9fa21wX2RlYnVnX3ByaW50Zigia21wX3NldF9hZmZpbml0eTogc2V0dGluZyBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHByb2M7CisgICAgICAgICAgICBpbnQgbnVtX3Byb2NzID0gMDsKKworICAgICAgICAgICAgS01QX0NQVV9TRVRfSVRFUkFURShwcm9jLCAoKGttcF9hZmZpbl9tYXNrX3QqKSgqbWFzaykpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnVtX3Byb2NzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtX3Byb2NzID09IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgICAgIH0KKworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgICAgICAgIGlmIChfX2ttcF9nZXRfcHJvY19ncm91cCgoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpIDwgMCkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eSIpOworICAgICAgICAgICAgfQorIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgICAgICB9CisgICAgfQorCisgICAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX2FmZmluX21hc2sgIT0gTlVMTCk7CisgICAgcmV0dmFsID0gX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSgoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzayksIEZBTFNFKTsKKyAgICBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgS01QX0NQVV9DT1BZKHRoLT50aC50aF9hZmZpbl9tYXNrLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgIH0KKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRoLT50aC50aF9jdXJyZW50X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSAwOworICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMTsKKworICAgIC8vCisgICAgLy8gVHVybiBvZmYgNC4wIGFmZmluaXR5IGZvciB0aGUgY3VycmVudCB0cmVhZCBhdCB0aGlzIHBhcmFsbGVsIGxldmVsLgorICAgIC8vCisgICAgdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZmFsc2U7CisjIGVuZGlmCisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKK2ludAorX19rbXBfYXV4X2dldF9hZmZpbml0eSh2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBpbnQgcmV0dmFsOworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKTsKKworICAgIEtBX1RSQUNFKDEwMDAsIDt7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgdGgtPnRoLnRoX2FmZmluX21hc2spOworICAgICAgICBfX2ttcF9wcmludGYoImttcF9nZXRfYWZmaW5pdHk6IHN0b3JlZCBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfZ2V0X2FmZmluaXR5Iik7CisgICAgICAgIH0KKyAgICB9CisKKyMgaWYgIUtNUF9PU19XSU5ET1dTCisKKyAgICByZXR2YWwgPSBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSwgRkFMU0UpOworICAgIEtBX1RSQUNFKDEwMDAsIDt7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJrbXBfZ2V0X2FmZmluaXR5OiBzeXN0ZW0gYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisgICAgcmV0dXJuIHJldHZhbDsKKworIyBlbHNlCisKKyAgICBLTVBfQ1BVX0NPUFkoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spLCB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgcmV0dXJuIDA7CisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworfQorCitpbnQKK19fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSB7CisgICAgaWYgKCEgIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgIGlmICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSApIHsKKyAgICAgICAgcmV0dXJuIChpbnQpKF9fa21wX251bV9wcm9jX2dyb3VwcypzaXplb2YoRFdPUkRfUFRSKSpDSEFSX0JJVCk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIF9fa21wX3hwcm9jOworfQorCitpbnQKK19fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYzogc2V0dGluZyBwcm9jICVkIGluIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLAorICAgICAgICAgIHByb2MsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocHJvYyA8IDApIHx8IChwcm9jID49IF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgICAgS01QX0NQVV9TRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQKK19fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2M6IHVuc2V0dGluZyBwcm9jICVkIGluIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLAorICAgICAgICAgIHByb2MsIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkgfHwgKHByb2MgPj0gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXhfcHJvYygpKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICBLTVBfQ1BVX0NMUihwcm9jLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgIHJldHVybiAwOworfQorCisKK2ludAorX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jOiBnZXR0aW5nIHByb2MgJWQgaW4gYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgcHJvYywgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkgfHwgKHByb2MgPj0gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXhfcHJvYygpKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBLTVBfQ1BVX0lTU0VUKHByb2MsIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7Cit9CisKKworLy8gRHluYW1pYyBhZmZpbml0eSBzZXR0aW5ncyAtIEFmZmluaXR5IGJhbGFuY2VkCit2b2lkIF9fa21wX2JhbGFuY2VkX2FmZmluaXR5KCBpbnQgdGlkLCBpbnQgbnRocmVhZHMgKQoreworICAgIGJvb2wgZmluZV9ncmFuID0gdHJ1ZTsKKworICAgIHN3aXRjaCAoX19rbXBfYWZmaW5pdHlfZ3JhbikgeworICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fZmluZToKKyAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX3RocmVhZDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fY29yZToKKyAgICAgICAgICAgIGlmKCBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPiAxKSB7CisgICAgICAgICAgICAgICAgZmluZV9ncmFuID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX3BhY2thZ2U6CisgICAgICAgICAgICBpZiggbkNvcmVzUGVyUGtnID4gMSkgeworICAgICAgICAgICAgICAgIGZpbmVfZ3JhbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmaW5lX2dyYW4gPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiggX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpICkgeworICAgICAgICBpbnQgY29yZUlEOworICAgICAgICBpbnQgdGhyZWFkSUQ7CisgICAgICAgIC8vIE51bWJlciBvZiBoeXBlciB0aHJlYWRzIHBlciBjb3JlIGluIEhUIG1hY2hpbmUKKyAgICAgICAgaW50IF9fa21wX250aF9wZXJfY29yZSA9IF9fa21wX2F2YWlsX3Byb2MgLyBfX2ttcF9uY29yZXM7CisgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcworICAgICAgICBpbnQgbmNvcmVzID0gX19rbXBfbmNvcmVzOworICAgICAgICBpZiggKCBuUGFja2FnZXMgPiAxICkgJiYgKCBfX2ttcF9udGhfcGVyX2NvcmUgPD0gMSApICkgeworICAgICAgICAgICAgX19rbXBfbnRoX3Blcl9jb3JlID0gX19rbXBfYXZhaWxfcHJvYyAvIG5QYWNrYWdlczsKKyAgICAgICAgICAgIG5jb3JlcyA9IG5QYWNrYWdlczsKKyAgICAgICAgfQorICAgICAgICAvLyBIb3cgbWFueSB0aHJlYWRzIHdpbGwgYmUgYm91bmQgdG8gZWFjaCBjb3JlCisgICAgICAgIGludCBjaHVuayA9IG50aHJlYWRzIC8gbmNvcmVzOworICAgICAgICAvLyBIb3cgbWFueSBjb3JlcyB3aWxsIGhhdmUgYW4gYWRkaXRpb25hbCB0aHJlYWQgYm91bmQgdG8gaXQgLSAiYmlnIGNvcmVzIgorICAgICAgICBpbnQgYmlnX2NvcmVzID0gbnRocmVhZHMgJSBuY29yZXM7CisgICAgICAgIC8vIE51bWJlciBvZiB0aHJlYWRzIG9uIHRoZSBiaWcgY29yZXMKKyAgICAgICAgaW50IGJpZ19udGggPSAoIGNodW5rICsgMSApICogYmlnX2NvcmVzOworICAgICAgICBpZiggdGlkIDwgYmlnX250aCApIHsKKyAgICAgICAgICAgIGNvcmVJRCA9IHRpZCAvIChjaHVuayArIDEgKTsKKyAgICAgICAgICAgIHRocmVhZElEID0gKCB0aWQgJSAoY2h1bmsgKyAxICkgKSAlIF9fa21wX250aF9wZXJfY29yZSA7CisgICAgICAgIH0gZWxzZSB7IC8vdGlkID49IGJpZ19udGgKKyAgICAgICAgICAgIGNvcmVJRCA9ICggdGlkIC0gYmlnX2NvcmVzICkgLyBjaHVuazsKKyAgICAgICAgICAgIHRocmVhZElEID0gKCAoIHRpZCAtIGJpZ19jb3JlcyApICUgY2h1bmsgKSAlIF9fa21wX250aF9wZXJfY29yZSA7CisgICAgICAgIH0KKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2s7CisgICAgICAgIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0sobWFzayk7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworICAgICAgICBpZiggZmluZV9ncmFuICkgeworICAgICAgICAgICAgaW50IG9zSUQgPSBhZGRyZXNzMm9zWyBjb3JlSUQgKiBfX2ttcF9udGhfcGVyX2NvcmUgKyB0aHJlYWRJRCBdLnNlY29uZDsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgX19rbXBfbnRoX3Blcl9jb3JlOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaW50IG9zSUQ7CisgICAgICAgICAgICAgICAgb3NJRCA9IGFkZHJlc3Myb3NbIGNvcmVJRCAqIF9fa21wX250aF9wZXJfY29yZSArIGkgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbWFzayk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCAoa21wX2ludDMyKWdldHBpZCgpLAorICAgICAgICAgICAgICB0aWQsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggbWFzaywgVFJVRSApOworICAgICAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhtYXNrKTsKKyAgICB9IGVsc2UgeyAvLyBOb24tdW5pZm9ybSB0b3BvbG9neQorCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2s7CisgICAgICAgIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0sobWFzayk7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworICAgICAgICBpbnQgY29yZV9sZXZlbCA9IF9fa21wX2FmZmluaXR5X2ZpbmRfY29yZV9sZXZlbChhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLCBfX2ttcF9hZmZfZGVwdGggLSAxKTsKKyAgICAgICAgaW50IG5jb3JlcyA9IF9fa21wX2FmZmluaXR5X2NvbXB1dGVfbmNvcmVzKGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MsIF9fa21wX2FmZl9kZXB0aCAtIDEsIGNvcmVfbGV2ZWwpOworICAgICAgICBpbnQgbnRoX3Blcl9jb3JlID0gX19rbXBfYWZmaW5pdHlfbWF4X3Byb2NfcGVyX2NvcmUoYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYywgX19rbXBfYWZmX2RlcHRoIC0gMSwgY29yZV9sZXZlbCk7CisKKyAgICAgICAgLy8gRm9yIHBlcmZvcm1hbmNlIGdhaW4gY29uc2lkZXIgdGhlIHNwZWNpYWwgY2FzZSBudGhyZWFkcyA9PSBfX2ttcF9hdmFpbF9wcm9jCisgICAgICAgIGlmKCBudGhyZWFkcyA9PSBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgaWYoIGZpbmVfZ3JhbiApIHsKKyAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIHRpZCBdLnNlY29uZDsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjb3JlID0gX19rbXBfYWZmaW5pdHlfZmluZF9jb3JlKGFkZHJlc3Myb3MsIHRpZCwgX19rbXBfYWZmX2RlcHRoIC0gMSwgY29yZV9sZXZlbCk7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9hdmFpbF9wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gYWRkcmVzczJvc1sgaSBdLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X2ZpbmRfY29yZShhZGRyZXNzMm9zLCBpLCAgX19rbXBfYWZmX2RlcHRoIC0gMSwgY29yZV9sZXZlbCkgPT0gY29yZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmKCBudGhyZWFkcyA8PSBuY29yZXMgKSB7CisKKyAgICAgICAgICAgIGludCBjb3JlID0gMDsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbmNvcmVzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjb3JlIGZyb20gcHJvY2FycltdIGlzIGluIHRoZSBtYXNrCisgICAgICAgICAgICAgICAgaW50IGluX21hc2sgPSAwOworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgbnRoX3Blcl9jb3JlOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9jYXJyWyBpICogbnRoX3Blcl9jb3JlICsgaiBdICE9IC0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluX21hc2sgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGluX21hc2sgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0aWQgPT0gY29yZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgbnRoX3Blcl9jb3JlOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9zSUQgPSBwcm9jYXJyWyBpICogbnRoX3Blcl9jb3JlICsgaiBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBvc0lEICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZmluZSBncmFudWxhcml0eSBpdCBpcyBlbm91Z2ggdG8gc2V0IHRoZSBmaXJzdCBhdmFpbGFibGUgb3NJRCBmb3IgdGhpcyBjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmaW5lX2dyYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3JlKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsgLy8gbnRocmVhZHMgPiBuY29yZXMKKworICAgICAgICAgICAgLy8gQXJyYXkgdG8gc2F2ZSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXQgZWFjaCBjb3JlCisgICAgICAgICAgICBpbnQqIG5wcm9jX2F0X2NvcmUgPSAoaW50KilLTVBfQUxMT0NBKHNpemVvZihpbnQpKm5jb3Jlcyk7CisgICAgICAgICAgICAvLyBBcnJheSB0byBzYXZlIHRoZSBudW1iZXIgb2YgY29yZXMgd2l0aCAieCIgYXZhaWxhYmxlIHByb2Nlc3NvcnM7CisgICAgICAgICAgICBpbnQqIG5jb3Jlc193aXRoX3hfcHJvY3MgPSAoaW50KilLTVBfQUxMT0NBKHNpemVvZihpbnQpKihudGhfcGVyX2NvcmUrMSkpOworICAgICAgICAgICAgLy8gQXJyYXkgdG8gc2F2ZSB0aGUgbnVtYmVyIG9mIGNvcmVzIHdpdGggIyBwcm9jcyBmcm9tIHggdG8gbnRoX3Blcl9jb3JlCisgICAgICAgICAgICBpbnQqIG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzID0gKGludCopS01QX0FMTE9DQShzaXplb2YoaW50KSoobnRoX3Blcl9jb3JlKzEpKTsKKworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPD0gbnRoX3Blcl9jb3JlOyBpKysgKSB7CisgICAgICAgICAgICAgICAgbmNvcmVzX3dpdGhfeF9wcm9jc1sgaSBdID0gMDsKKyAgICAgICAgICAgICAgICBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1sgaSBdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBuY29yZXM7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpbnQgY250ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBpZiggcHJvY2FyclsgaSAqIG50aF9wZXJfY29yZSArIGogXSAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5wcm9jX2F0X2NvcmVbIGkgXSA9IGNudDsKKyAgICAgICAgICAgICAgICBuY29yZXNfd2l0aF94X3Byb2NzWyBjbnQgXSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8PSBudGhfcGVyX2NvcmU7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gaTsgaiA8PSBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgbmNvcmVzX3dpdGhfeF90b19tYXhfcHJvY3NbIGkgXSArPSBuY29yZXNfd2l0aF94X3Byb2NzWyBqIF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIHByb2Nlc3NvcnMKKyAgICAgICAgICAgIGludCBucHJvYyA9IG50aF9wZXJfY29yZSAqIG5jb3JlczsKKyAgICAgICAgICAgIC8vIEFuIGFycmF5IHRvIGtlZXAgbnVtYmVyIG9mIHRocmVhZHMgcGVyIGVhY2ggY29udGV4dAorICAgICAgICAgICAgaW50ICogbmV3YXJyID0gKCBpbnQgKiApX19rbXBfYWxsb2NhdGUoIHNpemVvZiggaW50ICkgKiBucHJvYyApOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBucHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgIG5ld2FyclsgaSBdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG50aCA9IG50aHJlYWRzOworICAgICAgICAgICAgaW50IGZsYWcgPSAwOworICAgICAgICAgICAgd2hpbGUoIG50aCA+IDAgKSB7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDE7IGogPD0gbnRoX3Blcl9jb3JlOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjbnQgPSBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1sgaiBdOworICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5jb3JlczsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgY29yZSB3aXRoIDAgcHJvY2Vzc29ycworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG5wcm9jX2F0X2NvcmVbIGkgXSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgayA9IDA7IGsgPCBudGhfcGVyX2NvcmU7IGsrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcHJvY2FyclsgaSAqIG50aF9wZXJfY29yZSArIGsgXSAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG5ld2FyclsgaSAqIG50aF9wZXJfY29yZSArIGsgXSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3YXJyWyBpICogbnRoX3Blcl9jb3JlICsgayBdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRoLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmbGFnICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3YXJyWyBpICogbnRoX3Blcl9jb3JlICsgayBdICsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50aC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNudCA9PSAwIHx8IG50aCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBudGggPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZsYWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgc3VtICs9IG5ld2FyclsgaSBdOworICAgICAgICAgICAgICAgIGlmKCBzdW0gPiB0aWQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBmaW5lX2dyYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FyclsgaSBdOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcmVJRCA9IGkgLyBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpaSA9IDA7IGlpIDwgbnRoX3Blcl9jb3JlOyBpaSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FyclsgY29yZUlEICogbnRoX3Blcl9jb3JlICsgaWkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggb3NJRCAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBuZXdhcnIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbWFzayk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCAoa21wX2ludDMyKWdldHBpZCgpLAorICAgICAgICAgICAgICB0aWQsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggbWFzaywgVFJVRSApOworICAgICAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhtYXNrKTsKKyAgICB9Cit9CisKKyNpZiBLTVBfT1NfTElOVVgKKy8vIFdlIGRvbid0IG5lZWQgdGhpcyBlbnRyeSBmb3IgV2luZG93cyBiZWNhdXNlCisvLyB0aGVyZSBpcyBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCkgYXBpCisvLworLy8gVGhlIGludGVuZGVkIHVzYWdlIGlzIGluZGljYXRlZCBieSB0aGVzZSBzdGVwczoKKy8vIDEpIFRoZSB1c2VyIGdldHMgdGhlIGN1cnJlbnQgYWZmaW5pdHkgbWFzaworLy8gMikgVGhlbiBzZXRzIHRoZSBhZmZpbml0eSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKy8vIDMpIEVycm9yIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKKy8vIDQpIFVzZSBub24tT3Blbk1QIHBhcmFsbGVsaXphdGlvbgorLy8gNSkgUmVzZXQgdGhlIGFmZmluaXR5IHRvIHdoYXQgd2FzIHN0b3JlZCBpbiBzdGVwIDEpCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgoraW50CitrbXBfc2V0X3RocmVhZF9hZmZpbml0eV9tYXNrX2luaXRpYWwoKQorLy8gdGhlIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLAorLy8gICAtMSBpZiB3ZSBjYW5ub3QgYmluZCB0aHJlYWQKKy8vICAgPjAgKGVycm5vKSBpZiBhbiBlcnJvciBoYXBwZW5lZCBkdXJpbmcgYmluZGluZworeworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBpZiAoZ3RpZCA8IDApIHsKKyAgICAgICAgLy8gRG8gbm90IHRvdWNoIG5vbi1vbXAgdGhyZWFkcworICAgICAgICBLQV9UUkFDRSgzMCwgKCAia21wX3NldF90aHJlYWRfYWZmaW5pdHlfbWFza19pbml0aWFsOiAiCisgICAgICAgICAgICAibm9uLW9tcCB0aHJlYWQsIHJldHVybmluZ1xuIikpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSB8fCAhX19rbXBfaW5pdF9taWRkbGUpIHsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICggImttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbDogIgorICAgICAgICAgICAgImFmZmluaXR5IG5vdCBpbml0aWFsaXplZCwgcmV0dXJuaW5nXG4iKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgS0FfVFJBQ0UoMzAsICggImttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbDogIgorICAgICAgICAic2V0IGZ1bGwgbWFzayBmb3IgdGhyZWFkICVkXG4iLCBndGlkKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hZmZpbl9mdWxsTWFzayAhPSBOVUxMKTsKKyAgICByZXR1cm4gX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShfX2ttcF9hZmZpbl9mdWxsTWFzaywgRkFMU0UpOworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmggYi9yYzMvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyYWNmNwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuaApAQCAtMCwwICsxLDc3NiBAQAorLyoKKyAqIGttcF9hZmZpbml0eS5oIC0tIGhlYWRlciBmb3IgYWZmaW5pdHkgbWFuYWdlbWVudAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBLTVBfQUZGSU5JVFlfSAorI2RlZmluZSBLTVBfQUZGSU5JVFlfSAorCisjaW5jbHVkZSAia21wX29zLmgiCisjaW5jbHVkZSAia21wLmgiCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisjaWYgS01QX1VTRV9IV0xPQworY2xhc3MgS01QSHdsb2NBZmZpbml0eTogcHVibGljIEtNUEFmZmluaXR5IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBNYXNrIDogcHVibGljIEtNUEFmZmluaXR5OjpNYXNrIHsKKyAgICAgICAgaHdsb2NfY3B1c2V0X3QgbWFzazsKKyAgICBwdWJsaWM6CisgICAgICAgIE1hc2soKSB7IG1hc2sgPSBod2xvY19iaXRtYXBfYWxsb2MoKTsgdGhpcy0+emVybygpOyB9CisgICAgICAgIH5NYXNrKCkgeyBod2xvY19iaXRtYXBfZnJlZShtYXNrKTsgfQorICAgICAgICB2b2lkIHNldChpbnQgaSkgb3ZlcnJpZGUgeyBod2xvY19iaXRtYXBfc2V0KG1hc2ssIGkpOyB9CisgICAgICAgIGJvb2wgaXNfc2V0KGludCBpKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBod2xvY19iaXRtYXBfaXNzZXQobWFzaywgaSk7IH0KKyAgICAgICAgdm9pZCBjbGVhcihpbnQgaSkgb3ZlcnJpZGUgeyBod2xvY19iaXRtYXBfY2xyKG1hc2ssIGkpOyB9CisgICAgICAgIHZvaWQgemVybygpIG92ZXJyaWRlIHsgaHdsb2NfYml0bWFwX3plcm8obWFzayk7IH0KKyAgICAgICAgdm9pZCBjb3B5KGNvbnN0IEtNUEFmZmluaXR5OjpNYXNrKiBzcmMpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGNvbnN0IE1hc2sqIGNvbnZlcnQgPSBzdGF0aWNfY2FzdDxjb25zdCBNYXNrKj4oc3JjKTsKKyAgICAgICAgICAgIGh3bG9jX2JpdG1hcF9jb3B5KG1hc2ssIGNvbnZlcnQtPm1hc2spOworICAgICAgICB9CisgICAgICAgIHZvaWQgYml0d2lzZV9hbmQoY29uc3QgS01QQWZmaW5pdHk6Ok1hc2sqIHJocykgb3ZlcnJpZGUgeworICAgICAgICAgICAgY29uc3QgTWFzayogY29udmVydCA9IHN0YXRpY19jYXN0PGNvbnN0IE1hc2sqPihyaHMpOworICAgICAgICAgICAgaHdsb2NfYml0bWFwX2FuZChtYXNrLCBtYXNrLCBjb252ZXJ0LT5tYXNrKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGJpdHdpc2Vfb3IoY29uc3QgS01QQWZmaW5pdHk6Ok1hc2sgKiByaHMpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGNvbnN0IE1hc2sqIGNvbnZlcnQgPSBzdGF0aWNfY2FzdDxjb25zdCBNYXNrKj4ocmhzKTsKKyAgICAgICAgICAgIGh3bG9jX2JpdG1hcF9vcihtYXNrLCBtYXNrLCBjb252ZXJ0LT5tYXNrKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGJpdHdpc2Vfbm90KCkgb3ZlcnJpZGUgeyBod2xvY19iaXRtYXBfbm90KG1hc2ssIG1hc2spOyB9CisgICAgICAgIGludCBiZWdpbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGh3bG9jX2JpdG1hcF9maXJzdChtYXNrKTsgfQorICAgICAgICBpbnQgZW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gLTE7IH0KKyAgICAgICAgaW50IG5leHQoaW50IHByZXZpb3VzKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBod2xvY19iaXRtYXBfbmV4dChtYXNrLCBwcmV2aW91cyk7IH0KKyAgICAgICAgaW50IGdldF9zeXN0ZW1fYWZmaW5pdHkoYm9vbCBhYm9ydF9vbl9lcnJvcikgb3ZlcnJpZGUgeworICAgICAgICAgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICAgICAgICAgIklsbGVnYWwgZ2V0IGFmZmluaXR5IG9wZXJhdGlvbiB3aGVuIG5vdCBjYXBhYmxlIik7CisgICAgICAgICAgICBpbnQgcmV0dmFsID0gaHdsb2NfZ2V0X2NwdWJpbmQoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIG1hc2ssIEhXTE9DX0NQVUJJTkRfVEhSRUFEKTsKKyAgICAgICAgICAgIGlmIChyZXR2YWwgPj0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKCBGYXRhbFN5c0Vycm9yICksIEtNUF9FUlIoIGVycm9yICksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2V0X3N5c3RlbV9hZmZpbml0eShib29sIGFib3J0X29uX2Vycm9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgICAgICAgICAiSWxsZWdhbCBnZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKyAgICAgICAgICAgIGludCByZXR2YWwgPSBod2xvY19zZXRfY3B1YmluZChfX2ttcF9od2xvY190b3BvbG9neSwgbWFzaywgSFdMT0NfQ1BVQklORF9USFJFQUQpOworICAgICAgICAgICAgaWYgKHJldHZhbCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coIEZhdGFsU3lzRXJyb3IgKSwgS01QX0VSUiggZXJyb3IgKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICAgIGludCBnZXRfcHJvY19ncm91cCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaW50IGdyb3VwID0gLTE7CisjIGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIE9uIHdpbmRvd3MsIHRoZSBsb25nIHR5cGUgaXMgYWx3YXlzIDMyIGJpdHMKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZpcnN0XzMyX2JpdHMgPSBod2xvY19iaXRtYXBfdG9faXRoX3Vsb25nKG1hc2ssIGkqMik7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzZWNvbmRfMzJfYml0cyA9IGh3bG9jX2JpdG1hcF90b19pdGhfdWxvbmcobWFzaywgaSoyKzEpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdF8zMl9iaXRzID09IDAgJiYgc2Vjb25kXzMyX2JpdHMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdyb3VwID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBncm91cCA9IGk7CisgICAgICAgICAgICB9CisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgICAgICAgICByZXR1cm4gZ3JvdXA7CisgICAgICAgIH0KKyAgICB9OworICAgIHZvaWQgZGV0ZXJtaW5lX2NhcGFibGUoY29uc3QgY2hhciogdmFyKSBvdmVycmlkZSB7CisgICAgICAgIGNvbnN0IGh3bG9jX3RvcG9sb2d5X3N1cHBvcnQqIHRvcG9sb2d5X3N1cHBvcnQ7CisgICAgICAgIGlmKF9fa21wX2h3bG9jX3RvcG9sb2d5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmKGh3bG9jX3RvcG9sb2d5X2luaXQoJl9fa21wX2h3bG9jX3RvcG9sb2d5KSA8IDApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9od2xvY19lcnJvciA9IFRSVUU7CisgICAgICAgICAgICAgICAgaWYoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSHdsb2NFcnJvck9jY3VycmVkLCB2YXIsICJod2xvY190b3BvbG9neV9pbml0KCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGh3bG9jX3RvcG9sb2d5X2xvYWQoX19rbXBfaHdsb2NfdG9wb2xvZ3kpIDwgMCkgeworICAgICAgICAgICAgICAgIF9fa21wX2h3bG9jX2Vycm9yID0gVFJVRTsKKyAgICAgICAgICAgICAgICBpZihfX2ttcF9hZmZpbml0eV92ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZId2xvY0Vycm9yT2NjdXJyZWQsIHZhciwgImh3bG9jX3RvcG9sb2d5X2xvYWQoKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRvcG9sb2d5X3N1cHBvcnQgPSBod2xvY190b3BvbG9neV9nZXRfc3VwcG9ydChfX2ttcF9od2xvY190b3BvbG9neSk7CisgICAgICAgIC8vIElzIHRoZSBzeXN0ZW0gY2FwYWJsZSBvZiBzZXR0aW5nL2dldHRpbmcgdGhpcyB0aHJlYWQncyBhZmZpbml0eT8KKyAgICAgICAgLy8gYWxzbywgaXMgdG9wb2xvZ3kgZGlzY292ZXJ5IHBvc3NpYmxlPyAocHUgaW5kaWNhdGVzIGFiaWxpdHkgdG8gZGlzY292ZXIgcHJvY2Vzc2luZyB1bml0cykKKyAgICAgICAgLy8gYW5kIGZpbmFsbHksIHdlcmUgdGhlcmUgbm8gZXJyb3JzIHdoZW4gY2FsbGluZyBhbnkgaHdsb2NfKiBBUEkgZnVuY3Rpb25zPworICAgICAgICBpZih0b3BvbG9neV9zdXBwb3J0ICYmIHRvcG9sb2d5X3N1cHBvcnQtPmNwdWJpbmQtPnNldF90aGlzdGhyZWFkX2NwdWJpbmQgJiYKKyAgICAgICAgICAgdG9wb2xvZ3lfc3VwcG9ydC0+Y3B1YmluZC0+Z2V0X3RoaXN0aHJlYWRfY3B1YmluZCAmJgorICAgICAgICAgICB0b3BvbG9neV9zdXBwb3J0LT5kaXNjb3ZlcnktPnB1ICYmCisgICAgICAgICAgICFfX2ttcF9od2xvY19lcnJvcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZW5hYmxlcyBhZmZpbml0eSBhY2NvcmRpbmcgdG8gS01QX0FGRklOSVRZX0NBUEFCTEUoKSBtYWNybworICAgICAgICAgICAgS01QX0FGRklOSVRZX0VOQUJMRShUUlVFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgaHdsb2MgZGlkbid0IHdvcmsgYW5kIGRpc2FibGUgYWZmaW5pdHkKKyAgICAgICAgICAgIF9fa21wX2h3bG9jX2Vycm9yID0gVFJVRTsKKyAgICAgICAgICAgIEtNUF9BRkZJTklUWV9ESVNBQkxFKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBiaW5kX3RocmVhZChpbnQgd2hpY2gpIG92ZXJyaWRlIHsKKyAgICAgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICAgICAiSWxsZWdhbCBzZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKyAgICAgICAgS01QQWZmaW5pdHk6Ok1hc2sgKm1hc2s7CisgICAgICAgIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0sobWFzayk7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKyAgICAgICAgS01QX0NQVV9TRVQod2hpY2gsIG1hc2spOworICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG1hc2ssIFRSVUUpOworICAgICAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhtYXNrKTsKKyAgICB9CisgICAgS01QQWZmaW5pdHk6Ok1hc2sqIGFsbG9jYXRlX21hc2soKSBvdmVycmlkZSB7IHJldHVybiBuZXcgTWFzaygpOyAgfQorICAgIHZvaWQgZGVhbGxvY2F0ZV9tYXNrKEtNUEFmZmluaXR5OjpNYXNrKiBtKSBvdmVycmlkZSB7IGRlbGV0ZSBtOyB9CisgICAgS01QQWZmaW5pdHk6Ok1hc2sqIGFsbG9jYXRlX21hc2tfYXJyYXkoaW50IG51bSkgb3ZlcnJpZGUgeyByZXR1cm4gbmV3IE1hc2tbbnVtXTsgfQorICAgIHZvaWQgZGVhbGxvY2F0ZV9tYXNrX2FycmF5KEtNUEFmZmluaXR5OjpNYXNrKiBhcnJheSkgb3ZlcnJpZGUgeworICAgICAgICBNYXNrKiBod2xvY19hcnJheSA9IHN0YXRpY19jYXN0PE1hc2sqPihhcnJheSk7CisgICAgICAgIGRlbGV0ZVtdIGh3bG9jX2FycmF5OworICAgIH0KKyAgICBLTVBBZmZpbml0eTo6TWFzayogaW5kZXhfbWFza19hcnJheShLTVBBZmZpbml0eTo6TWFzayogYXJyYXksIGludCBpbmRleCkgb3ZlcnJpZGUgeworICAgICAgICBNYXNrKiBod2xvY19hcnJheSA9IHN0YXRpY19jYXN0PE1hc2sqPihhcnJheSk7CisgICAgICAgIHJldHVybiAmKGh3bG9jX2FycmF5W2luZGV4XSk7CisgICAgfQorICAgIGFwaV90eXBlIGdldF9hcGlfdHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEhXTE9DOyB9Cit9OworI2VuZGlmIC8qIEtNUF9VU0VfSFdMT0MgKi8KKworI2lmIEtNUF9PU19MSU5VWAorLyoKKyAqIE9uIHNvbWUgb2YgdGhlIG9sZGVyIE9TJ3MgdGhhdCB3ZSBidWlsZCBvbiwgdGhlc2UgY29uc3RhbnRzIGFyZW4ndCBwcmVzZW50CisgKiBpbiA8YXNtL3VuaXN0ZC5oPiAjaW5jbHVkZWQgZnJvbSA8c3lzLnN5c2NhbGwuaD4uICBUaGV5IG11c3QgYmUgdGhlIHNhbWUgb24KKyAqIGFsbCBzeXN0ZW1zIG9mIHRoZSBzYW1lIGFyY2ggd2hlcmUgdGhleSBhcmUgZGVmaW5lZCwgYW5kIHRoZXkgY2Fubm90IGNoYW5nZS4KKyAqIHN0b25lIGZvcmV2ZXIuCisgKi8KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCisjICBpZm5kZWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eQorIyAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAyNDEKKyMgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyNDEKKyMgICBlcnJvciBXcm9uZyBjb2RlIGZvciBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIDI0MgorIyAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDI0MgorIyAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgZW5kaWYgLyogX19OUl9zY2hlZF9nZXRhZmZpbml0eSAqLworIyBlbGlmIEtNUF9BUkNIX0FBUkNINjQKKyMgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDEyMgorIyAgZWxpZiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICE9IDEyMgorIyAgIGVycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgaWZuZGVmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkKKyMgICBkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAgMTIzCisjICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gMTIzCisjICAgZXJyb3IgV3JvbmcgY29kZSBmb3IgZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisjIGVsaWYgS01QX0FSQ0hfWDg2XzY0CisjICBpZm5kZWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eQorIyAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAyMDMKKyMgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyMDMKKyMgICBlcnJvciBXcm9uZyBjb2RlIGZvciBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIDIwNAorIyAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDIwNAorIyAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgZW5kaWYgLyogX19OUl9zY2hlZF9nZXRhZmZpbml0eSAqLworIyBlbGlmIEtNUF9BUkNIX1BQQzY0CisjICBpZm5kZWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eQorIyAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAyMjIKKyMgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyMjIKKyMgICBlcnJvciBXcm9uZyBjb2RlIGZvciBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIDIyMworIyAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDIyMworIyAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgZW5kaWYgLyogX19OUl9zY2hlZF9nZXRhZmZpbml0eSAqLworIyAgZWxpZiBLTVBfQVJDSF9NSVBTCisjICAgaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDQyMzkKKyMgICBlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gNDIzOQorIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICovCisjICAgaWZuZGVmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIDQyNDAKKyMgICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gNDI0MAorIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisjICBlbGlmIEtNUF9BUkNIX01JUFM2NAorIyAgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICA1MTk1CisjICAgZWxpZiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICE9IDUxOTUKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5ICA1MTk2CisjICAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDUxOTYKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3IgZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9nZXRhZmZpbml0eSAqLworIyAgZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKyMgZW5kaWYgLyogS01QX0FSQ0hfKiAqLworY2xhc3MgS01QTmF0aXZlQWZmaW5pdHkgOiBwdWJsaWMgS01QQWZmaW5pdHkgeworICAgIGNsYXNzIE1hc2sgOiBwdWJsaWMgS01QQWZmaW5pdHk6Ok1hc2sgeworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgbWFza190OworICAgICAgICBzdGF0aWMgY29uc3QgaW50IEJJVFNfUEVSX01BU0tfVCA9IHNpemVvZihtYXNrX3QpKkNIQVJfQklUOworICAgIHB1YmxpYzoKKyAgICAgICAgbWFza190KiBtYXNrOworICAgICAgICBNYXNrKCkgeyBtYXNrID0gKG1hc2tfdCopX19rbXBfYWxsb2NhdGUoX19rbXBfYWZmaW5fbWFza19zaXplKTsgfQorICAgICAgICB+TWFzaygpIHsgaWYgKG1hc2spIF9fa21wX2ZyZWUobWFzayk7IH0KKyAgICAgICAgdm9pZCBzZXQoaW50IGkpIG92ZXJyaWRlIHsgbWFza1tpL0JJVFNfUEVSX01BU0tfVF0gfD0gKChtYXNrX3QpMSA8PCAoaSAlIEJJVFNfUEVSX01BU0tfVCkpOyB9CisgICAgICAgIGJvb2wgaXNfc2V0KGludCBpKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAobWFza1tpL0JJVFNfUEVSX01BU0tfVF0gJiAoKG1hc2tfdCkxIDw8IChpICUgQklUU19QRVJfTUFTS19UKSkpOyB9CisgICAgICAgIHZvaWQgY2xlYXIoaW50IGkpIG92ZXJyaWRlIHsgbWFza1tpL0JJVFNfUEVSX01BU0tfVF0gJj0gfigobWFza190KTEgPDwgKGkgJSBCSVRTX1BFUl9NQVNLX1QpKTsgfQorICAgICAgICB2b2lkIHplcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGk8X19rbXBfYWZmaW5fbWFza19zaXplOyArK2kpCisgICAgICAgICAgICAgICAgbWFza1tpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBjb3B5KGNvbnN0IEtNUEFmZmluaXR5OjpNYXNrKiBzcmMpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGNvbnN0IE1hc2sgKiBjb252ZXJ0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgTWFzayo+KHNyYyk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGk8X19rbXBfYWZmaW5fbWFza19zaXplOyArK2kpCisgICAgICAgICAgICAgICAgbWFza1tpXSA9IGNvbnZlcnQtPm1hc2tbaV07CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBiaXR3aXNlX2FuZChjb25zdCBLTVBBZmZpbml0eTo6TWFzayogcmhzKSBvdmVycmlkZSB7CisgICAgICAgICAgICBjb25zdCBNYXNrICogY29udmVydCA9IHN0YXRpY19jYXN0PGNvbnN0IE1hc2sqPihyaHMpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpPF9fa21wX2FmZmluX21hc2tfc2l6ZTsgKytpKQorICAgICAgICAgICAgICAgIG1hc2tbaV0gJj0gY29udmVydC0+bWFza1tpXTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGJpdHdpc2Vfb3IoY29uc3QgS01QQWZmaW5pdHk6Ok1hc2sqIHJocykgb3ZlcnJpZGUgeworICAgICAgICAgICAgY29uc3QgTWFzayAqIGNvbnZlcnQgPSBzdGF0aWNfY2FzdDxjb25zdCBNYXNrKj4ocmhzKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaTxfX2ttcF9hZmZpbl9tYXNrX3NpemU7ICsraSkKKyAgICAgICAgICAgICAgICBtYXNrW2ldIHw9IGNvbnZlcnQtPm1hc2tbaV07CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBiaXR3aXNlX25vdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaTxfX2ttcF9hZmZpbl9tYXNrX3NpemU7ICsraSkKKyAgICAgICAgICAgICAgICBtYXNrW2ldID0gfihtYXNrW2ldKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICBpbnQgcmV0dmFsID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChyZXR2YWwgPCBlbmQoKSAmJiAhaXNfc2V0KHJldHZhbCkpCisgICAgICAgICAgICAgICAgKytyZXR2YWw7CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgICAgIGludCBlbmQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBfX2ttcF9hZmZpbl9tYXNrX3NpemUqQklUU19QRVJfTUFTS19UOyB9CisgICAgICAgIGludCBuZXh0KGludCBwcmV2aW91cykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgaW50IHJldHZhbCA9IHByZXZpb3VzKzE7CisgICAgICAgICAgICB3aGlsZSAocmV0dmFsIDwgZW5kKCkgJiYgIWlzX3NldChyZXR2YWwpKQorICAgICAgICAgICAgICAgICsrcmV0dmFsOworICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorICAgICAgICBpbnQgZ2V0X3N5c3RlbV9hZmZpbml0eShib29sIGFib3J0X29uX2Vycm9yKSBvdmVycmlkZSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgICAgICAgICAiSWxsZWdhbCBnZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKyAgICAgICAgICAgIGludCByZXR2YWwgPSBzeXNjYWxsKCBfX05SX3NjaGVkX2dldGFmZmluaXR5LCAwLCBfX2ttcF9hZmZpbl9tYXNrX3NpemUsIG1hc2sgKTsKKyAgICAgICAgICAgIGlmIChyZXR2YWwgPj0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKCBGYXRhbFN5c0Vycm9yICksIEtNUF9FUlIoIGVycm9yICksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2V0X3N5c3RlbV9hZmZpbml0eShib29sIGFib3J0X29uX2Vycm9yKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgICAgICAgICAiSWxsZWdhbCBnZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKyAgICAgICAgICAgIGludCByZXR2YWwgPSBzeXNjYWxsKCBfX05SX3NjaGVkX3NldGFmZmluaXR5LCAwLCBfX2ttcF9hZmZpbl9tYXNrX3NpemUsIG1hc2sgKTsKKyAgICAgICAgICAgIGlmIChyZXR2YWwgPj0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKCBGYXRhbFN5c0Vycm9yICksIEtNUF9FUlIoIGVycm9yICksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgIH07CisgICAgdm9pZCBkZXRlcm1pbmVfY2FwYWJsZShjb25zdCBjaGFyKiBlbnZfdmFyKSBvdmVycmlkZSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlKGVudl92YXIpOworICAgIH0KKyAgICB2b2lkIGJpbmRfdGhyZWFkKGludCB3aGljaCkgb3ZlcnJpZGUgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZCh3aGljaCk7CisgICAgfQorICAgIEtNUEFmZmluaXR5OjpNYXNrKiBhbGxvY2F0ZV9tYXNrKCkgb3ZlcnJpZGUgeworICAgICAgICBLTVBOYXRpdmVBZmZpbml0eTo6TWFzayogcmV0dmFsID0gbmV3IE1hc2soKTsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgdm9pZCBkZWFsbG9jYXRlX21hc2soS01QQWZmaW5pdHk6Ok1hc2sqIG0pIG92ZXJyaWRlIHsKKyAgICAgICAgS01QTmF0aXZlQWZmaW5pdHk6Ok1hc2sqIG5hdGl2ZV9tYXNrID0gc3RhdGljX2Nhc3Q8S01QTmF0aXZlQWZmaW5pdHk6Ok1hc2sqPihtKTsKKyAgICAgICAgZGVsZXRlIG07CisgICAgfQorICAgIEtNUEFmZmluaXR5OjpNYXNrKiBhbGxvY2F0ZV9tYXNrX2FycmF5KGludCBudW0pIG92ZXJyaWRlIHsgcmV0dXJuIG5ldyBNYXNrW251bV07IH0KKyAgICB2b2lkIGRlYWxsb2NhdGVfbWFza19hcnJheShLTVBBZmZpbml0eTo6TWFzayogYXJyYXkpIG92ZXJyaWRlIHsKKyAgICAgICAgTWFzayogbGludXhfYXJyYXkgPSBzdGF0aWNfY2FzdDxNYXNrKj4oYXJyYXkpOworICAgICAgICBkZWxldGVbXSBsaW51eF9hcnJheTsKKyAgICB9CisgICAgS01QQWZmaW5pdHk6Ok1hc2sqIGluZGV4X21hc2tfYXJyYXkoS01QQWZmaW5pdHk6Ok1hc2sqIGFycmF5LCBpbnQgaW5kZXgpIG92ZXJyaWRlIHsKKyAgICAgICAgTWFzayogbGludXhfYXJyYXkgPSBzdGF0aWNfY2FzdDxNYXNrKj4oYXJyYXkpOworICAgICAgICByZXR1cm4gJihsaW51eF9hcnJheVtpbmRleF0pOworICAgIH0KKyAgICBhcGlfdHlwZSBnZXRfYXBpX3R5cGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBOQVRJVkVfT1M7IH0KK307CisjZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworY2xhc3MgS01QTmF0aXZlQWZmaW5pdHkgOiBwdWJsaWMgS01QQWZmaW5pdHkgeworICAgIGNsYXNzIE1hc2sgOiBwdWJsaWMgS01QQWZmaW5pdHk6Ok1hc2sgeworICAgICAgICB0eXBlZGVmIFVMT05HX1BUUiBtYXNrX3Q7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgQklUU19QRVJfTUFTS19UID0gc2l6ZW9mKG1hc2tfdCkqQ0hBUl9CSVQ7CisgICAgICAgIG1hc2tfdCogbWFzazsKKyAgICBwdWJsaWM6CisgICAgICAgIE1hc2soKSB7IG1hc2sgPSAobWFza190KilfX2ttcF9hbGxvY2F0ZShzaXplb2YobWFza190KSpfX2ttcF9udW1fcHJvY19ncm91cHMpOyB9CisgICAgICAgIH5NYXNrKCkgeyBpZiAobWFzaykgX19rbXBfZnJlZShtYXNrKTsgfQorICAgICAgICB2b2lkIHNldChpbnQgaSkgb3ZlcnJpZGUgeyBtYXNrW2kvQklUU19QRVJfTUFTS19UXSB8PSAoKG1hc2tfdCkxIDw8IChpICUgQklUU19QRVJfTUFTS19UKSk7IH0KKyAgICAgICAgYm9vbCBpc19zZXQoaW50IGkpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIChtYXNrW2kvQklUU19QRVJfTUFTS19UXSAmICgobWFza190KTEgPDwgKGkgJSBCSVRTX1BFUl9NQVNLX1QpKSk7IH0KKyAgICAgICAgdm9pZCBjbGVhcihpbnQgaSkgb3ZlcnJpZGUgeyBtYXNrW2kvQklUU19QRVJfTUFTS19UXSAmPSB+KChtYXNrX3QpMSA8PCAoaSAlIEJJVFNfUEVSX01BU0tfVCkpOyB9CisgICAgICAgIHZvaWQgemVybygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaTxfX2ttcF9udW1fcHJvY19ncm91cHM7ICsraSkKKyAgICAgICAgICAgICAgICBtYXNrW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNvcHkoY29uc3QgS01QQWZmaW5pdHk6Ok1hc2sqIHNyYykgb3ZlcnJpZGUgeworICAgICAgICAgICAgY29uc3QgTWFzayAqIGNvbnZlcnQgPSBzdGF0aWNfY2FzdDxjb25zdCBNYXNrKj4oc3JjKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaTxfX2ttcF9udW1fcHJvY19ncm91cHM7ICsraSkKKyAgICAgICAgICAgICAgICBtYXNrW2ldID0gY29udmVydC0+bWFza1tpXTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGJpdHdpc2VfYW5kKGNvbnN0IEtNUEFmZmluaXR5OjpNYXNrKiByaHMpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGNvbnN0IE1hc2sgKiBjb252ZXJ0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgTWFzayo+KHJocyk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGk8X19rbXBfbnVtX3Byb2NfZ3JvdXBzOyArK2kpCisgICAgICAgICAgICAgICAgbWFza1tpXSAmPSBjb252ZXJ0LT5tYXNrW2ldOworICAgICAgICB9CisgICAgICAgIHZvaWQgYml0d2lzZV9vcihjb25zdCBLTVBBZmZpbml0eTo6TWFzayogcmhzKSBvdmVycmlkZSB7CisgICAgICAgICAgICBjb25zdCBNYXNrICogY29udmVydCA9IHN0YXRpY19jYXN0PGNvbnN0IE1hc2sqPihyaHMpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpPF9fa21wX251bV9wcm9jX2dyb3VwczsgKytpKQorICAgICAgICAgICAgICAgIG1hc2tbaV0gfD0gY29udmVydC0+bWFza1tpXTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGJpdHdpc2Vfbm90KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpPF9fa21wX251bV9wcm9jX2dyb3VwczsgKytpKQorICAgICAgICAgICAgICAgIG1hc2tbaV0gPSB+KG1hc2tbaV0pOworICAgICAgICB9CisgICAgICAgIGludCBiZWdpbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGludCByZXR2YWwgPSAwOworICAgICAgICAgICAgd2hpbGUgKHJldHZhbCA8IGVuZCgpICYmICFpc19zZXQocmV0dmFsKSkKKyAgICAgICAgICAgICAgICArK3JldHZhbDsKKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKyAgICAgICAgaW50IGVuZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIF9fa21wX251bV9wcm9jX2dyb3VwcypCSVRTX1BFUl9NQVNLX1Q7IH0KKyAgICAgICAgaW50IG5leHQoaW50IHByZXZpb3VzKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICBpbnQgcmV0dmFsID0gcHJldmlvdXMrMTsKKyAgICAgICAgICAgIHdoaWxlIChyZXR2YWwgPCBlbmQoKSAmJiAhaXNfc2V0KHJldHZhbCkpCisgICAgICAgICAgICAgICAgKytyZXR2YWw7CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgICAgIGludCBzZXRfc3lzdGVtX2FmZmluaXR5KGJvb2wgYWJvcnRfb25fZXJyb3IpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgdmFsaWQgbWFzay4KKyAgICAgICAgICAgICAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgICAgICAgICBpbnQgZ3JvdXAgPSBnZXRfcHJvY19ncm91cCgpOworICAgICAgICAgICAgICAgIGlmIChncm91cCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgYml0IHZlY3RvciBpbnRvIGEgR1JPVVBfQUZGSU5JVFkgc3RydWN0CisgICAgICAgICAgICAgICAgLy8gYW5kIG1ha2UgdGhlIHN5c3RlbSBjYWxsIHRvIHNldCBhZmZpbml0eS4KKyAgICAgICAgICAgICAgICBnYS5Hcm91cCA9IGdyb3VwOworICAgICAgICAgICAgICAgIGdhLk1hc2sgPSBtYXNrW2dyb3VwXTsKKyAgICAgICAgICAgICAgICBnYS5SZXNlcnZlZFswXSA9IGdhLlJlc2VydmVkWzFdID0gZ2EuUmVzZXJ2ZWRbMl0gPSAwOworCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgJmdhLCBOVUxMKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyggQ2FudFNldFRocmVhZEFmZk1hc2sgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFTZXRUaHJlYWRBZmZpbml0eU1hc2soIEdldEN1cnJlbnRUaHJlYWQoKSwgKm1hc2sgKSkgeworICAgICAgICAgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coIENhbnRTZXRUaHJlYWRBZmZNYXNrICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpbnQgZ2V0X3N5c3RlbV9hZmZpbml0eShib29sIGFib3J0X29uX2Vycm9yKSBvdmVycmlkZSB7CisgICAgICAgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAgICAgICAgIHRoaXMtPnplcm8oKTsKKyAgICAgICAgICAgICAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkoR2V0Q3VycmVudFRocmVhZCgpLCAmZ2EpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJHZXRUaHJlYWRHcm91cEFmZmluaXR5KCkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChnYS5Hcm91cCA8IDApIHx8IChnYS5Hcm91cCA+IF9fa21wX251bV9wcm9jX2dyb3VwcykgfHwgKGdhLk1hc2sgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYXNrW2dhLkdyb3VwXSA9IGdhLk1hc2s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hc2tfdCBuZXdNYXNrLCBzeXNNYXNrLCByZXR2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRQcm9jZXNzKCksICZuZXdNYXNrLCAmc3lzTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dmFsID0gU2V0VGhyZWFkQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRUaHJlYWQoKSwgbmV3TWFzayk7CisgICAgICAgICAgICAgICAgaWYgKCEgcmV0dmFsKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV3TWFzayA9IFNldFRocmVhZEFmZmluaXR5TWFzayhHZXRDdXJyZW50VGhyZWFkKCksIHJldHZhbCk7CisgICAgICAgICAgICAgICAgaWYgKCEgbmV3TWFzaykgeworICAgICAgICAgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIlNldFRocmVhZEFmZmluaXR5TWFzaygpIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqbWFzayA9IHJldHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGludCBnZXRfcHJvY19ncm91cCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGludCBncm91cCA9IC0xOworICAgICAgICAgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hc2tbaV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGdyb3VwID49IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBncm91cCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZ3JvdXA7CisgICAgICAgIH0KKyAgICB9OworICAgIHZvaWQgZGV0ZXJtaW5lX2NhcGFibGUoY29uc3QgY2hhciogZW52X3Zhcikgb3ZlcnJpZGUgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZShlbnZfdmFyKTsKKyAgICB9CisgICAgdm9pZCBiaW5kX3RocmVhZChpbnQgd2hpY2gpIG92ZXJyaWRlIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQod2hpY2gpOworICAgIH0KKyAgICBLTVBBZmZpbml0eTo6TWFzayogYWxsb2NhdGVfbWFzaygpIG92ZXJyaWRlIHsgcmV0dXJuIG5ldyBNYXNrKCk7ICB9CisgICAgdm9pZCBkZWFsbG9jYXRlX21hc2soS01QQWZmaW5pdHk6Ok1hc2sqIG0pIG92ZXJyaWRlIHsgZGVsZXRlIG07IH0KKyAgICBLTVBBZmZpbml0eTo6TWFzayogYWxsb2NhdGVfbWFza19hcnJheShpbnQgbnVtKSBvdmVycmlkZSB7IHJldHVybiBuZXcgTWFza1tudW1dOyB9CisgICAgdm9pZCBkZWFsbG9jYXRlX21hc2tfYXJyYXkoS01QQWZmaW5pdHk6Ok1hc2sqIGFycmF5KSBvdmVycmlkZSB7CisgICAgICAgIE1hc2sqIHdpbmRvd3NfYXJyYXkgPSBzdGF0aWNfY2FzdDxNYXNrKj4oYXJyYXkpOworICAgICAgICBkZWxldGVbXSB3aW5kb3dzX2FycmF5OworICAgIH0KKyAgICBLTVBBZmZpbml0eTo6TWFzayogaW5kZXhfbWFza19hcnJheShLTVBBZmZpbml0eTo6TWFzayogYXJyYXksIGludCBpbmRleCkgb3ZlcnJpZGUgeworICAgICAgICBNYXNrKiB3aW5kb3dzX2FycmF5ID0gc3RhdGljX2Nhc3Q8TWFzayo+KGFycmF5KTsKKyAgICAgICAgcmV0dXJuICYod2luZG93c19hcnJheVtpbmRleF0pOworICAgIH0KKyAgICBhcGlfdHlwZSBnZXRfYXBpX3R5cGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBOQVRJVkVfT1M7IH0KK307CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKK2NsYXNzIEFkZHJlc3MgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhEZXB0aCA9IDMyOworICAgIHVuc2lnbmVkIGxhYmVsc1ttYXhEZXB0aF07CisgICAgdW5zaWduZWQgY2hpbGROdW1zW21heERlcHRoXTsKKyAgICB1bnNpZ25lZCBkZXB0aDsKKyAgICB1bnNpZ25lZCBsZWFkZXI7CisgICAgQWRkcmVzcyh1bnNpZ25lZCBfZGVwdGgpCisgICAgICA6IGRlcHRoKF9kZXB0aCksIGxlYWRlcihGQUxTRSkgeworICAgIH0KKyAgICBBZGRyZXNzICZvcGVyYXRvcj0oY29uc3QgQWRkcmVzcyAmYikgeworICAgICAgICBkZXB0aCA9IGIuZGVwdGg7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgICAgICAgICBsYWJlbHNbaV0gPSBiLmxhYmVsc1tpXTsKKyAgICAgICAgICAgIGNoaWxkTnVtc1tpXSA9IGIuY2hpbGROdW1zW2ldOworICAgICAgICB9CisgICAgICAgIGxlYWRlciA9IEZBTFNFOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBZGRyZXNzICZiKSBjb25zdCB7CisgICAgICAgIGlmIChkZXB0aCAhPSBiLmRlcHRoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKKyAgICAgICAgICAgIGlmKGxhYmVsc1tpXSAhPSBiLmxhYmVsc1tpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBib29sIGlzQ2xvc2UoY29uc3QgQWRkcmVzcyAmYiwgaW50IGxldmVsKSBjb25zdCB7CisgICAgICAgIGlmIChkZXB0aCAhPSBiLmRlcHRoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoKHVuc2lnbmVkKWxldmVsID49IGRlcHRoKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAoZGVwdGggLSBsZXZlbCk7IGkrKykKKyAgICAgICAgICAgIGlmKGxhYmVsc1tpXSAhPSBiLmxhYmVsc1tpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oYik7CisgICAgfQorICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7CisgICAgICAgIHVuc2lnbmVkIGk7CisgICAgICAgIHByaW50ZigiRGVwdGg6ICV1IC0tLSAiLCBkZXB0aCk7CisgICAgICAgIGZvcihpPTA7aTxkZXB0aDtpKyspIHsKKyAgICAgICAgICAgIHByaW50ZigiJXUgIiwgbGFiZWxzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK307CisKK2NsYXNzIEFkZHJVbnNQYWlyIHsKK3B1YmxpYzoKKyAgICBBZGRyZXNzIGZpcnN0OworICAgIHVuc2lnbmVkIHNlY29uZDsKKyAgICBBZGRyVW5zUGFpcihBZGRyZXNzIF9maXJzdCwgdW5zaWduZWQgX3NlY29uZCkKKyAgICAgIDogZmlyc3QoX2ZpcnN0KSwgc2Vjb25kKF9zZWNvbmQpIHsKKyAgICB9CisgICAgQWRkclVuc1BhaXIgJm9wZXJhdG9yPShjb25zdCBBZGRyVW5zUGFpciAmYikKKyAgICB7CisgICAgICAgIGZpcnN0ID0gYi5maXJzdDsKKyAgICAgICAgc2Vjb25kID0gYi5zZWNvbmQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgdm9pZCBwcmludCgpIGNvbnN0IHsKKyAgICAgICAgcHJpbnRmKCJmaXJzdCA9ICIpOyBmaXJzdC5wcmludCgpOworICAgICAgICBwcmludGYoIiAtLS0gc2Vjb25kID0gJXUiLCBzZWNvbmQpOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWRkclVuc1BhaXIgJmIpIGNvbnN0IHsKKyAgICAgICAgaWYoZmlyc3QgIT0gYi5maXJzdCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZihzZWNvbmQgIT0gYi5zZWNvbmQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBZGRyVW5zUGFpciAmYikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oYik7CisgICAgfQorfTsKKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19sYWJlbHMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBBZGRyZXNzICphYSA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYSkKKyAgICAgIC0+Zmlyc3QpOworICAgIGNvbnN0IEFkZHJlc3MgKmJiID0gKGNvbnN0IEFkZHJlc3MgKikmKCgoQWRkclVuc1BhaXIgKiliKQorICAgICAgLT5maXJzdCk7CisgICAgdW5zaWduZWQgZGVwdGggPSBhYS0+ZGVwdGg7CisgICAgdW5zaWduZWQgaTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGRlcHRoID09IGJiLT5kZXB0aCk7CisgICAgZm9yIChpICA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgICAgIGlmIChhYS0+bGFiZWxzW2ldIDwgYmItPmxhYmVsc1tpXSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoYWEtPmxhYmVsc1tpXSA+IGJiLT5sYWJlbHNbaV0pIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKiogQSBzdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgbWFjaGluZS1zcGVjaWZpYyBoaWVyYXJjaHkgaW5mbyB0byBiZSBjb21wdXRlZCBvbmNlIGF0IGluaXQuCisgICAgVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIG1hcHBpbmcgb2YgdGhyZWFkcyB0byB0aGUgYWN0dWFsIG1hY2hpbmUgaGllcmFyY2h5LCBvciB0bworICAgIG91ciBiZXN0IGd1ZXNzIGF0IHdoYXQgdGhlIGhpZXJhcmNoeSBtaWdodCBiZSwgZm9yIHRoZSBwdXJwb3NlIG9mIHBlcmZvcm1pbmcgYW4KKyAgICBlZmZpY2llbnQgYmFycmllci4gIEluIHRoZSB3b3JzdCBjYXNlLCB3aGVuIHRoZXJlIGlzIG5vIG1hY2hpbmUgaGllcmFyY2h5IGluZm9ybWF0aW9uLAorICAgIGl0IHByb2R1Y2VzIGEgdHJlZSBzdWl0YWJsZSBmb3IgYSBiYXJyaWVyLCBzaW1pbGFyIHRvIHRoZSB0cmVlIHVzZWQgaW4gdGhlIGh5cGVyIGJhcnJpZXIuICovCitjbGFzcyBoaWVyYXJjaHlfaW5mbyB7CitwdWJsaWM6CisgICAgLyoqIEdvb2QgZGVmYXVsdCB2YWx1ZXMgZm9yIG51bWJlciBvZiBsZWF2ZXMgYW5kIGJyYW5jaGluZyBmYWN0b3IsIGdpdmVuIG5vIGFmZmluaXR5IGluZm9ybWF0aW9uLgorCUJlaGF2ZXMgYSBiaXQgbGlrZSBoeXBlciBiYXJyaWVyLiAqLworICAgIHN0YXRpYyBjb25zdCBrbXBfdWludDMyIG1heExlYXZlcz00OworICAgIHN0YXRpYyBjb25zdCBrbXBfdWludDMyIG1pbkJyYW5jaD00OworICAgIC8qKiBOdW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBoaWVyYXJjaHkuIFR5cGljYWwgbGV2ZWxzIGFyZSB0aHJlYWRzL2NvcmUsIGNvcmVzL3BhY2thZ2UKKwlvciBzb2NrZXQsIHBhY2thZ2VzL25vZGUsIG5vZGVzL21hY2hpbmUsIGV0Yy4gIFdlIGRvbid0IHdhbnQgdG8gZ2V0IHNwZWNpZmljIHdpdGgKKwlub21lbmNsYXR1cmUuICBXaGVuIHRoZSBtYWNoaW5lIGlzIG92ZXJzdWJzY3JpYmVkIHdlIGFkZCBsZXZlbHMgdG8gZHVwbGljYXRlIHRoZQorCWhpZXJhcmNoeSwgZG91YmxpbmcgdGhlIHRocmVhZCBjYXBhY2l0eSBvZiB0aGUgaGllcmFyY2h5IGVhY2ggdGltZSB3ZSBhZGQgYSBsZXZlbC4gKi8KKyAgICBrbXBfdWludDMyIG1heExldmVsczsKKworICAgIC8qKiBUaGlzIGlzIHNwZWNpZmljYWxseSB0aGUgZGVwdGggb2YgdGhlIG1hY2hpbmUgY29uZmlndXJhdGlvbiBoaWVyYXJjaHksIGluIHRlcm1zIG9mIHRoZQorICAgICAgICBudW1iZXIgb2YgbGV2ZWxzIGFsb25nIHRoZSBsb25nZXN0IHBhdGggZnJvbSByb290IHRvIGFueSBsZWFmLiBJdCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgaW4gbnVtUGVyTGV2ZWwgaWYgd2UgZXhjbHVkZSBhbGwgYnV0IG9uZSB0cmFpbGluZyAxLiAqLworICAgIGttcF91aW50MzIgZGVwdGg7CisgICAga21wX3VpbnQzMiBiYXNlX251bV90aHJlYWRzOworICAgIGVudW0gaW5pdF9zdGF0dXMgeyBpbml0aWFsaXplZD0wLCBub3RfaW5pdGlhbGl6ZWQ9MSwgaW5pdGlhbGl6aW5nPTIgfTsKKyAgICB2b2xhdGlsZSBrbXBfaW50OCB1bmluaXRpYWxpemVkOyAvLyAwPWluaXRpYWxpemVkLCAxPW5vdCBpbml0aWFsaXplZCwgMj1pbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzcworICAgIHZvbGF0aWxlIGttcF9pbnQ4IHJlc2l6aW5nOyAvLyAwPW5vdCByZXNpemluZywgMT1yZXNpemluZworCisgICAgLyoqIExldmVsIDAgY29ycmVzcG9uZHMgdG8gbGVhdmVzLiBudW1QZXJMZXZlbFtpXSBpcyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoZSBwYXJlbnQgb2YgYQorICAgICAgICBub2RlIGF0IGxldmVsIGkgaGFzLiBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZSBhIG1hY2hpbmUgd2l0aCA0IHBhY2thZ2VzLCA0IGNvcmVzL3BhY2thZ2UKKyAgICAgICAgYW5kIDIgSFQgcGVyIGNvcmUsIHRoZW4gbnVtUGVyTGV2ZWwgPSB7MiwgNCwgNCwgMSwgMX0uIEFsbCBlbXB0eSBsZXZlbHMgYXJlIHNldCB0byAxLiAqLworICAgIGttcF91aW50MzIgKm51bVBlckxldmVsOworICAgIGttcF91aW50MzIgKnNraXBQZXJMZXZlbDsKKworICAgIHZvaWQgZGVyaXZlTGV2ZWxzKEFkZHJVbnNQYWlyICphZHIyb3MsIGludCBudW1fYWRkcnMpIHsKKyAgICAgICAgaW50IGhpZXJfZGVwdGggPSBhZHIyb3NbMF0uZmlyc3QuZGVwdGg7CisgICAgICAgIGludCBsZXZlbCA9IDA7CisgICAgICAgIGZvciAoaW50IGk9aGllcl9kZXB0aC0xOyBpPj0wOyAtLWkpIHsKKyAgICAgICAgICAgIGludCBtYXggPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxudW1fYWRkcnM7ICsraikgeworICAgICAgICAgICAgICAgIGludCBuZXh0ID0gYWRyMm9zW2pdLmZpcnN0LmNoaWxkTnVtc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dCA+IG1heCkgbWF4ID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bVBlckxldmVsW2xldmVsXSA9IG1heCsxOworICAgICAgICAgICAgKytsZXZlbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGhpZXJhcmNoeV9pbmZvKCkgOiBtYXhMZXZlbHMoNyksIGRlcHRoKDEpLCB1bmluaXRpYWxpemVkKG5vdF9pbml0aWFsaXplZCksIHJlc2l6aW5nKDApIHt9CisKKyAgICB2b2lkIGZpbmkoKSB7IGlmICghdW5pbml0aWFsaXplZCAmJiBudW1QZXJMZXZlbCkgX19rbXBfZnJlZShudW1QZXJMZXZlbCk7IH0KKworICAgIHZvaWQgaW5pdChBZGRyVW5zUGFpciAqYWRyMm9zLCBpbnQgbnVtX2FkZHJzKQorICAgIHsKKyAgICAgICAga21wX2ludDggYm9vbF9yZXN1bHQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROCgmdW5pbml0aWFsaXplZCwgbm90X2luaXRpYWxpemVkLCBpbml0aWFsaXppbmcpOworICAgICAgICBpZiAoYm9vbF9yZXN1bHQgPT0gMCkgeyAvLyBXYWl0IGZvciBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgd2hpbGUgKFRDUl8xKHVuaW5pdGlhbGl6ZWQpICE9IGluaXRpYWxpemVkKSBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChib29sX3Jlc3VsdD09MSk7CisKKyAgICAgICAgLyogQWRkZWQgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGRhdGEgZmllbGRzIGhlcmUgdG8gcHJldmVudCB1c2FnZSBvZiBkaXJ0eSB2YWx1ZQorICAgICAgICAgICBvYnNlcnZlZCB3aGVuIHN0YXRpYyBsaWJyYXJ5IGlzIHJlLWluaXRpYWxpemVkIG11bHRpcGxlIHRpbWVzIChlLmcuIHdoZW4KKyAgICAgICAgICAgbm9uLU9wZW5NUCB0aHJlYWQgcmVwZWF0ZWRseSBsYXVuY2hlcy9qb2lucyB0aHJlYWQgdGhhdCB1c2VzIE9wZW5NUCkuICovCisgICAgICAgIGRlcHRoID0gMTsKKyAgICAgICAgcmVzaXppbmcgPSAwOworICAgICAgICBtYXhMZXZlbHMgPSA3OworICAgICAgICBudW1QZXJMZXZlbCA9IChrbXBfdWludDMyICopX19rbXBfYWxsb2NhdGUobWF4TGV2ZWxzKjIqc2l6ZW9mKGttcF91aW50MzIpKTsKKyAgICAgICAgc2tpcFBlckxldmVsID0gJihudW1QZXJMZXZlbFttYXhMZXZlbHNdKTsKKyAgICAgICAgZm9yIChrbXBfdWludDMyIGk9MDsgaTxtYXhMZXZlbHM7ICsraSkgeyAvLyBpbml0IG51bVBlckxldmVsWypdIHRvIDEgaXRlbSBwZXIgbGV2ZWwKKyAgICAgICAgICAgIG51bVBlckxldmVsW2ldID0gMTsKKyAgICAgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBTb3J0IHRhYmxlIGJ5IHBoeXNpY2FsIElECisgICAgICAgIGlmIChhZHIyb3MpIHsKKyAgICAgICAgICAgIHFzb3J0KGFkcjJvcywgbnVtX2FkZHJzLCBzaXplb2YoKmFkcjJvcyksIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2xhYmVscyk7CisgICAgICAgICAgICBkZXJpdmVMZXZlbHMoYWRyMm9zLCBudW1fYWRkcnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbnVtUGVyTGV2ZWxbMF0gPSBtYXhMZWF2ZXM7CisgICAgICAgICAgICBudW1QZXJMZXZlbFsxXSA9IG51bV9hZGRycy9tYXhMZWF2ZXM7CisgICAgICAgICAgICBpZiAobnVtX2FkZHJzJW1heExlYXZlcykgbnVtUGVyTGV2ZWxbMV0rKzsKKyAgICAgICAgfQorCisgICAgICAgIGJhc2VfbnVtX3RocmVhZHMgPSBudW1fYWRkcnM7CisgICAgICAgIGZvciAoaW50IGk9bWF4TGV2ZWxzLTE7IGk+PTA7IC0taSkgLy8gY291bnQgbm9uLWVtcHR5IGxldmVscyB0byBnZXQgZGVwdGgKKyAgICAgICAgICAgIGlmIChudW1QZXJMZXZlbFtpXSAhPSAxIHx8IGRlcHRoID4gMSkgLy8gb25seSBjb3VudCBvbmUgdG9wLWxldmVsICcxJworICAgICAgICAgICAgICAgIGRlcHRoKys7CisKKyAgICAgICAga21wX3VpbnQzMiBicmFuY2ggPSBtaW5CcmFuY2g7CisgICAgICAgIGlmIChudW1QZXJMZXZlbFswXSA9PSAxKSBicmFuY2ggPSBudW1fYWRkcnMvbWF4TGVhdmVzOworICAgICAgICBpZiAoYnJhbmNoPG1pbkJyYW5jaCkgYnJhbmNoPW1pbkJyYW5jaDsKKyAgICAgICAgZm9yIChrbXBfdWludDMyIGQ9MDsgZDxkZXB0aC0xOyArK2QpIHsgLy8gb3B0aW1pemUgaGllcmFyY2h5IHdpZHRoCisgICAgICAgICAgICB3aGlsZSAobnVtUGVyTGV2ZWxbZF0gPiBicmFuY2ggfHwgKGQ9PTAgJiYgbnVtUGVyTGV2ZWxbZF0+bWF4TGVhdmVzKSkgeyAvLyBtYXggNCBvbiBsZXZlbCAwIQorICAgICAgICAgICAgICAgIGlmIChudW1QZXJMZXZlbFtkXSAmIDEpIG51bVBlckxldmVsW2RdKys7CisgICAgICAgICAgICAgICAgbnVtUGVyTGV2ZWxbZF0gPSBudW1QZXJMZXZlbFtkXSA+PiAxOworICAgICAgICAgICAgICAgIGlmIChudW1QZXJMZXZlbFtkKzFdID09IDEpIGRlcHRoKys7CisgICAgICAgICAgICAgICAgbnVtUGVyTGV2ZWxbZCsxXSA9IG51bVBlckxldmVsW2QrMV0gPDwgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG51bVBlckxldmVsWzBdID09IDEpIHsKKyAgICAgICAgICAgICAgICBicmFuY2ggPSBicmFuY2ggPj4gMTsKKyAgICAgICAgICAgICAgICBpZiAoYnJhbmNoPDQpIGJyYW5jaCA9IG1pbkJyYW5jaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoa21wX3VpbnQzMiBpPTE7IGk8ZGVwdGg7ICsraSkKKyAgICAgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IG51bVBlckxldmVsW2ktMV0gKiBza2lwUGVyTGV2ZWxbaS0xXTsKKyAgICAgICAgLy8gRmlsbCBpbiBoaWVyYXJjaHkgaW4gdGhlIGNhc2Ugb2Ygb3ZlcnN1YnNjcmlwdGlvbgorICAgICAgICBmb3IgKGttcF91aW50MzIgaT1kZXB0aDsgaTxtYXhMZXZlbHM7ICsraSkKKyAgICAgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IDIqc2tpcFBlckxldmVsW2ktMV07CisKKyAgICAgICAgdW5pbml0aWFsaXplZCA9IGluaXRpYWxpemVkOyAvLyBPbmUgd3JpdGVyCisKKyAgICB9CisKKyAgICAvLyBSZXNpemUgdGhlIGhpZXJhcmNoeSBpZiBucHJvYyBjaGFuZ2VzIHRvIHNvbWV0aGluZyBsYXJnZXIgdGhhbiBiZWZvcmUKKyAgICB2b2lkIHJlc2l6ZShrbXBfdWludDMyIG5wcm9jKQorICAgIHsKKyAgICAgICAga21wX2ludDggYm9vbF9yZXN1bHQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROCgmcmVzaXppbmcsIDAsIDEpOworICAgICAgICB3aGlsZSAoYm9vbF9yZXN1bHQgPT0gMCkgeyAvLyBzb21lb25lIGVsc2UgaXMgdHJ5aW5nIHRvIHJlc2l6ZQorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgaWYgKG5wcm9jIDw9IGJhc2VfbnVtX3RocmVhZHMpICAvLyBoYXBweSB3aXRoIG90aGVyIHRocmVhZCdzIHJlc2l6ZQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGVsc2UgLy8gdHJ5IHRvIHJlc2l6ZQorICAgICAgICAgICAgICAgIGJvb2xfcmVzdWx0ID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgoJnJlc2l6aW5nLCAwLCAxKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJvb2xfcmVzdWx0IT0wKTsKKyAgICAgICAgaWYgKG5wcm9jIDw9IGJhc2VfbnVtX3RocmVhZHMpIHJldHVybjsgLy8gaGFwcHkgd2l0aCBvdGhlciB0aHJlYWQncyByZXNpemUKKworICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IG1heExldmVscworICAgICAgICBrbXBfdWludDMyIG9sZF9zeiA9IHNraXBQZXJMZXZlbFtkZXB0aC0xXTsKKyAgICAgICAga21wX3VpbnQzMiBpbmNzID0gMCwgb2xkX21heExldmVscyA9IG1heExldmVsczsKKyAgICAgICAgLy8gRmlyc3Qgc2VlIGlmIG9sZCBtYXhMZXZlbHMgaXMgZW5vdWdoIHRvIGNvbnRhaW4gbmV3IHNpemUKKyAgICAgICAgZm9yIChrbXBfdWludDMyIGk9ZGVwdGg7IGk8bWF4TGV2ZWxzICYmIG5wcm9jPm9sZF9zejsgKytpKSB7CisgICAgICAgICAgICBza2lwUGVyTGV2ZWxbaV0gPSAyKnNraXBQZXJMZXZlbFtpLTFdOworICAgICAgICAgICAgbnVtUGVyTGV2ZWxbaS0xXSAqPSAyOworICAgICAgICAgICAgb2xkX3N6ICo9IDI7CisgICAgICAgICAgICBkZXB0aCsrOworICAgICAgICB9CisgICAgICAgIGlmIChucHJvYyA+IG9sZF9zeikgeyAvLyBOb3QgZW5vdWdoIHNwYWNlLCBuZWVkIHRvIGV4cGFuZCBoaWVyYXJjaHkKKyAgICAgICAgICAgIHdoaWxlIChucHJvYyA+IG9sZF9zeikgeworICAgICAgICAgICAgICAgIG9sZF9zeiAqPTI7CisgICAgICAgICAgICAgICAgaW5jcysrOworICAgICAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXhMZXZlbHMgKz0gaW5jczsKKworICAgICAgICAgICAgLy8gUmVzaXplIGFycmF5cworICAgICAgICAgICAga21wX3VpbnQzMiAqb2xkX251bVBlckxldmVsID0gbnVtUGVyTGV2ZWw7CisgICAgICAgICAgICBrbXBfdWludDMyICpvbGRfc2tpcFBlckxldmVsID0gc2tpcFBlckxldmVsOworICAgICAgICAgICAgbnVtUGVyTGV2ZWwgPSBza2lwUGVyTGV2ZWwgPSBOVUxMOworICAgICAgICAgICAgbnVtUGVyTGV2ZWwgPSAoa21wX3VpbnQzMiAqKV9fa21wX2FsbG9jYXRlKG1heExldmVscyoyKnNpemVvZihrbXBfdWludDMyKSk7CisgICAgICAgICAgICBza2lwUGVyTGV2ZWwgPSAmKG51bVBlckxldmVsW21heExldmVsc10pOworCisgICAgICAgICAgICAvLyBDb3B5IG9sZCBlbGVtZW50cyBmcm9tIG9sZCBhcnJheXMKKyAgICAgICAgICAgIGZvciAoa21wX3VpbnQzMiBpPTA7IGk8b2xkX21heExldmVsczsgKytpKSB7IC8vIGluaXQgbnVtUGVyTGV2ZWxbKl0gdG8gMSBpdGVtIHBlciBsZXZlbAorICAgICAgICAgICAgICAgIG51bVBlckxldmVsW2ldID0gb2xkX251bVBlckxldmVsW2ldOworICAgICAgICAgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IG9sZF9za2lwUGVyTGV2ZWxbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluaXQgbmV3IGVsZW1lbnRzIGluIGFycmF5cyB0byAxCisgICAgICAgICAgICBmb3IgKGttcF91aW50MzIgaT1vbGRfbWF4TGV2ZWxzOyBpPG1heExldmVsczsgKytpKSB7IC8vIGluaXQgbnVtUGVyTGV2ZWxbKl0gdG8gMSBpdGVtIHBlciBsZXZlbAorICAgICAgICAgICAgICAgIG51bVBlckxldmVsW2ldID0gMTsKKyAgICAgICAgICAgICAgICBza2lwUGVyTGV2ZWxbaV0gPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGcmVlIG9sZCBhcnJheXMKKyAgICAgICAgICAgIF9fa21wX2ZyZWUob2xkX251bVBlckxldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgaW4gb3ZlcnN1YnNjcmlwdGlvbiBsZXZlbHMgb2YgaGllcmFyY2h5CisgICAgICAgIGZvciAoa21wX3VpbnQzMiBpPW9sZF9tYXhMZXZlbHM7IGk8bWF4TGV2ZWxzOyArK2kpCisgICAgICAgICAgICBza2lwUGVyTGV2ZWxbaV0gPSAyKnNraXBQZXJMZXZlbFtpLTFdOworCisgICAgICAgIGJhc2VfbnVtX3RocmVhZHMgPSBucHJvYzsKKyAgICAgICAgcmVzaXppbmcgPSAwOyAvLyBPbmUgd3JpdGVyCisKKyAgICB9Cit9OworI2VuZGlmIC8vIEtNUF9BRkZJTklUWV9ICmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2FsbG9jLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfYWxsb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllN2VkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2FsbG9jLmNwcApAQCAtMCwwICsxLDIwNzggQEAKKy8qCisgKiBrbXBfYWxsb2MuY3BwIC0tIHByaXZhdGUvc2hhcmVkIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gYW5kIG1hbmFnZW1lbnQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX21hbGxvYy5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisvLyBEaXNhYmxlIGJnZXQgd2hlbiBpdCBpcyBub3QgdXNlZAorI2lmIEtNUF9VU0VfQkdFVAorCisvKiBUaHJlYWQgcHJpdmF0ZSBidWZmZXIgbWFuYWdlbWVudCBjb2RlICovCisKK3R5cGVkZWYgaW50ICAgKCpiZ2V0X2NvbXBhY3RfdCkoc2l6ZV90LCBpbnQpOwordHlwZWRlZiB2b2lkICooKmJnZXRfYWNxdWlyZV90KShzaXplX3QpOwordHlwZWRlZiB2b2lkICAoKmJnZXRfcmVsZWFzZV90KSh2b2lkICopOworCisvKiBOT1RFOiBidWZzaXplIG11c3QgYmUgYSBzaWduZWQgZGF0YXR5cGUgKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9BUk0KKyAgIHR5cGVkZWYga21wX2ludDMyIGJ1ZnNpemU7CisjIGVsc2UKKyAgIHR5cGVkZWYga21wX2ludDY0IGJ1ZnNpemU7CisjIGVuZGlmCisjZWxzZQorICB0eXBlZGVmIHNzaXplX3QgYnVmc2l6ZTsKKyNlbmRpZgorCisvKiBUaGUgdGhyZWUgbW9kZXMgb2Ygb3BlcmF0aW9uIGFyZSwgZmlmbyBzZWFyY2gsIGxpZm8gc2VhcmNoLCBhbmQgYmVzdC1maXQgKi8KKwordHlwZWRlZiBlbnVtIGJnZXRfbW9kZSB7CisgICAgYmdldF9tb2RlX2ZpZm8gPSAwLAorICAgIGJnZXRfbW9kZV9saWZvID0gMSwKKyAgICBiZ2V0X21vZGVfYmVzdCA9IDIKK30gYmdldF9tb2RlX3Q7CisKKworc3RhdGljIHZvaWQgICAgYnBvb2woIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWZmZXIsIGJ1ZnNpemUgbGVuKTsKK3N0YXRpYyB2b2lkICAgKmJnZXQoIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUpOworc3RhdGljIHZvaWQgICAqYmdldHooIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUpOworc3RhdGljIHZvaWQgICAqYmdldHIoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWZmZXIsIGJ1ZnNpemUgbmV3c2l6ZSk7CitzdGF0aWMgdm9pZCAgICBicmVsKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmKTsKK3N0YXRpYyB2b2lkICAgIGJlY3RsKCAga21wX2luZm9fdCAqdGgsIGJnZXRfY29tcGFjdF90IGNvbXBhY3QsIGJnZXRfYWNxdWlyZV90IGFjcXVpcmUsIGJnZXRfcmVsZWFzZV90IHJlbGVhc2UsIGJ1ZnNpemUgcG9vbF9pbmNyICk7CisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYyB2b2lkICAgIGJzdGF0cygga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgKmN1cmFsbG9jLCBidWZzaXplICp0b3RmcmVlLCBidWZzaXplICptYXhmcmVlLCBsb25nICpuZ2V0LCBsb25nICpucmVsKTsKK3N0YXRpYyB2b2lkICAgIGJzdGF0c2UoIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpwb29sX2luY3IsIGxvbmcgKm5wb29sLCBsb25nICpucGdldCwgbG9uZyAqbnByZWwsIGxvbmcgKm5kZ2V0LCBsb25nICpuZHJlbCk7CitzdGF0aWMgdm9pZCAgICBidWZkdW1wKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmKTsKK3N0YXRpYyB2b2lkICAgIGJwb29sZCgga21wX2luZm9fdCAqdGgsIHZvaWQgKnBvb2wsIGludCBkdW1wYWxsb2MsIGludCBkdW1wZnJlZSk7CitzdGF0aWMgaW50ICAgICBicG9vbHYoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwb29sKTsKKyNlbmRpZgorCisvKiBCR0VUIENPTkZJR1VSQVRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnVmZmVyIGFsbG9jYXRpb24gc2l6ZSBxdWFudHVtOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgYnVmZmVycyBhbGxvY2F0ZWQgYXJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgb2YgdGhpcyBzaXplLiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvLiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uIElBLTMyIGFyY2hpdGVjdHVyZSB3aXRoICBMaW51eCogT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbGxvYygpIGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZSAxNiBieXRlIGFsaWdubW5lbnQgKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCAhS01QX0hBVkVfUVVBRAorCisjZGVmaW5lIFNpemVRdWFudCAgIDgKKyNkZWZpbmUgQWxpZ25UeXBlICAgZG91YmxlCisKKyNlbHNlCisKKyNkZWZpbmUgU2l6ZVF1YW50ICAgMTYKKyNkZWZpbmUgQWxpZ25UeXBlICAgX1F1YWQKKworI2VuZGlmCisKKyNkZWZpbmUgQnVmU3RhdHMgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnN0YXRzKCkgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdG90YWwgZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wsIHRoZSBsYXJnZXN0IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGFuZCB0aGUgdG90YWwgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGFsbG9jYXRlZC4gKi8KKworI2lmZGVmIEtNUF9ERUJVRworCisjZGVmaW5lIEJ1ZkR1bXAgICAgIDEgICAgICAgICAgICAgICAgIC8qIERlZmluZSB0aGlzIHN5bWJvbCB0byBlbmFibGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwb29sZCgpIGZ1bmN0aW9uIHdoaWNoIGR1bXBzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzIGluIGEgYnVmZmVyIHBvb2wuICovCisKKyNkZWZpbmUgQnVmVmFsaWQgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBvb2x2KCkgZnVuY3Rpb24gZm9yIHZhbGlkYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBidWZmZXIgcG9vbC4gKi8KKworI2RlZmluZSBEdW1wRGF0YSAgICAxICAgICAgICAgICAgICAgICAvKiBEZWZpbmUgdGhpcyBzeW1ib2wgdG8gZW5hYmxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZkdW1wKCkgZnVuY3Rpb24gd2hpY2ggYWxsb3dzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBpbmcgdGhlIGNvbnRlbnRzIG9mIGFuIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBmcmVlIGJ1ZmZlci4gKi8KKyNpZmRlZiBOT1RfVVNFRF9OT1cKKworI2RlZmluZSBGcmVlV2lwZSAgICAxICAgICAgICAgICAgICAgICAvKiBXaXBlIGZyZWUgYnVmZmVycyB0byBhIGd1YXJhbnRlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiBvZiBnYXJiYWdlIHRvIHRyaXAgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzY3JlYW50cyB3aG8gYXR0ZW1wdCB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcnMgaW50byByZWxlYXNlZCBidWZmZXJzLiAqLworCisjZGVmaW5lIEJlc3RGaXQgICAgIDEgICAgICAgICAgICAgICAgIC8qIFVzZSBhIGJlc3QgZml0IGFsZ29yaXRobSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGluZyBmb3Igc3BhY2UgZm9yIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gcmVxdWVzdC4gIFRoaXMgdXNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgbW9yZSBlZmZpY2llbnRseSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gd2lsbCBiZSBtdWNoIHNsb3dlci4gKi8KKyNlbmRpZiAvKiBOT1RfVVNFRF9OT1cgKi8KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworCitzdGF0aWMgYnVmc2l6ZSBiZ2V0X2Jpbl9zaXplWyBdID0geworICAgIDAsCisvLyAgICAxIDw8IDYsICAgIC8qIC41IENhY2hlIGxpbmUgKi8KKyAgICAxIDw8IDcsICAgIC8qIDEgQ2FjaGUgbGluZSwgbmV3ICovCisgICAgMSA8PCA4LCAgICAvKiAyIENhY2hlIGxpbmVzICovCisgICAgMSA8PCA5LCAgICAvKiA0IENhY2hlIGxpbmVzLCBuZXcgKi8KKyAgICAxIDw8IDEwLCAgIC8qIDggQ2FjaGUgbGluZXMgKi8KKyAgICAxIDw8IDExLCAgIC8qIDE2IENhY2hlIGxpbmVzLCBuZXcgKi8KKyAgICAxIDw8IDEyLAorICAgIDEgPDwgMTMsICAgLyogbmV3ICovCisgICAgMSA8PCAxNCwKKyAgICAxIDw8IDE1LCAgIC8qIG5ldyAqLworICAgIDEgPDwgMTYsCisgICAgMSA8PCAxNywKKyAgICAxIDw8IDE4LAorICAgIDEgPDwgMTksCisgICAgMSA8PCAyMCwgICAgLyogIDFNQiAqLworICAgIDEgPDwgMjEsICAgIC8qICAyTUIgKi8KKyAgICAxIDw8IDIyLCAgICAvKiAgNE1CICovCisgICAgMSA8PCAyMywgICAgLyogIDhNQiAqLworICAgIDEgPDwgMjQsICAgIC8qIDE2TUIgKi8KKyAgICAxIDw8IDI1LCAgICAvKiAzMk1CICovCit9OworCisjZGVmaW5lIE1BWF9CR0VUX0JJTlMgICAoaW50KShzaXplb2YoYmdldF9iaW5fc2l6ZSkgLyBzaXplb2YoYnVmc2l6ZSkpCisKK3N0cnVjdCBiZmhlYWQ7CisKKy8qICBEZWNsYXJlIHRoZSBpbnRlcmZhY2UsIGluY2x1ZGluZyB0aGUgcmVxdWVzdGVkIGJ1ZmZlciBzaXplIHR5cGUsCisgICAgYnVmc2l6ZS4gICovCisKKy8qIFF1ZXVlIGxpbmtzICovCisKK3R5cGVkZWYgc3RydWN0IHFsaW5rcyB7CisgICAgc3RydWN0IGJmaGVhZCAqZmxpbms7ICAgICAgICAgICAgIC8qIEZvcndhcmQgbGluayAqLworICAgIHN0cnVjdCBiZmhlYWQgKmJsaW5rOyAgICAgICAgICAgICAvKiBCYWNrd2FyZCBsaW5rICovCit9IHFsaW5rc190OworCisvKiBIZWFkZXIgaW4gYWxsb2NhdGVkIGFuZCBmcmVlIGJ1ZmZlcnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmhlYWQyIHsKKyAgICBrbXBfaW5mb190ICpidGhyOyAgICAgICAgICAgICAgICAgLyogVGhlIHRocmVhZCB3aGljaCBvd25zIHRoZSBidWZmZXIgcG9vbCAqLworICAgIGJ1ZnNpemUgICAgIHByZXZmcmVlOyAgICAgICAgICAgICAvKiBSZWxhdGl2ZSBsaW5rIGJhY2sgdG8gcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSBidWZmZXIgaW4gbWVtb3J5IG9yIDAgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgYnVmZmVyIGlzIGFsbG9jYXRlZC4gICovCisgICAgYnVmc2l6ZSAgICAgYnNpemU7ICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBzaXplOiBwb3NpdGl2ZSBpZiBmcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSBpZiBhbGxvY2F0ZWQuICovCit9IGJoZWFkMl90OworCisvKiBNYWtlIHN1cmUgdGhlIGJoZWFkIHN0cnVjdHVyZSBpcyBhIG11bHRpcGxlIG9mIFNpemVRdWFudCBpbiBzaXplLiAqLworCit0eXBlZGVmIHVuaW9uIGJoZWFkIHsKKyAgICBLTVBfQUxJR04oIFNpemVRdWFudCApCisgICAgQWxpZ25UeXBlICAgICAgICAgICBiX2FsaWduOworICAgIGNoYXIgICAgICAgICAgICAgICAgYl9wYWRbIHNpemVvZihiaGVhZDJfdCkgKyAoU2l6ZVF1YW50IC0gKHNpemVvZihiaGVhZDJfdCkgJSBTaXplUXVhbnQpKSBdOworICAgIGJoZWFkMl90ICAgICAgICAgICAgYmI7Cit9IGJoZWFkX3Q7CisjZGVmaW5lIEJIKHApICAgKChiaGVhZF90ICopIChwKSkKKworLyogIEhlYWRlciBpbiBkaXJlY3RseSBhbGxvY2F0ZWQgYnVmZmVycyAoYnkgYWNxZmNuKSAqLworCit0eXBlZGVmIHN0cnVjdCBiZGhlYWQKK3sKKyAgICBidWZzaXplIHRzaXplOyAgICAgICAgICAgICAgICAgICAgLyogVG90YWwgc2l6ZSwgaW5jbHVkaW5nIG92ZXJoZWFkICovCisgICAgYmhlYWRfdCBiaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBoZWFkZXIgKi8KK30gYmRoZWFkX3Q7CisjZGVmaW5lIEJESChwKSAgKChiZGhlYWRfdCAqKSAocCkpCisKKy8qIEhlYWRlciBpbiBmcmVlIGJ1ZmZlcnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmZoZWFkIHsKKyAgICBiaGVhZF90ICBiaDsgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbW9uIGFsbG9jYXRlZC9mcmVlIGhlYWRlciAqLworICAgIHFsaW5rc190IHFsOyAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5rcyBvbiBmcmVlIGxpc3QgKi8KK30gYmZoZWFkX3Q7CisjZGVmaW5lIEJGSChwKSAgKChiZmhlYWRfdCAqKSAocCkpCisKK3R5cGVkZWYgc3RydWN0IHRocl9kYXRhIHsKKyAgICBiZmhlYWRfdCBmcmVlbGlzdFsgTUFYX0JHRVRfQklOUyBdOworI2lmIEJ1ZlN0YXRzCisgICAgc2l6ZV90IHRvdGFsbG9jOyAgICAgICAgICAgICAgIC8qIFRvdGFsIHNwYWNlIGN1cnJlbnRseSBhbGxvY2F0ZWQgKi8KKyAgICBsb25nIG51bWdldCwgbnVtcmVsOyAgICAgICAgICAgLyogTnVtYmVyIG9mIGJnZXQoKSBhbmQgYnJlbCgpIGNhbGxzICovCisgICAgbG9uZyBudW1wYmxrOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBwb29sIGJsb2NrcyAqLworICAgIGxvbmcgbnVtcGdldCwgbnVtcHJlbDsgICAgICAgICAvKiBOdW1iZXIgb2YgYmxvY2sgZ2V0cyBhbmQgcmVscyAqLworICAgIGxvbmcgbnVtZGdldCwgbnVtZHJlbDsgICAgICAgICAvKiBOdW1iZXIgb2YgZGlyZWN0IGdldHMgYW5kIHJlbHMgKi8KKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworCisgICAgLyogQXV0b21hdGljIGV4cGFuc2lvbiBibG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworICAgIGJnZXRfY29tcGFjdF90IGNvbXBmY247CisgICAgYmdldF9hY3F1aXJlX3QgYWNxZmNuOworICAgIGJnZXRfcmVsZWFzZV90IHJlbGZjbjsKKworICAgIGJnZXRfbW9kZV90ICAgIG1vZGU7ICAgICAgICAgICAgICAvKiB3aGF0IGFsbG9jYXRpb24gbW9kZSB0byB1c2U/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+IF9fa21wX3RocmVhZF9yZWFsbG9jKCAlcCwgJXAsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIHRoLAorICAgICAgICBwdHIsCisgICAgICAgIChpbnQpIHNpemUKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICBwdHIgPSBiZ2V0ciggdGgsIHB0ciwgKGJ1ZnNpemUpIHNpemUgKTsKKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9yZWFsbG9jKCkgcmV0dXJucyAlcFxuIiwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkCitfX19rbXBfdGhyZWFkX2ZyZWUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgS0VfVFJBQ0UoIDMwLCAoCisgICAgICAgICItPiBfX2ttcF90aHJlYWRfZnJlZSggJXAsICVwICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIHRoLAorICAgICAgICBwdHIKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgICAgICAgYnJlbCggdGgsIHB0ciApOworICAgIH0KKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9mcmVlKClcbiIgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAgICBJZiBMRUFLX01FTU9SWSBpcyBkZWZpbmVkLCBfX2ttcF9mcmVlKCkgd2lsbCAqbm90KiBmcmVlIG1lbW9yeS4gSXQgY2F1c2VzIG1lbW9yeSBsZWFrcywgYnV0IGl0CisgICAgbWF5IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG1lbW9yeSBjb3JydXB0aW9ucywgdXNlZCBmcmVlZCBwb2ludGVycywgZXRjLgorKi8KKy8qICNkZWZpbmUgTEVBS19NRU1PUlkgKi8KKworc3RydWN0IGttcF9tZW1fZGVzY3IgeyAgICAgIC8vIE1lbW9yeSBibG9jayBkZXNjcmlwdG9yLgorICAgIHZvaWQgKiBwdHJfYWxsb2NhdGVkOyAgIC8vIFBvaW50ZXIgcmV0dXJuZWQgYnkgbWFsbG9jKCksIHN1YmplY3QgZm9yIGZyZWUoKS4KKyAgICBzaXplX3Qgc2l6ZV9hbGxvY2F0ZWQ7ICAvLyBTaXplIG9mIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2suCisgICAgdm9pZCAqIHB0cl9hbGlnbmVkOyAgICAgLy8gUG9pbnRlciB0byBhbGlnbmVkIG1lbW9yeSwgdG8gYmUgdXNlZCBieSBjbGllbnQgY29kZS4KKyAgICBzaXplX3Qgc2l6ZV9hbGlnbmVkOyAgICAvLyBTaXplIG9mIGFsaWduZWQgbWVtb3J5IGJsb2NrLgorfTsKK3R5cGVkZWYgc3RydWN0IGttcF9tZW1fZGVzY3Iga21wX21lbV9kZXNjcl90OworCisvKgorICAgIEFsbG9jYXRlIG1lbW9yeSBvbiByZXF1ZXN0ZWQgYm91bmRhcnksIGZpbGwgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIDB4MDAuCisgICAgTlVMTCBpcyBORVZFUiByZXR1cm5lZCwgX19rbXBfYWJvcnQoKSBpcyBjYWxsZWQgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKyAgICBNdXN0IHVzZSBfX2ttcF9mcmVlIHdoZW4gZnJlZWluZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSEKKyAqLworc3RhdGljCit2b2lkICoKK19fX2ttcF9hbGxvY2F0ZV9hbGlnbiggc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgLyoKKyAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCkgYWxsb2NhdGVzIChieSBjYWxsIHRvIG1hbGxvYygpKSBiaWdnZXIgbWVtb3J5IGJsb2NrIHRoYW4gcmVxdWVzdGVkIHRvCisgICAgICAgIHJldHVybiBwcm9wZXJseSBhbGlnbmVkIHBvaW50ZXIuIE9yaWdpbmFsIHBvaW50ZXIgcmV0dXJuZWQgYnkgbWFsbG9jKCkgYW5kIHNpemUgb2YgYWxsb2NhdGVkCisgICAgICAgIGJsb2NrIGlzIHNhdmVkIGluIGRlc2NyaXB0b3IganVzdCBiZWZvcmUgdGhlIGFsaWduZWQgcG9pbnRlci4gVGhpcyBpbmZvcm1hdGlvbiB1c2VkIGJ5CisgICAgICAgIF9fa21wX2ZyZWUoKSAtLSBpdCBoYXMgdG8gcGFzcyB0byBmcmVlKCkgb3JpZ2luYWwgcG9pbnRlciwgbm90IGFsaWduZWQgb25lLgorCisgICAgICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCisgICAgICAgICAgICB8IHBhZGRpbmcgfCBkZXNjcmlwdG9yIHwgICAgICAgICAgIGFsaWduZWQgYmxvY2sgICAgICAgICAgIHwgcGFkZGluZyB8CisgICAgICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCisgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICArLSBBbGlnbmVkIHBvaW50ZXIgcmV0dXJuZWQgdG8gY2FsbGVyCisgICAgICAgICAgICArLSBQb2ludGVyIHJldHVybmVkIGJ5IG1hbGxvYygpCisKKyAgICAgICAgQWxpZ25lZCBibG9jayBpcyBmaWxsZWQgd2l0aCB6ZXJvcywgcGFkZGluZ3MgYXJlIGZpbGxlZCB3aXRoIDB4RUYuCisgICAgKi8KKworICAgIGttcF9tZW1fZGVzY3JfdCAgZGVzY3I7CisgICAga21wX3VpbnRwdHJfdCAgICBhZGRyX2FsbG9jYXRlZDsgICAgICAgIC8vIEFkZHJlc3MgcmV0dXJuZWQgYnkgbWFsbG9jKCkuCisgICAga21wX3VpbnRwdHJfdCAgICBhZGRyX2FsaWduZWQ7ICAgICAgICAgIC8vIEFsaWduZWQgYWRkcmVzcyB0byByZXR1cm4gdG8gY2FsbGVyLgorICAgIGttcF91aW50cHRyX3QgICAgYWRkcl9kZXNjcjsgICAgICAgICAgICAvLyBBZGRyZXNzIG9mIG1lbW9yeSBibG9jayBkZXNjcmlwdG9yLgorCisgICAgS0VfVFJBQ0UoIDI1LCAoCisgICAgICAgICItPiBfX19rbXBfYWxsb2NhdGVfYWxpZ24oICVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICAoaW50KSBzaXplLAorICAgICAgICAoaW50KSBhbGlnbm1lbnQKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFsaWdubWVudCA8IDMyICogMTAyNCApOyAvLyBBbGlnbm1lbnQgc2hvdWxkIG5vdCBiZSB0b28KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIHZvaWQgKiApIDw9IHNpemVvZigga21wX3VpbnRwdHJfdCApICk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBrbXBfdWludHB0cl90IGlzIGVub3VnaCB0byBzdG9yZSBhZGRyZXNzZXMuCisKKyAgICBkZXNjci5zaXplX2FsaWduZWQgPSBzaXplOworICAgIGRlc2NyLnNpemVfYWxsb2NhdGVkID0gZGVzY3Iuc2l6ZV9hbGlnbmVkICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSArIGFsaWdubWVudDsKKworI2lmIEtNUF9ERUJVRworICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQgPSBfbWFsbG9jX3NyY19sb2MoIGRlc2NyLnNpemVfYWxsb2NhdGVkLCBfZmlsZV8sIF9saW5lXyApOworI2Vsc2UKKyAgICBkZXNjci5wdHJfYWxsb2NhdGVkID0gbWFsbG9jX3NyY19sb2MoIGRlc2NyLnNpemVfYWxsb2NhdGVkIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyNlbmRpZgorICAgIEtFX1RSQUNFKCAxMCwgKAorICAgICAgICAiICAgbWFsbG9jKCAlZCApIHJldHVybmVkICVwXG4iLAorICAgICAgICAoaW50KSBkZXNjci5zaXplX2FsbG9jYXRlZCwKKyAgICAgICAgZGVzY3IucHRyX2FsbG9jYXRlZAorICAgICkgKTsKKyAgICBpZiAoIGRlc2NyLnB0cl9hbGxvY2F0ZWQgPT0gTlVMTCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBPdXRPZkhlYXBNZW1vcnkgKTsKKyAgICB9OworCisgICAgYWRkcl9hbGxvY2F0ZWQgPSAoa21wX3VpbnRwdHJfdCkgZGVzY3IucHRyX2FsbG9jYXRlZDsKKyAgICBhZGRyX2FsaWduZWQgPQorICAgICAgICAoIGFkZHJfYWxsb2NhdGVkICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSArIGFsaWdubWVudCApCisgICAgICAgICYgfiAoIGFsaWdubWVudCAtIDEgKTsKKyAgICBhZGRyX2Rlc2NyID0gYWRkcl9hbGlnbmVkIC0gc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKTsKKworICAgIGRlc2NyLnB0cl9hbGlnbmVkID0gKHZvaWQgKikgYWRkcl9hbGlnbmVkOworCisgICAgS0VfVFJBQ0UoIDI2LCAoCisgICAgICAgICIgICBfX19rbXBfYWxsb2NhdGVfYWxpZ246ICIKKyAgICAgICAgICAgICJwdHJfYWxsb2NhdGVkPSVwLCBzaXplX2FsbG9jYXRlZD0lZCwgIgorICAgICAgICAgICAgInB0cl9hbGlnbmVkPSVwLCBzaXplX2FsaWduZWQ9JWRcbiIsCisgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQsCisgICAgICAgIChpbnQpIGRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICBkZXNjci5wdHJfYWxpZ25lZCwKKyAgICAgICAgKGludCkgZGVzY3Iuc2l6ZV9hbGlnbmVkCisgICAgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGxvY2F0ZWQgPD0gYWRkcl9kZXNjciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfZGVzY3IgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApID09IGFkZHJfYWxpZ25lZCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxpZ25lZCArIGRlc2NyLnNpemVfYWxpZ25lZCA8PSBhZGRyX2FsbG9jYXRlZCArIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGlnbmVkICUgYWxpZ25tZW50ID09IDAgKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIDB4RUYsIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgICAgIC8vIEZpbGwgYWxsb2NhdGVkIG1lbW9yeSBibG9jayB3aXRoIDB4RUYuCisjZW5kaWYKKyAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGlnbmVkLCAweDAwLCBkZXNjci5zaXplX2FsaWduZWQgKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgYWxpZ25lZCBtZW1vcnkgYmxvY2sgKHdoaWNoIGlzIGludGVuZGVkIGZvciB1c2luZyBieSBjYWxsZXIpIHdpdGggMHgwMC4gRG8gbm90CisgICAgICAgIC8vIHB1dCB0aGlzIGZpbGxpbmcgdW5kZXIgS01QX0RFQlVHIGNvbmRpdGlvbiEgTWFueSBjYWxsZXJzIGV4cGVjdCB6ZXJvZWQgbWVtb3J5LiAoUGFkZGluZworICAgICAgICAvLyBieXRlcyByZW1haW4gZmlsbGVkIHdpdGggMHhFRiBpbiBkZWJ1Z2dpbmcgbGlicmFyeS4pCisgICAgKiAoIChrbXBfbWVtX2Rlc2NyX3QgKikgYWRkcl9kZXNjciApID0gZGVzY3I7CisKKyAgICBLTVBfTUIoKTsKKworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19fa21wX2FsbG9jYXRlX2FsaWduKCkgcmV0dXJucyAlcFxuIiwgZGVzY3IucHRyX2FsaWduZWQgKSApOworICAgIHJldHVybiBkZXNjci5wdHJfYWxpZ25lZDsKK30gLy8gZnVuYyBfX19rbXBfYWxsb2NhdGVfYWxpZ24KKworCisvKgorICAgIEFsbG9jYXRlIG1lbW9yeSBvbiBjYWNoZSBsaW5lIGJvdW5kYXJ5LCBmaWxsIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCAweDAwLgorICAgIERvIG5vdCBjYWxsIHRoaXMgZnVuYyBkaXJlY3RseSEgVXNlIF9fa21wX2FsbG9jYXRlIG1hY3JvIGluc3RlYWQuCisgICAgTlVMTCBpcyBORVZFUiByZXR1cm5lZCwgX19rbXBfYWJvcnQoKSBpcyBjYWxsZWQgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKyAgICBNdXN0IHVzZSBfX2ttcF9mcmVlIHdoZW4gZnJlZWluZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSEKKyAqLwordm9pZCAqCitfX19rbXBfYWxsb2NhdGUoIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIHZvaWQgKiBwdHI7CisgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9hbGxvY2F0ZSggJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwgKGludCkgc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICBwdHIgPSBfX19rbXBfYWxsb2NhdGVfYWxpZ24oIHNpemUsIF9fa21wX2FsaWduX2FsbG9jIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2FsbG9jYXRlKCkgcmV0dXJucyAlcFxuIiwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfSAvLyBmdW5jIF9fX2ttcF9hbGxvY2F0ZQorCisjaWYgKEJVSUxEX01FTU9SWT09RklSU1RfVE9VQ0gpCit2b2lkICoKK19fa21wX2Z0X3BhZ2VfYWxsb2NhdGUoc2l6ZV90IHNpemUpCit7CisgIHZvaWQgKmFkciwgKmFhZHI7CisKKyAgY29uc3QgaW50IHBhZ2Vfc2l6ZSA9IEtNUF9HRVRfUEFHRV9TSVpFKCk7CisKKyAgYWRyID0gKHZvaWQgKikgX19rbXBfdGhyZWFkX21hbGxvYyggX19rbXBfZ2V0X3RocmVhZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArIHBhZ2Vfc2l6ZSArIEtNUF9QVFJfU0tJUCk7CisgIGlmICggYWRyID09IDAgKQorICAgIEtNUF9GQVRBTCggT3V0T2ZIZWFwTWVtb3J5ICk7CisKKyAgLyogY2hlY2sgdG8gc2VlIGlmIGFkciBpcyBvbiBhIHBhZ2UgYm91bmRhcnkuICovCisgIGlmICggKCAoa21wX3VpbnRwdHJfdCkgYWRyICYgKHBhZ2Vfc2l6ZSAtIDEpKSA9PSAwKQorICAgIC8qIG5vdGhpbmcgdG8gZG8gaWYgYWRyIGlzIGFscmVhZHkgb24gYSBwYWdlIGJvdW5kYXJ5LiAqLworICAgIGFhZHIgPSBhZHI7CisgIGVsc2UKKyAgICAvKiBlbHNlIHNldCBhYWRyIHRvIHRoZSBmaXJzdCBwYWdlIGJvdW5kYXJ5IGluIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAqLworICAgIGFhZHIgPSAodm9pZCAqKSAoICggKGttcF91aW50cHRyX3QpIGFkciArIHBhZ2Vfc2l6ZSkgJiB+KHBhZ2Vfc2l6ZSAtIDEpICk7CisKKyAgLyogdGhlIGZpcnN0IHRvdWNoIGJ5IHRoZSBvd25lciB0aHJlYWQuICovCisgICooKHZvaWQqKilhYWRyKSA9IGFkcjsKKworICAvKiBza2lwIHRoZSBtZW1vcnkgc3BhY2UgdXNlZCBmb3Igc3RvcmluZyBhZHIgYWJvdmUuICovCisgIHJldHVybiAodm9pZCopKChjaGFyKilhYWRyICsgS01QX1BUUl9TS0lQKTsKK30KKyNlbmRpZgorCisvKgorICAgIEFsbG9jYXRlIG1lbW9yeSBvbiBwYWdlIGJvdW5kYXJ5LCBmaWxsIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCAweDAwLgorICAgIERvZXMgbm90IGNhbGwgdGhpcyBmdW5jIGRpcmVjdGx5ISBVc2UgX19rbXBfcGFnZV9hbGxvY2F0ZSBtYWNybyBpbnN0ZWFkLgorICAgIE5VTEwgaXMgTkVWRVIgcmV0dXJuZWQsIF9fa21wX2Fib3J0KCkgaXMgY2FsbGVkIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisgICAgTXVzdCB1c2UgX19rbXBfZnJlZSB3aGVuIGZyZWVpbmcgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIHJvdXRpbmUhCisgKi8KK3ZvaWQgKgorX19fa21wX3BhZ2VfYWxsb2NhdGUoIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIGludCAgICBwYWdlX3NpemUgPSA4ICogMTAyNDsKKyAgICB2b2lkICogcHRyOworCisgICAgS0VfVFJBQ0UoIDI1LCAoCisgICAgICAgICItPiBfX2ttcF9wYWdlX2FsbG9jYXRlKCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICAoaW50KSBzaXplCisgICAgICAgIEtNUF9TUkNfTE9DX1BBUk0KKyAgICApICk7CisgICAgcHRyID0gX19fa21wX2FsbG9jYXRlX2FsaWduKCBzaXplLCBwYWdlX3NpemUgS01QX1NSQ19MT0NfUEFSTSApOworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfcGFnZV9hbGxvY2F0ZSggJWQgKSByZXR1cm5zICVwXG4iLCAoaW50KSBzaXplLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9IC8vIF9fX2ttcF9wYWdlX2FsbG9jYXRlCisKKy8qCisgICAgRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IF9fa21wX2FsbG9jYXRlKCkgYW5kIF9fa21wX3BhZ2VfYWxsb2NhdGUoKS4KKyAgICBJbiBkZWJ1ZyBtb2RlLCBmaWxsIHRoZSBtZW1vcnkgYmxvY2sgd2l0aCAweEVGIGJlZm9yZSBjYWxsIHRvIGZyZWUoKS4KKyovCit2b2lkCitfX19rbXBfZnJlZSggdm9pZCAqIHB0ciBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICBrbXBfbWVtX2Rlc2NyX3QgZGVzY3I7CisgICAga21wX3VpbnRwdHJfdCAgIGFkZHJfYWxsb2NhdGVkOyAgICAgICAgLy8gQWRkcmVzcyByZXR1cm5lZCBieSBtYWxsb2MoKS4KKyAgICBrbXBfdWludHB0cl90ICAgYWRkcl9hbGlnbmVkOyAgICAgICAgICAvLyBBbGlnbmVkIGFkZHJlc3MgcGFzc2VkIGJ5IGNhbGxlci4KKworICAgIEtFX1RSQUNFKCAyNSwgKCAiLT4gX19rbXBfZnJlZSggJXAgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwgcHRyIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgIEtNUF9BU1NFUlQoIHB0ciAhPSBOVUxMICk7CisKKyAgICBkZXNjciA9ICogKCBrbXBfbWVtX2Rlc2NyX3QgKikgKCAoa21wX3VpbnRwdHJfdCkgcHRyIC0gc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSApOworCisgICAgS0VfVFJBQ0UoIDI2LCAoICIgICBfX2ttcF9mcmVlOiAgICAgIgorICAgICAgICAgICAgICAgICAgICAicHRyX2FsbG9jYXRlZD0lcCwgc2l6ZV9hbGxvY2F0ZWQ9JWQsICIKKyAgICAgICAgICAgICAgICAgICAgInB0cl9hbGlnbmVkPSVwLCBzaXplX2FsaWduZWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIChpbnQpIGRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICBkZXNjci5wdHJfYWxpZ25lZCwgKGludCkgZGVzY3Iuc2l6ZV9hbGlnbmVkICkpOworCisgICAgYWRkcl9hbGxvY2F0ZWQgPSAoa21wX3VpbnRwdHJfdCkgZGVzY3IucHRyX2FsbG9jYXRlZDsKKyAgICBhZGRyX2FsaWduZWQgICA9IChrbXBfdWludHB0cl90KSBkZXNjci5wdHJfYWxpZ25lZDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxpZ25lZCAlIENBQ0hFX0xJTkUgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGRlc2NyLnB0cl9hbGlnbmVkID09IHB0ciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxsb2NhdGVkICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSA8PSBhZGRyX2FsaWduZWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBkZXNjci5zaXplX2FsaWduZWQgPCBkZXNjci5zaXplX2FsbG9jYXRlZCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxpZ25lZCArIGRlc2NyLnNpemVfYWxpZ25lZCA8PSBhZGRyX2FsbG9jYXRlZCArIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIG1lbXNldCggZGVzY3IucHRyX2FsbG9jYXRlZCwgMHhFRiwgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICAgICAgICAgIC8vIEZpbGwgbWVtb3J5IGJsb2NrIHdpdGggMHhFRiwgaXQgaGVscHMgY2F0Y2ggdXNpbmcgZnJlZWQgbWVtb3J5LgorICAgICNlbmRpZgorCisgICAgI2lmbmRlZiBMRUFLX01FTU9SWQorICAgICAgICBLRV9UUkFDRSggMTAsICggIiAgIGZyZWUoICVwIClcbiIsIGRlc2NyLnB0cl9hbGxvY2F0ZWQgKSApOworICAgICMgaWZkZWYgS01QX0RFQlVHCisgICAgICAgIF9mcmVlX3NyY19sb2MoIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIF9maWxlXywgX2xpbmVfICk7CisgICAgIyBlbHNlCisgICAgICAgIGZyZWVfc3JjX2xvYyggZGVzY3IucHRyX2FsbG9jYXRlZCBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgIyBlbmRpZgorICAgICNlbmRpZgorICAgIEtNUF9NQigpOworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfZnJlZSgpIHJldHVybnNcbiIgKSApOworfSAvLyBmdW5jIF9fX2ttcF9mcmVlCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBVU0VfRkFTVF9NRU1PUlkgPT0gMworLy8gQWxsb2NhdGUgZmFzdCBtZW1vcnkgYnkgZmlyc3Qgc2Nhbm5pbmcgdGhlIHRocmVhZCdzIGZyZWUgbGlzdHMKKy8vIElmIGEgY2h1bmsgdGhlIHJpZ2h0IHNpemUgZXhpc3RzLCBncmFiIGl0IG9mZiB0aGUgZnJlZSBsaXN0LgorLy8gT3RoZXJ3aXNlIGFsbG9jYXRlIG5vcm1hbGx5IHVzaW5nIGttcF90aHJlYWRfbWFsbG9jLgorCisvLyBBQzogSG93IHRvIGNob29zZSB0aGUgbGltaXQ/IEp1c3QgZ2V0IDE2IGZvciBub3cuLi4KKyNkZWZpbmUgS01QX0ZSRUVfTElTVF9MSU1JVCAxNgorCisvLyBBbHdheXMgdXNlIDEyOCBieXRlcyBmb3IgZGV0ZXJtaW5pbmcgYnVja2V0cyBmb3IgY2FjaGluZyBtZW1vcnkgYmxvY2tzCisjZGVmaW5lIERDQUNIRV9MSU5FICAxMjgKKwordm9pZCAqCitfX19rbXBfZmFzdF9hbGxvY2F0ZSgga21wX2luZm9fdCAqdGhpc190aHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIHZvaWQgICAgICAgICAgICAqIHB0cjsKKyAgICBpbnQgICAgICAgICAgICAgICBudW1fbGluZXM7CisgICAgaW50ICAgICAgICAgICAgICAgaWR4OworICAgIGludCAgICAgICAgICAgICAgIGluZGV4OworICAgIHZvaWQgICAgICAgICAgICAqIGFsbG9jX3B0cjsKKyAgICBzaXplX3QgICAgICAgICAgICBhbGxvY19zaXplOworICAgIGttcF9tZW1fZGVzY3JfdCAqIGRlc2NyOworCisgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9mYXN0X2FsbG9jYXRlKCBUIyVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIChpbnQpIHNpemUgS01QX1NSQ19MT0NfUEFSTSApICk7CisKKyAgICBudW1fbGluZXMgPSAoIHNpemUgKyBEQ0FDSEVfTElORSAtIDEgKSAvIERDQUNIRV9MSU5FOworICAgIGlkeCA9IG51bV9saW5lcyAtIDE7CisgICAgS01QX0RFQlVHX0FTU0VSVCggaWR4ID49IDAgKTsKKyAgICBpZiAoIGlkeCA8IDIgKSB7CisgICAgICAgIGluZGV4ID0gMDsgICAgICAgLy8gaWR4IGlzIFsgMCwgMSBdLCB1c2UgZmlyc3QgZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDI7ICAgLy8gMSwgMiBjYWNoZSBsaW5lcyBvciBsZXNzIHRoYW4gY2FjaGUgbGluZQorICAgIH0gZWxzZSBpZiAoICggaWR4ID4+PSAyICkgPT0gMCApIHsKKyAgICAgICAgaW5kZXggPSAxOyAgICAgICAvLyBpZHggaXMgWyAyLCAzIF0sIHVzZSBzZWNvbmQgZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDQ7ICAgLy8gMywgNCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4ID4+PSAyICkgPT0gMCApIHsKKyAgICAgICAgaW5kZXggPSAyOyAgICAgICAvLyBpZHggaXMgWyA0LCAxNSBdLCB1c2UgdGhpcmQgZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDE2OyAgLy8gNSwgNiwgLi4uLCAxNiBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4ID4+PSAyICkgPT0gMCApIHsKKyAgICAgICAgaW5kZXggPSAzOyAgICAgICAvLyBpZHggaXMgWyAxNiwgNjMgXSwgdXNlIGZvdXJ0aCBmcmVlIGxpc3QKKyAgICAgICAgbnVtX2xpbmVzID0gNjQ7ICAvLyAxNywgMTgsIC4uLiwgNjQgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGFsbG9jX2NhbGw7IC8vIDY1IG9yIG1vcmUgY2FjaGUgbGluZXMgKCA+IDhLQiApLCBkb24ndCB1c2UgZnJlZSBsaXN0cworICAgIH0KKworICAgIHB0ciA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZjsKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAvLyBwb3AgdGhlIGhlYWQgb2Ygbm8tc3luYyBmcmVlIGxpc3QKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmID0gKigodm9pZCAqKilwdHIpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PQorICAgICAgICAgICAgKChrbXBfbWVtX2Rlc2NyX3QgKikoIChrbXBfdWludHB0cl90KXB0ciAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICkpLT5wdHJfYWxpZ25lZCApOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9OworICAgIHB0ciA9IFRDUl9TWU5DX1BUUiggdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jICk7CisgICAgaWYgKCBwdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gbm8tc3luYyBmcmVlIGxpc3QgaXMgZW1wdHksIHVzZSBzeW5jIGZyZWUgbGlzdCAoZmlsbGVkIGluIGJ5IG90aGVyIHRocmVhZHMgb25seSkKKyAgICAgICAgLy8gcG9wIHRoZSBoZWFkIG9mIHRoZSBzeW5jIGZyZWUgbGlzdCwgcHVzaCBOVUxMIGluc3RlYWQKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoCisgICAgICAgICAgICAmdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jLCBwdHIsIE5VTEwgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgIHB0ciA9IFRDUl9TWU5DX1BUUiggdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcHVzaCB0aGUgcmVzdCBvZiBjaGFpbiBpbnRvIG5vLXN5bmMgZnJlZSBsaXN0IChjYW4gYmUgTlVMTCBpZiB0aGVyZSB3YXMgdGhlIG9ubHkgYmxvY2spCisgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZiA9ICooKHZvaWQgKiopcHRyKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgPT0KKyAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90ICopKCAoa21wX3VpbnRwdHJfdClwdHIgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApKS0+cHRyX2FsaWduZWQgKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgYWxsb2NfY2FsbDoKKyAgICAvLyBoYXZlbid0IGZvdW5kIGJsb2NrIGluIHRoZSBmcmVlIGxpc3RzLCB0aHVzIGFsbG9jYXRlIGl0CisgICAgc2l6ZSA9IG51bV9saW5lcyAqIERDQUNIRV9MSU5FOworCisgICAgYWxsb2Nfc2l6ZSA9IHNpemUgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApICsgRENBQ0hFX0xJTkU7CisgICAgS0VfVFJBQ0UoIDI1LCAoICJfX2ttcF9mYXN0X2FsbG9jYXRlOiBUIyVkIENhbGxpbmcgX19rbXBfdGhyZWFkX21hbGxvYyB3aXRoIGFsbG9jX3NpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgYWxsb2Nfc2l6ZSApICk7CisgICAgYWxsb2NfcHRyID0gYmdldCggdGhpc190aHIsIChidWZzaXplKSBhbGxvY19zaXplICk7CisKKyAgICAvLyBhbGlnbiBwdHIgdG8gRENBQ0hFX0xJTkUKKyAgICBwdHIgPSAodm9pZCAqKSgoICgoa21wX3VpbnRwdHJfdClhbGxvY19wdHIpICsgc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKyBEQ0FDSEVfTElORSApICYgfiggRENBQ0hFX0xJTkUgLSAxICkpOworICAgIGRlc2NyID0gKGttcF9tZW1fZGVzY3JfdCAqKSggKChrbXBfdWludHB0cl90KXB0cikgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApOworCisgICAgZGVzY3ItPnB0cl9hbGxvY2F0ZWQgPSBhbGxvY19wdHI7ICAgICAgICAvLyByZW1lbWJlciBhbGxvY2F0ZWQgcG9pbnRlcgorICAgIC8vIHdlIGRvbid0IG5lZWQgc2l6ZV9hbGxvY2F0ZWQKKyAgICBkZXNjci0+cHRyX2FsaWduZWQgICA9ICh2b2lkICopdGhpc190aHI7IC8vIHJlbWVtYmVyIGFsbG9jYXRpbmcgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoaXQgaXMgYWxyZWFkeSBzYXZlZCBpbiBiZ2V0IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBtYXkgd2FudCB0byB1c2UgYW5vdGhlciBhbGxvY2F0b3IgaW4gZnV0dXJlKQorICAgIGRlc2NyLT5zaXplX2FsaWduZWQgID0gc2l6ZTsKKworICAgIGVuZDoKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2Zhc3RfYWxsb2NhdGUoIFQjJWQgKSByZXR1cm5zICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9IC8vIGZ1bmMgX19rbXBfZmFzdF9hbGxvY2F0ZQorCisvLyBGcmVlIGZhc3QgbWVtb3J5IGFuZCBwbGFjZSBpdCBvbiB0aGUgdGhyZWFkJ3MgZnJlZSBsaXN0IGlmIGl0IGlzIG9mCisvLyB0aGUgY29ycmVjdCBzaXplLgordm9pZAorX19fa21wX2Zhc3RfZnJlZSgga21wX2luZm9fdCAqdGhpc190aHIsIHZvaWQgKiBwdHIgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAga21wX21lbV9kZXNjcl90ICogZGVzY3I7CisgICAga21wX2luZm9fdCAgICAgICogYWxsb2NfdGhyOworICAgIHNpemVfdCAgICAgICAgICAgIHNpemU7CisgICAgc2l6ZV90ICAgICAgICAgICAgaWR4OworICAgIGludCAgICAgICAgICAgICAgIGluZGV4OworCisgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9mYXN0X2ZyZWUoIFQjJWQsICVwICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgcHRyIEtNUF9TUkNfTE9DX1BBUk0gKSApOworICAgIEtNUF9BU1NFUlQoIHB0ciAhPSBOVUxMICk7CisKKyAgICBkZXNjciA9IChrbXBfbWVtX2Rlc2NyX3QgKikoICgoa21wX3VpbnRwdHJfdClwdHIpIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKTsKKworICAgIEtFX1RSQUNFKDI2LCAoIiAgIF9fa21wX2Zhc3RfZnJlZTogICAgIHNpemVfYWxpZ25lZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpIGRlc2NyLT5zaXplX2FsaWduZWQgKSApOworCisgICAgc2l6ZSA9IGRlc2NyLT5zaXplX2FsaWduZWQ7IC8vIDIsIDQsIDE2LCA2NCwgNjUsIDY2LCAuLi4gY2FjaGUgbGluZXMKKworICAgIGlkeCA9IERDQUNIRV9MSU5FICogMjsgLy8gMiBjYWNoZSBsaW5lcyBpcyBtaW5pbWFsIHNpemUgb2YgYmxvY2sKKyAgICBpZiAoIGlkeCA9PSBzaXplICkgeworICAgICAgICBpbmRleCA9IDA7ICAgICAgIC8vIDIgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA8PD0gMSApID09IHNpemUgKSB7CisgICAgICAgIGluZGV4ID0gMTsgICAgICAgLy8gNCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4IDw8PSAyICkgPT0gc2l6ZSApIHsKKyAgICAgICAgaW5kZXggPSAyOyAgICAgICAvLyAxNiBjYWNoZSBsaW5lcworICAgIH0gZWxzZSBpZiAoICggaWR4IDw8PSAyICkgPT0gc2l6ZSApIHsKKyAgICAgICAgaW5kZXggPSAzOyAgICAgICAvLyA2NCBjYWNoZSBsaW5lcworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemUgPiBEQ0FDSEVfTElORSAqIDY0ICk7CisgICAgICAgIGdvdG8gZnJlZV9jYWxsOyAgLy8gNjUgb3IgbW9yZSBjYWNoZSBsaW5lcyAoID4gOEtCICkKKyAgICB9CisKKyAgICBhbGxvY190aHIgPSAoa21wX2luZm9fdCAqKWRlc2NyLT5wdHJfYWxpZ25lZDsgLy8gZ2V0IHRocmVhZCBvd25pbmcgdGhlIGJsb2NrCisgICAgaWYgKCBhbGxvY190aHIgPT0gdGhpc190aHIgKSB7CisgICAgICAgIC8vIHB1c2ggYmxvY2sgdG8gc2VsZiBuby1zeW5jIGZyZWUgbGlzdCwgbGlua2luZyBwcmV2aW91cyBoZWFkIChMSUZPKQorICAgICAgICAqKCh2b2lkICoqKXB0cikgPSB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGY7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZiA9IHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICB2b2lkICogaGVhZCA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXI7CisgICAgICAgIGlmICggaGVhZCA9PSBOVUxMICkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmcmVlIGxpc3QKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXIgPSBwdHI7CisgICAgICAgICAgICAqKCh2b2lkICoqKXB0cikgPSBOVUxMOyAgICAgICAgICAgICAvLyBtYXJrIHRoZSB0YWlsIG9mIHRoZSBsaXN0CisgICAgICAgICAgICBkZXNjci0+c2l6ZV9hbGxvY2F0ZWQgPSAoc2l6ZV90KTE7ICAvLyBoZWFkIG9mIHRoZSBsaXN0IGtlZXBzIGl0cyBsZW5ndGgKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgZXhpc3RlZCAib3RoZXIiIGxpc3QncyBvd25lciB0aHJlYWQgYW5kIHNpemUgb2YgcXVldWUKKyAgICAgICAgICAgIGttcF9tZW1fZGVzY3JfdCAqIGRzYyAgPSAoa21wX21lbV9kZXNjcl90ICopKCAoY2hhciopaGVhZCAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICk7CisgICAgICAgICAgICBrbXBfaW5mb190ICAgICAgKiBxX3RoID0gKGttcF9pbmZvX3QgKikoZHNjLT5wdHJfYWxpZ25lZCk7IC8vIGFsbG9jYXRpbmcgdGhyZWFkLCBzYW1lIGZvciBhbGwgcXVldWUgbm9kZXMKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgIHFfc3ogPSBkc2MtPnNpemVfYWxsb2NhdGVkICsgMTsgICAgICAgICAgLy8gbmV3IHNpemUgaW4gY2FzZSB3ZSBhZGQgY3VycmVudCB0YXNrCisgICAgICAgICAgICBpZiAoIHFfdGggPT0gYWxsb2NfdGhyICYmIHFfc3ogPD0gS01QX0ZSRUVfTElTVF9MSU1JVCApIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gYWRkIGN1cnJlbnQgdGFzayB0byAib3RoZXIiIGxpc3QsIG5vIHN5bmMgbmVlZGVkCisgICAgICAgICAgICAgICAgKigodm9pZCAqKilwdHIpID0gaGVhZDsKKyAgICAgICAgICAgICAgICBkZXNjci0+c2l6ZV9hbGxvY2F0ZWQgPSBxX3N6OworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXIgPSBwdHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGVpdGhlciBxdWV1ZSBibG9ja3Mgb3duZXIgaXMgY2hhbmdpbmcgb3Igc2l6ZSBsaW1pdCBleGNlZWRlZAorICAgICAgICAgICAgICAgIC8vIHJldHVybiBvbGQgcXVldWUgdG8gYWxsb2NhdGluZyB0aHJlYWQgKHFfdGgpIHN5bmNocm9uZW91c2x5LAorICAgICAgICAgICAgICAgIC8vIGFuZCBzdGFydCBuZXcgbGlzdCBmb3IgYWxsb2NfdGhyJ3MgdGFza3MKKyAgICAgICAgICAgICAgICB2b2lkICogb2xkX3B0cjsKKyAgICAgICAgICAgICAgICB2b2lkICogdGFpbCA9IGhlYWQ7CisgICAgICAgICAgICAgICAgdm9pZCAqIG5leHQgPSAqKCh2b2lkICoqKWhlYWQpOworICAgICAgICAgICAgICAgIHdoaWxlICggbmV4dCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgc2l6ZSBzaG91bGQgZGVjcmVhc2UgYnkgMSBlYWNoIHN0ZXAgdGhyb3VnaCB0aGUgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgKChrbXBfbWVtX2Rlc2NyX3QqKSgoY2hhciopbmV4dCAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpKSktPnNpemVfYWxsb2NhdGVkICsgMSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgKChrbXBfbWVtX2Rlc2NyX3QqKSgoY2hhciopdGFpbCAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpKSktPnNpemVfYWxsb2NhdGVkICk7CisgICAgICAgICAgICAgICAgICAgIHRhaWwgPSBuZXh0OyAgIC8vIHJlbWVtYmVyIHRhaWwgbm9kZQorICAgICAgICAgICAgICAgICAgICBuZXh0ID0gKigodm9pZCAqKiluZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcV90aCAhPSBOVUxMICk7CisgICAgICAgICAgICAgICAgLy8gcHVzaCBibG9jayB0byBvd25lcidzIHN5bmMgZnJlZSBsaXN0CisgICAgICAgICAgICAgICAgb2xkX3B0ciA9IFRDUl9QVFIoIHFfdGgtPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jICk7CisgICAgICAgICAgICAgICAgLyogdGhlIG5leHQgcG9pbnRlciBtdXN0IGJlIHNldCBiZWZvcmUgc2V0dGluZyBmcmVlX2xpc3QgdG8gcHRyIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgICAgZXhwb3NpbmcgYSBicm9rZW4gbGlzdCB0byBvdGhlciB0aHJlYWRzLCBldmVuIGZvciBhbiBpbnN0YW50LiAqLworICAgICAgICAgICAgICAgICooKHZvaWQgKiopdGFpbCkgPSBvbGRfcHRyOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoCisgICAgICAgICAgICAgICAgICAgICZxX3RoLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYywKKyAgICAgICAgICAgICAgICAgICAgb2xkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgaGVhZCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgICAgICAgICAgb2xkX3B0ciA9IFRDUl9QVFIoIHFfdGgtPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jICk7CisgICAgICAgICAgICAgICAgICAgICooKHZvaWQgKiopdGFpbCkgPSBvbGRfcHRyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG5ldyBsaXN0IG9mIG5vdC1zZWx0IHRhc2tzCisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9vdGhlciA9IHB0cjsKKyAgICAgICAgICAgICAgICAqKCh2b2lkICoqKXB0cikgPSBOVUxMOworICAgICAgICAgICAgICAgIGRlc2NyLT5zaXplX2FsbG9jYXRlZCA9IChzaXplX3QpMTsgIC8vIGhlYWQgb2YgcXVldWUga2VlcHMgaXRzIGxlbmd0aAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGdvdG8gZW5kOworCisgICAgZnJlZV9jYWxsOgorICAgIEtFX1RSQUNFKDI1LCAoICJfX2ttcF9mYXN0X2ZyZWU6IFQjJWQgQ2FsbGluZyBfX2ttcF90aHJlYWRfZnJlZSBmb3Igc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociksIHNpemUgKSApOworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGhpc190aHIgKTsgICAgICAgICAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworICAgIGJyZWwoIHRoaXNfdGhyLCBkZXNjci0+cHRyX2FsbG9jYXRlZCApOworCisgICAgZW5kOgorICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19rbXBfZmFzdF9mcmVlKCkgcmV0dXJuc1xuIiApICk7CisKK30gLy8gZnVuYyBfX2ttcF9mYXN0X2ZyZWUKKworCisvLyBJbml0aWFsaXplIHRoZSB0aHJlYWQgZnJlZSBsaXN0cyByZWxhdGVkIHRvIGZhc3QgbWVtb3J5CisvLyBPbmx5IGRvIHRoaXMgd2hlbiBhIHRocmVhZCBpcyBpbml0aWFsbHkgY3JlYXRlZC4KK3ZvaWQKK19fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoaXNfdGhyICkKK3sKKyAgICBLRV9UUkFDRSgxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeTogQ2FsbGVkIGZyb20gdGggJXBcbiIsIHRoaXNfdGhyICkgKTsKKworICAgIG1lbXNldCAoIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzLCAwLCBOVU1fTElTVFMgKiBzaXplb2YoIGttcF9mcmVlX2xpc3RfdCApICk7Cit9CisKKy8vIEZyZWUgdGhlIG1lbW9yeSBpbiB0aGUgdGhyZWFkIGZyZWUgbGlzdHMgcmVsYXRlZCB0byBmYXN0IG1lbW9yeQorLy8gT25seSBkbyB0aGlzIHdoZW4gYSB0aHJlYWQgaXMgYmVpbmcgcmVhcGVkIChkZXN0cm95ZWQpLgordm9pZAorX19rbXBfZnJlZV9mYXN0X21lbW9yeSgga21wX2luZm9fdCAqdGggKQoreworICAgIC8vIFN1cHBvc2Ugd2UgdXNlIEJHRVQgdW5kZXJseWluZyBhbGxvY2F0b3IsIHdhbGsgdGhyb3VnaCBpdHMgc3RydWN0dXJlcy4uLgorICAgIGludCAgICAgICAgICBiaW47CisgICAgdGhyX2RhdGFfdCAqIHRociA9IGdldF90aHJfZGF0YSggdGggKTsKKyAgICB2b2lkICAgICAgKiogbHN0ID0gTlVMTDsKKworICAgIEtFX1RSQUNFKDUsICggIl9fa21wX2ZyZWVfZmFzdF9tZW1vcnk6IENhbGxlZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkgKSApOworCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8vIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzCisKKyAgICAvLyBEaWcgdGhyb3VnaCBmcmVlIGxpc3RzIGFuZCBleHRyYWN0IGFsbCBhbGxvY2F0ZWQgYmxvY2tzCisgICAgZm9yICggYmluID0gMDsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4gKSB7CisgICAgICAgIGJmaGVhZF90ICogYiA9IHRoci0+ZnJlZWxpc3RbIGJpbiBdLnFsLmZsaW5rOworICAgICAgICB3aGlsZSAoIGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdICkgeworICAgICAgICAgICAgaWYgKCAoa21wX3VpbnRwdHJfdCliLT5iaC5iYi5idGhyICYgMSApIHsgICAvLyBpZiB0aGUgYnVmZmVyIGlzIGFuIGFsbG9jYXRlZCBhZGRyZXNzPworICAgICAgICAgICAgICAgICooKHZvaWQqKiliKSA9IGxzdDsgICAvLyBsaW5rIHRoZSBsaXN0IChvdmVycmlkZSBidGhyLCBidXQga2VlcCBmbGluayB5ZXQpCisgICAgICAgICAgICAgICAgbHN0ID0gKHZvaWQqKiliOyAgICAgIC8vIHB1c2ggYiBpbnRvIGxzdAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYiA9IGItPnFsLmZsaW5rOyAgICAgICAgICAvLyBnZXQgbmV4dCBidWZmZXIKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoIGxzdCAhPSBOVUxMICkgeworICAgICAgICB2b2lkICogbmV4dCA9ICpsc3Q7CisgICAgICAgIEtFX1RSQUNFKDEwLCAoICJfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5OiBmcmVlaW5nICVwLCBuZXh0PSVwIHRoICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbHN0LCBuZXh0LCB0aCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSApICk7CisgICAgICAgICgqdGhyLT5yZWxmY24pKGxzdCk7CisgICAgICAgICNpZiBCdWZTdGF0cworICAgICAgICAgICAgLy8gY291bnQgYmxvY2tzIHRvIHByZXZlbnQgcHJvYmxlbXMgaW4gX19rbXBfZmluYWxpemVfYmdldCgpCisgICAgICAgICAgICB0aHItPm51bXByZWwrKzsgICAgICAgLyogTnIgb2YgZXhwYW5zaW9uIGJsb2NrIHJlbGVhc2VzICovCisgICAgICAgICAgICB0aHItPm51bXBibGstLTsgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyAqLworICAgICAgICAjZW5kaWYKKyAgICAgICAgbHN0ID0gKHZvaWQqKiluZXh0OworICAgIH0KKworICAgIEtFX1RSQUNFKDUsICggIl9fa21wX2ZyZWVfZmFzdF9tZW1vcnk6IEZyZWVkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApICkgKTsKK30KKworI2VuZGlmIC8vIFVTRV9GQVNUX01FTU9SWQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MzExNjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2F0b21pYy5jcHAKQEAgLTAsMCArMSwzMTIwIEBACisvKgorICoga21wX2F0b21pYy5jcHAgLS0gQVRPTUlDIGltcGxlbWVudGF0aW9uIHJvdXRpbmVzCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisjaW5jbHVkZSAia21wLmgiICAgICAgICAgICAgICAgICAgLy8gVFJVRSwgYXNtIHJvdXRpbmVzIHByb3RvdHlwZXMKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2hvcnQ7CisKKy8qIQorQGRlZmdyb3VwIEFUT01JQ19PUFMgQXRvbWljIE9wZXJhdGlvbnMKK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBtYW55IGRpZmZlcmVudCB2YXJpZXRpZXMgb2YgYXRvbWljIG9wZXJhdGlvbnMuCisKK1RoZSBjb21waWxlciBpcyBhdCBsaWJlcnR5IHRvIGlubGluZSBhdG9taWMgb3BlcmF0aW9ucyB0aGF0IGFyZSBuYXR1cmFsbHkgc3VwcG9ydGVkCitieSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gRm9yIGluc3RhbmNlIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbiBhdG9taWMgbGlrZSB0aGlzIGNhbiBiZSBpbmxpbmVkCitAY29kZQorc3RhdGljIGludCBzID0gMDsKKyNwcmFnbWEgb21wIGF0b21pYworICAgIHMrKzsKK0BlbmRjb2RlCit1c2luZyB0aGUgc2luZ2xlIGluc3RydWN0aW9uOiBgbG9jazsgaW5jbCBzYAorCitIb3dldmVyIHRoZSBydW50aW1lIGRvZXMgcHJvdmlkZSBlbnRyeXBvaW50cyBmb3IgdGhlc2Ugb3BlcmF0aW9ucyB0byBzdXBwb3J0IGNvbXBpbGVycyB0aGF0IGNob29zZQorbm90IHRvIGlubGluZSB0aGVtLiAoRm9yIGluc3RhbmNlLCBgX19rbXBjX2F0b21pY19maXhlZDRfYWRkYCBjb3VsZCBiZSB1c2VkIHRvIHBlcmZvcm0gdGhlCitpbmNyZW1lbnQgYWJvdmUuKQorCitUaGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgZW5jb2RlZCBieSB1c2luZyB0aGUgZGF0YSB0eXBlIG5hbWUgYW5kIHRoZSBvcGVyYXRpb24gbmFtZSwgYXMgaW4gdGhlc2UgdGFibGVzLgorCitEYXRhIFR5cGUgIHwgRGF0YSB0eXBlIGVuY29kaW5nCistLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0KK2ludDhfdCAgICAgfCBgZml4ZWQxYAordWludDhfdCAgICB8IGBmaXhlZDF1YAoraW50MTZfdCAgICB8IGBmaXhlZDJgCit1aW50MTZfdCAgIHwgYGZpeGVkMnVgCitpbnQzMl90ICAgIHwgYGZpeGVkNGAKK3VpbnQzMl90ICAgfCBgZml4ZWQ0dWAKK2ludDMyX3QgICAgfCBgZml4ZWQ4YAordWludDMyX3QgICB8IGBmaXhlZDh1YAorZmxvYXQgICAgICB8IGBmbG9hdDRgCitkb3VibGUgICAgIHwgYGZsb2F0OGAKK2Zsb2F0IDEwICg4MDg3IGVpZ2h0eSBiaXQgZmxvYXQpICB8IGBmbG9hdDEwYAorY29tcGxleDxmbG9hdD4gICB8ICBgY21wbHg0YAorY29tcGxleDxkb3VibGU+ICB8IGBjbXBseDhgCitjb21wbGV4PGZsb2F0MTA+IHwgYGNtcGx4MTBgCis8YnI+CisKK09wZXJhdGlvbiB8IE9wZXJhdGlvbiBlbmNvZGluZworLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tCisrIHwgYWRkCistIHwgc3ViCitcKiB8IG11bAorLyB8IGRpdgorJiB8IGFuZGIKKzw8IHwgc2hsCitcPlw+IHwgc2hyCitcfCB8IG9yYgorXiAgfCB4b3IKKyYmIHwgYW5kbAorXHxcfCB8IG9ybAorbWF4aW11bSB8IG1heAorbWluaW11bSB8IG1pbgorLmVxdi4gICB8IGVxdgorLm5lcXYuICB8IG5lcXYKKworPGJyPgorRm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLCBgX3JldmAgY2FuIGFsc28gYmUgYWRkZWQgZm9yIHRoZSByZXZlcnNlZCBvcGVyYXRpb24uCitGb3IgdGhlIGZ1bmN0aW9ucyB0aGF0IGNhcHR1cmUgdGhlIHJlc3VsdCwgdGhlIHN1ZmZpeCBgX2NwdGAgaXMgYWRkZWQuCisKK1VwZGF0ZSBGdW5jdGlvbnMKKz09PT09PT09PT09PT09PT0KK1RoZSBnZW5lcmFsIGZvcm0gb2YgYW4gYXRvbWljIGZ1bmN0aW9uIHRoYXQganVzdCBwZXJmb3JtcyBhbiB1cGRhdGUgKHdpdGhvdXQgYSBgY2FwdHVyZWApCitAY29kZQordm9pZCBfX2ttcGNfYXRvbWljXzxkYXRhdHlwZT5fPG9wZXJhdGlvbj4oIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICk7CitAZW5kY29kZQorQHBhcmFtIGlkZW50X3QgIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBndGlkICB0aGUgZ2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIGxocyAgIGEgcG9pbnRlciB0byB0aGUgbGVmdCBvcGVyYW5kCitAcGFyYW0gcmhzICAgdGhlIHJpZ2h0IG9wZXJhbmQKKworYGNhcHR1cmVgIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PQorVGhlIGNhcHR1cmUgZnVuY3Rpb25zIHBlcmZvcm0gYW4gYXRvbWljIHVwZGF0ZSBhbmQgcmV0dXJuIGEgcmVzdWx0LCB3aGljaCBpcyBlaXRoZXIgdGhlIHZhbHVlCitiZWZvcmUgdGhlIGNhcHR1cmUsIG9yIHRoYXQgYWZ0ZXIuIFRoZXkgdGFrZSBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIGRldGVybWluZSB3aGljaCByZXN1bHQgaXMgcmV0dXJuZWQuCitUaGVpciBnZW5lcmFsIGZvcm0gaXMgdGhlcmVmb3JlCitAY29kZQorVFlQRSBfX2ttcGNfYXRvbWljXzxkYXRhdHlwZT5fPG9wZXJhdGlvbj5fY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocywgaW50IGZsYWcgKTsKK0BlbmRjb2RlCitAcGFyYW0gaWRlbnRfdCAgYSBwb2ludGVyIHRvIHNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgIHRoZSBnbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gbGhzICAgYSBwb2ludGVyIHRvIHRoZSBsZWZ0IG9wZXJhbmQKK0BwYXJhbSByaHMgICB0aGUgcmlnaHQgb3BlcmFuZAorQHBhcmFtIGZsYWcgIG9uZSBpZiB0aGUgcmVzdWx0IGlzIHRvIGJlIGNhcHR1cmVkICphZnRlciogdGhlIG9wZXJhdGlvbiwgemVybyBpZiBjYXB0dXJlZCAqYmVmb3JlKi4KKworVGhlIG9uZSBzZXQgb2YgZXhjZXB0aW9ucyB0byB0aGlzIGlzIHRoZSBgY29tcGxleDxmbG9hdD5gIHR5cGUgd2hlcmUgdGhlIHZhbHVlIGlzIG5vdCByZXR1cm5lZCwKK3JhdGhlciBhbiBleHRyYSBhcmd1bWVudCBwb2ludGVyIGlzIHBhc3NlZC4KKworVGhleSBsb29rIGxpa2UKK0Bjb2RlCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0XzxvcD5fY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnICk7CitAZW5kY29kZQorCitSZWFkIGFuZCBXcml0ZSBPcGVyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgT3Blbk1QPHN1cD4qPC9zdXA+IHN0YW5kYXJkIG5vdyBzdXBwb3J0cyBhdG9taWMgb3BlcmF0aW9ucyB0aGF0IHNpbXBseSBlbnN1cmUgdGhhdCB0aGUKK3ZhbHVlIGlzIHJlYWQgb3Igd3JpdHRlbiBhdG9taWNhbGx5LCB3aXRoIG5vIG1vZGlmaWNhdGlvbgorcGVyZm9ybWVkLiBJbiBtYW55IGNhc2VzIG9uIElBLTMyIGFyY2hpdGVjdHVyZSB0aGVzZSBvcGVyYXRpb25zIGNhbiBiZSBpbmxpbmVkIHNpbmNlCit0aGUgYXJjaGl0ZWN0dXJlIGd1YXJhbnRlZXMgdGhhdCBubyB0ZWFyaW5nIG9jY3VycyBvbiBhbGlnbmVkIG9iamVjdHMKK2FjY2Vzc2VkIHdpdGggYSBzaW5nbGUgbWVtb3J5IG9wZXJhdGlvbiBvZiB1cCB0byA2NCBiaXRzIGluIHNpemUuCisKK1RoZSBnZW5lcmFsIGZvcm0gb2YgdGhlIHJlYWQgb3BlcmF0aW9ucyBpcworQGNvZGUKK1RZUEUgX19rbXBjX2F0b21pY188dHlwZT5fcmQgKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbG9jICk7CitAZW5kY29kZQorCitGb3IgdGhlIHdyaXRlIG9wZXJhdGlvbnMgdGhlIGZvcm0gaXMKK0Bjb2RlCit2b2lkIF9fa21wY19hdG9taWNfPHR5cGU+X3dyICggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKTsKK0BlbmRjb2RlCisKK0Z1bGwgbGlzdCBvZiBmdW5jdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgbGVhZHMgdG8gdGhlIGdlbmVyYXRpb24gb2YgMzc2IGF0b21pYyBmdW5jdGlvbnMsIGFzIGZvbGxvd3MuCisKK0Z1bmN0b25zIGZvciBpbnRlZ2VycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGVyZSBhcmUgdmVyc2lvbnMgaGVyZSBmb3IgaW50ZWdlcnMgb2Ygc2l6ZSAxLDIsNCBhbmQgOCBieXRlcyBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgKHdoZXJlIHRoYXQgbWF0dGVycykuCitAY29kZQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfcmQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF93cgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfcmV2CitAZW5kY29kZQorCitGdW5jdGlvbnMgZm9yIGZsb2F0aW5nIHBvaW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGVyZSBhcmUgdmVyc2lvbnMgaGVyZSBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBvZiBzaXplIDQsIDgsIDEwIGFuZCAxNiBieXRlcy4KKyhUZW4gYnl0ZSBmbG9hdHMgYXJlIHVzZWQgYnkgWDg3LCBidXQgYXJlIG5vdyByYXJlKS4KK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3JkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfd3IKK0BlbmRjb2RlCisKK0Z1bmN0aW9ucyBmb3IgQ29tcGxleCB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGdW5jdGlvbnMgZm9yIGNvbXBsZXggdHlwZXMgd2hvc2UgY29tcG9uZW50IGZsb2F0aW5nIHBvaW50IHZhcmlhYmxlcyBhcmUgb2Ygc2l6ZSA0LDgsMTAgb3IgMTYgYnl0ZXMuCitUaGUgbmFtZXMgaGVyZSBhcmUgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGNvbXBvbmVudCBmbG9hdCwgKm5vdCogdGhlIHNpemUgb2YgdGhlIGNvbXBsZXggdHlwZS4gU28KK2BfX2ttcGNfYXRvbWNfY21wbHg4X2FkZGAgaXMgYW4gb3BlcmF0aW9uIG9uIGEgYGNvbXBsZXg8ZG91YmxlPmAgb3IgYGNvbXBsZXgoa2luZD04KWAsICpub3QqIGBjb21wbGV4PGZsb2F0PmAuCisKK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3dyCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF93cgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl93cgorQGVuZGNvZGUKKyovCisKKy8qIQorQGluZ3JvdXAgQVRPTUlDX09QUworQHsKKyovCisKKy8qCisgKiBHbG9iYWwgdmFycworICovCisKKyNpZm5kZWYgS01QX0dPTVBfQ09NUEFUCitpbnQgX19rbXBfYXRvbWljX21vZGUgPSAxOyAgICAgIC8vIEludGVsIHBlcmYKKyNlbHNlCitpbnQgX19rbXBfYXRvbWljX21vZGUgPSAyOyAgICAgIC8vIEdPTVAgY29tcGF0aWJpbGl0eQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCitLTVBfQUxJR04oMTI4KQorCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9jazsgICAgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgaW4gR251IGNvbXBhdCBtb2RlICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzFpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgMS1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzJpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgMi1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgNC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWwzMiBkYXRhIHR5cGUgICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgOC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWw2NCBkYXRhIHR5cGUgICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhjOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgY29tcGxleCBieXRlIGRhdGEgdHlwZSAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzEwcjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgbG9uZyBkb3VibGUgZGF0YSB0eXBlICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2cjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgZGF0YSB0eXBlICAgICAgICAgKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2YzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgZG91YmxlIGNvbXBsZXggZGF0YSB0eXBlKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzIwYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgbG9uZyBkb3VibGUgY29tcGxleCB0eXBlKi8KK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzMyYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgY29tcGxleCBkYXRhIHR5cGUgKi8KKworCisvKgorICAyMDA3LTAzLTAyOgorICBXaXRob3V0ICJ2b2xhdGlsZSIgc3BlY2lmaWVyIGluIE9QX0NNUFhDSEcgYW5kIE1JTl9NQVhfQ01QWENIRyB3ZSBoYXZlIGEKKyAgYnVnIG9uICpfMzIgYW5kICpfMzJlLiBUaGlzIGlzIGp1c3QgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgdGhlIHByb2JsZW0uCisgIEl0IHNlZW1zIHRoZSByaWdodCBzb2x1dGlvbiBpcyB3cml0aW5nIE9QX0NNUFhDSEcgYW5kIE1JTl9NQVhfQ01QWENIRworICByb3V0aW5lcyBpbiBhc3NlbWJsZXIgbGFuZ3VhZ2UuCisqLworI2RlZmluZSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHZvbGF0aWxlCisKKyNpZiAoIEtNUF9BUkNIX1g4NiApICYmIEtNUF9IQVZFX1FVQUQKKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xICs9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAtPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xIC09IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAqPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IGxocy5xIC89IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvciA8ICggUXVhZF9hNF90ICYgbGhzLCBRdWFkX2E0X3QgJiByaHMgKSB7IHJldHVybiBsaHMucSA8IHJocy5xOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yID4gKCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgcmV0dXJuIGxocy5xID4gcmhzLnE7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC09KCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyBsaHMucSAtPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKj0oIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgbGhzLnEgLz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yIDwgKCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyByZXR1cm4gbGhzLnEgPCByaHMucTsgfQorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvciA+ICggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgcmV0dXJuIGxocy5xID4gcmhzLnE7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSgga21wX2NtcGx4MTI4X2E0X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hNF90ICYgcmhzICkgeyBsaHMucSArPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLT0oIGttcF9jbXBseDEyOF9hNF90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTRfdCAmIHJocyApIHsgbGhzLnEgLT0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICo9KCBrbXBfY21wbHgxMjhfYTRfdCAmIGxocywga21wX2NtcGx4MTI4X2E0X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSgga21wX2NtcGx4MTI4X2E0X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hNF90ICYgcmhzICkgeyBsaHMucSAvPSByaHMucTsgfTsKKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xICs9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAtPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xIC09IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAqPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xICo9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAvPSgga21wX2NtcGx4MTI4X2ExNl90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgJiByaHMgKSB7IGxocy5xIC89IHJocy5xOyB9OworCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBBVE9NSUMgaW1wbGVtZW50YXRpb24gcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIG9uZSByb3V0aW5lIGZvciBlYWNoIG9wZXJhdGlvbiBhbmQgb3BlcmFuZCB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIEFsbCByb3V0aW5lcyBkZWNsYXJhdGlvbnMgbG9va3MgbGlrZQorLy8gdm9pZCBfX2ttcGNfYXRvbWljX1JUWVBFX09QKCBpZGVudF90KiwgaW50LCBUWVBFICpsaHMsIFRZUEUgcmhzICk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBLTVBfQ0hFQ0tfR1RJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBndGlkID09IEtNUF9HVElEX1VOS05PV04gKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gLy8gY2hlY2sgYW5kIGdldCBndGlkIHdoZW4gbmVlZGVkCisKKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsIFJFVF9UWVBFKSBcCitSRVRfVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG9jayB2YXJpYWJsZXMgdXNlZCBmb3IgY3JpdGljYWwgc2VjdGlvbnMgZm9yIHZhcmlvdXMgc2l6ZSBvcGVyYW5kcworI2RlZmluZSBBVE9NSUNfTE9DSzAgICBfX2ttcF9hdG9taWNfbG9jayAgICAgICAvLyBhbGwgdHlwZXMsIGZvciBHbnUgY29tcGF0CisjZGVmaW5lIEFUT01JQ19MT0NLMWkgIF9fa21wX2F0b21pY19sb2NrXzFpICAgIC8vIGNoYXIKKyNkZWZpbmUgQVRPTUlDX0xPQ0syaSAgX19rbXBfYXRvbWljX2xvY2tfMmkgICAgLy8gc2hvcnQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s0aSAgX19rbXBfYXRvbWljX2xvY2tfNGkgICAgLy8gbG9uZyBpbnQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s0ciAgX19rbXBfYXRvbWljX2xvY2tfNHIgICAgLy8gZmxvYXQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s4aSAgX19rbXBfYXRvbWljX2xvY2tfOGkgICAgLy8gbG9uZyBsb25nIGludAorI2RlZmluZSBBVE9NSUNfTE9DSzhyICBfX2ttcF9hdG9taWNfbG9ja184ciAgICAvLyBkb3VibGUKKyNkZWZpbmUgQVRPTUlDX0xPQ0s4YyAgX19rbXBfYXRvbWljX2xvY2tfOGMgICAgLy8gZmxvYXQgY29tcGxleAorI2RlZmluZSBBVE9NSUNfTE9DSzEwciBfX2ttcF9hdG9taWNfbG9ja18xMHIgICAvLyBsb25nIGRvdWJsZQorI2RlZmluZSBBVE9NSUNfTE9DSzE2ciBfX2ttcF9hdG9taWNfbG9ja18xNnIgICAvLyBfUXVhZAorI2RlZmluZSBBVE9NSUNfTE9DSzE2YyBfX2ttcF9hdG9taWNfbG9ja18xNmMgICAvLyBkb3VibGUgY29tcGxleAorI2RlZmluZSBBVE9NSUNfTE9DSzIwYyBfX2ttcF9hdG9taWNfbG9ja18yMGMgICAvLyBsb25nIGRvdWJsZSBjb21wbGV4CisjZGVmaW5lIEFUT01JQ19MT0NLMzJjIF9fa21wX2F0b21pY19sb2NrXzMyYyAgIC8vIF9RdWFkIGNvbXBsZXgKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUwoT1AsTENLX0lEKSBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgT1AgKHJocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRm9yIEdOVSBjb21wYXRpYmlsaXR5LCB3ZSBtYXkgbmVlZCB0byB1c2UgYSBjcml0aWNhbCBzZWN0aW9uLAorLy8gZXZlbiB0aG91Z2ggaXQgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBJU0EuCisvLworLy8gT24gSUEtMzIgYXJjaGl0ZWN0dXJlLCBhbGwgYXRvbWljIG9wZXJhdGlvbnMgZXhjZXB0IGZvciBmaXhlZCA0IGJ5dGUgYWRkLAorLy8gc3ViLCBhbmQgYml0d2lzZSBsb2dpY2FsIG9wcywgYW5kIDEgJiAyIGJ5dGUgbG9naWNhbCBvcHMgdXNlIGEgY29tbW9uCisvLyBjcml0aWNhbCBzZWN0aW9uLiAgT24gSW50ZWwoUikgNjQsIGFsbCBhdG9taWMgb3BlcmF0aW9ucyBhcmUgZG9uZSB3aXRoIGZldGNoCisvLyBhbmQgYWRkIG9yIGNvbXBhcmUgYW5kIGV4Y2hhbmdlLiAgVGhlcmVmb3JlLCB0aGUgRkxBRyBwYXJhbWV0ZXIgdG8gdGhpcworLy8gbWFjcm8gaXMgZWl0aGVyIEtNUF9BUkNIX1g4NiBvciAwIChvciAxLCBmb3IgSW50ZWwtc3BlY2lmaWMgZXh0ZW5zaW9uIHdoaWNoCisvLyByZXF1aXJlIGEgY3JpdGljYWwgc2VjdGlvbiwgd2hlcmUgd2UgcHJlZGljdCB0aGF0IHRoZXkgd2lsbCBiZSBpbXBsZW1lbnRlZAorLy8gaW4gdGhlIEdudSBjb2RlZ2VuIGJ5IGNhbGxpbmcgR09NUF9hdG9taWNfc3RhcnQoKSAvIEdPTVBfYXRvbWljX2VuZCgpKS4KKy8vCisvLyBXaGVuIHRoZSBPUF9HT01QX0NSSVRJQ0FMIG1hY3JvIGlzIHVzZWQgaW4gYSAqQ1JJVElDQUwqIG1hY3JvIGNvbnN0cnVjdCwKKy8vIHRoZSBGTEFHIHBhcmFtZXRlciBzaG91bGQgYWx3YXlzIGJlIDEuICBJZiB3ZSBrbm93IHRoYXQgd2Ugd2lsbCBiZSB1c2luZworLy8gYSBjcml0aWNhbCBzZWN0aW9uLCB0aGVuIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluIHRoYXQgd2UgdXNlIHRoZSBnZW5lcmljCisvLyBsb2NrIF9fa21wX2F0b21pY19sb2NrIHRvIHByb3RlY3QgdGhlIGF0b21pYyB1cGRhdGUsIGFuZCBub3Qgb2Ygb2YgdGhlCisvLyBsb2NrcyB0aGF0IGFyZSBzcGVjaWFsaXplZCBiYXNlZCB1cG9uIHRoZSBzaXplIG9yIHR5cGUgb2YgdGhlIGRhdGEuCisvLworLy8gSWYgRkxBRyBpcyAwLCB0aGVuIHdlIGFyZSByZWx5aW5nIG9uIGRlYWQgY29kZSBlbGltaW5hdGlvbiBieSB0aGUgYnVpbGQKKy8vIGNvbXBpbGVyIHRvIGdldCByaWQgb2YgdGhlIHVzZWxlc3MgYmxvY2sgb2YgY29kZSwgYW5kIHNhdmUgYSBuZWVkbGVzcworLy8gYnJhbmNoIGF0IHJ1bnRpbWUuCisvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjIGRlZmluZSBPUF9HT01QX0NSSVRJQ0FMKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyMgZWxzZQorIyBkZWZpbmUgT1BfR09NUF9DUklUSUNBTChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisjaWYgS01QX01JQworIyBkZWZpbmUgS01QX0RPX1BBVVNFIF9tbV9kZWxheV8zMiggMSApCisjZWxzZQorIyBkZWZpbmUgS01QX0RPX1BBVVNFIEtNUF9DUFVfUEFVU0UoKQorI2VuZGlmIC8qIEtNUF9NSUMgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisjZGVmaW5lIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9ICooVFlQRSB2b2xhdGlsZSAqKWxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RPX1BBVVNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gKihUWVBFIHZvbGF0aWxlICopbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gMjAwNy0wNi0yNToKKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKKy8vIGxpbl8zMiwgbGluXzMyZSwgd2luXzMyIGFuZCB3aW5fMzJlIGFyZSBhZmZlY3RlZCAoSSB2ZXJpZmllZCB0aGUgYXNtKQorLy8gQ29tcGlsZXIgaWdub3JlcyB0aGUgdm9sYXRpbGUgcXVhbGlmaWVyIG9mIHRoZSB0ZW1wX3ZhbCBpbiB0aGUgT1BfQ01QWENIRyBtYWNyby4KKy8vIFRoaXMgaXMgYSBwcm9ibGVtIG9mIHRoZSBjb21waWxlci4KKy8vIFJlbGF0ZWQgdHJhY2tlciBpcyBDNzYwMDUsIHRhcmdldGVkIHRvIDExLjAuCisvLyBJIHZlcmlmaWVkIHRoZSBhc20gb2YgdGhlIHdvcmthcm91bmQuCisjZGVmaW5lIE9QX0NNUFhDSEdfV09SS0FST1VORChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBfc3NzIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgVFlQRSAgICAgICAgICAgIGNtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIGttcF9pbnQjI0JJVFMgICAqdnZ2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RydWN0IF9zc3Mgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUudnZ2ID0gKCBrbXBfaW50IyNCSVRTICogKSZvbGRfdmFsdWUuY21wOyAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZS52dnYgPSAoIGttcF9pbnQjI0JJVFMgKiApJm5ld192YWx1ZS5jbXA7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKm9sZF92YWx1ZS52dnYgPSAqICggdm9sYXRpbGUga21wX2ludCMjQklUUyAqICkgbGhzOyAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUuY21wID0gb2xkX3ZhbHVlLmNtcCBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopIG9sZF92YWx1ZS52dnYsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgbmV3X3ZhbHVlLnZ2diApICkgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ET19QQVVTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICpvbGRfdmFsdWUudnZ2ID0gKiAoIHZvbGF0aWxlIGttcF9pbnQjI0JJVFMgKiApIGxoczsgICAgICAgICAgXAorCSAgICBuZXdfdmFsdWUuY21wID0gb2xkX3ZhbHVlLmNtcCBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKy8vIGVuZCBvZiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBBVE9NSUNfRklYRURfQUREKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIE9QIHVzZWQgYXMgYSBzaWduIGZvciBzdWJ0cmFjdGlvbjogKGxocy1yaHMpIC0tPiAobGhzKy1yaHMpICovICAgICAgXAorICAgIEtNUF9URVNUX1RIRU5fQUREIyNCSVRTKCBsaHMsIE9QIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIRyhUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfV09SS0FST1VORChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBlbmQgb2YgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbmRpZgorCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19GSVhFRF9BREQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIE9QIHVzZWQgYXMgYSBzaWduIGZvciBzdWJ0cmFjdGlvbjogKGxocy1yaHMpIC0tPiAobGhzKy1yaHMpICovICBcCisgICAgICAgIEtNUF9URVNUX1RIRU5fQUREIyNCSVRTKCBsaHMsIE9QIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBlbmQgb2YgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbmRpZiAvLyBVU0VfQ01QWENIR19GSVgKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgNC1ieXRlIG9wZXJhbmRzIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbgorQVRPTUlDX0ZJWEVEX0FERCggZml4ZWQ0LCBhZGQsIGttcF9pbnQzMiwgIDMyLCArLCA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZAorQVRPTUlDX0ZJWEVEX0FERCggZml4ZWQ0LCBzdWIsIGttcF9pbnQzMiwgIDMyLCAtLCA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YgorCitBVE9NSUNfQ01QWENIRyggZmxvYXQ0LCAgYWRkLCBrbXBfcmVhbDMyLCAzMiwgKywgIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkCitBVE9NSUNfQ01QWENIRyggZmxvYXQ0LCAgc3ViLCBrbXBfcmVhbDMyLCAzMiwgLSwgIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViCisKKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgOC1ieXRlIG9wZXJhbmRzIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbgorQVRPTUlDX0ZJWEVEX0FERCggZml4ZWQ4LCBhZGQsIGttcF9pbnQ2NCwgIDY0LCArLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZAorQVRPTUlDX0ZJWEVEX0FERCggZml4ZWQ4LCBzdWIsIGttcF9pbnQ2NCwgIDY0LCAtLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YgorCitBVE9NSUNfQ01QWENIRyggZmxvYXQ4LCAgYWRkLCBrbXBfcmVhbDY0LCA2NCwgKywgIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfYWRkCitBVE9NSUNfQ01QWENIRyggZmxvYXQ4LCAgc3ViLCBrbXBfcmVhbDY0LCA2NCwgLSwgIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cmllcyBkZWZpbml0aW9uIGZvciBpbnRlZ2VyIG9wZXJhbmRzCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkNCwgZmxvYXQ0KQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvciAodXNlZCBpbiBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorLy8gICAgIE1BU0sgICAgLSB1c2VkIGZvciBhbGlnbm1lbnQgY2hlY2sKKworLy8gICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCAgVFlQRSwgICBCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIGludGVnZXIgb3BlcmFuZHMsIG90aGVyIG9wZXJhdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICAgICAgT1AsIExDS19JRCwgR09NUF9GTEFHCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgYWRkLCBrbXBfaW50OCwgICAgOCwgKywgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCBhbmRiLCBrbXBfaW50OCwgICAgOCwgJiwgIDFpLCAwLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIGRpdiwga21wX2ludDgsICAgIDgsIC8sICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMXUsIGRpdiwga21wX3VpbnQ4LCAgIDgsIC8sICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBtdWwsIGttcF9pbnQ4LCAgICA4LCAqLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBvcmIsIGttcF9pbnQ4LCAgICA4LCB8LCAgMWksIDAsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBzaGwsIGttcF9pbnQ4LCAgICA4LCA8PCwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBzaHIsIGttcF9pbnQ4LCAgICA4LCA+PiwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDF1LCBzaHIsIGttcF91aW50OCwgICA4LCA+PiwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgc3ViLCBrbXBfaW50OCwgICAgOCwgLSwgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgeG9yLCBrbXBfaW50OCwgICAgOCwgXiwgIDFpLCAwLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfeG9yCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgYWRkLCBrbXBfaW50MTYsICAxNiwgKywgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYWRkCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCBhbmRiLCBrbXBfaW50MTYsICAxNiwgJiwgIDJpLCAxLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYW5kYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIGRpdiwga21wX2ludDE2LCAgMTYsIC8sICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMnUsIGRpdiwga21wX3VpbnQxNiwgMTYsIC8sICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBtdWwsIGttcF9pbnQxNiwgIDE2LCAqLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBvcmIsIGttcF9pbnQxNiwgIDE2LCB8LCAgMmksIDEsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBzaGwsIGttcF9pbnQxNiwgIDE2LCA8PCwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBzaHIsIGttcF9pbnQxNiwgIDE2LCA+PiwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDJ1LCBzaHIsIGttcF91aW50MTYsIDE2LCA+PiwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgc3ViLCBrbXBfaW50MTYsICAxNiwgLSwgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgeG9yLCBrbXBfaW50MTYsICAxNiwgXiwgIDJpLCAxLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfeG9yCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCBhbmRiLCBrbXBfaW50MzIsICAzMiwgJiwgIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIGRpdiwga21wX2ludDMyLCAgMzIsIC8sICA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNHUsIGRpdiwga21wX3VpbnQzMiwgMzIsIC8sICA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICBtdWwsIGttcF9pbnQzMiwgIDMyLCAqLCAgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICBvcmIsIGttcF9pbnQzMiwgIDMyLCB8LCAgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICBzaGwsIGttcF9pbnQzMiwgIDMyLCA8PCwgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICBzaHIsIGttcF9pbnQzMiwgIDMyLCA+PiwgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDR1LCBzaHIsIGttcF91aW50MzIsIDMyLCA+PiwgNGksIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgeG9yLCBrbXBfaW50MzIsICAzMiwgXiwgIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfeG9yCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCBhbmRiLCBrbXBfaW50NjQsICA2NCwgJiwgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIGRpdiwga21wX2ludDY0LCAgNjQsIC8sICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOHUsIGRpdiwga21wX3VpbnQ2NCwgNjQsIC8sICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICBtdWwsIGttcF9pbnQ2NCwgIDY0LCAqLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICBvcmIsIGttcF9pbnQ2NCwgIDY0LCB8LCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICBzaGwsIGttcF9pbnQ2NCwgIDY0LCA8PCwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGwKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICBzaHIsIGttcF9pbnQ2NCwgIDY0LCA+PiwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDh1LCBzaHIsIGttcF91aW50NjQsIDY0LCA+PiwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgeG9yLCBrbXBfaW50NjQsICA2NCwgXiwgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfeG9yCitBVE9NSUNfQ01QWENIRyggZmxvYXQ0LCAgZGl2LCBrbXBfcmVhbDMyLCAzMiwgLywgIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2CitBVE9NSUNfQ01QWENIRyggZmxvYXQ0LCAgbXVsLCBrbXBfcmVhbDMyLCAzMiwgKiwgIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbXVsCitBVE9NSUNfQ01QWENIRyggZmxvYXQ4LCAgZGl2LCBrbXBfcmVhbDY0LCA2NCwgLywgIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2CitBVE9NSUNfQ01QWENIRyggZmxvYXQ4LCAgbXVsLCBrbXBfcmVhbDY0LCA2NCwgKiwgIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbXVsCisvLyAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICAgICAgT1AsIExDS19JRCwgR09NUF9GTEFHCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSb3V0aW5lcyBmb3IgQy9DKysgUmVkdWN0aW9uIG9wZXJhdG9ycyAmJiBhbmQgfHwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5lZWQgc2VwYXJhdGUgbWFjcm9zIGZvciAmJiwgfHwgYmVjYXVzZSB0aGVyZSBpcyBubyBjb21iaW5lZCBhc3NpZ25tZW50CisvLyAgIFRPRE86IGVsaW1pbmF0ZSBBVE9NSUNfQ1JJVF97TCxFUVZ9IG1hY3JvcyBhcyBub3QgdXNlZAorI2RlZmluZSBBVE9NSUNfQ1JJVF9MKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKCA9ICpsaHMgT1AsIEdPTVBfRkxBRyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKCA9ICpsaHMgT1AsIExDS19JRCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEFUT01JQ19DTVBYX0woVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoID0gKmxocyBPUCwgR09NUF9GTEFHICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19DTVBYX0woVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoPSAqbGhzIE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoPSAqbGhzIE9QLExDS19JRCkgIC8qIHVuYWxpZ25lZCAtIHVzZSBjcml0aWNhbCAqLyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitBVE9NSUNfQ01QWF9MKCBmaXhlZDEsIGFuZGwsIGNoYXIsICAgICAgIDgsICYmLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwKK0FUT01JQ19DTVBYX0woIGZpeGVkMSwgIG9ybCwgY2hhciwgICAgICAgOCwgfHwsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfb3JsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDIsIGFuZGwsIHNob3J0LCAgICAgMTYsICYmLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGwKK0FUT01JQ19DTVBYX0woIGZpeGVkMiwgIG9ybCwgc2hvcnQsICAgICAxNiwgfHwsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfb3JsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDQsIGFuZGwsIGttcF9pbnQzMiwgMzIsICYmLCA0aSwgMywgMCApICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGwKK0FUT01JQ19DTVBYX0woIGZpeGVkNCwgIG9ybCwga21wX2ludDMyLCAzMiwgfHwsIDRpLCAzLCAwICkgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfb3JsCitBVE9NSUNfQ01QWF9MKCBmaXhlZDgsIGFuZGwsIGttcF9pbnQ2NCwgNjQsICYmLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwKK0FUT01JQ19DTVBYX0woIGZpeGVkOCwgIG9ybCwga21wX2ludDY0LCA2NCwgfHwsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfb3JsCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUm91dGluZXMgZm9yIEZvcnRyYW4gb3BlcmF0b3JzIHRoYXQgbWF0Y2hlZCBubyBvbmUgaW4gQzogICAgICAgICAgICAgICAgICAqLworLyogTUFYLCBNSU4sIC5FUVYuLCAuTkVRVi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3BlcmF0b3JzIC5BTkQuLCAuT1IuIGFyZSBjb3ZlcmVkIGJ5IF9fa21wY19hdG9taWNfKl97YW5kbCxvcmx9ICAgICAgICAgICAqLworLyogSW50cmluc2ljcyBJQU5ELCBJT1IsIElFT1IgYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRiLG9yYix4b3J9ICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNSU4gYW5kIE1BWCBuZWVkIHNlcGFyYXRlIG1hY3JvcworLy8gT1AgLSBvcGVyYXRvciB0byBjaGVjayBpZiB3ZSBuZWVkIGFueSBhY3Rpb25zPworI2RlZmluZSBNSU5fTUFYX0NSSVRTRUNUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgICAgICAgICAgICAgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgIFwKKyAgICAgICAgKmxocyA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoIEZMQUcgKSAmJiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NSSVRTRUNUKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1JTl9NQVhfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggb2xkX3ZhbHVlIE9QIHJocyAmJiAgICAgICAgICAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICBcCisgICAgICAgICAgICAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmcmhzICkgKSAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAxLWJ5dGUsIDItYnl0ZSBvcGVyYW5kcyAtIHVzZSBjcml0aWNhbCBzZWN0aW9uCisjZGVmaW5lIE1JTl9NQVhfQ1JJVElDQUwoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgIC8qIG5lZWQgYWN0aW9ucz8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1QoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgTUlOX01BWF9DT01QWENIRyhUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBNSU5fTUFYX0NPTVBYQ0hHKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUlOX01BWF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUlOX01BWF9DUklUU0VDVChPUCxMQ0tfSUQpICAgLyogdW5hbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworTUlOX01BWF9DT01QWENIRyggZml4ZWQxLCAgbWF4LCBjaGFyLCAgICAgICAgOCwgPCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX21heAorTUlOX01BWF9DT01QWENIRyggZml4ZWQxLCAgbWluLCBjaGFyLCAgICAgICAgOCwgPiwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX21pbgorTUlOX01BWF9DT01QWENIRyggZml4ZWQyLCAgbWF4LCBzaG9ydCwgICAgICAxNiwgPCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX21heAorTUlOX01BWF9DT01QWENIRyggZml4ZWQyLCAgbWluLCBzaG9ydCwgICAgICAxNiwgPiwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX21pbgorTUlOX01BWF9DT01QWENIRyggZml4ZWQ0LCAgbWF4LCBrbXBfaW50MzIsICAzMiwgPCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21heAorTUlOX01BWF9DT01QWENIRyggZml4ZWQ0LCAgbWluLCBrbXBfaW50MzIsICAzMiwgPiwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbgorTUlOX01BWF9DT01QWENIRyggZml4ZWQ4LCAgbWF4LCBrbXBfaW50NjQsICA2NCwgPCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X21heAorTUlOX01BWF9DT01QWENIRyggZml4ZWQ4LCAgbWluLCBrbXBfaW50NjQsICA2NCwgPiwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbgorTUlOX01BWF9DT01QWENIRyggZmxvYXQ0LCAgbWF4LCBrbXBfcmVhbDMyLCAzMiwgPCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X21heAorTUlOX01BWF9DT01QWENIRyggZmxvYXQ0LCAgbWluLCBrbXBfcmVhbDMyLCAzMiwgPiwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbgorTUlOX01BWF9DT01QWENIRyggZmxvYXQ4LCAgbWF4LCBrbXBfcmVhbDY0LCA2NCwgPCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21heAorTUlOX01BWF9DT01QWENIRyggZmxvYXQ4LCAgbWluLCBrbXBfcmVhbDY0LCA2NCwgPiwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbgorI2lmIEtNUF9IQVZFX1FVQUQKK01JTl9NQVhfQ1JJVElDQUwoIGZsb2F0MTYsIG1heCwgICAgIFFVQURfTEVHQUNZLCAgICAgIDwsIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4CitNSU5fTUFYX0NSSVRJQ0FMKCBmbG9hdDE2LCBtaW4sICAgICBRVUFEX0xFR0FDWSwgICAgICA+LCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21pbgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBNSU5fTUFYX0NSSVRJQ0FMKCBmbG9hdDE2LCBtYXhfYTE2LCBRdWFkX2ExNl90LCAgICAgPCwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2CisgICAgTUlOX01BWF9DUklUSUNBTCggZmxvYXQxNiwgbWluX2ExNiwgUXVhZF9hMTZfdCwgICAgID4sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2ExNgorI2VuZGlmCisjZW5kaWYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmVlZCBzZXBhcmF0ZSBtYWNyb3MgZm9yIC5FUVYuIGJlY2F1c2Ugb2YgdGhlIG5lZWQgb2YgY29tcGxlbWVudCAofikKKy8vIE9QIGlnbm9yZWQgZm9yIGNyaXRpY2FsIHNlY3Rpb25zLCBePX4gdXNlZCBpbnN0ZWFkCisjZGVmaW5lIEFUT01JQ19DUklUX0VRVihUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoXj1+LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoXj1+LExDS19JRCkgICAgLyogc2VuZCBhc3NpZ25tZW50IGFuZCBjb21wbGVtZW50ICovICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0NNUFhfRVFWKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChePX4sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhfRVFWKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChePX4sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChePX4sTENLX0lEKSAgICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYQ0hHKCAgZml4ZWQxLCBuZXF2LCBrbXBfaW50OCwgICA4LCAgIF4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2CitBVE9NSUNfQ01QWENIRyggIGZpeGVkMiwgbmVxdiwga21wX2ludDE2LCAxNiwgICBeLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbmVxdgorQVRPTUlDX0NNUFhDSEcoICBmaXhlZDQsIG5lcXYsIGttcF9pbnQzMiwgMzIsICAgXiwgNGksIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXYKK0FUT01JQ19DTVBYQ0hHKCAgZml4ZWQ4LCBuZXF2LCBrbXBfaW50NjQsIDY0LCAgIF4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2CitBVE9NSUNfQ01QWF9FUVYoIGZpeGVkMSwgZXF2LCAga21wX2ludDgsICAgOCwgIF5+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZXF2CitBVE9NSUNfQ01QWF9FUVYoIGZpeGVkMiwgZXF2LCAga21wX2ludDE2LCAxNiwgIF5+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZXF2CitBVE9NSUNfQ01QWF9FUVYoIGZpeGVkNCwgZXF2LCAga21wX2ludDMyLCAzMiwgIF5+LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZXF2CitBVE9NSUNfQ01QWF9FUVYoIGZpeGVkOCwgZXF2LCAga21wX2ludDY0LCA2NCwgIF5+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZXF2CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUwoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICBcCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIHJvdXRpbmVzIGZvciBsb25nIGRvdWJsZSB0eXBlCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTAsIGFkZCwgbG9uZyBkb3VibGUsICAgICArLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDEwLCBzdWIsIGxvbmcgZG91YmxlLCAgICAgLSwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxMCwgbXVsLCBsb25nIGRvdWJsZSwgICAgICosIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTAsIGRpdiwgbG9uZyBkb3VibGUsICAgICAvLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2RpdgorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIGFkZCwgUVVBRF9MRUdBQ1ksICAgICArLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBzdWIsIFFVQURfTEVHQUNZLCAgICAgLSwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgbXVsLCBRVUFEX0xFR0FDWSwgICAgICosIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIGRpdiwgUVVBRF9MRUdBQ1ksICAgICAvLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2RpdgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIGFkZF9hMTYsIFF1YWRfYTE2X3QsICssIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgc3ViX2ExNiwgUXVhZF9hMTZfdCwgLSwgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBtdWxfYTE2LCBRdWFkX2ExNl90LCAqLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIGRpdl9hMTYsIFF1YWRfYTE2X3QsIC8sIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNgorI2VuZGlmCisjZW5kaWYKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisKKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKK0FUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoIGNtcGx4NCwgYWRkLCBrbXBfY21wbHgzMiwgNjQsICssIDhjLCA3LCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQKK0FUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoIGNtcGx4NCwgc3ViLCBrbXBfY21wbHgzMiwgNjQsIC0sIDhjLCA3LCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIKK0FUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoIGNtcGx4NCwgbXVsLCBrbXBfY21wbHgzMiwgNjQsICosIDhjLCA3LCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWwKK0FUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoIGNtcGx4NCwgZGl2LCBrbXBfY21wbHgzMiwgNjQsIC8sIDhjLCA3LCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYKKy8vIGVuZCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZWxzZQorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDQsICBhZGQsIGttcF9jbXBseDMyLCAgICAgKywgIDhjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDQsICBzdWIsIGttcF9jbXBseDMyLCAgICAgLSwgIDhjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDQsICBtdWwsIGttcF9jbXBseDMyLCAgICAgKiwgIDhjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDQsICBkaXYsIGttcF9jbXBseDMyLCAgICAgLywgIDhjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2RpdgorI2VuZGlmIC8vIFVTRV9DTVBYQ0hHX0ZJWAorCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4OCwgIGFkZCwga21wX2NtcGx4NjQsICAgICArLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4OCwgIHN1Yiwga21wX2NtcGx4NjQsICAgICAtLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4OCwgIG11bCwga21wX2NtcGx4NjQsICAgICAqLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4OCwgIGRpdiwga21wX2NtcGx4NjQsICAgICAvLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2CitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTAsIGFkZCwga21wX2NtcGx4ODAsICAgICArLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2FkZAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDEwLCBzdWIsIGttcF9jbXBseDgwLCAgICAgLSwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWIKK0FUT01JQ19DUklUSUNBTCggY21wbHgxMCwgbXVsLCBrbXBfY21wbHg4MCwgICAgICosIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTAsIGRpdiwga21wX2NtcGx4ODAsICAgICAvLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2RpdgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTCggY21wbHgxNiwgYWRkLCBDUExYMTI4X0xFRywgICAgICssIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIHN1YiwgQ1BMWDEyOF9MRUcsICAgICAtLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBtdWwsIENQTFgxMjhfTEVHLCAgICAgKiwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWwKK0FUT01JQ19DUklUSUNBTCggY21wbHgxNiwgZGl2LCBDUExYMTI4X0xFRywgICAgIC8sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTCggY21wbHgxNiwgYWRkX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCArLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBzdWJfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC0sIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIG11bF9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgKiwgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggY21wbHgxNiwgZGl2X2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAvLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2CisjZW5kaWYKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogeCA9IGV4cHIgYmlub3AgeCBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9SRVYoT1AsTENLX0lEKSBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9SRVYoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTl9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLCBSRVRfVFlQRSkgXAorUkVUX1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEIyNfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiX3JldjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX1JFVihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ET19QQVVTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzIE9QIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOX1JFVihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRVYoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX1JFVihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJpZXMgZGVmaW5pdGlvbiBmb3IgaW50ZWdlciBvcGVyYW5kcworLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZDQsIGZsb2F0NCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZCB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IgKHVzZWQgaW4gY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKworLy8gICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCAgVFlQRSwgICBCSVRTLE9QLExDS19JRCxHT01QX0ZMQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEFUT01JQyBpbnRlZ2VyIG9wZXJhbmRzLCBvdGhlciBvcGVyYXRvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICBCSVRTLCBPUCwgTENLX0lELCBHT01QX0ZMQUcKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxLCAgZGl2LCBrbXBfaW50OCwgICAgOCwgLywgIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDF1LCBkaXYsIGttcF91aW50OCwgICA4LCAvLCAgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDEsICBzaGwsIGttcF9pbnQ4LCAgICA4LCA8PCwgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMSwgIHNociwga21wX2ludDgsICAgIDgsID4+LCAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxdSwgc2hyLCBrbXBfdWludDgsICAgOCwgPj4sIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxLCAgc3ViLCBrbXBfaW50OCwgICAgOCwgLSwgIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMiwgIGRpdiwga21wX2ludDE2LCAgMTYsIC8sICAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQydSwgZGl2LCBrbXBfdWludDE2LCAxNiwgLywgIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQyLCAgc2hsLCBrbXBfaW50MTYsICAxNiwgPDwsIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hsX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDIsICBzaHIsIGttcF9pbnQxNiwgIDE2LCA+PiwgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMnUsIHNociwga21wX3VpbnQxNiwgMTYsID4+LCAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMiwgIHN1Yiwga21wX2ludDE2LCAgMTYsIC0sICAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDQsICBkaXYsIGttcF9pbnQzMiwgIDMyLCAvLCAgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNHUsIGRpdiwga21wX3VpbnQzMiwgMzIsIC8sICA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNCwgIHNobCwga21wX2ludDMyLCAgMzIsIDw8LCA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0LCAgc2hyLCBrbXBfaW50MzIsICAzMiwgPj4sIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDR1LCBzaHIsIGttcF91aW50MzIsIDMyLCA+PiwgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDQsICBzdWIsIGttcF9pbnQzMiwgIDMyLCAtLCAgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4LCAgZGl2LCBrbXBfaW50NjQsICA2NCwgLywgIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDh1LCBkaXYsIGttcF91aW50NjQsIDY0LCAvLCAgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDgsICBzaGwsIGttcF9pbnQ2NCwgIDY0LCA8PCwgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOCwgIHNociwga21wX2ludDY0LCAgNjQsID4+LCA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4dSwgc2hyLCBrbXBfdWludDY0LCA2NCwgPj4sIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4LCAgc3ViLCBrbXBfaW50NjQsICA2NCwgLSwgIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZsb2F0NCwgIGRpdiwga21wX3JlYWwzMiwgMzIsIC8sICA0ciwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZmxvYXQ0LCAgc3ViLCBrbXBfcmVhbDMyLCAzMiwgLSwgIDRyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZsb2F0OCwgIGRpdiwga21wX3JlYWw2NCwgNjQsIC8sICA4ciwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZmxvYXQ4LCAgc3ViLCBrbXBfcmVhbDY0LCA2NCwgLSwgIDhyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX3JldgorLy8gICAgICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgQklUUyxPUCxMQ0tfSUQsIEdPTVBfRkxBRworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRVYoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfUkVWKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIHJvdXRpbmVzIGZvciBsb25nIGRvdWJsZSB0eXBlCitBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDEwLCBzdWIsIGxvbmcgZG91YmxlLCAgICAgLSwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDEwLCBkaXYsIGxvbmcgZG91YmxlLCAgICAgLywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTYsIHN1YiwgUVVBRF9MRUdBQ1ksICAgICAtLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTYsIGRpdiwgUVVBRF9MRUdBQ1ksICAgICAvLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9yZXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgc3ViX2ExNiwgUXVhZF9hMTZfdCwgLSwgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X3JldgorICAgIEFUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTYsIGRpdl9hMTYsIFF1YWRfYTE2X3QsIC8sIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9yZXYKKyNlbmRpZgorI2VuZGlmCisKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDQsICBzdWIsIGttcF9jbXBseDMyLCAgICAgLSwgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4NCwgIGRpdiwga21wX2NtcGx4MzIsICAgICAvLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHg4LCAgc3ViLCBrbXBfY21wbHg2NCwgICAgIC0sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDgsICBkaXYsIGttcF9jbXBseDY0LCAgICAgLywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTAsIHN1Yiwga21wX2NtcGx4ODAsICAgICAtLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTAsIGRpdiwga21wX2NtcGx4ODAsICAgICAvLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDE2LCBzdWIsIENQTFgxMjhfTEVHLCAgICAgLSwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDE2LCBkaXYsIENQTFgxMjhfTEVHLCAgICAgLywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfcmV2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIHN1Yl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9yZXYKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDE2LCBkaXZfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfcmV2CisjZW5kaWYKKyNlbmRpZgorCisKKyNlbmRpZiAvL0tNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIEVuZCBvZiBPcGVuTVAgNC4wOiB4ID0gZXhwciBiaW5vcCB4IGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKworI2VuZGlmIC8vT01QXzQwX0VOQUJMRUQKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJvdXRpbmVzIGZvciBtaXhlZCB0eXBlcyBvZiBMSFMgYW5kIFJIUywgd2hlbiBSSFMgaXMgImxhcmdlciIgICAgICAgICAgICAqLworLyogTm90ZTogaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSB0b3RhbCBudW1iZXIgb2YgdHlwZXMgY29tYmluYXRpb25zICAgICAgICAgICovCisvKiAgICAgICBpdCBpcyBzdXBwb3NlZCB0aGF0IGNvbXBpbGVyIGNvbnZlcnRzIFJIUyB0byBsb25nZXN0IGZsb2F0aW5nIHR5cGUsKi8KKy8qICAgICAgIHRoYXQgaXMgX1F1YWQsIGJlZm9yZSBjYWxsIHRvIGFueSBvZiB0aGVzZSByb3V0aW5lcyAgICAgICAgICAgICAgICAqLworLyogQ29udmVyc2lvbiB0byBfUXVhZCB3aWxsIGJlIGRvbmUgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyBjYWxjdWxhdGlvbiwgICAgICovCisvKiAgICBjb252ZXJzaW9uIGJhY2sgdG8gVFlQRSAtIGJlZm9yZSB0aGUgYXNzaWdubWVudCwgbGlrZTogICAgICAgICAgICAgICAgKi8KKy8qICAgICpsaHMgPSAoVFlQRSkoIChfUXVhZCkoKmxocykgT1AgcmhzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGVyZm9ybWFuY2UgcGVuYWx0eSBleHBlY3RlZCBiZWNhdXNlIG9mIFNXIGVtdWxhdGlvbiB1c2UgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCMjXyMjUlRZUEVfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFJUWVBFIHJocyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIl8iICNSVFlQRV9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9GUChUWVBFX0lELFRZUEUsT1BfSUQsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX01JWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfQ01QWENIR19NSVgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfUkVWX01JWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfUkVWX0ZQKFRZUEVfSUQsVFlQRSxPUF9JRCxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRVYoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfUkVWKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvLyBSSFM9ZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgY2hhciwgICAgICAgbXVsLCAgOCwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsIGNoYXIsICAgICAgIGRpdiwgIDgsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCBzaG9ydCwgICAgICBtdWwsIDE2LCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgc2hvcnQsICAgICAgZGl2LCAxNiwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsIGttcF9pbnQzMiwgIG11bCwgMzIsICosIGZsb2F0OCwga21wX3JlYWw2NCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCBrbXBfaW50MzIsICBkaXYsIDMyLCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwga21wX2ludDY0LCAgbXVsLCA2NCwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsIGttcF9pbnQ2NCwgIGRpdiwgNjQsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBhZGQsIDMyLCArLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwga21wX3JlYWwzMiwgc3ViLCAzMiwgLSwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsIGttcF9yZWFsMzIsIG11bCwgMzIsICosIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBkaXYsIDMyLCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4CisKKy8vIFJIUz1mbG9hdDE2IChkZXByZWNhdGVkLCB0byBiZSByZW1vdmVkIHdoZW4gd2UgYXJlIHN1cmUgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHVzZSB0aGVtKQorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgYWRkLCAgOCwgKywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMXUsIHVjaGFyLCAgICAgIGFkZCwgIDgsICssIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgc3ViLCAgOCwgLSwgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMXUsIHVjaGFyLCAgICAgIHN1YiwgIDgsIC0sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgbXVsLCAgOCwgKiwgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMXUsIHVjaGFyLCAgICAgIG11bCwgIDgsICosIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgZGl2LCAgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMXUsIHVjaGFyLCAgICAgIGRpdiwgIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBhZGQsIDE2LCArLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQydSwgdXNob3J0LCAgICAgYWRkLCAxNiwgKywgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBzdWIsIDE2LCAtLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQydSwgdXNob3J0LCAgICAgc3ViLCAxNiwgLSwgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBtdWwsIDE2LCAqLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQydSwgdXNob3J0LCAgICAgbXVsLCAxNiwgKiwgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBkaXYsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQydSwgdXNob3J0LCAgICAgZGl2LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIGFkZCwgMzIsICssIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDR1LCBrbXBfdWludDMyLCBhZGQsIDMyLCArLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIHN1YiwgMzIsIC0sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDR1LCBrbXBfdWludDMyLCBzdWIsIDMyLCAtLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIG11bCwgMzIsICosIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDR1LCBrbXBfdWludDMyLCBtdWwsIDMyLCAqLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIGRpdiwgMzIsIC8sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDR1LCBrbXBfdWludDMyLCBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgYWRkLCA2NCwgKywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOHUsIGttcF91aW50NjQsIGFkZCwgNjQsICssIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgc3ViLCA2NCwgLSwgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOHUsIGttcF91aW50NjQsIHN1YiwgNjQsIC0sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgbXVsLCA2NCwgKiwgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOHUsIGttcF91aW50NjQsIG11bCwgNjQsICosIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgZGl2LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOHUsIGttcF91aW50NjQsIGRpdiwgNjQsIC8sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBhZGQsIDMyLCArLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgc3ViLCAzMiwgLSwgZnAsIF9RdWFkLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIG11bCwgMzIsICosIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBhZGQsIDY0LCArLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ4LCAga21wX3JlYWw2NCwgc3ViLCA2NCwgLSwgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIG11bCwgNjQsICosIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBkaXYsIDY0LCAvLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAKKworQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgYWRkLCArLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwCitBVE9NSUNfQ1JJVElDQUxfRlAoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAgICBzdWIsIC0sIGZwLCBfUXVhZCwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAKK0FUT01JQ19DUklUSUNBTF9GUCggZmxvYXQxMCwgbG9uZyBkb3VibGUsICAgIG11bCwgKiwgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcAorQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgZGl2LCAvLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyBSZXZlcnNlIG9wZXJhdGlvbnMKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIHN1Yl9yZXYsICA4LCAtLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKCBmaXhlZDF1LCB1Y2hhciwgICAgICBzdWJfcmV2LCAgOCwgLSwgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X3N1Yl9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIGRpdl9yZXYsICA4LCAvLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKCBmaXhlZDF1LCB1Y2hhciwgICAgICBkaXZfcmV2LCAgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9yZXZfZnAKKworQVRPTUlDX0NNUFhDSEdfUkVWX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgc3ViX3JldiwgMTYsIC0sIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoIGZpeGVkMnUsIHVzaG9ydCwgICAgIHN1Yl9yZXYsIDE2LCAtLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc3ViX3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgZGl2X3JldiwgMTYsIC8sIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoIGZpeGVkMnUsIHVzaG9ydCwgICAgIGRpdl9yZXYsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X3Jldl9mcAorCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBzdWJfcmV2LCAzMiwgLSwgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWCggZml4ZWQ0dSwga21wX3VpbnQzMiwgc3ViX3JldiwgMzIsIC0sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zdWJfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBkaXZfcmV2LCAzMiwgLywgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWCggZml4ZWQ0dSwga21wX3VpbnQzMiwgZGl2X3JldiwgMzIsIC8sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIHN1Yl9yZXYsIDY0LCAtLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKCBmaXhlZDh1LCBrbXBfdWludDY0LCBzdWJfcmV2LCA2NCwgLSwgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3N1Yl9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIGRpdl9yZXYsIDY0LCAvLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKCBmaXhlZDh1LCBrbXBfdWludDY0LCBkaXZfcmV2LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXZfZnAKKworQVRPTUlDX0NNUFhDSEdfUkVWX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgc3ViX3JldiwgMzIsIC0sIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIGRpdl9yZXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIHN1Yl9yZXYsIDY0LCAtLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBkaXZfcmV2LCA2NCwgLywgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X3Jldl9mcAorCitBVE9NSUNfQ1JJVElDQUxfUkVWX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgc3ViX3JldiwgLSwgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXZfZnAKK0FUT01JQ19DUklUSUNBTF9SRVZfRlAoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAgICBkaXZfcmV2LCAvLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X3Jldl9mcAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ01QTFgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBlbmQgb2YgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbHNlCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX0NNUExYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIFVTRV9DTVBYQ0hHX0ZJWAorI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX0NNUExYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitBVE9NSUNfQ01QWENIR19DTVBMWCggY21wbHg0LCBrbXBfY21wbHgzMiwgYWRkLCA2NCwgKywgY21wbHg4LCAga21wX2NtcGx4NjQsICA4YywgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OAorQVRPTUlDX0NNUFhDSEdfQ01QTFgoIGNtcGx4NCwga21wX2NtcGx4MzIsIHN1YiwgNjQsIC0sIGNtcGx4OCwgIGttcF9jbXBseDY0LCAgOGMsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jbXBseDgKK0FUT01JQ19DTVBYQ0hHX0NNUExYKCBjbXBseDQsIGttcF9jbXBseDMyLCBtdWwsIDY0LCAqLCBjbXBseDgsICBrbXBfY21wbHg2NCwgIDhjLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4CitBVE9NSUNfQ01QWENIR19DTVBMWCggY21wbHg0LCBrbXBfY21wbHgzMiwgZGl2LCA2NCwgLywgY21wbHg4LCAga21wX2NtcGx4NjQsICA4YywgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OAorCisvLyBSRUFELCBXUklURSwgQ0FQVFVSRSBhcmUgc3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF0b21pYyBSRUFEIHJvdXRpbmVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCZWdpbm5pbmcgb2YgYSBkZWZpbml0aW9uIChwcm92aWRlcyBuYW1lLCBwYXJhbWV0ZXJzLCBnZWJ1ZyB0cmFjZSkKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQqLCBmaXhlZCp1IGZvciBzaWduZWQsIHVuc2lnbmVkIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU5fUkVBRChUWVBFX0lELE9QX0lELFRZUEUsIFJFVF9UWVBFKSBcCitSRVRfVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsb2MgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZV9yZXQiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKy8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIHN0aWxsIG5lY2Vzc2FyeQorLy8gUmV0dXJuIG9sZCB2YWx1ZSByZWdhcmRsZXNzIG9mIHRoZSByZXN1bHQgb2YgImNvbXBhcmUgJiBzd2FwIyBvcGVyYXRpb24KKworI2RlZmluZSBPUF9DTVBYQ0hHX1JFQUQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bmlvbiBmX2lfdW5pb24geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBUWVBFIGZfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGttcF9pbnQjI0JJVFMgaV92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuaW9uIGZfaV91bmlvbiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbG9jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUuZl92YWwgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZS5pX3ZhbCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxvYywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZS5pX3ZhbCwgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLmlfdmFsICk7IFwKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlLmZfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfUkVBRChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmV3X3ZhbHVlID0gKCpsb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX1JFQUQoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19GSVhFRF9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUgPSBLTVBfVEVTVF9USEVOX0FERCMjQklUUyggbG9jLCBPUCAwICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX1JFQUQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfUkVBRChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICBcCitBVE9NSUNfQkVHSU5fUkVBRChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCMjPSxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfUkVBRChPUCxMQ0tfSUQpICAgICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpeCBmb3IgY21wbHg0IHJlYWQgKENRMjIwMzYxKSBvbiBXaW5kb3dzKiBPUy4gUmVndWxhciByb3V0aW5lIHdpdGggcmV0dXJuIHZhbHVlIGRvZXNuJ3Qgd29yay4KKy8vIExldCdzIHJldHVybiB0aGUgcmVhZCB2YWx1ZSB0aHJvdWdoIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKworI2lmICggS01QX09TX1dJTkRPV1MgKQorCisjZGVmaW5lIE9QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqb3V0KSA9ICgqbG9jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9SRUFEX1dSSyggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEX1dSSyhPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19CRUdJTl9SRUFEX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpIFwKK3ZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKCBUWVBFICogb3V0LCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbG9jICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfUkVBRF9XUksoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgXAorQVRPTUlDX0JFR0lOX1JFQURfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfUkVBRF9XUksoT1AjIz0sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLExDS19JRCkgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgXAorfQorCisjZW5kaWYgLy8gS01QX09TX1dJTkRPV1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgT1AsIEdPTVBfRkxBRworQVRPTUlDX0ZJWEVEX1JFQUQoIGZpeGVkNCwgcmQsIGttcF9pbnQzMiwgIDMyLCArLCAwICAgICAgICAgICAgKSAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3JkCitBVE9NSUNfRklYRURfUkVBRCggZml4ZWQ4LCByZCwga21wX2ludDY0LCAgNjQsICssIEtNUF9BUkNIX1g4NiApICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfcmQKK0FUT01JQ19DTVBYQ0hHX1JFQUQoIGZsb2F0NCwgcmQsIGttcF9yZWFsMzIsIDMyLCArLCBLTVBfQVJDSF9YODYgKSAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZAorQVRPTUlDX0NNUFhDSEdfUkVBRCggZmxvYXQ4LCByZCwga21wX3JlYWw2NCwgNjQsICssIEtNUF9BUkNIX1g4NiApICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3JkCisKKy8vICEhISBUT0RPOiBSZW1vdmUgbG9jayBvcGVyYXRpb25zIGZvciAiY2hhciIgc2luY2UgaXQgY2FuJ3QgYmUgbm9uLWF0b21pYworQVRPTUlDX0NNUFhDSEdfUkVBRCggZml4ZWQxLCAgcmQsIGttcF9pbnQ4LCAgICA4LCArLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3JkCitBVE9NSUNfQ01QWENIR19SRUFEKCBmaXhlZDIsICByZCwga21wX2ludDE2LCAgMTYsICssICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfcmQKKworQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGZsb2F0MTAsIHJkLCBsb25nIGRvdWJsZSwgKywgMTByLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBmbG9hdDE2LCByZCwgUVVBRF9MRUdBQ1ksICssIDE2ciwgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfcmQKKyNlbmRpZiAvLyBLTVBfSEFWRV9RVUFECisKKy8vIEZpeCBmb3IgQ1EyMjAzNjEgb24gV2luZG93cyogT1MKKyNpZiAoIEtNUF9PU19XSU5ET1dTICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVBRF9XUksoIGNtcGx4NCwgIHJkLCBrbXBfY21wbHgzMiwgKywgIDhjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZAorI2Vsc2UKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVBRCggY21wbHg0LCAgcmQsIGttcF9jbXBseDMyLCArLCAgOGMsIDEgKSAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZAorI2VuZGlmCitBVE9NSUNfQ1JJVElDQUxfUkVBRCggY21wbHg4LCAgcmQsIGttcF9jbXBseDY0LCArLCAxNmMsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfcmQKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDEwLCByZCwga21wX2NtcGx4ODAsICssIDIwYywgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfcmQKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfUkVBRCggY21wbHgxNiwgcmQsIENQTFgxMjhfTEVHLCArLCAzMmMsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3JkCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9SRUFEKCBmbG9hdDE2LCBhMTZfcmQsIFF1YWRfYTE2X3QsICssIDE2ciwgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9yZAorICAgIEFUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDE2LCBhMTZfcmQsIGttcF9jbXBseDEyOF9hMTZfdCwgKywgMzJjLCAxICkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9yZAorI2VuZGlmCisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF0b21pYyBXUklURSByb3V0aW5lcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX1hDSEdfV1IoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfWENIR19GSVhFRCMjQklUUyggbGhzLCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19YQ0hHX0ZMT0FUX1dSKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX1hDSEdfUkVBTCMjQklUUyggbGhzLCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisjZGVmaW5lIE9QX0NNUFhDSEdfV1IoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19XUihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfV1IoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1dSKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCxHT01QX0ZMQUcpICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBVE9NSUNfWENIR19XUiggZml4ZWQxLCAgd3IsIGttcF9pbnQ4LCAgICA4LCA9LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3dyCitBVE9NSUNfWENIR19XUiggZml4ZWQyLCAgd3IsIGttcF9pbnQxNiwgIDE2LCA9LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3dyCitBVE9NSUNfWENIR19XUiggZml4ZWQ0LCAgd3IsIGttcF9pbnQzMiwgIDMyLCA9LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DTVBYQ0hHX1dSKCBmaXhlZDgsICB3ciwga21wX2ludDY0LCAgNjQsID0sICBLTVBfQVJDSF9YODYgKSAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3dyCisjZWxzZQorICAgIEFUT01JQ19YQ0hHX1dSKCBmaXhlZDgsICB3ciwga21wX2ludDY0LCAgNjQsID0sICBLTVBfQVJDSF9YODYgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3dyCisjZW5kaWYKKworQVRPTUlDX1hDSEdfRkxPQVRfV1IoIGZsb2F0NCwgd3IsIGttcF9yZWFsMzIsIDMyLCA9LCBLTVBfQVJDSF9YODYgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3dyCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DTVBYQ0hHX1dSKCBmbG9hdDgsICB3ciwga21wX3JlYWw2NCwgIDY0LCA9LCAgS01QX0FSQ0hfWDg2ICkgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyCisjZWxzZQorICAgIEFUT01JQ19YQ0hHX0ZMT0FUX1dSKCBmbG9hdDgsICB3ciwga21wX3JlYWw2NCwgIDY0LCA9LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyCisjZW5kaWYKKworQVRPTUlDX0NSSVRJQ0FMX1dSKCBmbG9hdDEwLCB3ciwgbG9uZyBkb3VibGUsID0sIDEwciwgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfV1IoIGZsb2F0MTYsIHdyLCBRVUFEX0xFR0FDWSwgPSwgMTZyLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl93cgorI2VuZGlmCitBVE9NSUNfQ1JJVElDQUxfV1IoIGNtcGx4NCwgIHdyLCBrbXBfY21wbHgzMiwgPSwgIDhjLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3dyCitBVE9NSUNfQ1JJVElDQUxfV1IoIGNtcGx4OCwgIHdyLCBrbXBfY21wbHg2NCwgPSwgMTZjLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3dyCitBVE9NSUNfQ1JJVElDQUxfV1IoIGNtcGx4MTAsIHdyLCBrbXBfY21wbHg4MCwgPSwgMjBjLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF93cgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHgxNiwgd3IsIENQTFgxMjhfTEVHLCA9LCAzMmMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3dyCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9XUiggZmxvYXQxNiwgYTE2X3dyLCBRdWFkX2ExNl90LCAgICAgICAgID0sIDE2ciwgMSApIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfd3IKKyAgICBBVE9NSUNfQ1JJVElDQUxfV1IoIGNtcGx4MTYsIGExNl93ciwga21wX2NtcGx4MTI4X2ExNl90LCA9LCAzMmMsIDEgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyCisjZW5kaWYKKyNlbmRpZgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXRvbWljIENBUFRVUkUgcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBCZWdpbm5pbmcgb2YgYSBkZWZpbml0aW9uIChwcm92aWRlcyBuYW1lLCBwYXJhbWV0ZXJzLCBnZWJ1ZyB0cmFjZSkKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQqLCBmaXhlZCp1IGZvciBzaWduZWQsIHVuc2lnbmVkIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxSRVRfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitSRVRfVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzLCBpbnQgZmxhZyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfQ1BUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfQ1BUKCBPUCMjPSwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfRklYRURfQUREX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIE9QIHVzZWQgYXMgYSBzaWduIGZvciBzdWJ0cmFjdGlvbjogKGxocy1yaHMpIC0tPiAobGhzKy1yaHMpICovICAgICAgXAorICAgIG9sZF92YWx1ZSA9IEtNUF9URVNUX1RIRU5fQUREIyNCSVRTKCBsaHMsIE9QIHJocyApOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBVE9NSUNfRklYRURfQUREX0NQVCggZml4ZWQ0LCBhZGRfY3B0LCBrbXBfaW50MzIsICAzMiwgKywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQKK0FUT01JQ19GSVhFRF9BRERfQ1BUKCBmaXhlZDQsIHN1Yl9jcHQsIGttcF9pbnQzMiwgIDMyLCAtLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdAorQVRPTUlDX0ZJWEVEX0FERF9DUFQoIGZpeGVkOCwgYWRkX2NwdCwga21wX2ludDY0LCAgNjQsICssIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0CitBVE9NSUNfRklYRURfQUREX0NQVCggZml4ZWQ4LCBzdWJfY3B0LCBrbXBfaW50NjQsICA2NCwgLSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHQKKworQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsIGFkZF9jcHQsIGttcF9yZWFsMzIsIDMyLCArLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsIHN1Yl9jcHQsIGttcF9yZWFsMzIsIDMyLCAtLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDgsIGFkZF9jcHQsIGttcF9yZWFsNjQsIDY0LCArLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDgsIHN1Yl9jcHQsIGttcF9yZWFsNjQsIDY0LCAtLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJpZXMgZGVmaW5pdGlvbiBmb3IgaW50ZWdlciBvcGVyYW5kcworLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZDQsIGZsb2F0NCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZCB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IgKHVzZWQgaW4gY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgIFRZUEUsICAgQklUUyxPUCxHT01QX0ZMQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEFUT01JQyBpbnRlZ2VyIG9wZXJhbmRzLCBvdGhlciBvcGVyYXRvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCAgR09NUF9GTEFHCitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIGFkZF9jcHQsIGttcF9pbnQ4LCAgICA4LCArLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCBhbmRiX2NwdCwga21wX2ludDgsICAgIDgsICYsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgZGl2X2NwdCwga21wX2ludDgsICAgIDgsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDF1LCBkaXZfY3B0LCBrbXBfdWludDgsICAgOCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBtdWxfY3B0LCBrbXBfaW50OCwgICAgOCwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIG9yYl9jcHQsIGttcF9pbnQ4LCAgICA4LCB8LCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgc2hsX2NwdCwga21wX2ludDgsICAgIDgsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBzaHJfY3B0LCBrbXBfaW50OCwgICAgOCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMXUsIHNocl9jcHQsIGttcF91aW50OCwgICA4LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIHN1Yl9jcHQsIGttcF9pbnQ4LCAgICA4LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgeG9yX2NwdCwga21wX2ludDgsICAgIDgsIF4sICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBhZGRfY3B0LCBrbXBfaW50MTYsICAxNiwgKywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgYW5kYl9jcHQsIGttcF9pbnQxNiwgIDE2LCAmLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIGRpdl9jcHQsIGttcF9pbnQxNiwgIDE2LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQydSwgZGl2X2NwdCwga21wX3VpbnQxNiwgMTYsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgbXVsX2NwdCwga21wX2ludDE2LCAgMTYsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBvcmJfY3B0LCBrbXBfaW50MTYsICAxNiwgfCwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIHNobF9jcHQsIGttcF9pbnQxNiwgIDE2LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgc2hyX2NwdCwga21wX2ludDE2LCAgMTYsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDJ1LCBzaHJfY3B0LCBrbXBfdWludDE2LCAxNiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBzdWJfY3B0LCBrbXBfaW50MTYsICAxNiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIHhvcl9jcHQsIGttcF9pbnQxNiwgIDE2LCBeLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCBhbmRiX2NwdCwga21wX2ludDMyLCAgMzIsICYsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgZGl2X2NwdCwga21wX2ludDMyLCAgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDR1LCBkaXZfY3B0LCBrbXBfdWludDMyLCAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBtdWxfY3B0LCBrbXBfaW50MzIsICAzMiwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIG9yYl9jcHQsIGttcF9pbnQzMiwgIDMyLCB8LCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgc2hsX2NwdCwga21wX2ludDMyLCAgMzIsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBzaHJfY3B0LCBrbXBfaW50MzIsICAzMiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNHUsIHNocl9jcHQsIGttcF91aW50MzIsIDMyLCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIHhvcl9jcHQsIGttcF9pbnQzMiwgIDMyLCBeLCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCBhbmRiX2NwdCwga21wX2ludDY0LCAgNjQsICYsICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgZGl2X2NwdCwga21wX2ludDY0LCAgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDh1LCBkaXZfY3B0LCBrbXBfdWludDY0LCA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBtdWxfY3B0LCBrbXBfaW50NjQsICA2NCwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIG9yYl9jcHQsIGttcF9pbnQ2NCwgIDY0LCB8LCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgc2hsX2NwdCwga21wX2ludDY0LCAgNjQsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBzaHJfY3B0LCBrbXBfaW50NjQsICA2NCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOHUsIHNocl9jcHQsIGttcF91aW50NjQsIDY0LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIHhvcl9jcHQsIGttcF9pbnQ2NCwgIDY0LCBeLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ0LCAgZGl2X2NwdCwga21wX3JlYWwzMiwgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsICBtdWxfY3B0LCBrbXBfcmVhbDMyLCAzMiwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgIGRpdl9jcHQsIGttcF9yZWFsNjQsIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ4LCAgbXVsX2NwdCwga21wX3JlYWw2NCwgNjQsICosICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdAorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCAgR09NUF9GTEFHCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gQ0FQVFVSRSByb3V0aW5lcyBmb3IgbWl4ZWQgdHlwZXMgUkhTPWZsb2F0MTYKKyNpZiBLTVBfSEFWRV9RVUFECisKKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTl9DUFRfTUlYKFRZUEVfSUQsT1BfSUQsVFlQRSxSVFlQRV9JRCxSVFlQRSkgICAgICAgXAorVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQjI18jI1JUWVBFX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBSVFlQRSByaHMsIGludCBmbGFnICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICJfIiAjUlRZUEVfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFRfTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVF9NSVgoVFlQRV9JRCxPUF9JRCxUWVBFLFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFRfTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFRfTUlYKFRZUEVfSUQsT1BfSUQsVFlQRSxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUKE9QIyM9LExDS19JRCkgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBhZGRfY3B0LCAgOCwgKywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQxdSwgdWNoYXIsICAgICAgYWRkX2NwdCwgIDgsICssIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9hZGRfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBzdWJfY3B0LCAgOCwgLSwgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQxdSwgdWNoYXIsICAgICAgc3ViX2NwdCwgIDgsIC0sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zdWJfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBtdWxfY3B0LCAgOCwgKiwgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQxdSwgdWNoYXIsICAgICAgbXVsX2NwdCwgIDgsICosIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9tdWxfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBkaXZfY3B0LCAgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQxdSwgdWNoYXIsICAgICAgZGl2X2NwdCwgIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X2ZwCisKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIGFkZF9jcHQsIDE2LCArLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDJ1LCB1c2hvcnQsICAgICBhZGRfY3B0LCAxNiwgKywgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2FkZF9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIHN1Yl9jcHQsIDE2LCAtLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDJ1LCB1c2hvcnQsICAgICBzdWJfY3B0LCAxNiwgLSwgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3N1Yl9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIG11bF9jcHQsIDE2LCAqLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDJ1LCB1c2hvcnQsICAgICBtdWxfY3B0LCAxNiwgKiwgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X211bF9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIGRpdl9jcHQsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDJ1LCB1c2hvcnQsICAgICBkaXZfY3B0LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfZnAKKworQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgYWRkX2NwdCwgMzIsICssIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZpeGVkNHUsIGttcF91aW50MzIsIGFkZF9jcHQsIDMyLCArLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgc3ViX2NwdCwgMzIsIC0sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZpeGVkNHUsIGttcF91aW50MzIsIHN1Yl9jcHQsIDMyLCAtLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc3ViX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgbXVsX2NwdCwgMzIsICosIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZpeGVkNHUsIGttcF91aW50MzIsIG11bF9jcHQsIDMyLCAqLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfbXVsX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgZGl2X2NwdCwgMzIsIC8sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZpeGVkNHUsIGttcF91aW50MzIsIGRpdl9jcHQsIDMyLCAvLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9mcAorCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBhZGRfY3B0LCA2NCwgKywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQ4dSwga21wX3VpbnQ2NCwgYWRkX2NwdCwgNjQsICssIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9hZGRfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBzdWJfY3B0LCA2NCwgLSwgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQ4dSwga21wX3VpbnQ2NCwgc3ViX2NwdCwgNjQsIC0sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBtdWxfY3B0LCA2NCwgKiwgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQ4dSwga21wX3VpbnQ2NCwgbXVsX2NwdCwgNjQsICosIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9tdWxfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBkaXZfY3B0LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZml4ZWQ4dSwga21wX3VpbnQ2NCwgZGl2X2NwdCwgNjQsIC8sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X2ZwCisKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIGFkZF9jcHQsIDMyLCArLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBzdWJfY3B0LCAzMiwgLSwgZnAsIF9RdWFkLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgbXVsX2NwdCwgMzIsICosIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIGRpdl9jcHQsIDMyLCAvLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X2ZwCisKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIGFkZF9jcHQsIDY0LCArLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBzdWJfY3B0LCA2NCwgLSwgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWCggZmxvYXQ4LCAga21wX3JlYWw2NCwgbXVsX2NwdCwgNjQsICosIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIGRpdl9jcHQsIDY0LCAvLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X2ZwCisKK0FUT01JQ19DUklUSUNBTF9DUFRfTUlYKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgYWRkX2NwdCwgKywgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHRfZnAKK0FUT01JQ19DUklUSUNBTF9DUFRfTUlYKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgc3ViX2NwdCwgLSwgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfZnAKK0FUT01JQ19DUklUSUNBTF9DUFRfTUlYKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgbXVsX2NwdCwgKiwgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9jcHRfZnAKK0FUT01JQ19DUklUSUNBTF9DUFRfTUlYKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgZGl2X2NwdCwgLywgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfZnAKKworI2VuZGlmIC8vS01QX0hBVkVfUVVBRAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBDL0MrKyBSZWR1Y3Rpb24gb3BlcmF0b3JzICYmIGFuZCB8fAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9MX0NQVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0xfQ1BUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9MX0NQVCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0xfQ1BUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmVlZCBzZXBhcmF0ZSBtYWNyb3MgZm9yICYmLCB8fCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbWJpbmVkIGFzc2lnbm1lbnQKKyNkZWZpbmUgQVRPTUlDX0NNUFhfTF9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0xfQ1BUKCA9ICpsaHMgT1AsIEdPTVBfRkxBRyApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDEsIGFuZGxfY3B0LCBjaGFyLCAgICAgICA4LCAmJiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQxLCAgb3JsX2NwdCwgY2hhciwgICAgICAgOCwgfHwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQyLCBhbmRsX2NwdCwgc2hvcnQsICAgICAxNiwgJiYsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkMiwgIG9ybF9jcHQsIHNob3J0LCAgICAgMTYsIHx8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkNCwgYW5kbF9jcHQsIGttcF9pbnQzMiwgMzIsICYmLCAwICkgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDQsICBvcmxfY3B0LCBrbXBfaW50MzIsIDMyLCB8fCwgMCApICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDgsIGFuZGxfY3B0LCBrbXBfaW50NjQsIDY0LCAmJiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQ4LCAgb3JsX2NwdCwga21wX2ludDY0LCA2NCwgfHwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmxfY3B0CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEZvcnRyYW4gb3BlcmF0b3JzIHRoYXQgbWF0Y2hlZCBubyBvbmUgaW4gQzoKKy8vIE1BWCwgTUlOLCAuRVFWLiwgLk5FUVYuCisvLyBPcGVyYXRvcnMgLkFORC4sIC5PUi4gYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRsLG9ybH1fY3B0CisvLyBJbnRyaW5zaWNzIElBTkQsIElPUiwgSUVPUiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGIsb3JiLHhvcn1fY3B0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1JTiBhbmQgTUFYIG5lZWQgc2VwYXJhdGUgbWFjcm9zCisvLyBPUCAtIG9wZXJhdG9yIHRvIGNoZWNrIGlmIHdlIG5lZWQgYW55IGFjdGlvbnM/CisjZGVmaW5lIE1JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqbGhzID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIGZsYWcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoIEZMQUcgKSAmJiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NSSVRTRUNUX0NQVCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBNSU5fTUFYX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKlRZUEUgb2xkX3ZhbHVlOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoIG9sZF92YWx1ZSBPUCByaHMgJiYgICAgICAgICAgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgXAorICAgICAgICAgICAgISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJnJocyApICkgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggZmxhZyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gMS1ieXRlLCAyLWJ5dGUgb3BlcmFuZHMgLSB1c2UgY3JpdGljYWwgc2VjdGlvbgorI2RlZmluZSBNSU5fTUFYX0NSSVRJQ0FMX0NQVChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlLCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAvKiBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIE1JTl9NQVhfQ09NUFhDSEdfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWUsIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ01QWENIR19DUFQoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkMSwgIG1heF9jcHQsIGNoYXIsICAgICAgICA4LCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQxLCAgbWluX2NwdCwgY2hhciwgICAgICAgIDgsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDIsICBtYXhfY3B0LCBzaG9ydCwgICAgICAxNiwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkMiwgIG1pbl9jcHQsIHNob3J0LCAgICAgIDE2LCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQ0LCAgbWF4X2NwdCwga21wX2ludDMyLCAgMzIsIDwsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDQsICBtaW5fY3B0LCBrbXBfaW50MzIsICAzMiwgPiwgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkOCwgIG1heF9jcHQsIGttcF9pbnQ2NCwgIDY0LCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQ4LCAgbWluX2NwdCwga21wX2ludDY0LCAgNjQsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmbG9hdDQsICBtYXhfY3B0LCBrbXBfcmVhbDMyLCAzMiwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZsb2F0NCwgIG1pbl9jcHQsIGttcF9yZWFsMzIsIDMyLCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZmxvYXQ4LCAgbWF4X2NwdCwga21wX3JlYWw2NCwgNjQsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmbG9hdDgsICBtaW5fY3B0LCBrbXBfcmVhbDY0LCA2NCwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdAorI2lmIEtNUF9IQVZFX1FVQUQKK01JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtYXhfY3B0LCBRVUFEX0xFR0FDWSwgICAgPCwgMTZyLCAgIDEgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQKK01JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtaW5fY3B0LCBRVUFEX0xFR0FDWSwgICAgPiwgMTZyLCAgIDEgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgTUlOX01BWF9DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG1heF9hMTZfY3B0LCBRdWFkX2ExNl90LCA8LCAxNnIsICAxICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2X2NwdAorICAgIE1JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtaW5fYTE2X2NwdCwgUXVhZF9hMTZfdCwgPiwgMTZyLCAgMSApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWl4X2ExNl9jcHQKKyNlbmRpZgorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0VRVl9DUFQoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFQoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9FUVZfQ1BUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhfRVFWX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0VRVl9DUFQoXj1+LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDEsIG5lcXZfY3B0LCBrbXBfaW50OCwgICA4LCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDIsIG5lcXZfY3B0LCBrbXBfaW50MTYsIDE2LCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDQsIG5lcXZfY3B0LCBrbXBfaW50MzIsIDMyLCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoICBmaXhlZDgsIG5lcXZfY3B0LCBrbXBfaW50NjQsIDY0LCAgIF4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKCBmaXhlZDEsIGVxdl9jcHQsICBrbXBfaW50OCwgICA4LCAgXn4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Vxdl9jcHQKK0FUT01JQ19DTVBYX0VRVl9DUFQoIGZpeGVkMiwgZXF2X2NwdCwgIGttcF9pbnQxNiwgMTYsICBefiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVCggZml4ZWQ0LCBlcXZfY3B0LCAga21wX2ludDMyLCAzMiwgIF5+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKCBmaXhlZDgsIGVxdl9jcHQsICBrbXBfaW50NjQsIDY0LCAgXn4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Vxdl9jcHQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUKE9QIyM9LExDS19JRCkgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NC4gUmVndWxhciByb3V0aW5lcyB3aXRoIHJldHVybiB2YWx1ZSBkb24ndCB3b3JrCisvLyBvbiBXaW5fMzJlLiBMZXQncyByZXR1cm4gY2FwdHVyZWQgdmFsdWVzIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfV1JLKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1dSSyhPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVF9XUksoIE9QIyM9LCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9XUksoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19CRUdJTl9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocywgVFlQRSAqIG91dCwgaW50IGZsYWcgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyhUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU5fV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9XUksoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVF9XUksoT1AjIz0sTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBUaGUgZW5kIG9mIHdvcmthcm91bmQgZm9yIGNtcGx4NAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxMCwgYWRkX2NwdCwgbG9uZyBkb3VibGUsICAgICArLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTAsIHN1Yl9jcHQsIGxvbmcgZG91YmxlLCAgICAgLSwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDEwLCBtdWxfY3B0LCBsb25nIGRvdWJsZSwgICAgICosIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxMCwgZGl2X2NwdCwgbG9uZyBkb3VibGUsICAgICAvLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHQKKyNpZiBLTVBfSEFWRV9RVUFECisvLyByb3V0aW5lcyBmb3IgX1F1YWQgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgYWRkX2NwdCwgUVVBRF9MRUdBQ1ksICAgICArLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIHN1Yl9jcHQsIFFVQURfTEVHQUNZLCAgICAgLSwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtdWxfY3B0LCBRVUFEX0xFR0FDWSwgICAgICosIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgZGl2X2NwdCwgUVVBRF9MRUdBQ1ksICAgICAvLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgYWRkX2ExNl9jcHQsIFF1YWRfYTE2X3QsICssIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBzdWJfYTE2X2NwdCwgUXVhZF9hMTZfdCwgLSwgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIG11bF9hMTZfY3B0LCBRdWFkX2ExNl90LCAqLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgZGl2X2ExNl9jcHQsIFF1YWRfYTE2X3QsIC8sIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHQKKyNlbmRpZgorI2VuZGlmCisKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisKKy8vIGNtcGx4NCByb3V0aW5lcyB0byByZXR1cm4gdm9pZAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIGFkZF9jcHQsIGttcF9jbXBseDMyLCArLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIHN1Yl9jcHQsIGttcF9jbXBseDMyLCAtLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIG11bF9jcHQsIGttcF9jbXBseDMyLCAqLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoIGNtcGx4NCwgIGRpdl9jcHQsIGttcF9jbXBseDMyLCAvLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdAorCitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDgsICBhZGRfY3B0LCBrbXBfY21wbHg2NCwgKywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4OCwgIHN1Yl9jcHQsIGttcF9jbXBseDY0LCAtLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHg4LCAgbXVsX2NwdCwga21wX2NtcGx4NjQsICosIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDgsICBkaXZfY3B0LCBrbXBfY21wbHg2NCwgLywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIGFkZF9jcHQsIGttcF9jbXBseDgwLCArLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIHN1Yl9jcHQsIGttcF9jbXBseDgwLCAtLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIG11bF9jcHQsIGttcF9jbXBseDgwLCAqLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTAsIGRpdl9jcHQsIGttcF9jbXBseDgwLCAvLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBhZGRfY3B0LCBDUExYMTI4X0xFRywgKywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBzdWJfY3B0LCBDUExYMTI4X0xFRywgLSwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBtdWxfY3B0LCBDUExYMTI4X0xFRywgKiwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBkaXZfY3B0LCBDUExYMTI4X0xFRywgLywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIGFkZF9hMTZfY3B0LCBrbXBfY21wbHgxMjhfYTE2X3QsICssIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBzdWJfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgbXVsX2ExNl9jcHQsIGttcF9jbXBseDEyOF9hMTZfdCwgKiwgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIGRpdl9hMTZfY3B0LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHQKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLyBPcGVuTVAgNC4wOiB2ID0geCA9IGV4cHIgYmlub3AgeDsgeyB2ID0geDsgeCA9IGV4cHIgYmlub3AgeDsgfSB7IHggPSBleHByIGJpbm9wIHg7IHYgPSB4OyB9ICBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfUkVWKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qdGVtcF92YWwgPSAoKmxocyk7Ki9cCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTtcCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVYoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX0NQVF9SRVYoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gcmhzIE9QIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFRfUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19DUFRfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxLCAgZGl2X2NwdF9yZXYsIGttcF9pbnQ4LCAgICA4LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDF1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQ4LCAgIDgsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDEsICBzaGxfY3B0X3Jldiwga21wX2ludDgsICAgIDgsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMSwgIHNocl9jcHRfcmV2LCBrbXBfaW50OCwgICAgOCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxdSwgc2hyX2NwdF9yZXYsIGttcF91aW50OCwgICA4LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxLCAgc3ViX2NwdF9yZXYsIGttcF9pbnQ4LCAgICA4LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDIsICBkaXZfY3B0X3Jldiwga21wX2ludDE2LCAgMTYsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMnUsIGRpdl9jcHRfcmV2LCBrbXBfdWludDE2LCAxNiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMiwgIHNobF9jcHRfcmV2LCBrbXBfaW50MTYsICAxNiwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQyLCAgc2hyX2NwdF9yZXYsIGttcF9pbnQxNiwgIDE2LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDJ1LCBzaHJfY3B0X3Jldiwga21wX3VpbnQxNiwgMTYsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDIsICBzdWJfY3B0X3Jldiwga21wX2ludDE2LCAgMTYsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNCwgIGRpdl9jcHRfcmV2LCBrbXBfaW50MzIsICAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0dSwgZGl2X2NwdF9yZXYsIGttcF91aW50MzIsIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0LCAgc2hsX2NwdF9yZXYsIGttcF9pbnQzMiwgIDMyLCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDQsICBzaHJfY3B0X3Jldiwga21wX2ludDMyLCAgMzIsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNHUsIHNocl9jcHRfcmV2LCBrbXBfdWludDMyLCAzMiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNCwgIHN1Yl9jcHRfcmV2LCBrbXBfaW50MzIsICAzMiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4LCAgZGl2X2NwdF9yZXYsIGttcF9pbnQ2NCwgIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDh1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQ2NCwgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDgsICBzaGxfY3B0X3Jldiwga21wX2ludDY0LCAgNjQsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOCwgIHNocl9jcHRfcmV2LCBrbXBfaW50NjQsICA2NCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4dSwgc2hyX2NwdF9yZXYsIGttcF91aW50NjQsIDY0LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4LCAgc3ViX2NwdF9yZXYsIGttcF9pbnQ2NCwgIDY0LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmbG9hdDQsICBkaXZfY3B0X3Jldiwga21wX3JlYWwzMiwgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZsb2F0NCwgIHN1Yl9jcHRfcmV2LCBrbXBfcmVhbDMyLCAzMiwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZmxvYXQ4LCAgZGl2X2NwdF9yZXYsIGttcF9yZWFsNjQsIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmbG9hdDgsICBzdWJfY3B0X3Jldiwga21wX3JlYWw2NCwgNjQsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgIEdPTVBfRkxBRworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qcHJpbnRmKCJfX2ttcF9hdG9taWNfbW9kZSA9ICVkXG4iLCBfX2ttcF9hdG9taWNfbW9kZSk7Ki9cCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUX1JFVihPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDEwLCBzdWJfY3B0X3JldiwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxMCwgZGl2X2NwdF9yZXYsIGxvbmcgZG91YmxlLCAgICAgLywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldgorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxNiwgc3ViX2NwdF9yZXYsIFFVQURfTEVHQUNZLCAgICAgLSwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTYsIGRpdl9jcHRfcmV2LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTYsIHN1Yl9hMTZfY3B0X3JldiwgUXVhZF9hMTZfdCwgLSwgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdF9yZXYKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxNiwgZGl2X2ExNl9jcHRfcmV2LCBRdWFkX2ExNl90LCAvLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0X3JldgorI2VuZGlmCisjZW5kaWYKKworLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NC4gUmVndWxhciByb3V0aW5lcyB3aXRoIHJldHVybiB2YWx1ZSBkb24ndCB3b3JrCisvLyBvbiBXaW5fMzJlLiBMZXQncyByZXR1cm4gY2FwdHVyZWQgdmFsdWVzIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVl9XUksoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gVGhlIGVuZCBvZiB3b3JrYXJvdW5kIGZvciBjbXBseDQKKworCisvLyAhISEgVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byByZXR1cm4gdm9pZCBmb3IgY21wbHg0IHJvdXRpbmVzCisvLyBjbXBseDQgcm91dGluZXMgdG8gcmV0dXJuIHZvaWQKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWX1dSSyggY21wbHg0LCAgc3ViX2NwdF9yZXYsIGttcF9jbXBseDMyLCAtLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWX1dSSyggY21wbHg0LCAgZGl2X2NwdF9yZXYsIGttcF9jbXBseDMyLCAvLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYKKworQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4OCwgIHN1Yl9jcHRfcmV2LCBrbXBfY21wbHg2NCwgLSwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHg4LCAgZGl2X2NwdF9yZXYsIGttcF9jbXBseDY0LCAvLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDEwLCBzdWJfY3B0X3Jldiwga21wX2NtcGx4ODAsIC0sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDEwLCBkaXZfY3B0X3Jldiwga21wX2NtcGx4ODAsIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgc3ViX2NwdF9yZXYsIENQTFgxMjhfTEVHLCAtLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgZGl2X2NwdF9yZXYsIENQTFgxMjhfTEVHLCAvLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDE2LCBzdWJfYTE2X2NwdF9yZXYsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdF9yZXYKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgZGl2X2ExNl9jcHRfcmV2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHRfcmV2CisjZW5kaWYKKyNlbmRpZgorCisvLyBDYXB0dXJlIHJldmVyc2UgZm9yIG1peGVkIHR5cGU6IFJIUz1mbG9hdDE2CisjaWYgS01QX0hBVkVfUVVBRAorCisvLyBCZWdpbm5pbmcgb2YgYSBkZWZpbml0aW9uIChwcm92aWRlcyBuYW1lLCBwYXJhbWV0ZXJzLCBnZWJ1ZyB0cmFjZSkKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQqLCBmaXhlZCp1IGZvciBzaWduZWQsIHVuc2lnbmVkIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFRfTUlYKFRZUEVfSUQsT1BfSUQsVFlQRSxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX0NQVF9SRVYoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVF9NSVgoVFlQRV9JRCxPUF9JRCxUWVBFLFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUX1JFVihPUCxMQ0tfSUQpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIHN1Yl9jcHRfcmV2LCAgOCwgLSwgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKCBmaXhlZDF1LCB1Y2hhciwgICAgICBzdWJfY3B0X3JldiwgIDgsIC0sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zdWJfY3B0X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIGRpdl9jcHRfcmV2LCAgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKCBmaXhlZDF1LCB1Y2hhciwgICAgICBkaXZfY3B0X3JldiwgIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3Jldl9mcAorCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgc3ViX2NwdF9yZXYsIDE2LCAtLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoIGZpeGVkMnUsIHVzaG9ydCwgICAgIHN1Yl9jcHRfcmV2LCAxNiwgLSwgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3N1Yl9jcHRfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgZGl2X2NwdF9yZXYsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoIGZpeGVkMnUsIHVzaG9ydCwgICAgIGRpdl9jcHRfcmV2LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBzdWJfY3B0X3JldiwgMzIsIC0sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWCggZml4ZWQ0dSwga21wX3VpbnQzMiwgc3ViX2NwdF9yZXYsIDMyLCAtLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc3ViX2NwdF9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBkaXZfY3B0X3JldiwgMzIsIC8sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWCggZml4ZWQ0dSwga21wX3VpbnQzMiwgZGl2X2NwdF9yZXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXZfZnAKKworQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIHN1Yl9jcHRfcmV2LCA2NCwgLSwgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKCBmaXhlZDh1LCBrbXBfdWludDY0LCBzdWJfY3B0X3JldiwgNjQsIC0sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfY3B0X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIGRpdl9jcHRfcmV2LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKCBmaXhlZDh1LCBrbXBfdWludDY0LCBkaXZfY3B0X3JldiwgNjQsIC8sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3Jldl9mcAorCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgc3ViX2NwdF9yZXYsIDMyLCAtLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIGRpdl9jcHRfcmV2LCAzMiwgLywgZnAsIF9RdWFkLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXZfZnAKKworQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIHN1Yl9jcHRfcmV2LCA2NCwgLSwgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBkaXZfY3B0X3JldiwgNjQsIC8sIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2X2ZwCisKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWX01JWCggZmxvYXQxMCwgbG9uZyBkb3VibGUsIHN1Yl9jcHRfcmV2LCAtLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXZfZnAKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWX01JWCggZmxvYXQxMCwgbG9uZyBkb3VibGUsIGRpdl9jcHRfcmV2LCAvLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9yZXZfZnAKKworI2VuZGlmIC8vS01QX0hBVkVfUVVBRAorCisKKy8vICAgT3Blbk1QIDQuMCBDYXB0dXJlLXdyaXRlIChzd2FwKToge3YgPSB4OyB4ID0gZXhwcjt9CisKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI19zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl9zd3A6IFQjJWRcbiIsIGd0aWQgKSk7CisKKyNkZWZpbmUgQ1JJVElDQUxfU1dQKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybiBvbGRfdmFsdWU7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUChGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDUklUSUNBTF9TV1AoIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1AoRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworCisjZGVmaW5lIEFUT01JQ19YQ0hHX1NXUChUWVBFX0lELFRZUEUsQklUUyxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSBLTVBfWENIR19GSVhFRCMjQklUUyggbGhzLCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX1hDSEdfRkxPQVRfU1dQKFRZUEVfSUQsVFlQRSxCSVRTLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUChHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9IEtNUF9YQ0hHX1JFQUwjI0JJVFMoIGxocywgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIENNUFhDSEdfU1dQKFRZUEUsQklUUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1NXUChUWVBFX0lELFRZUEUsQklUUyxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDTVBYQ0hHX1NXUChUWVBFLEJJVFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitBVE9NSUNfWENIR19TV1AoIGZpeGVkMSwga21wX2ludDgsICAgIDgsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zd3AKK0FUT01JQ19YQ0hHX1NXUCggZml4ZWQyLCBrbXBfaW50MTYsICAxNiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N3cAorQVRPTUlDX1hDSEdfU1dQKCBmaXhlZDQsIGttcF9pbnQzMiwgIDMyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3dwCisKK0FUT01JQ19YQ0hHX0ZMT0FUX1NXUCggZmxvYXQ0LCBrbXBfcmVhbDMyLCAzMiwgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AKKworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ01QWENIR19TV1AoIGZpeGVkOCwga21wX2ludDY0LCA2NCwgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zd3AKKyAgICBBVE9NSUNfQ01QWENIR19TV1AoIGZsb2F0OCwga21wX3JlYWw2NCwgNjQsIEtNUF9BUkNIX1g4NiApICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AKKyNlbHNlCisgICAgQVRPTUlDX1hDSEdfU1dQKCAgICAgICBmaXhlZDgsIGttcF9pbnQ2NCwgNjQsIEtNUF9BUkNIX1g4NiApICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3dwCisgICAgQVRPTUlDX1hDSEdfRkxPQVRfU1dQKCBmbG9hdDgsIGttcF9yZWFsNjQsIDY0LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3dwCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9TV1AoVFlQRV9JRCxUWVBFLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1JJVElDQUxfU1dQKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAhISEgVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byByZXR1cm4gdm9pZCBmb3IgY21wbHg0IHJvdXRpbmVzCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQuIFJlZ3VsYXIgcm91dGluZXMgd2l0aCByZXR1cm4gdmFsdWUgZG9uJ3Qgd29yaworLy8gb24gV2luXzMyZS4gTGV0J3MgcmV0dXJuIGNhcHR1cmVkIHZhbHVlcyB0aHJvdWdoIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKworI2RlZmluZSBBVE9NSUNfQkVHSU5fU1dQX1dSSyhUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjX3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMsIFRZUEUgKiBvdXQgKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiX3N3cDogVCMlZFxuIiwgZ3RpZCApKTsKKworCisjZGVmaW5lIENSSVRJQ0FMX1NXUF9XUksoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgPSAocmhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqb3V0KSA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm47CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfQ1JJVElDQUxfU1dQX1dSSyhGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENSSVRJQ0FMX1NXUF9XUksoIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUF9XUksoRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9TV1BfV1JLKFRZUEVfSUQsIFRZUEUsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1BfV1JLKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9DUklUSUNBTF9TV1BfV1JLKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDUklUSUNBTF9TV1BfV1JLKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gVGhlIGVuZCBvZiB3b3JrYXJvdW5kIGZvciBjbXBseDQKKworCitBVE9NSUNfQ1JJVElDQUxfU1dQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgMTByLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N3cAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9TV1AoIGZsb2F0MTYsIFFVQURfTEVHQUNZLCAxNnIsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3dwCisjZW5kaWYKKy8vIGNtcGx4NCByb3V0aW5lIHRvIHJldHVybiB2b2lkCitBVE9NSUNfQ1JJVElDQUxfU1dQX1dSSyggY21wbHg0LCBrbXBfY21wbHgzMiwgIDhjLCAgIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3dwCisKKy8vQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHg0LCBrbXBfY21wbHgzMiwgIDhjLCAgIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3dwCisKKworQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHg4LCAga21wX2NtcGx4NjQsIDE2YywgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N3cAorQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHgxMCwga21wX2NtcGx4ODAsIDIwYywgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zd3AKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDE2LCBDUExYMTI4X0xFRywgMzJjLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N3cAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfU1dQKCBmbG9hdDE2X2ExNiwgUXVhZF9hMTZfdCwgICAgICAgICAxNnIsIDEgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AKKyAgICBBVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDE2X2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAzMmMsIDEgKSAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9zd3AKKyNlbmRpZgorI2VuZGlmCisKKworLy8gRW5kIG9mIE9wZW5NUCA0LjAgQ2FwdHVyZQorCisjZW5kaWYgLy9PTVBfNDBfRU5BQkxFRAorCisjZW5kaWYgLy9LTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKworI3VuZGVmIE9QX0NSSVRJQ0FMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogR2VuZXJpYyBhdG9taWMgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBjX2F0b21pY18xKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAoCisjaWYgS01QX0FSQ0hfWDg2ICYmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCB1c2UgbG9jayAqLworI2Vsc2UKKyAgICAgICAgVFJVRQorI2VuZGlmCisJKQorICAgIHsKKwlrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworCW9sZF92YWx1ZSA9ICooa21wX2ludDggKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCisJLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworCXdoaWxlICggISAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTggKCAoa21wX2ludDggKikgbGhzLAorCQkgICAgCQkqKGttcF9pbnQ4ICopICZvbGRfdmFsdWUsICooa21wX2ludDggKikgJm5ld192YWx1ZSApICkKKwl7CisJICAgIEtNUF9DUFVfUEFVU0UoKTsKKworCSAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQ4ICopIGxoczsKKwkgICAgKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJfQorCisJcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWxsIDEtYnl0ZSBkYXRhIGlzIG9mIGludGVnZXIgZGF0YSB0eXBlLgorICAgICAgICAvLworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xaSwgZ3RpZCApOworCisJKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisJX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xaSwgZ3RpZCApOworICAgIH0KK30KKwordm9pZAorX19rbXBjX2F0b21pY18yKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIGlmICgKKyNpZiBLTVBfQVJDSF9YODYgJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IHVzZSBsb2NrICovCisjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisJVFJVRQkJCQkJLyogbm8gYWxpZ25tZW50IHByb2JsZW1zICovCisjZWxzZQorCSEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgxKQkJLyogbWFrZSBzdXJlIGFkZHJlc3MgaXMgMi1ieXRlIGFsaWduZWQgKi8KKyNlbmRpZgorCSkKKyAgICB7CisJa21wX2ludDE2IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisJb2xkX3ZhbHVlID0gKihrbXBfaW50MTYgKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCisJLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworCXdoaWxlICggISAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTE2ICggKGttcF9pbnQxNiAqKSBsaHMsCisJCSAgICAJCSooa21wX2ludDE2ICopICZvbGRfdmFsdWUsICooa21wX2ludDE2ICopICZuZXdfdmFsdWUgKSApCisJeworCSAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKwkgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50MTYgKikgbGhzOworCSAgICAoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwl9CisKKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBBbGwgMi1ieXRlIGRhdGEgaXMgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzJpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzJpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICgKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IE9uIElBLTMyIGFyY2hpdGVjdHVyZSwgZ2NjIHVzZXMgY21weGNoZyBvbmx5IGZvciA0LWJ5dGUgaW50cy4KKyAgICAgICAgLy8gR29tcCBjb21wYXRpYmlsaXR5IGlzIGJyb2tlbiBpZiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBmbG9hdHMuCisgICAgICAgIC8vCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCVRSVUUJCQkJCS8qIG5vIGFsaWdubWVudCBwcm9ibGVtcyAqLworI2Vsc2UKKwkhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4MykJCS8qIG1ha2Ugc3VyZSBhZGRyZXNzIGlzIDQtYnl0ZSBhbGlnbmVkICovCisjZW5kaWYKKwkpCisgICAgeworCWttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworCW9sZF92YWx1ZSA9ICooa21wX2ludDMyICopIGxoczsKKwkoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKworCS8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKwl3aGlsZSAoICEgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiAoIChrbXBfaW50MzIgKikgbGhzLAorCQkgICAgCQkqKGttcF9pbnQzMiAqKSAmb2xkX3ZhbHVlLCAqKGttcF9pbnQzMiAqKSAmbmV3X3ZhbHVlICkgKQorCXsKKwkgICAgS01QX0NQVV9QQVVTRSgpOworCisJICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDMyICopIGxoczsKKwkgICAgKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJfQorCisJcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIF9fa21wX2F0b21pY19sb2NrXzRpIGZvciBhbGwgNC1ieXRlIGRhdGEsCisgICAgICAgIC8vIGV2ZW4gaWYgaXQgaXNuJ3Qgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzRpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzRpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBpZiAoCisKKyNpZiBLTVBfQVJDSF9YODYgJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IHVzZSBsb2NrICovCisjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisJVFJVRQkJCQkJLyogbm8gYWxpZ25tZW50IHByb2JsZW1zICovCisjZWxzZQorCSEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHg3KQkJLyogbWFrZSBzdXJlIGFkZHJlc3MgaXMgOC1ieXRlIGFsaWduZWQgKi8KKyNlbmRpZgorCSkKKyAgICB7CisJa21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisJb2xkX3ZhbHVlID0gKihrbXBfaW50NjQgKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCS8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKwl3aGlsZSAoICEgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCAoIChrbXBfaW50NjQgKikgbGhzLAorCQkJCQkgICAgICAgKihrbXBfaW50NjQgKikgJm9sZF92YWx1ZSwKKwkJCQkJICAgICAgICooa21wX2ludDY0ICopICZuZXdfdmFsdWUgKSApCisJeworCSAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKwkgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50NjQgKikgbGhzOworCSAgICAoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwl9CisKKwlyZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIF9fa21wX2F0b21pY19sb2NrXzhpIGZvciBhbGwgOC1ieXRlIGRhdGEsCisgICAgICAgIC8vIGV2ZW4gaWYgaXQgaXNuJ3Qgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzEwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTByLCBndGlkICk7CisKKyAgICAoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTByLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMTYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNmMsIGd0aWQgKTsKKworICAgICgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNmMsIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBjX2F0b21pY18yMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzIwYywgZ3RpZCApOworCisgICAgKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzIwYywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzMyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMzJjLCBndGlkICk7CisKKyAgICAoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMzJjLCBndGlkICk7Cit9CisKKy8vIEFDOiBzYW1lIHR3byByb3V0aW5lcyBhcyBHT01QX2F0b21pY19zdGFydC9lbmQsIGJ1dCB3aWxsIGJlIGNhbGxlZCBieSBvdXIgY29tcGlsZXIKKy8vICAgICBkdXBsaWNhdGVkIGluIG9yZGVyIHRvIG5vdCB1c2UgMy1wYXJ0eSBuYW1lcyBpbiBwdXJlIEludGVsIGNvZGUKKy8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBHVElEIHBhcmFtZXRlciBhZnRlciBjb25zdWx0YXRpb24gd2l0aCBFcm5lc3RvL1hpbm1pbi4KK3ZvaWQKK19fa21wY19hdG9taWNfc3RhcnQodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfYXRvbWljX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisKK3ZvaWQKK19fa21wY19hdG9taWNfZW5kKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19hdG9taWNfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyohCitAfQorKi8KKworLy8gZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmggYi9yYzMvcnVudGltZS9zcmMva21wX2F0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOThkZTYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2F0b21pYy5oCkBAIC0wLDAgKzEsMTE1NyBAQAorLyoKKyAqIGttcF9hdG9taWMuaCAtIEFUT01JQyBoZWFkZXIgZmlsZQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9BVE9NSUNfSAorI2RlZmluZSBLTVBfQVRPTUlDX0gKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworLy8gQysrIGJ1aWxkIHBvcnQuCisvLyBJbnRlbCBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IF9Db21wbGV4IGRhdGF0eXBlIG9uIHdpbi4KKy8vIEludGVsIGNvbXBpbGVyIHN1cHBvcnRzIF9Db21wbGV4IGRhdGF0eXBlIG9uIGxpbiBhbmQgbWFjLgorLy8gT24gdGhlIG90aGVyIHNpZGUsIHRoZXJlIGlzIGEgcHJvYmxlbSBvZiBzdGFjayBhbGlnbm1lbnQgb24gbGluXzMyIGFuZCBtYWNfMzIKKy8vIGlmIHRoZSByaHMgaXMgY21wbHg4MCBvciBjbXBseDEyOCB0eXBlZGVmJ2VkIGRhdGF0eXBlLgorLy8gVGhlIGRlY2lzaW9uIGlzOiB0byB1c2UgY29tcGlsZXIgc3VwcG9ydGVkIF9Db21wbGV4IHR5cGUgb24gbGluIGFuZCBtYWMsCisvLyAgICAgICAgICAgICAgICAgIHRvIHVzZSB0eXBlZGVmJ2VkIHR5cGVzIG9uIHdpbi4KKy8vIENvbmRpdGlvbiBmb3IgV0lONjQgd2FzIG1vZGlmaWVkIGluIGFudGljaXBhdGlvbiBvZiAxMC4xIGJ1aWxkIGNvbXBpbGVyLgorCisjaWYgZGVmaW5lZCggX19jcGx1c3BsdXMgKSAmJiAoIEtNUF9PU19XSU5ET1dTICkKKyAgICAvLyBjcmVhdGUgc2hvcnRjdXRzIGZvciBjOTkgY29tcGxleCB0eXBlcworCisgICAgLy8gVmlzdWFsIFN0dWRpbyBjYW5ub3QgaGF2ZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSB0aGUKKyAgICAvLyBhbGlnbiBfX2RlY2xzcGVjIGF0dHJpYnV0ZSwgc28gd2UgbXVzdCByZW1vdmUgaXQuIChDb21waWxlciBFcnJvciBDMjcxOSkKKyAgICAjaWYgS01QX0NPTVBJTEVSX01TVkMKKyAgICAjIHVuZGVmIEtNUF9ET19BTElHTgorICAgICMgZGVmaW5lIEtNUF9ET19BTElHTihhbGlnbm1lbnQpIC8qIE5vdGhpbmcgKi8KKyAgICAjZW5kaWYKKworICAgICNpZiAoX01TQ19WRVIgPCAxNjAwKSAmJiBkZWZpbmVkKF9ERUJVRykKKyAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgdGhlIHByb2JsZW0gb2YgX0RlYnVnSGVhcFRhZyB1bnJlc29sdmVkIGV4dGVybmFsLgorICAgICAgICAvLyBUaGlzIHByb2JsZW0gcHJldmVudGVkIHRvIHVzZSBvdXIgc3RhdGljIGRlYnVnIGxpYnJhcnkgZm9yIEMgdGVzdHMKKyAgICAgICAgLy8gY29tcGlsZWQgd2l0aCAvTURkIG9wdGlvbiAodGhlIGxpYnJhcnkgaXRzZWxmIGJ1aWx0IHdpdGggL01UZCksCisgICAgICAgICN1bmRlZiBfREVCVUcKKyAgICAgICAgI2RlZmluZSBfREVCVUdfVEVNUE9SQVJJTFlfVU5TRVRfCisgICAgI2VuZGlmCisKKyAgICAjaW5jbHVkZSA8Y29tcGxleD4KKworICAgIHRlbXBsYXRlPCB0eXBlbmFtZSB0eXBlX2xocywgdHlwZW5hbWUgdHlwZV9yaHMgPgorICAgIHN0ZDo6Y29tcGxleDwgdHlwZV9saHMgPiBfX2ttcF9saHNfZGl2X3JocygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8IHR5cGVfbGhzID4mIGxocywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8IHR5cGVfcmhzID4mIHJocyApIHsKKyAgICB0eXBlX2xocyBhID0gbGhzLnJlYWwoKTsKKyAgICB0eXBlX2xocyBiID0gbGhzLmltYWcoKTsKKyAgICB0eXBlX3JocyBjID0gcmhzLnJlYWwoKTsKKyAgICB0eXBlX3JocyBkID0gcmhzLmltYWcoKTsKKyAgICB0eXBlX3JocyBkZW4gPSBjKmMgKyBkKmQ7CisgICAgdHlwZV9yaHMgciA9ICggYSpjICsgYipkICk7CisgICAgdHlwZV9yaHMgaSA9ICggYipjIC0gYSpkICk7CisgICAgc3RkOjpjb21wbGV4PCB0eXBlX2xocyA+IHJldCggci9kZW4sIGkvZGVuICk7CisgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBjb21wbGV4OAorICAgIHN0cnVjdCBfX2ttcF9jbXBseDY0X3QgOiBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IHsKKworICAgIF9fa21wX2NtcGx4NjRfdCgpIDogc3RkOjpjb21wbGV4PCBkb3VibGUgPiAoKSB7fQorCisgICAgX19rbXBfY21wbHg2NF90KCBjb25zdCBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+JiBjZCApCisgICAgICAgICAgICAgICAgOiBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+ICggY2QgKSB7fQorCisgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4NjRfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIF9fa21wX2NtcGx4NjRfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHg2NF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICB9OworICAgIHR5cGVkZWYgc3RydWN0IF9fa21wX2NtcGx4NjRfdCBrbXBfY21wbHg2NDsKKworICAgIC8vIGNvbXBsZXg0CisgICAgc3RydWN0IF9fa21wX2NtcGx4MzJfdCA6IHN0ZDo6Y29tcGxleDwgZmxvYXQgPiB7CisKKyAgICBfX2ttcF9jbXBseDMyX3QoKSA6IHN0ZDo6Y29tcGxleDwgZmxvYXQgPiAoKSB7fQorCisgICAgX19rbXBfY21wbHgzMl90KCBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBjZiApCisgICAgICAgICAgICAgICAgOiBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gKCBjZiApIHt9CisKKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgKyAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgYiApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gcmhzID0gYjsKKyAgICAgICAgcmV0dXJuICggbGhzICsgcmhzICk7CisgICAgfQorICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAtICggY29uc3QgX19rbXBfY21wbHgzMl90JiBiICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiByaHMgPSBiOworICAgICAgICByZXR1cm4gKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yICogKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIGIgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IHJocyA9IGI7CisgICAgICAgIHJldHVybiAoIGxocyAqIHJocyApOworICAgIH0KKworICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciArICggY29uc3Qga21wX2NtcGx4NjQmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDY0IHQgPSBrbXBfY21wbHg2NCggKnRoaXMgKSArIGI7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gZCggdCApOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gZiggZCApOworICAgICAgICBfX2ttcF9jbXBseDMyX3QgciggZiApOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yIC0gKCBjb25zdCBrbXBfY21wbHg2NCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4NjQgdCA9IGttcF9jbXBseDY0KCAqdGhpcyApIC0gYjsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBkKCB0ICk7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBmKCBkICk7CisgICAgICAgIF9fa21wX2NtcGx4MzJfdCByKCBmICk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDY0JiBiICkgeworICAgICAgICBrbXBfY21wbHg2NCB0ID0ga21wX2NtcGx4NjQoICp0aGlzICkgKiBiOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGQoIHQgKTsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGYoIGQgKTsKKyAgICAgICAgX19rbXBfY21wbHgzMl90IHIoIGYgKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yIC8gKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICByZXR1cm4gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvciAvPSAoIGNvbnN0IGttcF9jbXBseDY0JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDY0JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKyAgICB9OworICAgIHR5cGVkZWYgc3RydWN0IF9fa21wX2NtcGx4MzJfdCBrbXBfY21wbHgzMjsKKworICAgIC8vIGNvbXBsZXgxMAorICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDE2ICkgIF9fa21wX2NtcGx4ODBfdCA6IHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiB7CisKKyAgICAgICAgICAgIF9fa21wX2NtcGx4ODBfdCgpIDogc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+ICgpIHt9CisKKyAgICAgICAgICAgIF9fa21wX2NtcGx4ODBfdCggY29uc3Qgc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+JiBjbGQgKQorICAgICAgICAgICAgICAgIDogc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+ICggY2xkICkge30KKworICAgICAgICB2b2lkIG9wZXJhdG9yIC89ICggY29uc3QgX19rbXBfY21wbHg4MF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2NtcGx4ODBfdCBvcGVyYXRvciAvICggY29uc3QgX19rbXBfY21wbHg4MF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgbG9uZyBkb3VibGUgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICB9OworICAgIHR5cGVkZWYgS01QX0RPX0FMSUdOKCAxNiApICBzdHJ1Y3QgX19rbXBfY21wbHg4MF90IGttcF9jbXBseDgwOworCisgICAgLy8gY29tcGxleDE2CisgICAgI2lmIEtNUF9IQVZFX1FVQUQKKyAgICBzdHJ1Y3QgX19rbXBfY21wbHgxMjhfdCA6IHN0ZDo6Y29tcGxleDwgX1F1YWQgPiB7CisKKyAgICAgICAgICAgIF9fa21wX2NtcGx4MTI4X3QoKSA6IHN0ZDo6Y29tcGxleDwgX1F1YWQgPiAoKSB7fQorCisgICAgICAgICAgICBfX2ttcF9jbXBseDEyOF90KCBjb25zdCBzdGQ6OmNvbXBsZXg8IF9RdWFkID4mIGNxICkKKyAgICAgICAgICAgICAgICA6IHN0ZDo6Y29tcGxleDwgX1F1YWQgPiAoIGNxICkge30KKworICAgICAgICB2b2lkIG9wZXJhdG9yIC89ICggY29uc3QgX19rbXBfY21wbHgxMjhfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IF9RdWFkID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9jbXBseDEyOF90IG9wZXJhdG9yIC8gKCBjb25zdCBfX2ttcF9jbXBseDEyOF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgX1F1YWQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICB9OworICAgIHR5cGVkZWYgc3RydWN0IF9fa21wX2NtcGx4MTI4X3Qga21wX2NtcGx4MTI4OworICAgICNlbmRpZiAvKiBLTVBfSEFWRV9RVUFEICovCisKKyAgICAjaWZkZWYgX0RFQlVHX1RFTVBPUkFSSUxZX1VOU0VUXworICAgICAgICAjdW5kZWYgX0RFQlVHX1RFTVBPUkFSSUxZX1VOU0VUXworICAgICAgICAvLyBTZXQgaXQgYmFjayBub3cKKyAgICAgICAgI2RlZmluZSBfREVCVUcgMQorICAgICNlbmRpZgorCisjZWxzZQorICAgIC8vIGNyZWF0ZSBzaG9ydGN1dHMgZm9yIGM5OSBjb21wbGV4IHR5cGVzCisgICAgdHlwZWRlZiBmbG9hdCBfQ29tcGxleCAgICAgICBrbXBfY21wbHgzMjsKKyAgICB0eXBlZGVmIGRvdWJsZSBfQ29tcGxleCAgICAgIGttcF9jbXBseDY0OworICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX0NvbXBsZXgga21wX2NtcGx4ODA7CisgICAgI2lmIEtNUF9IQVZFX1FVQUQKKyAgICB0eXBlZGVmIF9RdWFkIF9Db21wbGV4ICAgICAgIGttcF9jbXBseDEyODsKKyAgICAjZW5kaWYKKyNlbmRpZgorCisvLyBDb21waWxlciAxMi4wIGNoYW5nZWQgYWxpZ25tZW50IG9mIDE2IGFuZCAzMi1ieXRlIGFyZ3VtZW50cyAobGlrZSBfUXVhZAorLy8gYW5kIGttcF9jbXBseDEyOCkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiBUaGUgZm9sbG93aW5nIGFsaWduZWQgc3RydWN0dXJlcworLy8gYXJlIGltcGxlbWVudGVkIHRvIHN1cHBvcnQgdGhlIG9sZCBhbGlnbm1lbnQgaW4gMTAuMSwgMTEuMCwgMTEuMSBhbmQKKy8vIGludHJvZHVjZSB0aGUgbmV3IGFsaWdubWVudCBpbiAxMi4wLiBTZWUgQ1E4ODQwNS4KKyNpZiBLTVBfQVJDSF9YODYgJiYgS01QX0hBVkVfUVVBRAorCisgICAgLy8gNC1ieXRlIGFsaWduZWQgc3RydWN0dXJlcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworICAgICNwcmFnbWEgcGFjayggcHVzaCwgNCApCisKKworICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDQgKSBRdWFkX2E0X3QgeworICAgICAgICBfUXVhZCBxOworCisgICAgICAgIFF1YWRfYTRfdCggICkgOiBxKCAgKSB7fQorICAgICAgICBRdWFkX2E0X3QoIGNvbnN0IF9RdWFkICYgY3EgKSA6IHEgKCBjcSApIHt9CisKKyAgICAgICAgUXVhZF9hNF90IG9wZXJhdG9yICsgKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyArIHJocyApOworICAgIH0KKworICAgIFF1YWRfYTRfdCBvcGVyYXRvciAtICggY29uc3QgUXVhZF9hNF90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2E0X3QpKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAgUXVhZF9hNF90IG9wZXJhdG9yICogKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyAqIHJocyApOworICAgIH0KKworICAgIFF1YWRfYTRfdCBvcGVyYXRvciAvICggY29uc3QgUXVhZF9hNF90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hNF90KSggbGhzIC8gcmhzICk7CisgICAgfQorCisgICAgfTsKKworICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDQgKSBrbXBfY21wbHgxMjhfYTRfdCB7CisgICAgICAgIGttcF9jbXBseDEyOCBxOworCisgICAga21wX2NtcGx4MTI4X2E0X3QoKSA6IHEgKCkge30KKworICAgIGttcF9jbXBseDEyOF9hNF90KCBjb25zdCBrbXBfY21wbHgxMjggJiBjMTI4ICkgOiBxICggYzEyOCApIHt9CisKKyAgICAgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzICsgcmhzICk7CisgICAgfQorICAgICAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgLSByaHMgKTsKKyAgICB9CisgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDEyOF9hNF90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hNF90KSggbGhzIC8gcmhzICk7CisgICAgfQorCisgICAgfTsKKworICAgICNwcmFnbWEgcGFjayggcG9wICkKKworICAgIC8vIE5ldyAxNi1ieXRlIGFsaWduZWQgc3RydWN0dXJlcyBmb3IgMTIuMCBjb21waWxlci4KKyAgICBzdHJ1Y3QgS01QX0RPX0FMSUdOKCAxNiApIFF1YWRfYTE2X3QgeworICAgICAgICBfUXVhZCBxOworCisgICAgICAgIFF1YWRfYTE2X3QoICApIDogcSggICkge30KKyAgICAgICAgUXVhZF9hMTZfdCggY29uc3QgX1F1YWQgJiBjcSApIDogcSAoIGNxICkge30KKworICAgICAgICBRdWFkX2ExNl90IG9wZXJhdG9yICsgKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzICsgcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hMTZfdCBvcGVyYXRvciAtICggY29uc3QgUXVhZF9hMTZfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hMTZfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBRdWFkX2ExNl90IG9wZXJhdG9yICogKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hMTZfdCBvcGVyYXRvciAvICggY29uc3QgUXVhZF9hMTZfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTE2X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisgICAgfTsKKworICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDE2ICkga21wX2NtcGx4MTI4X2ExNl90IHsKKyAgICAgICAga21wX2NtcGx4MTI4IHE7CisKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QoKSA6IHEgKCkge30KKworICAgIGttcF9jbXBseDEyOF9hMTZfdCggY29uc3Qga21wX2NtcGx4MTI4ICYgYzEyOCApIDogcSAoIGMxMjggKSB7fQorCisgICAgICAga21wX2NtcGx4MTI4X2ExNl90IG9wZXJhdG9yICsgKCBjb25zdCBrbXBfY21wbHgxMjhfYTE2X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2ExNl90KSggbGhzICsgcmhzICk7CisgICAgfQorICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvciAtICggY29uc3Qga21wX2NtcGx4MTI4X2ExNl90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisgICAgfTsKKworI2VuZGlmCisKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgI2RlZmluZSBRVUFEX0xFR0FDWSBRdWFkX2E0X3QKKyAgICAjZGVmaW5lIENQTFgxMjhfTEVHIGttcF9jbXBseDEyOF9hNF90CisjZWxzZQorICAgICNkZWZpbmUgUVVBRF9MRUdBQ1kgX1F1YWQKKyAgICAjZGVmaW5lIENQTFgxMjhfTEVHIGttcF9jbXBseDEyOAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBpbnQgX19rbXBfYXRvbWljX21vZGU7CisKKy8vCisvLyBBdG9taWMgbG9ja3MgY2FuIGVhc2lseSBiZWNvbWUgY29udGVuZGVkLCBzbyB3ZSB1c2UgcXVldWluZyBsb2NrcyBmb3IgdGhlbS4KKy8vCisKK3R5cGVkZWYga21wX3F1ZXVpbmdfbG9ja190IGttcF9hdG9taWNfbG9ja190OworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfYXRvbWljKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMpKAorICAgICAgICAgICAgKG9tcHRfd2FpdF9pZF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9hdG9taWMpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9hdG9taWMpKAorICAgICAgICAgICAgKG9tcHRfd2FpdF9pZF90KSBsY2spOworICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9hdG9taWNfbG9jaygga21wX2F0b21pY19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHJldHVybiBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygga21wX2F0b21pY19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfYXRvbWljKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMpKAorICAgICAgICAgICAgKG9tcHRfd2FpdF9pZF90KSBsY2spOworICB9CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9pbml0X2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV9hdG9taWNfbG9jaygga21wX2F0b21pY19sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soIGxjayApOworfQorCisvLyBHbG9iYWwgTG9ja3MKKworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrOyAgICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGluIEdudSBjb21wYXQgbW9kZSAgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMWk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAxLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzJpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgMi1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja180aTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDQtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfNHI7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDMyIGRhdGEgdHlwZSAgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgOC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184cjsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGttcF9yZWFsNjQgZGF0YSB0eXBlICAgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGM7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBjb21wbGV4IGJ5dGUgZGF0YSB0eXBlICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzEwcjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgbG9uZyBkb3VibGUgZGF0YSB0eXBlICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xNnI7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIF9RdWFkIGRhdGEgdHlwZSAgICAgICAgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTZjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBkb3VibGUgY29tcGxleCBkYXRhIHR5cGUqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzIwYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgbG9uZyBkb3VibGUgY29tcGxleCB0eXBlKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18zMmM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIF9RdWFkIGNvbXBsZXggZGF0YSB0eXBlICovCisKKy8vCisvLyAgQmVsb3cgcm91dGluZXMgZm9yIGF0b21pYyBVUERBVEUgYXJlIGxpc3RlZAorLy8KKworLy8gMS1ieXRlCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX29yYiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3NociggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3hvciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7CisvLyAyLWJ5dGUKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX29yYiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc2hsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7CisvLyA0LWJ5dGUgYWRkIC8gc3ViIGZpeGVkCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZmxvYXQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKKy8vIDgtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworLy8gNC1ieXRlIGZpeGVkCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDR1X2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc2hyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOworLy8gOC1ieXRlIGZpeGVkCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc2hyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gNC1ieXRlIGZsb2F0Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzICk7CisvLyA4LWJ5dGUgZmxvYXQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKKy8vIDEtLCAyLSwgNC0sIDgtYnl0ZSBsb2dpY2FsICgmJiwgfHwpCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX29ybCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfb3JsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfb3JsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKKy8vIE1JTiAvIE1BWAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX21pbiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4oIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnk7IElBLTMyIGFyY2hpdGVjdHVyZSBvbmx5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorLy8gLk5FUVYuIChzYW1lIGFzIHhvcikKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbmVxdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyAuRVFWLiAoc2FtZSBhcyB+eG9yKQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKKy8vIGxvbmcgZG91YmxlIHR5cGUKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocyApOworLy8gX1F1YWQgdHlwZQorI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworI2VuZGlmCisjZW5kaWYKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX211bCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X211bCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworI2VuZGlmCisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHggPSBleHByIGJpbm9wIHggZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorLy8gU3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAqIGxocywgZmxvYXQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAqIGxocywgZmxvYXQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKiBsaHMsIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqIGxocywgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocyApOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNlbmRpZgordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmIC8vIEtNUF9IQVZFX1FVQUQKKworI2VuZGlmIC8vS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisjZW5kaWYgLy9PTVBfNDBfRU5BQkxFRAorCisvLyByb3V0aW5lcyBmb3IgbWl4ZWQgdHlwZXMKKworLy8gUkhTPWZsb2F0OAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWw2NCByaHMgKTsKKworLy8gUkhTPWZsb2F0MTYgKGRlcHJlY2F0ZWQsIHRvIGJlIHJlbW92ZWQgd2hlbiB3ZSBhcmUgc3VyZSB0aGUgY29tcGlsZXIgZG9lcyBub3QgdXNlIHRoZW0pCisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2FkZF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc3ViX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9tdWxfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgX1F1YWQgcmhzICk7CisKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfYWRkX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X3N1Yl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9tdWxfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7CisKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDR1X2FkZF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zdWJfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfbXVsX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywgX1F1YWQgcmhzICk7CisKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X2FkZF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfbXVsX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywgX1F1YWQgcmhzICk7CisKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywgX1F1YWQgcmhzICk7CisKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywgX1F1YWQgcmhzICk7CisKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocyApOworCisvLyBSZXZlcnNlIG9wZXJhdGlvbnMKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX3Jldl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3Jldl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X3Jldl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3Jldl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3Jldl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9yZXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X3Jldl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfcmV2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7CisKKyNlbmRpZiAvLyBLTVBfSEFWRV9RVUFECisKKy8vIFJIUz1jbXBseDgKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY21wbHg4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOworCisvLyBnZW5lcmljIGF0b21pYyByb3V0aW5lcwordm9pZCBfX2ttcGNfYXRvbWljXzEoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfNCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18xMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMTYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzIwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18zMiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7CisKKy8vIFJFQUQsIFdSSVRFLCBDQVBUVVJFIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgUkVBRCBhcmUgbGlzdGVkCisvLworCitjaGFyICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgICAqIGxvYyApOworc2hvcnQgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICAgKiBsb2MgKTsKK2ttcF9pbnQzMiAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgICogbG9jICk7CitrbXBfaW50NjQgICAgX19rbXBjX2F0b21pY19maXhlZDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICAqIGxvYyApOwora21wX3JlYWwzMiAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAgKiBsb2MgKTsKK2ttcF9yZWFsNjQgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgICogbG9jICk7Citsb25nIGRvdWJsZSAgX19rbXBjX2F0b21pY19mbG9hdDEwX3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxvYyApOworI2lmIEtNUF9IQVZFX1FVQUQKK1FVQURfTEVHQUNZICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfcmQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbG9jICk7CisjZW5kaWYKKy8vIEZpeCBmb3IgQ1EyMjAzNjE6IGNtcGx4NCBSRUFEIHdpbGwgcmV0dXJuIHZvaWQgb24gV2luZG93cyogT1M7IHJlYWQgdmFsdWUgd2lsbCBiZQorLy8gcmV0dXJuZWQgdGhyb3VnaCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlcgorI2lmICggS01QX09TX1dJTkRPV1MgKQorICAgIHZvaWQgIF9fa21wY19hdG9taWNfY21wbHg0X3JkKCAga21wX2NtcGx4MzIgKiBvdXQsIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbG9jICk7CisjZWxzZQorICAgIGttcF9jbXBseDMyICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbG9jICk7CisjZW5kaWYKK2ttcF9jbXBseDY0ICBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbG9jICk7CitrbXBfY21wbHg4MCAgX19rbXBjX2F0b21pY19jbXBseDEwX3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxvYyApOworI2lmIEtNUF9IQVZFX1FVQUQKK0NQTFgxMjhfTEVHICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbG9jICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgUXVhZF9hMTZfdCAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfcmQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICAgICAgICAgKiBsb2MgKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9yZCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxvYyApOworI2VuZGlmCisjZW5kaWYKKworCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgV1JJVEUgYXJlIGxpc3RlZAorLy8KKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAgICogbGhzLCBjaGFyICAgICAgICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgICAqIGxocywgc2hvcnQgICAgICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAgKiBsaHMsIGttcF9pbnQzMiAgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgICogbGhzLCBrbXBfaW50NjQgICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICAqIGxocywga21wX3JlYWwzMiAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAgKiBsaHMsIGttcF9yZWFsNjQgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl93ciggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2VuZGlmCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfd3IoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfd3IoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICAgICAgICAgKiBsaHMsIFF1YWRfYTE2X3QgICAgICAgICByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfd3IoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vCisvLyAgQmVsb3cgcm91dGluZXMgZm9yIGF0b21pYyBDQVBUVVJFIGFyZSBsaXN0ZWQKKy8vCisKKy8vIDEtYnl0ZQorY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOwordW5zaWduZWQgY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7Cit1bnNpZ25lZCBjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CisvLyAyLWJ5dGUKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfb3JiX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOwordW5zaWduZWQgc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmaXhlZAora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmbG9hdAora21wX3JlYWwzMiBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZpeGVkCitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZsb2F0CitrbXBfcmVhbDY0IF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBmaXhlZAora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF91aW50MzIgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGZpeGVkCitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF91aW50NjQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX3VpbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CisvLyA0LWJ5dGUgZmxvYXQKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGZsb2F0CitrbXBfcmVhbDY0IF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKKy8vIDEtLCAyLSwgNC0sIDgtYnl0ZSBsb2dpY2FsICgmJiwgfHwpCitjaGFyICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICogbGhzLCBzaG9ydCAgICAgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCAgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKKy8vIE1JTiAvIE1BWAorY2hhciAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworY2hhciAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICAgX19rbXBjX2F0b21pY19maXhlZDhfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOwora21wX3JlYWw2NCAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisjaWYgS01QX0hBVkVfUVVBRAorUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CisjZW5kaWYKKy8vIC5ORVFWLiAoc2FtZSBhcyB4b3IpCitjaGFyICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gLkVRVi4gKHNhbWUgYXMgfnhvcikKK2NoYXIgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICogbGhzLCBjaGFyICAgICAgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyBsb25nIGRvdWJsZSB0eXBlCitsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKKy8vIF9RdWFkIHR5cGUKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CisjZW5kaWYKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQgcm91dGluZXMgLSByZXR1cm4gdm9pZDsgY2FwdHVyZWQgdmFsdWUgaXMgcmV0dXJuZWQgdmlhIHRoZSBhcmd1bWVudAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnKTsKKwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocywgaW50IGZsYWcpOwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGRfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOwora21wX2NtcGx4ODAgX19rbXBjX2F0b21pY19jbXBseDEwX211bF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnKTsKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CitDUExYMTI4X0xFRyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcpOworQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworICAgIGttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisjZW5kaWYKKyNlbmRpZgorCit2b2lkIF9fa21wY19hdG9taWNfc3RhcnQodm9pZCk7Cit2b2lkIF9fa21wY19hdG9taWNfZW5kKHZvaWQpOworCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogdiA9IHggPSBleHByIGJpbm9wIHg7IHsgdiA9IHg7IHggPSBleHByIGJpbm9wIHg7IH0geyB4ID0gZXhwciBiaW5vcCB4OyB2ID0geDsgfSAgZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorCitjaGFyCSAgICAgICAJX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcgKTsKK2NoYXIJCV9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBjaGFyIAlfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzLCBpbnQgZmxhZyApOworY2hhciAJCV9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgLCBpbnQgZmxhZyk7CitjaGFyCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgY2hhciAJX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBzaG9ydCAJX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnICk7CitzaG9ydCAJCV9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Vuc2lnbmVkIHNob3J0IAlfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMsIGludCBmbGFnICk7CitrbXBfaW50MzIgCV9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnICk7CitrbXBfaW50MzIgCV9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnICk7CitrbXBfdWludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKiBsaHMsIGttcF91aW50MzIgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50NjQgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDY0IAlfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDY0IAlfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQ2NCAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMsIGludCBmbGFnICk7CitmbG9hdCAJCV9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocywgaW50IGZsYWcgKTsKK2Zsb2F0IAkJX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAqIGxocywgZmxvYXQgcmhzLCBpbnQgZmxhZyApOworZG91YmxlIAkJX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKiBsaHMsIGRvdWJsZSByaHMsIGludCBmbGFnICk7Citkb3VibGUgCQlfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqIGxocywgZG91YmxlIHJocywgaW50IGZsYWcgKTsKK2xvbmcgZG91YmxlIAlfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnICk7Citsb25nIGRvdWJsZSAJX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworI2lmIEtNUF9IQVZFX1FVQUQKK1FVQURfTEVHQUNZCV9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcgKTsKK1FVQURfTEVHQUNZCV9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcgKTsKKyNlbmRpZgorLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0IHJvdXRpbmVzIC0gcmV0dXJuIHZvaWQ7IGNhcHR1cmVkIHZhbHVlIGlzIHJldHVybmVkIHZpYSB0aGUgYXJndW1lbnQKK3ZvaWQgICAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyApOwordm9pZCAJICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyApOwora21wX2NtcGx4NjQgCV9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocywgaW50IGZsYWcgKTsKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnICk7CitrbXBfY21wbHg4MCAJX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyApOwora21wX2NtcGx4ODAgCV9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyAgCV9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcgKTsKK0NQTFgxMjhfTEVHICAJX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBRdWFkX2ExNl90IAkJX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyApOworICAgIFF1YWRfYTE2X3QJCV9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdF9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcgKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgCV9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdF9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyApOworI2VuZGlmCisjZW5kaWYKKworLy8gICBPcGVuTVAgNC4wIENhcHR1cmUtd3JpdGUgKHN3YXApOiB7diA9IHg7IHggPSBleHByO30KK2NoYXIgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgICAqIGxocywgY2hhciAgICAgICAgcmhzICk7CitzaG9ydCAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICAgKiBsaHMsIHNob3J0ICAgICAgIHJocyApOwora21wX2ludDMyICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgICogbGhzLCBrbXBfaW50MzIgICByaHMgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAgKiBsaHMsIGttcF9pbnQ2NCAgIHJocyApOworZmxvYXQgCQlfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAgICAgICAqIGxocywgZmxvYXQgIHJocyApOworZG91YmxlCQlfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgICAgICAqIGxocywgZG91YmxlICByaHMgKTsKK2xvbmcgZG91YmxlCV9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWSAgICAJX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2VuZGlmCisvLyAhISEgVE9ETzogY2hlY2sgaWYgd2UgbmVlZCBhIHdvcmthcm91bmQgaGVyZQordm9pZCAgICAgICAgCV9fa21wY19hdG9taWNfY21wbHg0X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0ICk7CisvL2ttcF9jbXBseDMyICAgCV9fa21wY19hdG9taWNfY21wbHg0X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKKwora21wX2NtcGx4NjQgCV9fa21wY19hdG9taWNfY21wbHg4X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK2ttcF9jbXBseDgwCV9fa21wY19hdG9taWNfY21wbHgxMF9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyAJX19rbXBjX2F0b21pY19jbXBseDE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBRdWFkX2ExNl90CQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vIENhcHR1cmUgcm91dGluZXMgZm9yIG1peGVkIHR5cGVzIChSSFM9ZmxvYXQxNikKKyNpZiBLTVBfSEFWRV9RVUFECisKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK3Vuc2lnbmVkIGNoYXIgIF9fa21wY19hdG9taWNfZml4ZWQxdV9hZGRfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxdV9zdWJfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxdV9tdWxfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CisKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJ1X2FkZF9jcHRfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc3ViX2NwdF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9tdWxfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CisKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9hZGRfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zdWJfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9tdWxfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CisKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9hZGRfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9tdWxfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CisKK2Zsb2F0IF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9jcHRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitmbG9hdCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOworZmxvYXQgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2NwdF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2Zsb2F0IF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CisKK2RvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOworZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7Citkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2RvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOworCitsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9jcHRfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKKworY2hhciAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgY2hhciAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zdWJfY3B0X3Jldl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOworY2hhciAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgY2hhciAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3Jldl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK3Vuc2lnbmVkIHNob3J0ICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc3ViX2NwdF9yZXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitzaG9ydCAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgc2hvcnQgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3Jldl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQzMiAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3Jldl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIF9RdWFkICByaHMsIGludCBmbGFnICk7CitrbXBfdWludDMyICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3N1Yl9jcHRfcmV2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitrbXBfaW50MzIgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBfUXVhZCAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQzMiAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3Jldl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDY0ICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywgX1F1YWQgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50NjQgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc3ViX2NwdF9yZXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3Jldl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIF9RdWFkICByaHMsIGludCBmbGFnICk7CitrbXBfdWludDY0ICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7CitmbG9hdCAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdF9yZXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOworZmxvYXQgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKK2RvdWJsZSAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0X3Jldl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOworZG91YmxlICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfcmV2X2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBfUXVhZCByaHMsIGludCBmbGFnICk7Citsb25nIGRvdWJsZSAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyApOworbG9uZyBkb3VibGUgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3Jldl9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocywgaW50IGZsYWcgKTsKKworI2VuZGlmIC8vIEtNUF9IQVZFX1FVQUQKKworLy8gRW5kIG9mIE9wZW5NUCA0LjAgY2FwdHVyZQorCisjZW5kaWYgLy9PTVBfNDBfRU5BQkxFRAorCisjZW5kaWYgLy9LTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfQVRPTUlDX0ggKi8KKworLy8gZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfYmFycmllci5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2JhcnJpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzc2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2JhcnJpZXIuY3BwCkBAIC0wLDAgKzEsMTc5NyBAQAorLyoKKyAqIGttcF9iYXJyaWVyLmNwcAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3dhaXRfcmVsZWFzZS5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworCisjaWYgS01QX01JQworI2luY2x1ZGUgPGltbWludHJpbi5oPgorI2RlZmluZSBVU0VfTkdPX1NUT1JFUyAxCisjZW5kaWYgLy8gS01QX01JQworCisjaW5jbHVkZSAidHNhbl9hbm5vdGF0aW9ucy5oIgorCisjaWYgS01QX01JQyAmJiBVU0VfTkdPX1NUT1JFUworLy8gSUNWIGNvcHlpbmcKKyNkZWZpbmUgbmdvX2xvYWQoc3JjKSAgICAgICAgICAgIF9fbTUxMmQgVnQgPSBfbW01MTJfbG9hZF9wZCgodm9pZCAqKShzcmMpKQorI2RlZmluZSBuZ29fc3RvcmVfaWN2cyhkc3QsIHNyYykgX21tNTEyX3N0b3JlbnJuZ29fcGQoKHZvaWQgKikoZHN0KSwgVnQpCisjZGVmaW5lIG5nb19zdG9yZV9nbyhkc3QsIHNyYykgICBfbW01MTJfc3RvcmVucm5nb19wZCgodm9pZCAqKShkc3QpLCBWdCkKKyNkZWZpbmUgbmdvX3N5bmMoKSAgICAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCJsb2NrOyBhZGRsICQwLDAoJSVyc3ApIiA6OjogIm1lbW9yeSIpCisjZWxzZQorI2RlZmluZSBuZ29fbG9hZChzcmMpICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIG5nb19zdG9yZV9pY3ZzKGRzdCwgc3JjKSBjb3B5X2ljdnMoKGRzdCksIChzcmMpKQorI2RlZmluZSBuZ29fc3RvcmVfZ28oZHN0LCBzcmMpICAgS01QX01FTUNQWSgoZHN0KSwgKHNyYyksIENBQ0hFX0xJTkUpCisjZGVmaW5lIG5nb19zeW5jKCkgICAgICAgICAgICAgICAoKHZvaWQpMCkKKyNlbmRpZiAvKiBLTVBfTUlDICYmIFVTRV9OR09fU1RPUkVTICovCisKK3ZvaWQgX19rbXBfcHJpbnRfc3RydWN0dXJlKHZvaWQpOyAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmFycmllciBBbGdvcml0aG1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTGluZWFyIEJhcnJpZXIKK3N0YXRpYyB2b2lkCitfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKEtNUF9saW5lYXJfZ2F0aGVyKTsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJiB0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gc2F2ZSBhcnJpdmUgdGltZSB0byB0aGUgdGhyZWFkCisgICAgaWYoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorICAgIC8vIFdlIG5vdyBwZXJmb3JtIGEgbGluZWFyIHJlZHVjdGlvbiB0byBzaWduYWwgdGhhdCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZSBhcnJpdmVkLgorICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCk6ICVsbHUgPT4gJWxsdVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCgwLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCAwLCAmdGhyX2Jhci0+Yl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+Yl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAvLyBNYXJrIGFycml2YWwgdG8gbWFzdGVyIHRocmVhZAorICAgICAgICAvKiBBZnRlciBwZXJmb3JtaW5nIHRoaXMgd3JpdGUsIGEgd29ya2VyIHRocmVhZCBtYXkgbm90IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkCisgICAgICAgICAgIGFueSBtb3JlIC0gaXQgY291bGQgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICovCisgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfYXJyaXZlZCwgb3RoZXJfdGhyZWFkc1swXSk7CisgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlZ2lzdGVyIGttcF9iYWxpZ25fdGVhbV90ICp0ZWFtX2JhciA9ICZ0ZWFtLT50LnRfYmFyW2J0XTsKKyAgICAgICAgcmVnaXN0ZXIgaW50IG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgICAvLyBEb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNsZWVwIGJpdCBoZXJlIG9yIGF0b21pYyBzaW5jZSB0ZWFtIHNldHRpbmcKKyAgICAgICAgcmVnaXN0ZXIga21wX3VpbnQ2NCBuZXdfc3RhdGUgPSB0ZWFtX2Jhci0+Yl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKworICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgd29ya2VyIHRlYW0gbWVtYmVyIHRocmVhZHMuCisgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgICAgICAgIGlmIChpKzEgPCBucHJvYykKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbaSsxXS0+dGgudGhfYmFyW2J0XS5iYi5iX2Fycml2ZWQpOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGksIHRlYW0pLCB0ZWFtLT50LnRfaWQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKworICAgICAgICAgICAgLy8gV2FpdCBmb3Igd29ya2VyIHRocmVhZCB0byBhcnJpdmUKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJm90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHdyaXRlIG1pbiBvZiB0aGUgdGhyZWFkIHRpbWUgYW5kIHRoZSBvdGhlciB0aHJlYWQgdGltZSB0byB0aGUgdGhyZWFkLgorICAgICAgICAgICAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gS01QX01JTih0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcl9taW5fdGltZSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiVkKVxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChpLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCBpKSk7CisgICAgICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0FGVEVSKHJlZHVjZSk7CisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICAgICAgICAgIEFOTk9UQVRFX1JFRFVDRV9CRUZPUkUocmVkdWNlKTsKKyAgICAgICAgICAgICAgICBBTk5PVEFURV9SRURVQ0VfQkVGT1JFKCZ0ZWFtLT50LnRfYmFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBEb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNsZWVwIGJpdCBoZXJlIG9yIGF0b21pYyBzaW5jZSB0ZWFtIHNldHRpbmcKKyAgICAgICAgdGVhbV9iYXItPmJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBzZXQgdGVhbSAlZCBhcnJpdmVkKCVwKSA9ICVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwgJnRlYW1fYmFyLT5iX2Fycml2ZWQsIG5ld19zdGF0ZSkpOworICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZShlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvcGFnYXRlX2ljdnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKEtNUF9saW5lYXJfcmVsZWFzZSk7CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBucHJvYyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkczsKKworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisKKyAgICAgICAgaWYgKG5wcm9jID4gMSkgeworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKFVTRVJfaWN2X2NvcHkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wYWdhdGVfaWN2cykgeworICAgICAgICAgICAgICAgICAgICBuZ29fbG9hZCgmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cyk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayh0ZWFtLT50LnRfaWRlbnQsIHRlYW0tPnQudF90aHJlYWRzW2ldLCB0ZWFtLCBpLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZ29fc3RvcmVfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbaV0udGRfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVswXS50ZF9pY3ZzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZ29fc3luYygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorCisgICAgICAgICAgICAvLyBOb3csIHJlbGVhc2UgYWxsIG9mIHRoZSB3b3JrZXIgdGhyZWFkcworICAgICAgICAgICAgZm9yIChpPTE7IGk8bnByb2M7ICsraSkgeworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGdvIGZsYWcKKyAgICAgICAgICAgICAgICBpZiAoaSsxIDwgbnByb2MpCisgICAgICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tpKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvKCVwKTogJXUgPT4gJXVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19ndGlkLCB0ZWFtLT50LnRfaWQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJm90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbywgb3RoZXJfdGhyZWFkc1tpXSk7CisgICAgICAgICAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBXYWl0IGZvciB0aGUgTUFTVEVSIHRocmVhZCB0byByZWxlYXNlIHVzCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQgd2FpdCBnbyglcCkgPT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCk7CisgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwpIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgIC8vIEluIGEgZm9yayBiYXJyaWVyOyBjYW5ub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkgKG9yIElUVE5PVElGWSBpcyBkaXNhYmxlZCkKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAwLCAtMSk7CisgICAgICAgICAgICAvLyBDYW5jZWwgd2FpdCBvbiBwcmV2aW91cyBwYXJhbGxlbCByZWdpb24uLi4KKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKGl0dF9zeW5jX29iaik7CisKKyAgICAgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICAgICAgICAgICAgLy8gQ2FsbCBwcmVwYXJlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciAibmV3IiBiYXJyaWVyCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgaWYgKCBidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBtYXkgbm93IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkLgorI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyNlbmRpZgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgICAgIFRDV180KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKSk7CisgICAgICAgIEtNUF9NQigpOyAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworLy8gVHJlZSBiYXJyaWVyCitzdGF0aWMgdm9pZAorX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcihlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKEtNUF90cmVlX2dhdGhlcik7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqdGhyX2JhciA9ICZ0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGJyYW5jaF9iaXRzID0gX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnRdOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgYnJhbmNoX2ZhY3RvciA9IDEgPDwgYnJhbmNoX2JpdHM7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBjaGlsZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkX3RpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDY0IG5ld19zdGF0ZTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBzYXZlIGFycml2ZSB0aW1lIHRvIHRoZSB0aHJlYWQKKyAgICBpZihfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgfQorI2VuZGlmCisgICAgLy8gUGVyZm9ybSB0cmVlIGdhdGhlciB0byB3YWl0IHVudGlsIGFsbCB0aHJlYWRzIGhhdmUgYXJyaXZlZDsgcmVkdWNlIGFueSByZXF1aXJlZCBkYXRhIGFzIHdlIGdvCisgICAgY2hpbGRfdGlkID0gKHRpZCA8PCBicmFuY2hfYml0cykgKyAxOworICAgIGlmIChjaGlsZF90aWQgPCBucHJvYykgeworICAgICAgICAvLyBQYXJlbnQgdGhyZWFkcyB3YWl0IGZvciBhbGwgdGhlaXIgY2hpbGRyZW4gdG8gYXJyaXZlCisgICAgICAgIG5ld19zdGF0ZSA9IHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIGNoaWxkID0gMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgYXJyaXZlZCBjb3VudAorICAgICAgICAgICAgaWYgKGNoaWxkKzEgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQrMSA8IG5wcm9jKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tjaGlsZF90aWQrMV0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JXUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID09ICVsbHVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGNoaWxkIHRvIGFycml2ZQorICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2Fycml2ZWQsIG5ld19zdGF0ZSk7CisgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgYSBjaGlsZCB0aW1lIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBLTVBfTUlOKHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGhyLT50aC50aF9iYXJfbWluX3RpbWUpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JXUpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQpKTsKKyAgICAgICAgICAgICAgICBBTk5PVEFURV9SRURVQ0VfQUZURVIocmVkdWNlKTsKKyAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLCBjaGlsZF90aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhKTsKKyAgICAgICAgICAgICAgICBBTk5PVEFURV9SRURVQ0VfQkVGT1JFKHJlZHVjZSk7CisgICAgICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRSgmdGVhbS0+dC50X2Jhcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGlsZCsrOworICAgICAgICAgICAgY2hpbGRfdGlkKys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGNoaWxkIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnByb2MpOworICAgIH0KKworICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBXb3JrZXIgdGhyZWFkcworICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgcGFyZW50X3RpZCA9ICh0aWQgLSAxKSA+PiBicmFuY2hfYml0czsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJWxsdSA9PiAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHBhcmVudF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIHBhcmVudF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+Yl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKworICAgICAgICAvLyBNYXJrIGFycml2YWwgdG8gcGFyZW50IHRocmVhZAorICAgICAgICAvKiBBZnRlciBwZXJmb3JtaW5nIHRoaXMgd3JpdGUsIGEgd29ya2VyIHRocmVhZCBtYXkgbm90IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkCisgICAgICAgICAgIGFueSBtb3JlIC0gaXQgY291bGQgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICAqLworICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2Fycml2ZWQsIG90aGVyX3RocmVhZHNbcGFyZW50X3RpZF0pOworICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOZWVkIHRvIHVwZGF0ZSB0aGUgdGVhbSBhcnJpdmVkIHBvaW50ZXIgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIGlmIChucHJvYyA+IDEpIC8vIE5ldyB2YWx1ZSB3YXMgYWxyZWFkeSBjb21wdXRlZCBhYm92ZQorICAgICAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkID0gbmV3X3N0YXRlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKz0gS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgc2V0IHRlYW0gJWQgYXJyaXZlZCglcCkgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCwgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkKSk7CisgICAgfQorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKEtNUF90cmVlX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF07CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfZmFjdG9yID0gMSA8PCBicmFuY2hfYml0czsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgY2hpbGRfdGlkOworCisgICAgLy8gUGVyZm9ybSBhIHRyZWUgcmVsZWFzZSBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGdhdGhlcmVkCisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIEhhbmRsZSBmb3JrIGJhcnJpZXIgd29ya2VycyB3aG8gYXJlbid0IHBhcnQgb2YgYSB0ZWFtIHlldAorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCB3YWl0IGdvKCVwKSA9PSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAvLyBXYWl0IGZvciBwYXJlbnQgdGhyZWFkIHRvIHJlbGVhc2UgdXMKKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCk7CisgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwpIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgIC8vIEluIGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkgKG9yIElUVE5PVElGWSBpcyBkaXNhYmxlZCkKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAwLCAtMSk7CisgICAgICAgICAgICAvLyBDYW5jZWwgd2FpdCBvbiBwcmV2aW91cyBwYXJhbGxlbCByZWdpb24uLi4KKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKGl0dF9zeW5jX29iaik7CisKKyAgICAgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICAgICAgICAgICAgLy8gQ2FsbCBwcmVwYXJlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciAibmV3IiBiYXJyaWVyCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgaWYgKGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBtYXkgbm93IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkLgorICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgICAgIFRDV180KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICAgICAgICBLTVBfTUIoKTsgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9IGVsc2UgeworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgfQorICAgIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgY2hpbGRfdGlkID0gKHRpZCA8PCBicmFuY2hfYml0cykgKyAxOworCisgICAgaWYgKGNoaWxkX3RpZCA8IG5wcm9jKSB7CisgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgIGNoaWxkID0gMTsKKyAgICAgICAgLy8gUGFyZW50IHRocmVhZHMgcmVsZWFzZSBhbGwgdGhlaXIgY2hpbGRyZW4KKyAgICAgICAgZG8geworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkKzEgPCBucHJvYykKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbY2hpbGRfdGlkKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKFVTRVJfaWN2X2NvcHkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wYWdhdGVfaWN2cykgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbSwgY2hpbGRfdGlkLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbY2hpbGRfdGlkXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiV1KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImdvKCVwKTogJXUgPT4gJXVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF9iYXItPmJfZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgY2hpbGQgZnJvbSBiYXJyaWVyCisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX3Rocik7CisgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGNoaWxkKys7CisgICAgICAgICAgICBjaGlsZF90aWQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY2hpbGQgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQgPCBucHJvYyk7CisgICAgfQorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworCisvLyBIeXBlciBCYXJyaWVyCitzdGF0aWMgdm9pZAorX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKEtNUF9oeXBlcl9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmdGhpc190aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDY0IG5ld19zdGF0ZSA9IEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG51bV90aHJlYWRzID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2J0XTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgb2Zmc2V0OworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbGV2ZWw7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gc2F2ZSBhcnJpdmUgdGltZSB0byB0aGUgdGhyZWFkCisgICAgaWYoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorICAgIC8qIFBlcmZvcm0gYSBoeXBlcmN1YmUtZW1iZWRkZWQgdHJlZSBnYXRoZXIgdG8gd2FpdCB1bnRpbCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZQorICAgICAgIGFycml2ZWQsIGFuZCByZWR1Y2UgYW55IHJlcXVpcmVkIGRhdGEgYXMgd2UgZ28uICAqLworICAgIGttcF9mbGFnXzY0IHBfZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkKTsKKyAgICBmb3IgKGxldmVsPTAsIG9mZnNldD0xOyBvZmZzZXQ8bnVtX3RocmVhZHM7IGxldmVsKz1icmFuY2hfYml0cywgb2Zmc2V0PDw9YnJhbmNoX2JpdHMpCisgICAgeworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkX3RpZDsKKworICAgICAgICBpZiAoKCh0aWQgPj4gbGV2ZWwpICYgKGJyYW5jaF9mYWN0b3IgLSAxKSkgIT0gMCkgeworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2ludDMyIHBhcmVudF90aWQgPSB0aWQgJiB+KCgxIDw8IChsZXZlbCArIGJyYW5jaF9iaXRzKSkgLTEpOworCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApOiAlbGx1ID0+ICVsbHVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHBhcmVudF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIHBhcmVudF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgLy8gTWFyayBhcnJpdmFsIHRvIHBhcmVudCB0aHJlYWQKKyAgICAgICAgICAgIC8qIEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSAoaW4gdGhlIGxhc3QgaXRlcmF0aW9uIG9mIHRoZSBlbmNsb3NpbmcgZm9yIGxvb3ApLAorICAgICAgICAgICAgICAgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQgYW55IG1vcmUgLSBpdCBjb3VsZCBiZQorICAgICAgICAgICAgICAgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICAqLworICAgICAgICAgICAgcF9mbGFnLnNldF93YWl0ZXIob3RoZXJfdGhyZWFkc1twYXJlbnRfdGlkXSk7CisgICAgICAgICAgICBwX2ZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJlbnQgdGhyZWFkcyB3YWl0IGZvciBjaGlsZHJlbiB0byBhcnJpdmUKKyAgICAgICAgaWYgKG5ld19zdGF0ZSA9PSBLTVBfQkFSUklFUl9VTlVTRURfU1RBVEUpCisgICAgICAgICAgICBuZXdfc3RhdGUgPSB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBmb3IgKGNoaWxkPTEsIGNoaWxkX3RpZD10aWQrKDEgPDwgbGV2ZWwpOyBjaGlsZDxicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZDxudW1fdGhyZWFkczsKKyAgICAgICAgICAgICBjaGlsZCsrLCBjaGlsZF90aWQrPSgxIDw8IGxldmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbmV4dF9jaGlsZF90aWQgPSBjaGlsZF90aWQgKyAoMSA8PCBsZXZlbCk7CisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDwgYnJhbmNoX2ZhY3RvciAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tuZXh0X2NoaWxkX3RpZF0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiV1KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGNoaWxkIHRvIGFycml2ZQorICAgICAgICAgICAga21wX2ZsYWdfNjQgY19mbGFnKCZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgICAgICAgIGNfZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgYSBjaGlsZCB0aW1lIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBLTVBfTUlOKHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGhyLT50aC50aF9iYXJfbWluX3RpbWUpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0FGVEVSKHJlZHVjZSk7CisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRShyZWR1Y2UpOworICAgICAgICAgICAgICAgIEFOTk9UQVRFX1JFRFVDRV9CRUZPUkUoJnRlYW0tPnQudF9iYXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgLy8gTmVlZCB0byB1cGRhdGUgdGhlIHRlYW0gYXJyaXZlZCBwb2ludGVyIGlmIHdlIGFyZSB0aGUgbWFzdGVyIHRocmVhZAorICAgICAgICBpZiAobmV3X3N0YXRlID09IEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURSkKKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCArPSBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgPSBuZXdfc3RhdGU7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBzZXQgdGVhbSAlZCBhcnJpdmVkKCVwKSA9ICVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkLCB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQpKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCisvLyBUaGUgcmV2ZXJzZSB2ZXJzaW9ucyBzZWVtIHRvIGJlYXQgdGhlIGZvcndhcmQgdmVyc2lvbnMgb3ZlcmFsbAorI2RlZmluZSBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKK3N0YXRpYyB2b2lkCitfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvcGFnYXRlX2ljdnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICppdHRfc3luY19vYmopICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soS01QX2h5cGVyX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgICAgKnRlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICAqdGhyX2JhciAgICAgICA9ICYgdGhpc190aHIgLT4gdGgudGhfYmFyWyBidCBdLmJiOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgICAqKm90aGVyX3RocmVhZHM7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgbnVtX3RocmVhZHM7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgYnJhbmNoX2JpdHMgICA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgYnQgXTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBicmFuY2hfZmFjdG9yID0gMSA8PCBicmFuY2hfYml0czsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBjaGlsZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBjaGlsZF90aWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgb2Zmc2V0OworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGxldmVsOworCisgICAgLyogUGVyZm9ybSBhIGh5cGVyY3ViZS1lbWJlZGRlZCB0cmVlIHJlbGVhc2UgZm9yIGFsbCBvZiB0aGUgdGhyZWFkcyB0aGF0IGhhdmUgYmVlbiBnYXRoZXJlZC4KKyAgICAgICBJZiBLTVBfUkVWRVJTRV9IWVBFUl9CQVIgaXMgZGVmaW5lZCAoZGVmYXVsdCkgdGhlIHRocmVhZHMgYXJlIHJlbGVhc2VkIGluIHRoZSByZXZlcnNlCisgICAgICAgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZ2F0aGVyLCBvdGhlcndpc2UgdGhyZWFkcyBhcmUgcmVsZWFzZWQgaW4gdGhlIHNhbWUgb3JkZXIuICovCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsgLy8gbWFzdGVyCisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICAgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzKSB7IC8vIG1hc3RlciBhbHJlYWR5IGhhcyBJQ1ZzIGluIGZpbmFsIGRlc3RpbmF0aW9uOyBjb3B5CisgICAgICAgICAgICBjb3B5X2ljdnMoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSAgeyAvLyBIYW5kbGUgZm9yayBiYXJyaWVyIHdvcmtlcnMgd2hvIGFyZW4ndCBwYXJ0IG9mIGEgdGVhbSB5ZXQKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkIHdhaXQgZ28oJXApID09ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgIC8vIFdhaXQgZm9yIHBhcmVudCB0aHJlYWQgdG8gcmVsZWFzZSB1cworICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QKTsKKyAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBUUlVFCisgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICBpZiAoKF9faXR0X3N5bmNfY3JlYXRlX3B0ciAmJiBpdHRfc3luY19vYmogPT0gTlVMTCkgfHwgS01QX0lUVF9ERUJVRykgeworICAgICAgICAgICAgLy8gSW4gZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIsIDAsIC0xKTsKKyAgICAgICAgICAgIC8vIENhbmNlbCB3YWl0IG9uIHByZXZpb3VzIHBhcmFsbGVsIHJlZ2lvbi4uLgorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoaXR0X3N5bmNfb2JqKTsKKworICAgICAgICAgICAgaWYgKGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyKTsKKyAgICAgICAgICAgIGlmIChpdHRfc3luY19vYmogIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAvLyBDYWxsIHByZXBhcmUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yICJuZXciIGJhcnJpZXIKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19maW5pc2hlZChpdHRfc3luY19vYmopOworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgIC8vIEVhcmx5IGV4aXQgZm9yIHJlYXBpbmcgdGhyZWFkcyByZWxlYXNpbmcgZm9ya2pvaW4gYmFycmllcgorICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFRoZSB3b3JrZXIgdGhyZWFkIG1heSBub3cgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQuCisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgVENXXzQodGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSk7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICAgICAgICBLTVBfTUIoKTsgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9CisgICAgbnVtX3RocmVhZHMgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICBvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisKKyNpZmRlZiBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICAvLyBDb3VudCB1cCB0byBjb3JyZWN0IGxldmVsIGZvciBwYXJlbnQKKyAgICBmb3IgKGxldmVsPTAsIG9mZnNldD0xOyBvZmZzZXQ8bnVtX3RocmVhZHMgJiYgKCgodGlkPj5sZXZlbCkgJiAoYnJhbmNoX2ZhY3Rvci0xKSkgPT0gMCk7CisgICAgICAgICBsZXZlbCs9YnJhbmNoX2JpdHMsIG9mZnNldDw8PWJyYW5jaF9iaXRzKTsKKworICAgIC8vIE5vdyBnbyBkb3duIGZyb20gdGhlcmUKKyAgICBmb3IgKGxldmVsLT1icmFuY2hfYml0cywgb2Zmc2V0Pj49YnJhbmNoX2JpdHM7IG9mZnNldCAhPSAwOworICAgICAgICAgbGV2ZWwtPWJyYW5jaF9iaXRzLCBvZmZzZXQ+Pj1icmFuY2hfYml0cykKKyNlbHNlCisgICAgLy8gR28gZG93biB0aGUgdHJlZSwgbGV2ZWwgYnkgbGV2ZWwKKyAgICBmb3IgKGxldmVsPTAsIG9mZnNldD0xOyBvZmZzZXQ8bnVtX3RocmVhZHM7IGxldmVsKz1icmFuY2hfYml0cywgb2Zmc2V0PDw9YnJhbmNoX2JpdHMpCisjZW5kaWYgLy8gS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgeworI2lmZGVmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgICAgICAvKiBOb3cgZ28gaW4gcmV2ZXJzZSBvcmRlciB0aHJvdWdoIHRoZSBjaGlsZHJlbiwgaGlnaGVzdCB0byBsb3dlc3QuCisgICAgICAgICAgIEluaXRpYWwgc2V0dGluZyBvZiBjaGlsZCBpcyBjb25zZXJ2YXRpdmUgaGVyZS4gKi8KKyAgICAgICAgY2hpbGQgPSBudW1fdGhyZWFkcyA+PiAoKGxldmVsPT0wKT9sZXZlbDpsZXZlbC0xKTsKKyAgICAgICAgZm9yIChjaGlsZD0oY2hpbGQ8YnJhbmNoX2ZhY3Rvci0xKSA/IGNoaWxkIDogYnJhbmNoX2ZhY3Rvci0xLCBjaGlsZF90aWQ9dGlkKyhjaGlsZDw8bGV2ZWwpOworICAgICAgICAgICAgIGNoaWxkPj0xOyBjaGlsZC0tLCBjaGlsZF90aWQtPSgxPDxsZXZlbCkpCisjZWxzZQorICAgICAgICBpZiAoKCh0aWQgPj4gbGV2ZWwpICYgKGJyYW5jaF9mYWN0b3IgLSAxKSkgIT0gMCkKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZ28gbG93ZXIgdGhhbiB0aGlzLCBzaW5jZSB0aGlzIGlzIHRoZSBsZXZlbCBwYXJlbnQgd291bGQgYmUgbm90aWZpZWQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY2hpbGRyZW4gb24gdGhpcyBsZXZlbCBvZiB0aGUgdHJlZQorICAgICAgICBmb3IgKGNoaWxkPTEsIGNoaWxkX3RpZD10aWQrKDE8PGxldmVsKTsgY2hpbGQ8YnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQ8bnVtX3RocmVhZHM7CisgICAgICAgICAgICAgY2hpbGQrKywgY2hpbGRfdGlkKz0oMTw8bGV2ZWwpKQorI2VuZGlmIC8vIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2hpbGRfdGlkID49IG51bV90aHJlYWRzKSBjb250aW51ZTsgIC8vIENoaWxkIGRvZXNuJ3QgZXhpc3Qgc28ga2VlcCBnb2luZworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBuZXh0X2NoaWxkX3RpZCA9IGNoaWxkX3RpZCAtICgxIDw8IGxldmVsKTsKKyAgICAgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGdvIGNvdW50CisjIGlmZGVmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgICAgICAgICAgICAgIGlmIChjaGlsZC0xID49IDEgJiYgbmV4dF9jaGlsZF90aWQgPCBudW1fdGhyZWFkcykKKyMgZWxzZQorICAgICAgICAgICAgICAgIGlmIChjaGlsZCsxIDwgYnJhbmNoX2ZhY3RvciAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorIyBlbmRpZiAvLyBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICAgICAgICAgICAgICAgICAgS01QX0NBQ0hFX1BSRUZFVENIKCZvdGhlcl90aHJlYWRzW25leHRfY2hpbGRfdGlkXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgICAgIGlmIChwcm9wYWdhdGVfaWN2cykgLy8gcHVzaCBteSBmaXhlZCBJQ1ZzIHRvIG15IGNoaWxkCisgICAgICAgICAgICAgICAgICAgIGNvcHlfaWN2cygmY2hpbGRfYmFyLT50aF9maXhlZF9pY3ZzLCAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JXUpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvKCVwKTogJXUgPT4gJXVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX2Jhci0+Yl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIGNoaWxkIGZyb20gYmFycmllcgorICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfdGhyKTsKKyAgICAgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgIGlmIChwcm9wYWdhdGVfaWN2cyAmJiAhS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBjb3B5IElDVnMgbG9jYWxseSB0byBmaW5hbCBkZXN0CisgICAgICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayh0ZWFtLT50LnRfaWRlbnQsIHRlYW0tPnQudF90aHJlYWRzW3RpZF0sIHRlYW0sIHRpZCwgRkFMU0UpOworICAgICAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywgJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgIH0KKyNlbmRpZgorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIEhpZXJhcmNoaWNhbCBCYXJyaWVyCisKKy8vIEluaXRpYWxpemUgdGhyZWFkIGJhcnJpZXIgZGF0YQorLyogSW5pdGlhbGl6ZXMvcmUtaW5pdGlhbGl6ZXMgdGhlIGhpZXJhcmNoaWNhbCBiYXJyaWVyIGRhdGEgc3RvcmVkIG9uIGEgdGhyZWFkLiAgUGVyZm9ybXMgdGhlCisgICBtaW5pbXVtIGFtb3VudCBvZiBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBiYXNlZCBvbiBob3cgdGhlIHRlYW0gaGFzIGNoYW5nZWQuICBSZXR1cm5zIHRydWUgaWYKKyAgIGxlYWYgY2hpbGRyZW4gd2lsbCByZXF1aXJlIGJvdGggb24tY29yZSBhbmQgdHJhZGl0aW9uYWwgd2FrZS11cCBtZWNoYW5pc21zLiAgRm9yIGV4YW1wbGUsIGlmIHRoZQorICAgdGVhbSBzaXplIGluY3JlYXNlcywgdGhyZWFkcyBhbHJlYWR5IGluIHRoZSB0ZWFtIHdpbGwgcmVzcG9uZCB0byBvbi1jb3JlIHdha2V1cCBvbiB0aGVpciBwYXJlbnQKKyAgIHRocmVhZCwgYnV0IHRocmVhZHMgbmV3bHkgYWRkZWQgdG8gdGhlIHRlYW0gd2lsbCBvbmx5IGJlIGxpc3RlbmluZyBvbiB0aGUgdGhlaXIgbG9jYWwgYl9nby4gKi8KK3N0YXRpYyBib29sCitfX2ttcF9pbml0X2hpZXJhcmNoaWNhbF9iYXJyaWVyX3RocmVhZChlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2JzdGF0ZV90ICp0aHJfYmFyLCBrbXBfdWludDMyIG5wcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsIGttcF90ZWFtX3QgKnRlYW0pCit7CisgICAgLy8gQ2hlY2tzIHRvIGRldGVybWluZSBpZiAocmUtKWluaXRpYWxpemF0aW9uIGlzIG5lZWRlZAorICAgIGJvb2wgdW5pbml0aWFsaXplZCA9IHRocl9iYXItPnRlYW0gPT0gTlVMTDsKKyAgICBib29sIHRlYW1fY2hhbmdlZCA9IHRlYW0gIT0gdGhyX2Jhci0+dGVhbTsKKyAgICBib29sIHRlYW1fc3pfY2hhbmdlZCA9IG5wcm9jICE9IHRocl9iYXItPm5wcm9jOworICAgIGJvb2wgdGlkX2NoYW5nZWQgPSB0aWQgIT0gdGhyX2Jhci0+b2xkX3RpZDsKKyAgICBib29sIHJldHZhbCA9IGZhbHNlOworCisgICAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9zel9jaGFuZ2VkKSB7CisgICAgICAgIF9fa21wX2dldF9oaWVyYXJjaHkobnByb2MsIHRocl9iYXIpOworICAgIH0KKworICAgIGlmICh1bmluaXRpYWxpemVkIHx8IHRlYW1fc3pfY2hhbmdlZCB8fCB0aWRfY2hhbmdlZCkgeworICAgICAgICB0aHJfYmFyLT5teV9sZXZlbCA9IHRocl9iYXItPmRlcHRoLTE7IC8vIGRlZmF1bHQgZm9yIG1hc3RlcgorICAgICAgICB0aHJfYmFyLT5wYXJlbnRfdGlkID0gLTE7IC8vIGRlZmF1bHQgZm9yIG1hc3RlcgorICAgICAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsgLy8gaWYgbm90IG1hc3RlciwgZmluZCBwYXJlbnQgdGhyZWFkIGluIGhpZXJhcmNoeQorICAgICAgICAgICAga21wX3VpbnQzMiBkPTA7CisgICAgICAgICAgICB3aGlsZSAoZDx0aHJfYmFyLT5kZXB0aCkgeyAvLyBmaW5kIHBhcmVudCBiYXNlZCBvbiBsZXZlbCBvZiB0aHJlYWQgaW4gaGllcmFyY2h5LCBhbmQgbm90ZSBsZXZlbAorICAgICAgICAgICAgICAgIGttcF91aW50MzIgcmVtOworICAgICAgICAgICAgICAgIGlmIChkID09IHRocl9iYXItPmRlcHRoLTIpIHsgLy8gcmVhY2hlZCBsZXZlbCByaWdodCBiZWxvdyB0aGUgbWFzdGVyCisgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPnBhcmVudF90aWQgPSAwOworICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5teV9sZXZlbCA9IGQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgocmVtID0gdGlkJXRocl9iYXItPnNraXBfcGVyX2xldmVsW2QrMV0pICE9IDApIHsgLy8gVE9ETzogY2FuIHdlIG1ha2UgdGhpcyBvcCBmYXN0ZXI/CisgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCBpcyBub3QgYSBzdWJ0cmVlIHJvb3QgYXQgbmV4dCBsZXZlbCwgc28gdGhpcyBpcyBtYXgKKyAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+cGFyZW50X3RpZCA9IHRpZCAtIHJlbTsKKyAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+bXlfbGV2ZWwgPSBkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocl9iYXItPm9mZnNldCA9IDctKHRpZC10aHJfYmFyLT5wYXJlbnRfdGlkLTEpOworICAgICAgICB0aHJfYmFyLT5vbGRfdGlkID0gdGlkOworICAgICAgICB0aHJfYmFyLT53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9OT1RfV0FJVElORzsKKyAgICAgICAgdGhyX2Jhci0+dGVhbSA9IHRlYW07CisgICAgICAgIHRocl9iYXItPnBhcmVudF9iYXIgPSAmdGVhbS0+dC50X3RocmVhZHNbdGhyX2Jhci0+cGFyZW50X3RpZF0tPnRoLnRoX2JhcltidF0uYmI7CisgICAgfQorICAgIGlmICh1bmluaXRpYWxpemVkIHx8IHRlYW1fY2hhbmdlZCB8fCB0aWRfY2hhbmdlZCkgeworICAgICAgICB0aHJfYmFyLT50ZWFtID0gdGVhbTsKKyAgICAgICAgdGhyX2Jhci0+cGFyZW50X2JhciA9ICZ0ZWFtLT50LnRfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXS0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICAgICAgcmV0dmFsID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9zel9jaGFuZ2VkIHx8IHRpZF9jaGFuZ2VkKSB7CisgICAgICAgIHRocl9iYXItPm5wcm9jID0gbnByb2M7CisgICAgICAgIHRocl9iYXItPmxlYWZfa2lkcyA9IHRocl9iYXItPmJhc2VfbGVhZl9raWRzOworICAgICAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwgPT0gMCkgdGhyX2Jhci0+bGVhZl9raWRzPTA7CisgICAgICAgIGlmICh0aHJfYmFyLT5sZWFmX2tpZHMgJiYgKGttcF91aW50MzIpdGlkK3Rocl9iYXItPmxlYWZfa2lkcysxID4gbnByb2MpCisgICAgICAgICAgICB0aHJfYmFyLT5sZWFmX2tpZHMgPSBucHJvYyAtIHRpZCAtIDE7CisgICAgICAgIHRocl9iYXItPmxlYWZfc3RhdGUgPSAwOworICAgICAgICBmb3IgKGludCBpPTA7IGk8dGhyX2Jhci0+bGVhZl9raWRzOyArK2kpICgoY2hhciAqKSYodGhyX2Jhci0+bGVhZl9zdGF0ZSkpWzctaV0gPSAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyKGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwgdm9pZCAoKnJlZHVjZSkgKHZvaWQgKiwgdm9pZCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soS01QX2hpZXJfZ2F0aGVyKTsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJiB0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDY0IG5ld19zdGF0ZTsKKworICAgIGludCBsZXZlbCA9IHRlYW0tPnQudF9sZXZlbDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmIChvdGhlcl90aHJlYWRzWzBdLT50aC50aF90ZWFtc19taWNyb3Rhc2spICAgIC8vIGFyZSB3ZSBpbnNpZGUgdGhlIHRlYW1zIGNvbnN0cnVjdD8KKyAgICAgICAgaWYgKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+IDEpCisgICAgICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2ZfbWFzdGVycworI2VuZGlmCisgICAgaWYgKGxldmVsID09IDEpIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDE7CisgICAgZWxzZSB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgPSAwOyAvLyBEbyBub3QgdXNlIG9uY29yZSBiYXJyaWVyIHdoZW4gbmVzdGVkCisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBzYXZlIGFycml2ZSB0aW1lIHRvIHRoZSB0aHJlYWQKKyAgICBpZihfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICB9CisjZW5kaWYKKworICAgICh2b2lkKV9fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGJ0LCB0aHJfYmFyLCBucHJvYywgZ3RpZCwgdGlkLCB0ZWFtKTsKKworICAgIGlmICh0aHJfYmFyLT5teV9sZXZlbCkgeyAvLyBub3QgYSBsZWFmIChteV9sZXZlbD09MCBtZWFucyBsZWFmKQorICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgY2hpbGRfdGlkOworICAgICAgICBuZXdfc3RhdGUgPSAoa21wX3VpbnQ2NCl0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgJiYgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyKSB7CisgICAgICAgICAgICBpZiAodGhyX2Jhci0+bGVhZl9raWRzKSB7IC8vIEZpcnN0LCB3YWl0IGZvciBsZWFmIGNoaWxkcmVuIHRvIGNoZWNrLWluIG9uIG15IGJfYXJyaXZlZCBmbGFnCisgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBsZWFmX3N0YXRlID0gS01QX01BU1RFUl9USUQodGlkKSA/IHRocl9iYXItPmJfYXJyaXZlZCB8IHRocl9iYXItPmxlYWZfc3RhdGUgOiB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgfCB0aHJfYmFyLT5sZWFmX3N0YXRlOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdGluZyBmb3IgbGVhZiBraWRzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQpKTsKKyAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2Fycml2ZWQsIGxlYWZfc3RhdGUpOworICAgICAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0FGVEVSKHJlZHVjZSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY2hpbGRfdGlkPXRpZCsxOyBjaGlsZF90aWQ8PXRpZCt0aHJfYmFyLT5sZWFmX2tpZHM7ICsrY2hpbGRfdGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRShyZWR1Y2UpOworICAgICAgICAgICAgICAgICAgICBBTk5PVEFURV9SRURVQ0VfQkVGT1JFKCZ0ZWFtLT50LnRfYmFyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKHZvaWQpIEtNUF9URVNUX1RIRU5fQU5ENjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSZ0aHJfYmFyLT5iX2Fycml2ZWQsIH4odGhyX2Jhci0+bGVhZl9zdGF0ZSkpOyAvLyBjbGVhciBsZWFmX3N0YXRlIGJpdHMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5leHQsIHdhaXQgZm9yIGhpZ2hlciBsZXZlbCBjaGlsZHJlbiBvbiBlYWNoIGNoaWxkJ3MgYl9hcnJpdmVkIGZsYWcKKyAgICAgICAgICAgIGZvciAoa21wX3VpbnQzMiBkPTE7IGQ8dGhyX2Jhci0+bXlfbGV2ZWw7ICsrZCkgeyAvLyBnYXRoZXIgbG93ZXN0IGxldmVsIHRocmVhZHMgZmlyc3QsIGJ1dCBza2lwIDAKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxhc3QgPSB0aWQrdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCsxXSwgc2tpcCA9IHRocl9iYXItPnNraXBfcGVyX2xldmVsW2RdOworICAgICAgICAgICAgICAgIGlmIChsYXN0ID4gbnByb2MpIGxhc3QgPSBucHJvYzsKKyAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrc2tpcDsgY2hpbGRfdGlkPChpbnQpbGFzdDsgY2hpbGRfdGlkKz1za2lwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHdhaXQgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTk5PVEFURV9SRURVQ0VfQUZURVIocmVkdWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqcmVkdWNlKSh0aGlzX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEsIGNoaWxkX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRShyZWR1Y2UpOworICAgICAgICAgICAgICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRSgmdGVhbS0+dC50X2Jhcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIEJsb2NrdGltZSBpcyBub3QgaW5maW5pdGUKKyAgICAgICAgICAgIGZvciAoa21wX3VpbnQzMiBkPTA7IGQ8dGhyX2Jhci0+bXlfbGV2ZWw7ICsrZCkgeyAvLyBHYXRoZXIgbG93ZXN0IGxldmVsIHRocmVhZHMgZmlyc3QKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxhc3QgPSB0aWQrdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCsxXSwgc2tpcCA9IHRocl9iYXItPnNraXBfcGVyX2xldmVsW2RdOworICAgICAgICAgICAgICAgIGlmIChsYXN0ID4gbnByb2MpIGxhc3QgPSBucHJvYzsKKyAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrc2tpcDsgY2hpbGRfdGlkPChpbnQpbGFzdDsgY2hpbGRfdGlkKz1za2lwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHdhaXQgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTk5PVEFURV9SRURVQ0VfQUZURVIocmVkdWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqcmVkdWNlKSh0aGlzX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEsIGNoaWxkX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRShyZWR1Y2UpOworICAgICAgICAgICAgICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRSgmdGVhbS0+dC50X2Jhcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQWxsIHN1Ym9yZGluYXRlcyBhcmUgZ2F0aGVyZWQ7IG5vdyByZWxlYXNlIHBhcmVudCBpZiBub3QgbWFzdGVyIHRocmVhZAorCisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIHdvcmtlciB0aHJlYWRzIHJlbGVhc2UgcGFyZW50IGluIGhpZXJhcmNoeQorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApOiAlbGx1ID0+ICVsbHVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQodGhyX2Jhci0+cGFyZW50X3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwgdGhyX2Jhci0+cGFyZW50X3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAmdGhyX2Jhci0+Yl9hcnJpdmVkLCB0aHJfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPmJfYXJyaXZlZCtLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgIC8qIE1hcmsgYXJyaXZhbCB0byBwYXJlbnQ6IEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSwgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQKKyAgICAgICAgICAgdGhlIHRlYW0gaXMgdmFsaWQgYW55IG1vcmUgLSBpdCBjb3VsZCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBhdCBhbnkgdGltZS4gKi8KKyAgICAgICAgaWYgKHRocl9iYXItPm15X2xldmVsIHx8IF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FCisgICAgICAgICAgICB8fCAhdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyKSB7IC8vIFBhcmVudCBpcyB3YWl0aW5nIG9uIG15IGJfYXJyaXZlZCBmbGFnOyByZWxlYXNlIGl0CisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2Fycml2ZWQsIG90aGVyX3RocmVhZHNbdGhyX2Jhci0+cGFyZW50X3RpZF0pOworICAgICAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIExlYWYgZG9lcyBzcGVjaWFsIHJlbGVhc2Ugb24gdGhlICJvZmZzZXQiIGJpdHMgb2YgcGFyZW50J3MgYl9hcnJpdmVkIGZsYWcKKyAgICAgICAgICAgIHRocl9iYXItPmJfYXJyaXZlZCA9IHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgICAgICBrbXBfZmxhZ19vbmNvcmUgZmxhZygmdGhyX2Jhci0+cGFyZW50X2Jhci0+Yl9hcnJpdmVkLCB0aHJfYmFyLT5vZmZzZXQpOworICAgICAgICAgICAgZmxhZy5zZXRfd2FpdGVyKG90aGVyX3RocmVhZHNbdGhyX2Jhci0+cGFyZW50X3RpZF0pOworICAgICAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBNYXN0ZXIgdGhyZWFkIG5lZWRzIHRvIHVwZGF0ZSB0aGUgdGVhbSdzIGJfYXJyaXZlZCB2YWx1ZQorICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgPSBuZXdfc3RhdGU7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgc2V0IHRlYW0gJWQgYXJyaXZlZCglcCkgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsICZ0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQsIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCkpOworICAgIH0KKyAgICAvLyBJcyB0aGUgdGVhbSBhY2Nlc3MgYmVsb3cgdW5zYWZlIG9yIGp1c3QgdGVjaG5pY2FsbHkgaW52YWxpZD8KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZShlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvcGFnYXRlX2ljdnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhLTVBfaGllcl9yZWxlYXNlKTsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqdGhyX2JhciA9ICZ0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG5wcm9jOworICAgIGJvb2wgdGVhbV9jaGFuZ2UgPSBmYWxzZTsgLy8gaW5kaWNhdGVzIG9uLWNvcmUgYmFycmllciBzaG91bGRuJ3QgYmUgdXNlZAorCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyZWQgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworICAgIH0KKyAgICBlbHNlIHsgLy8gV29ya2VyIHRocmVhZHMKKyAgICAgICAgLy8gV2FpdCBmb3IgcGFyZW50IHRocmVhZCB0byByZWxlYXNlIG1lCisgICAgICAgIGlmICghdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyIHx8IF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FCisgICAgICAgICAgICB8fCB0aHJfYmFyLT5teV9sZXZlbCAhPSAwIHx8IHRocl9iYXItPnRlYW0gPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gVXNlIHRyYWRpdGlvbmFsIG1ldGhvZCBvZiB3YWl0aW5nIG9uIG15IG93biBiX2dvIGZsYWcKKyAgICAgICAgICAgIHRocl9iYXItPndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX09XTl9GTEFHOworICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCk7CisgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICBUQ1dfOCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsgLy8gUmVzZXQgbXkgYl9nbyBmbGFnIGZvciBuZXh0IHRpbWUKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gVGhyZWFkIGJhcnJpZXIgZGF0YSBpcyBpbml0aWFsaXplZCwgdGhpcyBpcyBhIGxlYWYsIGJsb2NrdGltZSBpcyBpbmZpbml0ZSwgbm90IG5lc3RlZAorICAgICAgICAgICAgLy8gV2FpdCBvbiBteSAib2Zmc2V0IiBiaXRzIG9uIHBhcmVudCdzIGJfZ28gZmxhZworICAgICAgICAgICAgdGhyX2Jhci0+d2FpdF9mbGFnID0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUc7CisgICAgICAgICAgICBrbXBfZmxhZ19vbmNvcmUgZmxhZygmdGhyX2Jhci0+cGFyZW50X2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCwgdGhyX2Jhci0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnQsIHRoaXNfdGhyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUpOworICAgICAgICAgICAgaWYgKHRocl9iYXItPndhaXRfZmxhZyA9PSBLTVBfQkFSUklFUl9TV0lUQ0hJTkcpIHsgLy8gVGhyZWFkIHdhcyBzd2l0Y2hlZCB0byBvd24gYl9nbworICAgICAgICAgICAgICAgIFRDV184KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOyAvLyBSZXNldCBteSBiX2dvIGZsYWcgZm9yIG5leHQgdGltZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7IC8vIFJlc2V0IG15IGJpdHMgb24gcGFyZW50J3MgYl9nbyBmbGFnCisgICAgICAgICAgICAgICAgKChjaGFyKikmKHRocl9iYXItPnBhcmVudF9iYXItPmJfZ28pKVt0aHJfYmFyLT5vZmZzZXRdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJfYmFyLT53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9OT1RfV0FJVElORzsKKyAgICAgICAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8vIFRoZSB3b3JrZXIgdGhyZWFkIG1heSBub3cgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQuCisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICAgICAgICBLTVBfTUIoKTsgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9CisKKyAgICBucHJvYyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgIGludCBsZXZlbCA9IHRlYW0tPnQudF9sZXZlbDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICh0ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeyAgICAvLyBhcmUgd2UgaW5zaWRlIHRoZSB0ZWFtcyBjb25zdHJ1Y3Q/CisgICAgICAgIGlmICh0ZWFtLT50LnRfcGtmbiAhPSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICYmIHRoaXNfdGhyLT50aC50aF90ZWFtc19sZXZlbCA9PSBsZXZlbCkKKyAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl93b3JrZXJzCisgICAgICAgIGlmKCB0aGlzX3Roci0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXMgPiAxICkKKyAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl9tYXN0ZXJzCisgICAgfQorI2VuZGlmCisgICAgaWYgKGxldmVsID09IDEpIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDE7CisgICAgZWxzZSB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgPSAwOyAvLyBEbyBub3QgdXNlIG9uY29yZSBiYXJyaWVyIHdoZW4gbmVzdGVkCisKKyAgICAvLyBJZiB0aGUgdGVhbSBzaXplIGhhcyBpbmNyZWFzZWQsIHdlIHN0aWxsIGNvbW11bmljYXRlIHdpdGggb2xkIGxlYXZlcyB2aWEgb25jb3JlIGJhcnJpZXIuCisgICAgdW5zaWduZWQgc2hvcnQgaW50IG9sZF9sZWFmX2tpZHMgPSB0aHJfYmFyLT5sZWFmX2tpZHM7CisgICAga21wX3VpbnQ2NCBvbGRfbGVhZl9zdGF0ZSA9IHRocl9iYXItPmxlYWZfc3RhdGU7CisgICAgdGVhbV9jaGFuZ2UgPSBfX2ttcF9pbml0X2hpZXJhcmNoaWNhbF9iYXJyaWVyX3RocmVhZChidCwgdGhyX2JhciwgbnByb2MsIGd0aWQsIHRpZCwgdGVhbSk7CisgICAgLy8gQnV0IGlmIHRoZSBlbnRpcmUgdGVhbSBjaGFuZ2VzLCB3ZSB3b24ndCB1c2Ugb25jb3JlIGJhcnJpZXIgYXQgYWxsCisgICAgaWYgKHRlYW1fY2hhbmdlKSBvbGRfbGVhZl9raWRzID0gMDsKKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzKSB7CisgICAgICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayh0ZWFtLT50LnRfaWRlbnQsIHRlYW0tPnQudF90aHJlYWRzW3RpZF0sIHRlYW0sIHRpZCwgRkFMU0UpOworICAgICAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBtYXN0ZXIgYWxyZWFkeSBoYXMgY29weSBpbiBmaW5hbCBkZXN0aW5hdGlvbjsgY29weQorICAgICAgICAgICAgY29weV9pY3ZzKCZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzLCAmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSAmJiB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsgLy8gb3B0aW1pemF0aW9uIGZvciBpbmYgYmxvY2t0aW1lCisgICAgICAgICAgICBpZiAoIXRocl9iYXItPm15X2xldmVsKSAvLyBJJ20gYSBsZWFmIGluIHRoZSBoaWVyYXJjaHkgKG15X2xldmVsPT0wKQorICAgICAgICAgICAgICAgIC8vIGxlYXZlcyAob24tY29yZSBjaGlsZHJlbikgcHVsbCBwYXJlbnQncyBmaXhlZCBJQ1ZzIGRpcmVjdGx5IHRvIGxvY2FsIElDViBzdG9yZQorICAgICAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyX2Jhci0+cGFyZW50X2Jhci0+dGhfZml4ZWRfaWN2cyk7CisgICAgICAgICAgICAvLyBub24tbGVhdmVzIHdpbGwgZ2V0IElDVnMgcGlnZ3liYWNrZWQgd2l0aCBiX2dvIHZpYSBOR08gc3RvcmUKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gYmxvY2t0aW1lIGlzIG5vdCBpbmZpbml0ZTsgcHVsbCBJQ1ZzIGZyb20gcGFyZW50J3MgZml4ZWQgSUNWcworICAgICAgICAgICAgaWYgKHRocl9iYXItPm15X2xldmVsKSAvLyBub3QgYSBsZWFmOyBjb3B5IElDVnMgdG8gbXkgZml4ZWQgSUNWcyBjaGlsZCBjYW4gYWNjZXNzCisgICAgICAgICAgICAgICAgY29weV9pY3ZzKCZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzLCAmdGhyX2Jhci0+cGFyZW50X2Jhci0+dGhfZml4ZWRfaWN2cyk7CisgICAgICAgICAgICBlbHNlIC8vIGxlYXZlcyBjb3B5IHBhcmVudCdzIGZpeGVkIElDVnMgZGlyZWN0bHkgdG8gbG9jYWwgSUNWIHN0b3JlCisgICAgICAgICAgICAgICAgY29weV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5wYXJlbnRfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorCisgICAgLy8gTm93LCByZWxlYXNlIG15IGNoaWxkcmVuCisgICAgaWYgKHRocl9iYXItPm15X2xldmVsKSB7IC8vIG5vdCBhIGxlYWYKKyAgICAgICAgcmVnaXN0ZXIga21wX2ludDMyIGNoaWxkX3RpZDsKKyAgICAgICAga21wX3VpbnQzMiBsYXN0OworICAgICAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgJiYgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyKSB7CisgICAgICAgICAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBkbyBhIGZsYXQgcmVsZWFzZQorICAgICAgICAgICAgICAgIC8vIFNldCBsb2NhbCBiX2dvIHRvIGJ1bXAgY2hpbGRyZW4gdmlhIE5HTyBzdG9yZSBvZiB0aGUgY2FjaGUgbGluZSBjb250YWluaW5nIElWQ3MgYW5kIGJfZ28uCisgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9nbyA9IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgICAgICAgICAgLy8gVXNlIG5nbyBzdG9yZXMgaWYgYXZhaWxhYmxlOyBiX2dvIHBpZ2d5YmFja3MgaW4gdGhlIGxhc3QgOCBieXRlcyBvZiB0aGUgY2FjaGUgbGluZQorICAgICAgICAgICAgICAgIG5nb19sb2FkKCZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGxvb3BzIG92ZXIgYWxsIHRoZSB0aHJlYWRzIHNraXBwaW5nIG9ubHkgdGhlIGxlYWYgbm9kZXMgaW4gdGhlIGhpZXJhcmNoeQorICAgICAgICAgICAgICAgIGZvciAoY2hpbGRfdGlkPXRocl9iYXItPnNraXBfcGVyX2xldmVsWzFdOyBjaGlsZF90aWQ8KGludClucHJvYzsgY2hpbGRfdGlkKz10aHJfYmFyLT5za2lwX3Blcl9sZXZlbFsxXSkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZ0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDolZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBnbyglcCk6ICV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX2Jhci0+Yl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9iYXItPmJfZ28gKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBuZ28gc3RvcmUgKGlmIGF2YWlsYWJsZSkgdG8gYm90aCBzdG9yZSBJQ1ZzIGFuZCByZWxlYXNlIGNoaWxkIHZpYSBjaGlsZCdzIGJfZ28KKyAgICAgICAgICAgICAgICAgICAgbmdvX3N0b3JlX2dvKCZjaGlsZF9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmdvX3N5bmMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRDV184KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOyAvLyBSZXNldCBteSBiX2dvIGZsYWcgZm9yIG5leHQgdGltZQorICAgICAgICAgICAgLy8gTm93LCByZWxlYXNlIGxlYWYgY2hpbGRyZW4KKyAgICAgICAgICAgIGlmICh0aHJfYmFyLT5sZWFmX2tpZHMpIHsgLy8gaWYgdGhlcmUgYXJlIGFueQorICAgICAgICAgICAgICAgIC8vIFdlIHRlc3QgdGVhbV9jaGFuZ2Ugb24gdGhlIG9mZi1jaGFuY2UgdGhhdCB0aGUgbGV2ZWwgMSB0ZWFtIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgaWYgKHRlYW1fY2hhbmdlIHx8IG9sZF9sZWFmX2tpZHMgPCB0aHJfYmFyLT5sZWFmX2tpZHMpIHsgLy8gc29tZSBvbGQgbGVhZl9raWRzLCBzb21lIG5ldworICAgICAgICAgICAgICAgICAgICBpZiAob2xkX2xlYWZfa2lkcykgeyAvLyByZWxlYXNlIG9sZCBsZWFmIGtpZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPmJfZ28gfD0gb2xkX2xlYWZfc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSBuZXcgbGVhZiBraWRzCisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSB0aWQrdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0ID4gbnByb2MpIGxhc3QgPSBucHJvYzsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjaGlsZF90aWQ9dGlkKzErb2xkX2xlYWZfa2lkczsgY2hpbGRfdGlkPChpbnQpbGFzdDsgKytjaGlsZF90aWQpIHsgLy8gc2tpcF9wZXJfbGV2ZWxbMF09MQorICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICpjaGlsZF90aHIgPSB0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFQjJWQoJWQ6JWQpIGdvKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF9iYXItPmJfZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgY2hpbGQgdXNpbmcgY2hpbGQncyBiX2dvIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfdGhyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBSZWxlYXNlIGFsbCBjaGlsZHJlbiBhdCBvbmNlIHdpdGggbGVhZl9zdGF0ZSBiaXRzIG9uIG15IG93biBiX2dvIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9nbyB8PSB0aHJfYmFyLT5sZWFmX3N0YXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gQmxvY2t0aW1lIGlzIG5vdCBpbmZpbml0ZTsgZG8gYSBzaW1wbGUgaGllcmFyY2hpY2FsIHJlbGVhc2UKKyAgICAgICAgICAgIGZvciAoaW50IGQ9dGhyX2Jhci0+bXlfbGV2ZWwtMTsgZD49MDsgLS1kKSB7IC8vIFJlbGVhc2UgaGlnaGVzdCBsZXZlbCB0aHJlYWRzIGZpcnN0CisgICAgICAgICAgICAgICAgbGFzdCA9IHRpZCt0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFtkKzFdOworICAgICAgICAgICAgICAgIGttcF91aW50MzIgc2tpcCA9IHRocl9iYXItPnNraXBfcGVyX2xldmVsW2RdOworICAgICAgICAgICAgICAgIGlmIChsYXN0ID4gbnByb2MpIGxhc3QgPSBucHJvYzsKKyAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrc2tpcDsgY2hpbGRfdGlkPChpbnQpbGFzdDsgY2hpbGRfdGlkKz1za2lwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgICAqY2hpbGRfdGhyID0gdGVhbS0+dC50X3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDolZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBnbyglcCk6ICV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX2Jhci0+Yl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9iYXItPmJfZ28gKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgY2hpbGQgdXNpbmcgY2hpbGQncyBiX2dvIGZsYWcKKyAgICAgICAgICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF90aHIpOworICAgICAgICAgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICBpZiAocHJvcGFnYXRlX2ljdnMgJiYgIUtNUF9NQVNURVJfVElEKHRpZCkpIC8vIG5vbi1sZWF2ZXMgY29weSBJQ1ZzIGZyb20gZml4ZWQgSUNWcyB0byBsb2NhbCBkZXN0CisgICAgICAgICAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywgJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMpOworI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgfQorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvZiBCYXJyaWVyIEFsZ29yaXRobXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJbnRlcm5hbCBmdW5jdGlvbiB0byBkbyBhIGJhcnJpZXIuCisvKiBJZiBpc19zcGxpdCBpcyB0cnVlLCBkbyBhIHNwbGl0IGJhcnJpZXIsIG90aGVyd2lzZSwgZG8gYSBwbGFpbiBiYXJyaWVyCisgICBJZiByZWR1Y2UgaXMgbm9uLU5VTEwsIGRvIGEgc3BsaXQgcmVkdWN0aW9uIGJhcnJpZXIsIG90aGVyd2lzZSwgZG8gYSBzcGxpdCBiYXJyaWVyCisgICBSZXR1cm5zIDAgaWYgbWFzdGVyIHRocmVhZCwgMSBpZiB3b3JrZXIgdGhyZWFkLiAgKi8KK2ludAorX19rbXBfYmFycmllcihlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQsIGludCBpc19zcGxpdCwgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgICAgICAgICAgICB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopKQoreworICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9wbGFpbl9iYXJyaWVyKTsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhQTEFJTl9CQVJSSUVSKTsKKyAgICByZWdpc3RlciBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgIHJlZ2lzdGVyIGludCBzdGF0dXMgPSAwOworICAgIGlkZW50X3QgKmxvYyA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2lkZW50OworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgb21wdF9wYXJhbGxlbF9pZF90IG15X3BhcmFsbGVsX2lkOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9iYXJyaWVyOiBUIyVkKCVkOiVkKSBoYXMgYXJyaXZlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkpKTsKKworICAgIEFOTk9UQVRFX05FV19CQVJSSUVSX0JFR0lOKCZ0ZWFtLT50LnRfYmFyKTsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9CTEFNRQorICAgICAgICBteV90YXNrX2lkID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICBteV9wYXJhbGxlbF9pZCA9IHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisKKyNpZiBPTVBUX1RSQUNFCisgICAgICAgIGlmICh0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfc2luZ2xlKSB7CisgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfZW5kKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCkoCisgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2JlZ2luKSgKKyAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvLyBJdCBpcyBPSyB0byByZXBvcnQgdGhlIGJhcnJpZXIgc3RhdGUgYWZ0ZXIgdGhlIGJhcnJpZXIgYmVnaW4gY2FsbGJhY2suCisgICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgT01QVCBzcGVjaWZpY2F0aW9uLCBhIGNvbXBsaWFudCBpbXBsZW1lbnRhdGlvbiBtYXkKKyAgICAgICAgLy8gZXZlbiBkZWxheSByZXBvcnRpbmcgdGhpcyBzdGF0ZSB1bnRpbCB0aGUgYmFycmllciBiZWdpbnMgdG8gd2FpdC4KKyAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcjsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICghIHRlYW0tPnQudF9zZXJpYWxpemVkKSB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBpbiBpdHQgbm90aWZ5IGV2ZW50cyBiZWxvdy4KKyAgICAgICAgdm9pZCAqaXR0X3N5bmNfb2JqID0gTlVMTDsKKyMgaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJ0LCAxKTsKKyMgZW5kaWYKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9leHRyYV9iYXJyaWVyKSB7CisgICAgICAgICAgICBfX2ttcF90YXNraW5nX2JhcnJpZXIodGVhbSwgdGhpc190aHIsIGd0aWQpOworICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfYmFycmllcjogVCMlZCglZDolZCkgcGFzdCB0YXNraW5nIGJhcnJpZXJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvcHkgdGhlIGJsb2NrdGltZSBpbmZvIHRvIHRoZSB0aHJlYWQsIHdoZXJlIF9fa21wX3dhaXRfdGVtcGxhdGUoKSBjYW4gYWNjZXNzIGl0IHdoZW4KKyAgICAgICAgICAgdGhlIHRlYW0gc3RydWN0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LiAqLworICAgICAgICAvLyBTZWUgbm90ZSBhYm91dCB0aGUgY29ycmVzcG9uZGluZyBjb2RlIGluIF9fa21wX2pvaW5fYmFycmllcigpIGJlaW5nIHBlcmZvcm1hbmNlLWNyaXRpY2FsLgorICAgICAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFscyA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisjZW5kaWYKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X3NldCA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9zZXQ7CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgIC8vIExldCB0aGUgZGVidWdnZXIga25vdzogdGhlIHRocmVhZCBhcnJpdmVkIHRvIHRoZSBiYXJyaWVyIGFuZCB3YWl0aW5nLgorICAgICAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBNYXN0ZXIgY291bnRlciBpcyBzdG9yZWQgaW4gdGVhbSBzdHJ1Y3R1cmUuCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX21hc3Rlcl9hcnJpdmVkICs9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYi5iX3dvcmtlcl9hcnJpdmVkICs9IDE7CisgICAgICAgIH0gLy8gaWYKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KKyAgICAgICAgaWYgKHJlZHVjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvL0tNUF9ERUJVR19BU1NFUlQoIGlzX3NwbGl0ID09IFRSVUUgKTsgIC8vICNDNjk5NTYKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSA9IHJlZHVjZV9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkgJiYgX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpCisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAodGhpc190aHIsIHRlYW0sIDApOyAvLyB1c2UgMCB0byBvbmx5IHNldHVwIHRoZSBjdXJyZW50IHRlYW0gaWYgbnRocmVhZHMgPiAxCisKKyAgICAgICAgc3dpdGNoIChfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuW2J0XSkgeworICAgICAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tidF0pOyAvLyBkb24ndCBzZXQgYnJhbmNoIGJpdHMgdG8gMDsgdXNlIGxpbmVhcgorICAgICAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgICAgICBfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBicF90cmVlX2JhcjogeworICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tidF0pOyAvLyBkb24ndCBzZXQgYnJhbmNoIGJpdHMgdG8gMDsgdXNlIGxpbmVhcgorICAgICAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcihidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcihidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV93YWl0KHRoaXNfdGhyLCB0ZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgfQorI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgLy8gTGV0IHRoZSBkZWJ1Z2dlciBrbm93OiBBbGwgdGhyZWFkcyBhcmUgYXJyaXZlZCBhbmQgc3RhcnRpbmcgbGVhdmluZyB0aGUgYmFycmllci4KKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfdGVhbV9hcnJpdmVkICs9IDE7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIC8qIFRPRE86IEluIGNhc2Ugb2Ygc3BsaXQgcmVkdWN0aW9uIGJhcnJpZXIsIG1hc3RlciB0aHJlYWQgbWF5IHNlbmQgYWNxdWlyZWQgZXZlbnQgZWFybHksCisgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGZpbmFsIHN1bW1hdGlvbiBpbnRvIHRoZSBzaGFyZWQgdmFyaWFibGUgaXMgZG9uZSAoZmluYWwgc3VtbWF0aW9uIGNhbiBiZSBhCisgICAgICAgICAgICAgICBsb25nIG9wZXJhdGlvbiBmb3IgYXJyYXkgcmVkdWN0aW9ucykuICAqLworICAgICAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAvLyBCYXJyaWVyIC0gcmVwb3J0IGZyYW1lIGVuZCAob25seSBpZiBhY3RpdmVfbGV2ZWwgPT0gMSkKKyAgICAgICAgICAgIGlmICgoX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMICYmCisjZW5kaWYKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBjdXJfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgICAgIGludCBucHJvYyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIHN3aXRjaChfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIDAsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSA9IGN1cl90aW1lOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IC8vIEFDIDIwMTUtMDEtMTk6IGN1cnJlbnRseSBkb2VzIG5vdCB3b3JrIGZvciBoaWVyYXJjaGljYWwgKHRvIGJlIGZpeGVkKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsIGN1cl90aW1lLCAxLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBpZiggX19pdHRfbWV0YWRhdGFfYWRkX3B0ciApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBtYXN0ZXIncyB3YWl0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgZGVsdGEgPSBjdXJfdGltZSAtIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYXJyaXZlIHRpbWUgdG8gemVybyB0byBiZSBhYmxlIHRvIGNoZWNrIGl0IGluIF9fa21wX2ludm9rZV90YXNrKCk7IHRoZSBzYW1lIGlzIGRvbmUgaW5zaWRlIHRoZSBsb29wIGJlbG93CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSArPSAoIGN1cl90aW1lIC0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyX2Fycml2ZV90aW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyX2Fycml2ZV90aW1lID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9pbWJhbGFuY2UoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCBkZWx0YSwgKGttcF91aW50NjQpKCByZWR1Y2UgIT0gTlVMTCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCAwLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUgPSBjdXJfdGltZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDE7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IDEgfHwgISBpc19zcGxpdCkgeworICAgICAgICAgICAgc3dpdGNoIChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVybltidF0pIHsKKyAgICAgICAgICAgIGNhc2UgYnBfaHlwZXJfYmFyOiB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnRdKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgYnBfaGllcmFyY2hpY2FsX2JhcjogeworICAgICAgICAgICAgICAgIF9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIGJwX3RyZWVfYmFyOiB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnRdKTsKKyAgICAgICAgICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV9zeW5jKHRoaXNfdGhyLCB0ZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvKiBHRUg6IFRPRE86IE1vdmUgdGhpcyB1bmRlciBpZi1jb25kaXRpb24gYWJvdmUgYW5kIGFsc28gaW5jbHVkZSBpbgorICAgICAgICAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllcigpLiBUaGlzIHdpbGwgbW9yZSBhY2N1cmF0ZWx5IHJlcHJlc2VudCB0aGUgYWN0dWFsIHJlbGVhc2UgdGltZQorICAgICAgICAgICBvZiB0aGUgdGhyZWFkcyBmb3Igc3BsaXQgYmFycmllcnMuICAqLworICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZChndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9IGVsc2UgeyAvLyBUZWFtIGlzIHNlcmlhbGl6ZWQuCisgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworI2lmIE9NUF80NV9FTkFCTEVECisgICAgICAgICAgICBpZiAoIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICB2b2lkICppdHRfc3luY19vYmogPSBOVUxMOworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBidCwgMSk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKGd0aWQsIGl0dF9zeW5jX29iaik7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzID09IFRSVUUpOworICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV93YWl0KHRoaXNfdGhyLCB0ZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV9zZXR1cCh0aGlzX3RociwgdGVhbSwgMCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZChndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAvLyBUaGUgdGFzayB0ZWFtIHNob3VsZCBiZSBOVUxMIGZvciBzZXJpYWxpemVkIGNvZGUgKHRhc2tzIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkpCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdID09IE5VTEwpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID09IE5VTEwpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfYmFycmllcjogVCMlZCglZDolZCkgaXMgbGVhdmluZyB3aXRoIHJldHVybiB2YWx1ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksIHN0YXR1cykpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfQkxBTUUKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2VuZCkpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2VuZCkoCisgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQsIG15X3Rhc2tfaWQpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgfQorI2VuZGlmCisgICAgQU5OT1RBVEVfTkVXX0JBUlJJRVJfRU5EKCZ0ZWFtLT50LnRfYmFyKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZAorX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGludCBndGlkKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhLTVBfZW5kX3NwbGl0X2JhcnJpZXIpOworICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKFBMQUlOX0JBUlJJRVIpOworICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisKKyAgICBBTk5PVEFURV9ORVdfQkFSUklFUl9CRUdJTigmdGVhbS0+dC50X2Jhcik7CisgICAgaWYgKCF0ZWFtLT50LnRfc2VyaWFsaXplZCkgeworICAgICAgICBpZiAoS01QX01BU1RFUl9HVElEKGd0aWQpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuW2J0XSkgeworICAgICAgICAgICAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF0pOworICAgICAgICAgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgYnBfaGllcmFyY2hpY2FsX2JhcjogeworICAgICAgICAgICAgICAgIF9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIGJwX3RyZWVfYmFyOiB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnRdKTsKKyAgICAgICAgICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwgRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3N5bmModGhpc190aHIsIHRlYW0pOworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9CisgICAgfQorICAgIEFOTk9UQVRFX05FV19CQVJSSUVSX0VORCgmdGVhbS0+dC50X2Jhcik7Cit9CisKKwordm9pZAorX19rbXBfam9pbl9iYXJyaWVyKGludCBndGlkKQoreworICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9qb2luX2JhcnJpZXIpOworICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKEZPUktfSk9JTl9CQVJSSUVSKTsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfdWludCBucHJvYzsKKyAgICBrbXBfaW5mb190ICptYXN0ZXJfdGhyZWFkOworICAgIGludCB0aWQ7CisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IHRlYW1faWQ7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgKml0dF9zeW5jX29iaiA9IE5VTEw7CisjIGlmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAvLyBEb24ndCBjYWxsIHJvdXRpbmUgd2l0aG91dCBuZWVkCisgICAgICAgIC8vIEdldCBvYmplY3QgY3JlYXRlZCBhdCBmb3JrX2JhcnJpZXIKKyAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworIyBlbmRpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBLTVBfTUIoKTsKKworICAgIC8vIEdldCBjdXJyZW50IGluZm8KKyAgICB0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICBLTVBfREVCVUdfQVNTRVJUKChpbnQpbnByb2MgPT0gdGVhbS0+dC50X25wcm9jKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworI2lmZGVmIEtNUF9ERUJVRworICAgIHRlYW1faWQgPSB0ZWFtLT50LnRfaWQ7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgbWFzdGVyX3RocmVhZCA9IHRoaXNfdGhyLT50aC50aF90ZWFtX21hc3RlcjsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpZiAobWFzdGVyX3RocmVhZCAhPSB0ZWFtLT50LnRfdGhyZWFkc1swXSkgeworICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmUoKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgS01QX0RFQlVHX0FTU0VSVChtYXN0ZXJfdGhyZWFkID09IHRlYW0tPnQudF90aHJlYWRzWzBdKTsKKyAgICBLTVBfTUIoKTsKKworICAgIC8vIFZlcmlmeSBzdGF0ZQorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGhyZWFkcyAmJiBfX2ttcF90aHJlYWRzW2d0aWRdKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3RlYW0pKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3Jvb3QpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IHRlYW0tPnQudF90aHJlYWRzW3RpZF0pOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgYXJyaXZlZCBhdCBqb2luIGJhcnJpZXJcbiIsIGd0aWQsIHRlYW1faWQsIHRpZCkpOworCisgICAgQU5OT1RBVEVfTkVXX0JBUlJJRVJfQkVHSU4oJnRlYW0tPnQudF9iYXIpOworI2lmIE9NUFRfU1VQUE9SVAorI2lmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2JlZ2luKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbikoCisgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKyAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyOworI2VuZGlmCisKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllcikgeworICAgICAgICBfX2ttcF90YXNraW5nX2JhcnJpZXIodGVhbSwgdGhpc190aHIsIGd0aWQpOworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIHBhc3QgdGFraW5nIGJhcnJpZXJcbiIsIGd0aWQsIHRlYW1faWQsIHRpZCkpOworICAgIH0KKyMgaWZkZWYgS01QX0RFQlVHCisgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoICJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQsIG9sZCB0ZWFtID0gJWQsIG9sZCB0YXNrX3RlYW0gPSAlcCwgdGhfdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCB0ZWFtX2lkLCB0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSkpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPT0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0pOworICAgIH0KKyMgZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAvKiBDb3B5IHRoZSBibG9ja3RpbWUgaW5mbyB0byB0aGUgdGhyZWFkLCB3aGVyZSBfX2ttcF93YWl0X3RlbXBsYXRlKCkgY2FuIGFjY2VzcyBpdCB3aGVuIHRoZQorICAgICAgIHRlYW0gc3RydWN0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LiBEb2luZyB0aGVzZSBsb2FkcyBjYXVzZXMgYSBjYWNoZSBtaXNzIHNsb3dzCisgICAgICAgZG93biBFUENDIHBhcmFsbGVsIGJ5IDJ4LiBBcyBhIHdvcmthcm91bmQsIHdlIGRvIG5vdCBwZXJmb3JtIHRoZSBjb3B5IGlmIGJsb2NrdGltZT1pbmZpbml0ZSwKKyAgICAgICBzaW5jZSB0aGUgdmFsdWVzIGFyZSBub3QgdXNlZCBieSBfX2ttcF93YWl0X3RlbXBsYXRlKCkgaW4gdGhhdCBjYXNlLiAqLworICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworI2lmIEtNUF9VU0VfTU9OSVRPUgorICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfaW50ZXJ2YWxzOworI2VuZGlmCisgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X3NldCA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9zZXQ7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBzd2l0Y2ggKF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bYnNfZm9ya2pvaW5fYmFycmllcl0pIHsKKyAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2JzX2Zvcmtqb2luX2JhcnJpZXJdKTsKKyAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGJwX2hpZXJhcmNoaWNhbF9iYXI6IHsKKyAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9nYXRoZXIoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICB9CisgICAgfQorCisgICAgLyogRnJvbSB0aGlzIHBvaW50IG9uLCB0aGUgdGVhbSBkYXRhIHN0cnVjdHVyZSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgYW55IHRpbWUgYnkgdGhlCisgICAgICAgbWFzdGVyIHRocmVhZCAtIGl0IGlzIHVuc2FmZSB0byByZWZlcmVuY2UgaXQgaW4gYW55IG9mIHRoZSB3b3JrZXIgdGhyZWFkcy4gQW55IHBlci10ZWFtCisgICAgICAgZGF0YSBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgcmVmZXJlbmNlZCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgYmFycmllciBzaG91bGQgYmUgbW92ZWQgdG8KKyAgICAgICB0aGUga21wX3Rhc2tfdGVhbV90IHN0cnVjdHMuICAqLworICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3dhaXQodGhpc190aHIsIHRlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgfQorI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAgICAgIC8vIEhhdmUgbWFzdGVyIHRocmVhZCBmbGFnIHRoZSB3b3JrZXJzIHRvIGluZGljYXRlIHRoZXkgYXJlIG5vdyB3YWl0aW5nIGZvcgorICAgICAgICAvLyBuZXh0IHBhcmFsbGVsIHJlZ2lvbiwgQWxzbyB3YWtlIHRoZW0gdXAgc28gdGhleSBzd2l0Y2ggdGhlaXIgdGltZXJzIHRvIGlkbGUuCisgICAgICAgIGZvciAoaW50IGk9MDsgaTx0ZWFtLT50LnRfbnByb2M7ICsraSkgeworICAgICAgICAgICAga21wX2luZm9fdCogdGVhbV90aHJlYWQgPSB0ZWFtLT50LnRfdGhyZWFkc1tpXTsKKyAgICAgICAgICAgIGlmICh0ZWFtX3RocmVhZCA9PSB0aGlzX3RocikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHRlYW1fdGhyZWFkLT50aC50aF9zdGF0cy0+c2V0SWRsZUZsYWcoKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSAmJiB0ZWFtX3RocmVhZC0+dGgudGhfc2xlZXBfbG9jICE9IE5VTEwpCisgICAgICAgICAgICAgICAgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRlYW1fdGhyZWFkKSwgdGVhbV90aHJlYWQtPnRoLnRoX3NsZWVwX2xvYyk7CisgICAgICAgIH0KKyNlbmRpZgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjIGlmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgLy8gSm9pbiBiYXJyaWVyIC0gcmVwb3J0IGZyYW1lIGVuZAorICAgICAgICBpZiAoKF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgfHwgS01QX0lUVF9ERUJVRykgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgJiYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMICYmCisjZW5kaWYKKyAgICAgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAga21wX3VpbnQ2NCBjdXJfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICAgICAgICAgIGlkZW50X3QgKiBsb2MgPSB0ZWFtLT50LnRfaWRlbnQ7CisgICAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgaW50IG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHN3aXRjaChfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCAwLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsIGN1cl90aW1lLCAxLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBpZiggX19pdHRfbWV0YWRhdGFfYWRkX3B0ciApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIG1hc3RlcidzIHdhaXQgdGltZQorICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IGRlbHRhID0gY3VyX3RpbWUgLSB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lOworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYXJyaXZlIHRpbWUgdG8gemVybyB0byBiZSBhYmxlIHRvIGNoZWNrIGl0IGluIF9fa21wX2ludm9rZV90YXNrKCk7IHRoZSBzYW1lIGlzIGRvbmUgaW5zaWRlIHRoZSBsb29wIGJlbG93CisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTsgaTxucHJvYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSArPSAoIGN1cl90aW1lIC0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyX2Fycml2ZV90aW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9pbWJhbGFuY2UoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCBkZWx0YSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCAwLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSA9IGN1cl90aW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjIGVuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGVsc2UgeworICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgS01QX0RFQlVHCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkKCVkOiVkKSBzYXlzIGFsbCAlZCB0ZWFtIHRocmVhZHMgYXJyaXZlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtX2lkLCB0aWQsIG5wcm9jKSk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgLy8gVE9ETyBub3csIG1hcmsgd29ya2VyIHRocmVhZHMgYXMgZG9uZSBzbyB0aGV5IG1heSBiZSBkaXNiYW5kZWQKKyAgICBLTVBfTUIoKTsgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgbGVhdmluZ1xuIiwgZ3RpZCwgdGVhbV9pZCwgdGlkKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9CTEFNRQorICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfZW5kKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfZW5kKSgKKyAgICAgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vIHJldHVybiB0byBkZWZhdWx0IHN0YXRlCisgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICB9CisjZW5kaWYKKyAgICBBTk5PVEFURV9ORVdfQkFSUklFUl9FTkQoJnRlYW0tPnQudF9iYXIpOworfQorCisKKy8vIFRPRE8gcmVsZWFzZSB3b3JrZXIgdGhyZWFkcycgZm9yayBiYXJyaWVycyBhcyB3ZSBhcmUgcmVhZHkgaW5zdGVhZCBvZiBhbGwgYXQgb25jZQordm9pZAorX19rbXBfZm9ya19iYXJyaWVyKGludCBndGlkLCBpbnQgdGlkKQoreworICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9mb3JrX2JhcnJpZXIpOworICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKEZPUktfSk9JTl9CQVJSSUVSKTsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAga21wX3RlYW1fdCAqdGVhbSA9ICh0aWQgPT0gMCkgPyB0aGlzX3Roci0+dGgudGhfdGVhbSA6IE5VTEw7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBOVUxMOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBpZiAodGVhbSkKKyAgICAgIEFOTk9UQVRFX05FV19CQVJSSUVSX0VORCgmdGVhbS0+dC50X2Jhcik7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGhhcyBhcnJpdmVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgKHRlYW0gIT0gTlVMTCkgPyB0ZWFtLT50LnRfaWQgOiAtMSwgdGlkKSk7CisKKyAgICAvLyB0aF90ZWFtIHBvaW50ZXIgb25seSB2YWxpZCBmb3IgbWFzdGVyIHRocmVhZCBoZXJlCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGl0dCBiYXJyaWVyIG9iamVjdAorICAgICAgICAgICAgaXR0X3N5bmNfb2JqICA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAxKTsKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOyAgLy8gQ2FsbCBhY3F1aXJlZC9yZWxlYXNpbmcKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICByZWdpc3RlciBpbnQgaTsKKworICAgICAgICAvLyBWZXJpZnkgc3RhdGUKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgZm9yKGk9MTsgaTx0ZWFtLT50LnRfbnByb2M7ICsraSkgeworICAgICAgICAgICAgS0FfVFJBQ0UoNTAwLCAoIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCglZDowKSBjaGVja2luZyBUIyVkKCVkOiVkKSBmb3JrIGdvID09ICV1LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19ndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXS5iYi5iX2dvKSk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChUQ1JfNChvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYmIuYl9nbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgfihLTVBfQkFSUklFUl9TTEVFUF9TVEFURSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtID09IHRlYW0pOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV9zZXR1cCh0aGlzX3RociwgdGVhbSwgMCk7ICAvLyAwIGluZGljYXRlcyBzZXR1cCBjdXJyZW50IHRhc2sgdGVhbSBpZiBudGhyZWFkcyA+IDEKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSBtYXN0ZXIgdGhyZWFkIG1heSBoYXZlIGNoYW5nZWQgaXRzIGJsb2NrdGltZSBiZXR3ZWVuIHRoZSBqb2luIGJhcnJpZXIgYW5kIHRoZQorICAgICAgICAgICBmb3JrIGJhcnJpZXIuIENvcHkgdGhlIGJsb2NrdGltZSBpbmZvIHRvIHRoZSB0aHJlYWQsIHdoZXJlIF9fa21wX3dhaXRfdGVtcGxhdGUoKSBjYW4KKyAgICAgICAgICAgYWNjZXNzIGl0IHdoZW4gdGhlIHRlYW0gc3RydWN0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LiAqLworICAgICAgICAvLyBTZWUgbm90ZSBhYm91dCB0aGUgY29ycmVzcG9uZGluZyBjb2RlIGluIF9fa21wX2pvaW5fYmFycmllcigpIGJlaW5nIHBlcmZvcm1hbmNlLWNyaXRpY2FsCisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworI2lmIEtNUF9VU0VfTU9OSVRPUgorICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X2ludGVydmFsczsKKyNlbmRpZgorICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfc2V0ID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X3NldDsKKyAgICAgICAgfQorICAgIH0gLy8gbWFzdGVyCisKKyAgICBzd2l0Y2ggKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuW2JzX2Zvcmtqb2luX2JhcnJpZXJdKSB7CisgICAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnNfZm9ya2pvaW5fYmFycmllcl0pOworICAgICAgICBfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgIF9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2UoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnNfZm9ya2pvaW5fYmFycmllcl0pOworICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgIH0KKyAgICB9CisKKyAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICBpZiAoVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkIGlzIGxlYXZpbmcgZWFybHlcbiIsIGd0aWQpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFdlIGNhbiBub3cgYXNzdW1lIHRoYXQgYSB2YWxpZCB0ZWFtIHN0cnVjdHVyZSBoYXMgYmVlbiBhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciBhbmQKKyAgICAgICBwcm9wYWdhdGVkIHRvIGFsbCB3b3JrZXIgdGhyZWFkcy4gVGhlIGN1cnJlbnQgdGhyZWFkLCBob3dldmVyLCBtYXkgbm90IGJlIHBhcnQgb2YgdGhlCisgICAgICAgdGVhbSwgc28gd2UgY2FuJ3QgYmxpbmRseSBhc3N1bWUgdGhhdCB0aGUgdGVhbSBwb2ludGVyIGlzIG5vbi1udWxsLiAgKi8KKyAgICB0ZWFtID0gKGttcF90ZWFtX3QgKilUQ1JfUFRSKHRoaXNfdGhyLT50aC50aF90ZWFtKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVTEwKKyAgICAvKiBNYXN0ZXIgdGhyZWFkJ3MgY29weSBvZiB0aGUgSUNWcyB3YXMgc2V0IHVwIG9uIHRoZSBpbXBsaWNpdCB0YXNrZGF0YSBpbgorICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtLiBfX2ttcF9mb3JrX2NhbGwoKSBhc3N1bWVzIHRoZSBtYXN0ZXIgdGhyZWFkJ3MgaW1wbGljaXQgdGFzayBoYXMKKyAgICAgICB0aGlzIGRhdGEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBXZSBjYW5ub3QgbW9kaWZ5IF9fa21wX2ZvcmtfY2FsbCgpIHRvIGxvb2sgYXQKKyAgICAgICB0aGUgZml4ZWQgSUNWcyBpbiB0aGUgbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdCwgYmVjYXVzZSBpdCBpcyBub3QgYWx3YXlzIHRoZSBjYXNlIHRoYXQgdGhlCisgICAgICAgdGhyZWFkcyBhcnJheXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aGVuIF9fa21wX2ZvcmtfY2FsbCgpIGlzIGV4ZWN1dGVkLiAqLworICAgIHsKKyAgICAgICAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKFVTRVJfaWN2X2NvcHkpOworICAgICAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsgIC8vIG1hc3RlciB0aHJlYWQgYWxyZWFkeSBoYXMgSUNWcworICAgICAgICAgICAgLy8gQ29weSB0aGUgaW5pdGlhbCBJQ1ZzIGZyb20gdGhlIG1hc3RlcidzIHRocmVhZCBzdHJ1Y3QgdG8gdGhlIGltcGxpY2l0IHRhc2sgZm9yIHRoaXMgdGlkLgorICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkKSBpcyBQVUxMaW5nIElDVnNcbiIsIGd0aWQsIHRpZCkpOworICAgICAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLCBGQUxTRSk7CisgICAgICAgICAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXS5iYi50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorCisgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgIF9fa21wX3Rhc2tfdGVhbV9zeW5jKHRoaXNfdGhyLCB0ZWFtKTsKKyAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCA9IHRlYW0tPnQudF9wcm9jX2JpbmQ7CisgICAgaWYgKHByb2NfYmluZCA9PSBwcm9jX2JpbmRfaW50ZWwpIHsKKyNlbmRpZgorI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgLy8gQ2FsbCBkeW5hbWljIGFmZmluaXR5IHNldHRpbmdzCisgICAgICAgIGlmKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfYmFsYW5jZWQgJiYgdGVhbS0+dC50X3NpemVfY2hhbmdlZCkgeworICAgICAgICAgICAgX19rbXBfYmFsYW5jZWRfYWZmaW5pdHkodGlkLCB0ZWFtLT50LnRfbnByb2MpOworICAgICAgICB9CisjZW5kaWYgLy8gS01QX0FGRklOSVRZX1NVUFBPUlRFRAorI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICB9CisgICAgZWxzZSBpZiAocHJvY19iaW5kICE9IHByb2NfYmluZF9mYWxzZSkgeworICAgICAgICBpZiAodGhpc190aHItPnRoLnRoX25ld19wbGFjZSA9PSB0aGlzX3Roci0+dGgudGhfY3VycmVudF9wbGFjZSkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCBhbHJlYWR5IGluIGNvcnJlY3QgcGxhY2UgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfcGxhY2UpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3NldF9wbGFjZShndGlkKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykgeworICAgICAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgICAgIC8vIEdldCBjb3JyZWN0IGJhcnJpZXIgb2JqZWN0CisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZChndGlkLCBpdHRfc3luY19vYmopOyAgLy8gV29ya2VycyBjYWxsIGFjcXVpcmVkCisgICAgICAgIH0gLy8gKHByZXBhcmUgY2FsbGVkIGluc2lkZSBiYXJyaWVyX3JlbGVhc2UpCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICBBTk5PVEFURV9ORVdfQkFSUklFUl9FTkQoJnRlYW0tPnQudF9iYXIpOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCglZDolZCkgaXMgbGVhdmluZ1xuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQpKTsKK30KKworCit2b2lkCitfX2ttcF9zZXR1cF9pY3ZfY29weShrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbmV3X25wcm9jLCBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soS01QX3NldHVwX2ljdl9jb3B5KTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAmJiBuZXdfbnByb2MgJiYgbmV3X2ljdnMpOworICAgIEtNUF9ERUJVR19BU1NFUlQoKCFUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgfHwgbmV3X2ljdnMtPm5wcm9jKTsKKworICAgIC8qIE1hc3RlciB0aHJlYWQncyBjb3B5IG9mIHRoZSBJQ1ZzIHdhcyBzZXQgdXAgb24gdGhlIGltcGxpY2l0IHRhc2tkYXRhIGluCisgICAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0uIF9fa21wX2ZvcmtfY2FsbCgpIGFzc3VtZXMgdGhlIG1hc3RlciB0aHJlYWQncyBpbXBsaWNpdCB0YXNrIGhhcworICAgICAgIHRoaXMgZGF0YSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICovCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVTEwKKyAgICAvKiBDb3B5IElDVnMgdG8gbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdHVyZSBpbnRvIHRoX2ZpeGVkX2ljdnMgKHdoaWNoIHJlbWFpbnMgdW50b3VjaGVkKSwgd2hlcmUKKyAgICAgICBhbGwgb2YgdGhlIHdvcmtlciB0aHJlYWRzIGNhbiBhY2Nlc3MgdGhlbSBhbmQgbWFrZSB0aGVpciBvd24gY29waWVzIGFmdGVyIHRoZSBiYXJyaWVyLiAqLworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbMF0pOyAgLy8gVGhlIHRocmVhZHMgYXJyYXlzIHNob3VsZCBiZSBhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludAorICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXS5iYi50aF9maXhlZF9pY3ZzLCBuZXdfaWN2cyk7CisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfc2V0dXBfaWN2X2NvcHk6IFBVTEw6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtKSk7CisjZWxpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgIC8vIFRoZSBJQ1ZzIHdpbGwgYmUgcHJvcGFnYXRlZCBpbiB0aGUgZm9yayBiYXJyaWVyLCBzbyBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgaGVyZS4KKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogUFVTSDogVCMlZCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgMCwgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0pKTsKKyNlbHNlCisgICAgLy8gQ29weSB0aGUgSUNWcyB0byBlYWNoIG9mIHRoZSBub24tbWFzdGVyIHRocmVhZHMuICBUaGlzIHRha2VzIE8obnRocmVhZHMpIHRpbWUuCisgICAgbmdvX2xvYWQobmV3X2ljdnMpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbMF0pOyAgLy8gVGhlIHRocmVhZHMgYXJyYXlzIHNob3VsZCBiZSBhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludAorICAgIGZvciAoaW50IGY9MTsgZjxuZXdfbnByb2M7ICsrZikgeyAvLyBTa2lwIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIC8vIFRPRE86IEdFSCAtIHBhc3MgaW4gYmV0dGVyIHNvdXJjZSBsb2NhdGlvbiBpbmZvIHNpbmNlIHVzdWFsbHkgTlVMTCBoZXJlCisgICAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldHVwX2ljdl9jb3B5OiBMSU5FQVI6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSkpOworICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sobG9jLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSwgZiwgRkFMU0UpOworICAgICAgICBuZ29fc3RvcmVfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbZl0udGRfaWN2cywgbmV3X2ljdnMpOworICAgICAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogTElORUFSOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZiwgdGVhbS0+dC50X3RocmVhZHNbZl0sIHRlYW0pKTsKKyAgICB9CisgICAgbmdvX3N5bmMoKTsKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9jYW5jZWwuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9jYW5jZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTYwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2NhbmNlbC5jcHAKQEAgLTAsMCArMSwyODIgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBjbmNsX2tpbmQgQ2FuY2VsbGF0aW9uIGtpbmQgKHBhcmFsbGVsLCBmb3IsIHNlY3Rpb25zLCB0YXNrZ3JvdXApCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBhY3RpdmF0ZWQgYW5kIHRoZSBleGVjdXRpb24gdGhyZWFkCituZWVkcyB0byBwcm9jZWVkIHRvIHRoZSBlbmQgb2YgdGhlIGNhbmNlbGVkIHJlZ2lvbi4KKworUmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgdGhlIGJpbmRpbmcgT3Blbk1QIHJlZ2lvbi4KKyovCitrbXBfaW50MzIgX19rbXBjX2NhbmNlbChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCkgeworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfY2FuY2VsOiBUIyVkIHJlcXVlc3QgJWQgT01QX0NBTkNFTExBVElPTj0lZFxuIiwgZ3RpZCwgY25jbF9raW5kLCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgIT0gY2FuY2VsX25vcmVxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGNuY2xfa2luZCA9PSBjYW5jZWxfcGFyYWxsZWwgfHwgY25jbF9raW5kID09IGNhbmNlbF9sb29wIHx8CisgICAgICAgICAgICAgICAgICAgICBjbmNsX2tpbmQgPT0gY2FuY2VsX3NlY3Rpb25zIHx8IGNuY2xfa2luZCA9PSBjYW5jZWxfdGFza2dyb3VwKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF9ndGlkKCkgPT0gZ3RpZCk7CisKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBzd2l0Y2ggKGNuY2xfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0ZWFtIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190ZWFtKTsKKyAgICAgICAgICAgICAgICBrbXBfaW50MzIgb2xkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCYodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpLCBjYW5jZWxfbm9yZXEsIGNuY2xfa2luZCk7CisgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSBjYW5jZWxfbm9yZXEgfHwgb2xkID09IGNuY2xfa2luZCkgeworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiX19rbXBjX2NhbmNlbDogdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3Q9JWQgQCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QsICYodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBpbiB0aGlzIHRlYW0gb3Igd2UgZG8gaGF2ZSBvbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHJlcXVlc3QgLT4gY2FuY2VsCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIHRydWUgKi87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIGNhbmNlbF90YXNrZ3JvdXA6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIGEgdGFzayBncm91cAorICAgICAgICAgICAgLy8gYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgdGFza2dyb3VwIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90YXNrZGF0YV90KiAgdGFzazsKKyAgICAgICAgICAgICAgICBrbXBfdGFza2dyb3VwX3QqIHRhc2tncm91cDsKKworICAgICAgICAgICAgICAgIHRhc2sgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2sgKTsKKworICAgICAgICAgICAgICAgIHRhc2tncm91cCA9IHRhc2stPnRkX3Rhc2tncm91cDsKKyAgICAgICAgICAgICAgICBpZiAodGFza2dyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBvbGQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoJih0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0KSwgY2FuY2VsX25vcmVxLCBjbmNsX2tpbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkID09IGNhbmNlbF9ub3JlcSB8fCBvbGQgPT0gY25jbF9raW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGluIHRoaXMgdGFza2dyb3VwIG9yIHdlIGRvIGhhdmUgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgcmVxdWVzdCAtPiBjYW5jZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIHRydWUgKi87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgbmVlZHMgdG8gaGFwcGVuIGhlcmU/CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGVjaWZpY2F0aW9uIGRpc2FsbG93cyBjYW5jZWxsYXRpb24gdy9vIHRhc2tncm91cHMKKyAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgbWlnaHQgZG8gYW55dGhpbmcgaGVyZSwgbGV0J3MgYWJvcnQgZm9yIG5vdworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAwIC8qIGZhbHNlICovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKDAgLyogZmFsc2UgKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSUNWIE9NUF9DQU5DRUxMQVRJT049ZmFsc2UsIHNvIHdlIGlnbm9yZWQgdGhpcyBjYW5jZWwgcmVxdWVzdAorICAgIEtNUF9ERUJVR19BU1NFUlQoIV9fa21wX29tcF9jYW5jZWxsYXRpb24pOworICAgIHJldHVybiAwIC8qIGZhbHNlICovOworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBjbmNsX2tpbmQgQ2FuY2VsbGF0aW9uIGtpbmQgKHBhcmFsbGVsLCBmb3IsIHNlY3Rpb25zLCB0YXNrZ3JvdXApCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gZmxhZ2dlZCBpbiB0aGUgUlRMIGFuZCB0aGUKK2VuY291bnRlcmluZyB0aHJlYWQgaGFzIHRvIGNhbmNlbC4uCisKK0NhbmNlbGxhdGlvbiBwb2ludCBmb3IgdGhlIGVuY291bnRlcmluZyB0aHJlYWQuCisqLwora21wX2ludDMyIF9fa21wY19jYW5jZWxsYXRpb25wb2ludChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCkgeworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQ6IFQjJWQgcmVxdWVzdCAlZCBPTVBfQ0FOQ0VMTEFUSU9OPSVkXG4iLCBndGlkLCBjbmNsX2tpbmQsIF9fa21wX29tcF9jYW5jZWxsYXRpb24pICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKGNuY2xfa2luZCAhPSBjYW5jZWxfbm9yZXEpOworICAgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kID09IGNhbmNlbF9wYXJhbGxlbCB8fCBjbmNsX2tpbmQgPT0gY2FuY2VsX2xvb3AgfHwKKyAgICAgICAgICAgICAgICAgICAgIGNuY2xfa2luZCA9PSBjYW5jZWxfc2VjdGlvbnMgfHwgY25jbF9raW5kID09IGNhbmNlbF90YXNrZ3JvdXApOworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZ2V0X2d0aWQoKSA9PSBndGlkKTsKKworICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIHN3aXRjaCAoY25jbF9raW5kKSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgICAgICBjYXNlIGNhbmNlbF9zZWN0aW9uczoKKyAgICAgICAgICAgIC8vIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBmb3IgcGFyYWxsZWwgYW5kIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKyAgICAgICAgICAgIC8vIGFyZSBoYW5kbGVkIHRocm91Z2ggdGhlIHRlYW0gc3RydWN0dXJlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RlYW0pOworICAgICAgICAgICAgICAgIGlmICh0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY25jbF9raW5kID09IHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBpbiB0aGUgdGVhbSBzdHJ1Y3R1cmUgbWF0Y2hlcyB0aGUgdHlwZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHBvaW50IHNvIHdlIGNhbiBjYW5jZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIHRydWUgKi87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggMCAvKiBmYWxzZSAqLyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHBlbmRpbmcsIHNvIHdlIGp1c3QKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgY2FuY2VsbGF0aW9uIHBvaW50CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBhIHRhc2sgZ3JvdXAKKyAgICAgICAgICAgIC8vIGFyZSBoYW5kbGVkIHRocm91Z2ggdGhlIHRhc2tncm91cCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza2RhdGFfdCogIHRhc2s7CisgICAgICAgICAgICAgICAga21wX3Rhc2tncm91cF90KiB0YXNrZ3JvdXA7CisKKyAgICAgICAgICAgICAgICB0YXNrID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrICk7CisKKyAgICAgICAgICAgICAgICB0YXNrZ3JvdXAgPSB0YXNrLT50ZF90YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgaWYgKHRhc2tncm91cCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGNhbmNlbGxhdGlvbiBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHRhc2tncm91cAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBjYW5jZWxsYXRpb24gcG9pbnQgaXMgZW5jb3VudGVyZWQgYnkgYSB0YXNrCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIGEgdGFza2dyb3VwLCBpdCBpcyBPSworICAgICAgICAgICAgICAgICAgICAvLyB0byBpZ25vcmUgaXQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgS01QX0FTU0VSVCAoMCAvKiBmYWxzZSAqLyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJQ1YgT01QX0NBTkNFTExBVElPTj1mYWxzZSwgc28gd2UgaWdub3JlIHRoZSBjYW5jZWxsYXRpb24gcG9pbnQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCFfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKTsKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKK30KKworLyohCitAaW5ncm91cCBDQU5DRUxMQVRJT04KK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gZmxhZ2dlZCBpbiB0aGUgUlRMIGFuZCB0aGUKK2VuY291bnRlcmluZyB0aHJlYWQgaGFzIHRvIGNhbmNlbC4uCisKK0JhcnJpZXIgd2l0aCBjYW5jZWxsYXRpb24gcG9pbnQgdG8gc2VuZCB0aHJlYWRzIGZyb20gdGhlIGJhcnJpZXIgdG8gdGhlCitlbmQgb2YgdGhlIHBhcmFsbGVsIHJlZ2lvbi4gIE5lZWRzIGEgc3BlY2lhbCBjb2RlIHBhdHRlcm4gYXMgZG9jdW1lbnRlZAoraW4gdGhlIGRlc2lnbiBkb2N1bWVudCBmb3IgdGhlIGNhbmNlbGxhdGlvbiBmZWF0dXJlLgorKi8KK2ttcF9pbnQzMgorX19rbXBjX2NhbmNlbF9iYXJyaWVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQpIHsKKyAgICBpbnQgcmV0ID0gMCAvKiBmYWxzZSAqLzsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHMgWyBndGlkIF07CisgICAga21wX3RlYW1fdCAqdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF9ndGlkKCkgPT0gZ3RpZCk7CisKKyAgICAvLyBjYWxsIGludG8gdGhlIHN0YW5kYXJkIGJhcnJpZXIKKyAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworCisgICAgLy8gaWYgY2FuY2VsbGF0aW9uIGlzIGFjdGl2ZSwgY2hlY2sgY2FuY2VsbGF0aW9uIGZsYWcKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICAvLyBkZXBlbmRpbmcgb24gd2hpY2ggY29uc3RydWN0IHRvIGNhbmNlbCwgY2hlY2sgdGhlIGZsYWcgYW5kCisgICAgICAgIC8vIHJlc2V0IHRoZSBmbGFnCisgICAgICAgIHN3aXRjaCAodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpIHsKKyAgICAgICAgY2FzZSBjYW5jZWxfcGFyYWxsZWw6CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhyZWFkcyBoYXZlIGNoZWNrZWQgdGhlIGZsYWcsIHdoZW4KKyAgICAgICAgICAgIC8vIGxlYXZpbmcgdGhlIGFib3ZlIGJhcnJpZXIKKyAgICAgICAgICAgIF9fa21wY19iYXJyaWVyKGxvYywgZ3RpZCk7CisgICAgICAgICAgICB0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCA9IGNhbmNlbF9ub3JlcTsKKyAgICAgICAgICAgIC8vIHRoZSBuZXh0IGJhcnJpZXIgaXMgdGhlIGZvcmsvam9pbiBiYXJyaWVyLCB3aGljaAorICAgICAgICAgICAgLy8gc3luY2hyb25pemVzIHRoZSB0aHJlYWRzIGxlYXZpbmcgaGVyZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY2FuY2VsX2xvb3A6CisgICAgICAgIGNhc2UgY2FuY2VsX3NlY3Rpb25zOgorICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRocmVhZHMgaGF2ZSBjaGVja2VkIHRoZSBmbGFnLCB3aGVuCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBhYm92ZSBiYXJyaWVyCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSB0aGUgdGhyZWFkcyBhZ2FpbiB0byBtYWtlIHN1cmUgd2UKKyAgICAgICAgICAgIC8vIGRvIG5vdCBoYXZlIGFueSBydW4tYXdheSB0aHJlYWRzIHRoYXQgY2F1c2UgYSByYWNlCisgICAgICAgICAgICAvLyBvbiB0aGUgY2FuY2VsbGF0aW9uIGZsYWcKKyAgICAgICAgICAgIF9fa21wY19iYXJyaWVyKGxvYywgZ3RpZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBub3Qgb2NjdXIKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKDAgLyogZmFsc2UgKi8gKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNhbmNlbF9ub3JlcToKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgS01QX0FTU0VSVCAoIDAgLyogZmFsc2UgKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyohCitAaW5ncm91cCBDQU5DRUxMQVRJT04KK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gZmxhZ2dlZCBpbiB0aGUgUlRMIGFuZCB0aGUKK2VuY291bnRlcmluZyB0aHJlYWQgaGFzIHRvIGNhbmNlbC4uCisKK1F1ZXJ5IGZ1bmN0aW9uIHRvIHF1ZXJ5IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMuCitDYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOgorCitpZiAoa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGttcF9jYW5jZWxfcGFyYWxsZWwpKSB7CisgICAgcGVyZm9ybV9jbGVhbnVwKCk7CisgICAgI3ByYWdtYSBvbXAgY2FuY2VsbGF0aW9uIHBvaW50IHBhcmFsbGVsCit9CisqLworaW50IF9fa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGludCBjYW5jZWxfa2luZCkgeworICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisKKyAgICAgICAgc3dpdGNoIChjYW5jZWxfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID09IGNhbmNlbF9raW5kOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIGNhbmNlbF90YXNrZ3JvdXA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tkYXRhX3QqICB0YXNrOworICAgICAgICAgICAgICAgIGttcF90YXNrZ3JvdXBfdCogdGFza2dyb3VwOworICAgICAgICAgICAgICAgIHRhc2sgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICAgICAgICAgIHRhc2tncm91cCA9IHRhc2stPnRkX3Rhc2tncm91cDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFza2dyb3VwICYmIHRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2NvbmZpZy5oLmNtYWtlIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9jb25maWcuaC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Y4Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9jb25maWcuaC5jbWFrZQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIGttcF9jb25maWcuaCAtLSBGZWF0dXJlIG1hY3JvcworICovCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBLTVBfQ09ORklHX0gKKyNkZWZpbmUgS01QX0NPTkZJR19ICisKKyNpbmNsdWRlICJrbXBfcGxhdGZvcm0uaCIKKworLy8gY21ha2VkZWZpbmUwMSBNQUNSTyB3aWxsIGRlZmluZSBNQUNSTyBhcyBlaXRoZXIgMCBvciAxCisvLyBjbWFrZWRlZmluZSBNQUNSTyAxIHdpbGwgZGVmaW5lIE1BQ1JPIGFzIDEgb3IgbGVhdmUgdW5kZWZpbmVkCisjY21ha2VkZWZpbmUwMSBERUJVR19CVUlMRAorI2NtYWtlZGVmaW5lMDEgUkVMV0lUSERFQklORk9fQlVJTEQKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfSVRUX05PVElGWQorI2RlZmluZSBVU0VfSVRUX05PVElGWSBMSUJPTVBfVVNFX0lUVF9OT1RJRlkKKyNpZiAhIExJQk9NUF9VU0VfSVRUX05PVElGWQorIyBkZWZpbmUgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2VuZGlmCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworI2lmIExJQk9NUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisjIGRlZmluZSBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworI2VuZGlmCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfSEFWRV9XRUFLX0FUVFJJQlVURQorI2RlZmluZSBLTVBfSEFWRV9XRUFLX0FUVFJJQlVURSBMSUJPTVBfSEFWRV9XRUFLX0FUVFJJQlVURQorI2NtYWtlZGVmaW5lMDEgTElCT01QX0hBVkVfUFNBUEkKKyNkZWZpbmUgS01QX0hBVkVfUFNBUEkgTElCT01QX0hBVkVfUFNBUEkKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9TVEFUUworI2RlZmluZSBLTVBfU1RBVFNfRU5BQkxFRCBMSUJPTVBfU1RBVFMKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9IQVZFX1g4NklOVFJJTl9ICisjZGVmaW5lIEtNUF9IQVZFX1g4NklOVFJJTl9IIExJQk9NUF9IQVZFX1g4NklOVFJJTl9ICisjY21ha2VkZWZpbmUwMSBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUgorI2RlZmluZSBLTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUiBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUgorI2NtYWtlZGVmaW5lMDEgTElCT01QX0hBVkVfX19SRFRTQworI2RlZmluZSBLTVBfSEFWRV9fX1JEVFNDIExJQk9NUF9IQVZFX19fUkRUU0MKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfREVCVUdHRVIKKyNkZWZpbmUgVVNFX0RFQlVHR0VSIExJQk9NUF9VU0VfREVCVUdHRVIKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX0RFQlVHCisjZGVmaW5lIE9NUFRfREVCVUcgTElCT01QX09NUFRfREVCVUcKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX1NVUFBPUlQKKyNkZWZpbmUgT01QVF9TVVBQT1JUIExJQk9NUF9PTVBUX1NVUFBPUlQKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX0JMQU1FCisjZGVmaW5lIE9NUFRfQkxBTUUgTElCT01QX09NUFRfQkxBTUUKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9PTVBUX1RSQUNFCisjZGVmaW5lIE9NUFRfVFJBQ0UgTElCT01QX09NUFRfVFJBQ0UKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfQURBUFRJVkVfTE9DS1MKKyNkZWZpbmUgS01QX1VTRV9BREFQVElWRV9MT0NLUyBMSUJPTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjZGVmaW5lIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUyAwCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQKKyNkZWZpbmUgS01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UIExJQk9NUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVAorI2NtYWtlZGVmaW5lMDEgTElCT01QX0VOQUJMRV9BU1NFUlRJT05TCisjZGVmaW5lIEtNUF9VU0VfQVNTRVJUIExJQk9NUF9FTkFCTEVfQVNTRVJUSU9OUworI2NtYWtlZGVmaW5lMDEgU1RVQlNfTElCUkFSWQorI2NtYWtlZGVmaW5lMDEgTElCT01QX1VTRV9IV0xPQworI2RlZmluZSBLTVBfVVNFX0hXTE9DIExJQk9NUF9VU0VfSFdMT0MKKyNkZWZpbmUgS01QX0FSQ0hfU1RSICJATElCT01QX0xFR0FMX0FSQ0hAIgorI2RlZmluZSBLTVBfTElCUkFSWV9GSUxFICJATElCT01QX0xJQl9GSUxFQCIKKyNkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgQExJQk9NUF9WRVJTSU9OX01BSk9SQAorI2RlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiBATElCT01QX1ZFUlNJT05fTUlOT1JACisjZGVmaW5lIExJQk9NUF9PTVBfVkVSU0lPTiBATElCT01QX09NUF9WRVJTSU9OQAorI2RlZmluZSBPTVBfNTBfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDUwKQorI2RlZmluZSBPTVBfNDVfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDQ1KQorI2RlZmluZSBPTVBfNDBfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDQwKQorI2RlZmluZSBPTVBfMzBfRU5BQkxFRCAoTElCT01QX09NUF9WRVJTSU9OID49IDMwKQorI2NtYWtlZGVmaW5lMDEgTElCT01QX1RTQU5fU1VQUE9SVAorI2lmIExJQk9NUF9UU0FOX1NVUFBPUlQKKyNkZWZpbmUgVFNBTl9TVVBQT1JUCisjZW5kaWYKKworLy8gQ29uZmlndXJlZCBjYWNoZSBsaW5lIGJhc2VkIG9uIGFyY2hpdGVjdHVyZQorI2lmIEtNUF9BUkNIX1BQQzY0CisjIGRlZmluZSBDQUNIRV9MSU5FIDEyOAorI2Vsc2UKKyMgZGVmaW5lIENBQ0hFX0xJTkUgNjQKKyNlbmRpZgorCisjaWYgISBLTVBfMzJfQklUX0FSQ0gKKyMgZGVmaW5lIEJVSUxEX0k4IDEKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9EWU5BTUlDX0xJQiAxCisjZGVmaW5lIEtNUF9ORVNURURfSE9UX1RFQU1TIDEKKyNkZWZpbmUgS01QX0FESlVTVF9CTE9DS1RJTUUgMQorI2RlZmluZSBCVUlMRF9QQVJBTExFTF9PUkRFUkVEIDEKKyNkZWZpbmUgS01QX0FTTV9JTlRSSU5TIDEKKyNkZWZpbmUgVVNFX0lUVF9CVUlMRCBMSUJPTVBfVVNFX0lUVF9OT1RJRlkKKyNkZWZpbmUgSU5URUxfSVRUTk9USUZZX1BSRUZJWCBfX2ttcF9pdHRfCisjaWYgISBLTVBfTUlDCisjIGRlZmluZSBVU0VfTE9BRF9CQUxBTkNFIDEKKyNlbmRpZgorI2lmICEgKEtNUF9PU19XSU5ET1dTIHx8IEtNUF9PU19EQVJXSU4pCisjIGRlZmluZSBLTVBfVERBVEFfR1RJRCAxCisjZW5kaWYKKyNpZiBTVFVCU19MSUJSQVJZCisjIGRlZmluZSBLTVBfU1RVQiAxCisjZW5kaWYKKyNpZiBERUJVR19CVUlMRCB8fCBSRUxXSVRIREVCSU5GT19CVUlMRAorIyBkZWZpbmUgS01QX0RFQlVHIDEKKyNlbmRpZgorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgZGVmaW5lIEtNUF9XSU5fQ0RFQ0wKKyNlbHNlCisjIGRlZmluZSBCVUlMRF9UVgorIyBkZWZpbmUgS01QX0dPTVBfQ09NUEFUCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9DT05GSUdfSApkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9jc3VwcG9ydC5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2NzdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdiYmRlCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9jc3VwcG9ydC5jcHAKQEAgLTAsMCArMSwzMzM4IEBACisvKgorICoga21wX2NzdXBwb3J0LmNwcCAtLSBrZnJvbnQgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvbXAuaCIgICAgICAgIC8qIGV4dGVybiAiQyIgZGVjbGFyYXRpb25zIG9mIHVzZXItdmlzaWJsZSByb3V0aW5lcyAqLworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LWludGVybmFsLmgiCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5oIgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX01FU1NBR0UgNTEyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICBmbGFncyB3aWxsIGJlIHVzZWQgaW4gZnV0dXJlLCBlLmcuLCB0byBpbXBsZW1lbnQgKi8KKy8qICBvcGVubXBfc3RyaWN0IGxpYnJhcnkgcmVzdHJpY3Rpb25zICAgICAgICAgICAgICAgKi8KKworLyohCisgKiBAaW5ncm91cCBTVEFSVFVQX1NIVVRET1dOCisgKiBAcGFyYW0gbG9jICAgaW4gICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KKyAqIEBwYXJhbSBmbGFncyBpbiAgIGZvciBmdXR1cmUgdXNlIChjdXJyZW50bHkgaWdub3JlZCkKKyAqCisgKiBJbml0aWFsaXplIHRoZSBydW50aW1lIGxpYnJhcnkuIFRoaXMgY2FsbCBpcyBvcHRpb25hbDsgaWYgaXQgaXMgbm90IG1hZGUgdGhlbgorICogaXQgd2lsbCBiZSBpbXBsaWNpdGx5IGNhbGxlZCBieSBhdHRlbXB0cyB0byB1c2Ugb3RoZXIgbGlicmFyeSBmdW5jdGlvbnMuCisgKgorICovCit2b2lkCitfX2ttcGNfYmVnaW4oaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZmxhZ3MpCit7CisgICAgLy8gQnkgZGVmYXVsdCBfX2ttcF9pZ25vcmVfbXBwYmVnKCkgcmV0dXJucyBUUlVFLgorICAgIGlmIChfX2ttcF9pZ25vcmVfbXBwYmVnKCkgPT0gRkFMU0UpIHsKKyAgICAgICAgX19rbXBfaW50ZXJuYWxfYmVnaW4oKTsKKworICAgICAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2JlZ2luOiBjYWxsZWRcbiIgKSApOworICAgIH0KK30KKworLyohCisgKiBAaW5ncm91cCBTVEFSVFVQX1NIVVRET1dOCisgKiBAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorICoKKyAqIFNodXRkb3duIHRoZSBydW50aW1lIGxpYnJhcnkuIFRoaXMgaXMgYWxzbyBvcHRpb25hbCwgYW5kIGV2ZW4gaWYgY2FsbGVkIHdpbGwgbm90CisgKiBkbyBhbnl0aGluZyB1bmxlc3MgdGhlIGBLTVBfSUdOT1JFX01QUEVORGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIHplcm8uCisgICovCit2b2lkCitfX2ttcGNfZW5kKGlkZW50X3QgKmxvYykKK3sKKyAgICAvLyBCeSBkZWZhdWx0LCBfX2ttcF9pZ25vcmVfbXBwZW5kKCkgcmV0dXJucyBUUlVFIHdoaWNoIG1ha2VzIF9fa21wY19lbmQoKSBjYWxsIG5vLW9wLgorICAgIC8vIEhvd2V2ZXIsIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBLTVBfSUdOT1JFX01QUEVORCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAvLyBJZiBLTVBfSUdOT1JFX01QUEVORCBpcyAwLCBfX2ttcF9pZ25vcmVfbXBwZW5kKCkgcmV0dXJucyBGQUxTRSBhbmQgX19rbXBjX2VuZCgpCisgICAgLy8gd2lsbCB1bnJlZ2lzdGVyIHRoaXMgcm9vdCAoaXQgY2FuIGNhdXNlIGxpYnJhcnkgc2h1dCBkb3duKS4KKyAgICBpZiAoX19rbXBfaWdub3JlX21wcGVuZCgpID09IEZBTFNFKSB7CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kOiBjYWxsZWRcbiIgKSApOworICAgICAgICBLQV9UUkFDRSggMzAsICgiX19rbXBjX2VuZFxuIiApKTsKKworICAgICAgICBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkKCAtMSApOworICAgIH0KK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gVGhlIGdsb2JhbCB0aHJlYWQgaW5kZXggb2YgdGhlIGFjdGl2ZSB0aHJlYWQuCisKK1RoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBpbiBhbnkgY29udGV4dC4KKworSWYgdGhlIHJ1bnRpbWUgaGFzIG9ueSBiZWVuIGVudGVyZWQgYXQgdGhlIG91dGVybW9zdCBsZXZlbCBmcm9tIGEKK3NpbmdsZSAobmVjZXNzYXJpbHkgbm9uLU9wZW5NUDxzdXA+Kjwvc3VwPikgdGhyZWFkLCB0aGVuIHRoZSB0aHJlYWQgbnVtYmVyIGlzIHRoYXQKK3doaWNoIHdvdWxkIGJlIHJldHVybmVkIGJ5IG9tcF9nZXRfdGhyZWFkX251bSgpIGluIHRoZSBvdXRlcm1vc3QKK2FjdGl2ZSBwYXJhbGxlbCBjb25zdHJ1Y3QuIChPciB6ZXJvIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBwYXJhbGxlbAorY29uc3RydWN0LCBzaW5jZSB0aGUgbWFzdGVyIHRocmVhZCBpcyBuZWNlc3NhcmlseSB0aHJlYWQgemVybykuCisKK0lmIG11bHRpcGxlIG5vbi1PcGVuTVAgdGhyZWFkcyBhbGwgZW50ZXIgYW4gT3Blbk1QIGNvbnN0cnVjdCB0aGVuIHRoaXMKK3dpbGwgYmUgYSB1bmlxdWUgdGhyZWFkIGlkZW50aWZpZXIgYW1vbmcgYWxsIHRoZSB0aHJlYWRzIGNyZWF0ZWQgYnkKK3RoZSBPcGVuTVAgcnVudGltZSAoYnV0IHRoZSB2YWx1ZSBjYW5ub3RlIGJlIGRlZmluZWQgaW4gdGVybXMgb2YKK09wZW5NUCB0aHJlYWQgaWRzIHJldHVybmVkIGJ5IG9tcF9nZXRfdGhyZWFkX251bSgpKS4KKworKi8KK2ttcF9pbnQzMgorX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKGlkZW50X3QgKmxvYykKK3sKKyAgICBrbXBfaW50MzIgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW06IFQjJWRcbiIsIGd0aWQgKSApOworCisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGhyZWFkcyB1bmRlciBjb250cm9sIG9mIHRoZSBPcGVuTVA8c3VwPio8L3N1cD4gcnVudGltZQorCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gYW55IGNvbnRleHQuCitJdCByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgT3Blbk1QIHJ1bnRpbWUuIFRoYXQgaXMKK25vdCBhIG51bWJlciB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGFueSBPcGVuTVAgc3RhbmRhcmQgY2FsbHMsIHNpbmNlIHRoZSBsaWJyYXJ5IG1heSBiZQorY2FsbGVkIGZyb20gbW9yZSB0aGFuIG9uZSBub24tT3Blbk1QIHRocmVhZCwgYW5kIHRoaXMgcmVmbGVjdHMgdGhlIHRvdGFsIG92ZXIgYWxsIHN1Y2ggY2FsbHMuCitTaW1pbGFybHkgdGhlIHJ1bnRpbWUgbWFpbnRhaW5zIHVuZGVybHlpbmcgdGhyZWFkcyBldmVuIHdoZW4gdGhleSBhcmUgbm90IGFjdGl2ZSAoc2luY2UgdGhlIGNvc3QKK29mIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIE9TIHRocmVhZHMgaXMgaGlnaCksIHRoaXMgY2FsbCBjb3VudHMgYWxsIHN1Y2ggdGhyZWFkcyBldmVuIGlmIHRoZXkgYXJlIG5vdAord2FpdGluZyBmb3Igd29yay4KKyovCitrbXBfaW50MzIKK19fa21wY19nbG9iYWxfbnVtX3RocmVhZHMoaWRlbnRfdCAqbG9jKQoreworICAgIEtDX1RSQUNFKDEwLCgiX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkczogbnVtX3RocmVhZHMgPSAlZFxuIiwgX19rbXBfYWxsX250aCkpOworCisgICAgcmV0dXJuIFRDUl80KF9fa21wX2FsbF9udGgpOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgdGhyZWFkIG51bWJlciBvZiB0aGUgY2FsbGluZyB0aHJlYWQgaW4gdGhlIGlubmVybW9zdCBhY3RpdmUgcGFyYWxsZWwgY29uc3RydWN0LgorCisqLwora21wX2ludDMyCitfX2ttcGNfYm91bmRfdGhyZWFkX251bShpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19ib3VuZF90aHJlYWRfbnVtOiBjYWxsZWRcbiIgKSApOworICAgIHJldHVybiBfX2ttcF90aWRfZnJvbV9ndGlkKCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gVGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBpbm5lcm1vc3QgYWN0aXZlIHBhcmFsbGVsIGNvbnN0cnVjdC4KKyovCitrbXBfaW50MzIKK19fa21wY19ib3VuZF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19ib3VuZF9udW1fdGhyZWFkczogY2FsbGVkXG4iICkgKTsKKworICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKK30KKworLyohCisgKiBAaW5ncm91cCBERVBSRUNBVEVECisgKiBAcGFyYW0gbG9jIGxvY2F0aW9uIGRlc2NyaXB0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBuZWVkIG5vdCBiZSBjYWxsZWQuIEl0IGFsd2F5cyByZXR1cm5zIFRSVUUuCisgKi8KK2ttcF9pbnQzMgorX19rbXBjX29rX3RvX2ZvcmsoaWRlbnRfdCAqbG9jKQoreworI2lmbmRlZiBLTVBfREVCVUcKKworICAgIHJldHVybiBUUlVFOworCisjZWxzZQorCisgICAgY29uc3QgY2hhciAqc2VtaTI7CisgICAgY29uc3QgY2hhciAqc2VtaTM7CisgICAgaW50IGxpbmVfbm87CisKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlID09IDApIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHNlbWkyID0gbG9jLT5wc291cmNlOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBzZW1pMiA9IHN0cmNocihzZW1pMiwgJzsnKTsKKyAgICBpZiAoc2VtaTIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgc2VtaTIgPSBzdHJjaHIoc2VtaTIgKyAxLCAnOycpOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lWzBdKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzZW1pMiAtIDE7CisgICAgICAgIHdoaWxlICgobmFtZSA+IGxvYy0+cHNvdXJjZSkgJiYgKCpuYW1lICE9ICcvJykgJiYgKCpuYW1lICE9ICc7JykpIHsKKyAgICAgICAgICAgIG5hbWUtLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCpuYW1lID09ICcvJykgfHwgKCpuYW1lID09ICc7JykpIHsKKyAgICAgICAgICAgIG5hbWUrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2VfZmlsZW5hbWUsIG5hbWUsIHNlbWkyIC0gbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgICAgICB9CisgICAgfQorICAgIHNlbWkzID0gc3RyY2hyKHNlbWkyICsgMSwgJzsnKTsKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbMF0pIHsKKyAgICAgICAgaWYgKChzZW1pMyAhPSBOVUxMKSAmJiAoc2VtaTMgPiBzZW1pMikKKyAgICAgICAgICAmJiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZSwgc2VtaTIgKyAxLCBzZW1pMyAtIHNlbWkyIC0gMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gX19rbXBfcGFyX3JhbmdlIDwgMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoS01QX1NTQ0FORihzZW1pMyArIDEsICIlZCIsICZsaW5lX25vKSA9PSAxKSB7CisgICAgICAgIGlmICgobGluZV9ubyA+PSBfX2ttcF9wYXJfcmFuZ2VfbGIpICYmIChsaW5lX25vIDw9IF9fa21wX3Bhcl9yYW5nZV91YikpIHsKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIDEgaWYgdGhpcyB0aHJlYWQgaXMgZXhlY3V0aW5nIGluc2lkZSBhbiBhY3RpdmUgcGFyYWxsZWwgcmVnaW9uLCB6ZXJvIGlmIG5vdC4KKyovCitrbXBfaW50MzIKK19fa21wY19pbl9wYXJhbGxlbCggaWRlbnRfdCAqbG9jICkKK3sKKyAgICByZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdGhyZWFkcyBudW1iZXIgb2YgdGhyZWFkcyByZXF1ZXN0ZWQgZm9yIHRoaXMgcGFyYWxsZWwgY29uc3RydWN0CisKK1NldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgbmV4dCBmb3JrIHNwYXduZWQgYnkgdGhpcyB0aHJlYWQuCitUaGlzIGNhbGwgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0IGhhcyBhIGBudW1fdGhyZWFkc2AgY2xhdXNlLgorKi8KK3ZvaWQKK19fa21wY19wdXNoX251bV90aHJlYWRzKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdGhyZWFkcyApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wY19wdXNoX251bV90aHJlYWRzOiBlbnRlciBUIyVkIG51bV90aHJlYWRzPSVkXG4iLAorICAgICAgZ2xvYmFsX3RpZCwgbnVtX3RocmVhZHMgKSApOworCisgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcyggbG9jLCBnbG9iYWxfdGlkLCBudW1fdGhyZWFkcyApOworfQorCit2b2lkCitfX2ttcGNfcG9wX251bV90aHJlYWRzKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcGNfcG9wX251bV90aHJlYWRzOiBlbnRlclxuIiApICk7CisKKyAgICAvKiB0aGUgbnVtX3RocmVhZHMgYXJlIGF1dG9tYXRpY2FsbHkgcG9wcGVkICovCit9CisKKworI2lmIE9NUF80MF9FTkFCTEVECisKK3ZvaWQKK19fa21wY19wdXNoX3Byb2NfYmluZChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgcHJvY19iaW5kICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBjX3B1c2hfcHJvY19iaW5kOiBlbnRlciBUIyVkIHByb2NfYmluZD0lZFxuIiwKKyAgICAgIGdsb2JhbF90aWQsIHByb2NfYmluZCApICk7CisKKyAgICBfX2ttcF9wdXNoX3Byb2NfYmluZCggbG9jLCBnbG9iYWxfdGlkLCAoa21wX3Byb2NfYmluZF90KXByb2NfYmluZCApOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBhcmdjICB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBlbGxpcHNpcworQHBhcmFtIG1pY3JvdGFzayAgcG9pbnRlciB0byBjYWxsYmFjayByb3V0aW5lIGNvbnNpc3Rpbmcgb2Ygb3V0bGluZWQgcGFyYWxsZWwgY29uc3RydWN0CitAcGFyYW0gLi4uICBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlbid0IGdsb2JhbAorCitEbyB0aGUgYWN0dWFsIGZvcmsgYW5kIGNhbGwgdGhlIG1pY3JvdGFzayBpbiB0aGUgcmVsZXZhbnQgbnVtYmVyIG9mIHRocmVhZHMuCisqLwordm9pZAorX19rbXBjX2ZvcmtfY2FsbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBhcmdjLCBrbXBjX21pY3JvIG1pY3JvdGFzaywgLi4uKQoreworICBpbnQgICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCisjaWYgKEtNUF9TVEFUU19FTkFCTEVEKQorICBpbnQgaW5QYXJhbGxlbCA9IF9fa21wY19pbl9wYXJhbGxlbChsb2MpOworICBpZiAoaW5QYXJhbGxlbCkKKyAgeworICAgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9ORVNURURfUEFSQUxMRUwpOworICB9CisgIGVsc2UKKyAgeworICAgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9QQVJBTExFTCk7CisgIH0KKyNlbmRpZgorCisgIC8vIG1heWJlIHRvIHNhdmUgdGhyX3N0YXRlIGlzIGVub3VnaCBoZXJlCisgIHsKKyAgICB2YV9saXN0ICAgICBhcDsKKyAgICB2YV9zdGFydCggICBhcCwgbWljcm90YXNrICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X2ZyYW1lX3QqIG9tcHRfZnJhbWU7CisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICBrbXBfdGVhbV90ICpwYXJlbnRfdGVhbSA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbTsKKyAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IHBhcmVudF90ZWFtLT50Lm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm87CisgICAgICAgaWYgKGx3dCkKKyAgICAgICAgIG9tcHRfZnJhbWUgPSAmKGx3dC0+b21wdF90YXNrX2luZm8uZnJhbWUpOworICAgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICAgb21wdF9mcmFtZSA9ICYocGFyZW50X3RlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0uCisgICAgICAgICBvbXB0X3Rhc2tfaW5mby5mcmFtZSk7CisgICAgICAgfQorICAgICAgIG9tcHRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpOworICAgIH0KKyNlbmRpZgorCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19GT1JLSU5HKCk7CisjZW5kaWYKKyAgICBfX2ttcF9mb3JrX2NhbGwoIGxvYywgZ3RpZCwgZm9ya19jb250ZXh0X2ludGVsLAorICAgICAgICAgICAgYXJnYywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1Qodm9pZCAqKSBtaWNyb3Rhc2ssICAgICAgLy8gInVud3JhcHBlZCIgdGFzaworI2VuZGlmCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKG1pY3JvdGFza190KSBtaWNyb3Rhc2ssIC8vICJ3cmFwcGVkIiB0YXNrCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKGxhdW5jaF90KSAgICBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAmYXAKKyNlbHNlCisgICAgICAgICAgICBhcAorI2VuZGlmCisgICAgICAgICAgICApOworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfSk9JTklORygpOworI2VuZGlmCisgICAgX19rbXBfam9pbl9jYWxsKCBsb2MsIGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgLCBmb3JrX2NvbnRleHRfaW50ZWwKKyNlbmRpZgorICAgICk7CisKKyAgICB2YV9lbmQoIGFwICk7CisKKyAgfQorfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV90ZWFtcyBudW1iZXIgb2YgdGVhbXMgcmVxdWVzdGVkIGZvciB0aGUgdGVhbXMgY29uc3RydWN0CitAcGFyYW0gbnVtX3RocmVhZHMgbnVtYmVyIG9mIHRocmVhZHMgcGVyIHRlYW0gcmVxdWVzdGVkIGZvciB0aGUgdGVhbXMgY29uc3RydWN0CisKK1NldCB0aGUgbnVtYmVyIG9mIHRlYW1zIHRvIGJlIHVzZWQgYnkgdGhlIHRlYW1zIGNvbnN0cnVjdC4KK1RoaXMgY2FsbCBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoZSB0ZWFtcyBjb25zdHJ1Y3QgaGFzIGEgYG51bV90ZWFtc2AgY2xhdXNlCitvciBhIGB0aHJlYWRfbGltaXRgIGNsYXVzZSAob3IgYm90aCkuCisqLwordm9pZAorX19rbXBjX3B1c2hfbnVtX3RlYW1zKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdGVhbXMsIGttcF9pbnQzMiBudW1fdGhyZWFkcyApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wY19wdXNoX251bV90ZWFtczogZW50ZXIgVCMlZCBudW1fdGVhbXM9JWQgbnVtX3RocmVhZHM9JWRcbiIsCisgICAgICBnbG9iYWxfdGlkLCBudW1fdGVhbXMsIG51bV90aHJlYWRzICkgKTsKKworICAgIF9fa21wX3B1c2hfbnVtX3RlYW1zKCBsb2MsIGdsb2JhbF90aWQsIG51bV90ZWFtcywgbnVtX3RocmVhZHMgKTsKK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gYXJnYyAgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgZWxsaXBzaXMKK0BwYXJhbSBtaWNyb3Rhc2sgIHBvaW50ZXIgdG8gY2FsbGJhY2sgcm91dGluZSBjb25zaXN0aW5nIG9mIG91dGxpbmVkIHRlYW1zIGNvbnN0cnVjdAorQHBhcmFtIC4uLiAgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZW4ndCBnbG9iYWwKKworRG8gdGhlIGFjdHVhbCBmb3JrIGFuZCBjYWxsIHRoZSBtaWNyb3Rhc2sgaW4gdGhlIHJlbGV2YW50IG51bWJlciBvZiB0aHJlYWRzLgorKi8KK3ZvaWQKK19fa21wY19mb3JrX3RlYW1zKGlkZW50X3QgKmxvYywga21wX2ludDMyIGFyZ2MsIGttcGNfbWljcm8gbWljcm90YXNrLCAuLi4pCit7CisgICAgaW50ICAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB2YV9saXN0ICAgICBhcDsKKyAgICB2YV9zdGFydCggICBhcCwgbWljcm90YXNrICk7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX1RFQU1TKTsKKworICAgIC8vIHJlbWVtYmVyIHRlYW1zIGVudHJ5IHBvaW50IGFuZCBuZXN0aW5nIGxldmVsCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9IG1pY3JvdGFzazsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbGV2ZWwgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2xldmVsOyAvLyBBQzogY2FuIGJlID4wIG9uIGhvc3QKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGttcF90ZWFtX3QgKnBhcmVudF90ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLgorICAgICAgICAgICBvbXB0X3Rhc2tfaW5mby5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygxKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIGNoZWNrIGlmIF9fa21wY19wdXNoX251bV90ZWFtcyBjYWxsZWQsIHNldCBkZWZhdWx0IG51bWJlciBvZiB0ZWFtcyBvdGhlcndpc2UKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA9PSAwICkgeworICAgICAgICBfX2ttcF9wdXNoX251bV90ZWFtcyggbG9jLCBndGlkLCAwLCAwICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3NldF9ucHJvYyA+PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50aCA+PSAxKTsKKworICAgIF9fa21wX2ZvcmtfY2FsbCggbG9jLCBndGlkLCBmb3JrX2NvbnRleHRfaW50ZWwsCisgICAgICAgICAgICBhcmdjLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVCh2b2lkICopIG1pY3JvdGFzaywgICAgICAgICAgICAgICAvLyAidW53cmFwcGVkIiB0YXNrCisjZW5kaWYKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobWljcm90YXNrX3QpIF9fa21wX3RlYW1zX21hc3RlciwgLy8gIndyYXBwZWQiIHRhc2sKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobGF1bmNoX3QpICAgIF9fa21wX2ludm9rZV90ZWFtc19tYXN0ZXIsCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAmYXAKKyNlbHNlCisgICAgICAgICAgICBhcAorI2VuZGlmCisgICAgICAgICAgICApOworICAgIF9fa21wX2pvaW5fY2FsbCggbG9jLCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICwgZm9ya19jb250ZXh0X2ludGVsCisjZW5kaWYKKyAgICApOworCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9IE5VTEw7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX2xldmVsID0gMDsKKyAgICAqKGttcF9pbnQ2NCopKCZ0aGlzX3Roci0+dGgudGhfdGVhbXNfc2l6ZSkgPSAwTDsKKyAgICB2YV9lbmQoIGFwICk7Cit9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCisvLworLy8gSSBkb24ndCB0aGluayB0aGlzIGZ1bmN0aW9uIHNob3VsZCBldmVyIGhhdmUgYmVlbiBleHBvcnRlZC4KKy8vIFRoZSBfX2ttcGNfIHByZWZpeCB3YXMgbWlzYXBwbGllZC4gIEknbSBmYWlybHkgY2VydGFpbiB0aGF0IG5vIGdlbmVyYXRlZAorLy8gb3Blbm1wIGNvZGUgZXZlciBjYWxsZWQgaXQsIGJ1dCBpdCdzIGJlZW4gZXhwb3J0ZWQgZnJvbSB0aGUgUlRMIGZvciBzbworLy8gbG9uZyB0aGF0IEknbSBhZnJhaWQgdG8gcmVtb3ZlIHRoZSBkZWZpbml0aW9uLgorLy8KK2ludAorX19rbXBjX2ludm9rZV90YXNrX2Z1bmMoIGludCBndGlkICkKK3sKKyAgICByZXR1cm4gX19rbXBfaW52b2tlX3Rhc2tfZnVuYyggZ3RpZCApOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlcgorCitFbnRlciBhIHNlcmlhbGl6ZWQgcGFyYWxsZWwgY29uc3RydWN0LiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGhhbmRsZSBhCitjb25kaXRpb25hbCBwYXJhbGxlbCByZWdpb24sIGxpa2UgdGhpcywKK0Bjb2RlCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZiAoY29uZGl0aW9uKQorQGVuZGNvZGUKK3doZW4gdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4KKyovCit2b2lkCitfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3cgaW4ga21wX3J1bnRpbWUuY3BwIHNvIHRoYXQgaXQgY2FuIHNoYXJlIHN0YXRpYworICAgIC8vIGZ1bmN0aW9ucyB3aXRoIGttcF9mb3JrX2NhbGwgc2luY2UgdGhlIHRhc2tzIHRvIGJlIGRvbmUgYXJlIHNpbWlsYXIgaW4KKyAgICAvLyBlYWNoIGNhc2UuCisgICAgX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChsb2MsIGdsb2JhbF90aWQpOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlcgorCitMZWF2ZSBhIHNlcmlhbGl6ZWQgcGFyYWxsZWwgY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKnRvcDsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RocjsKKyAgICBrbXBfdGVhbV90ICpzZXJpYWxfdGVhbTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IGNhbGxlZCBieSBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIC8qIHNraXAgYWxsIHRoaXMgY29kZSBmb3IgYXV0b3BhciBzZXJpYWxpemVkIGxvb3BzIHNpbmNlIGl0IHJlc3VsdHMgaW4KKyAgICAgICB1bmFjY2VwdGFibGUgb3ZlcmhlYWQgKi8KKyAgICBpZiggbG9jICE9IE5VTEwgJiYgKGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQVVUT1BBUiApICkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTm90IGF1dG9wYXIgY29kZQorICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICB0aGlzX3RociAgICA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICBzZXJpYWxfdGVhbSA9IHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbTsKKworICAgI2lmIE9NUF80NV9FTkFCTEVECisgICBrbXBfdGFza190ZWFtX3QgKiAgIHRhc2tfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW07CisKKyAgIC8vIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHByb3h5IHRhc2tzIGJlZm9yZSBmaW5pc2hpbmcgdGhlIHRocmVhZAorICAgaWYgKCB0YXNrX3RlYW0gIT0gTlVMTCAmJiB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzICkKKyAgICAgICAgX19rbXBfdGFza190ZWFtX3dhaXQodGhpc190aHIsIHNlcmlhbF90ZWFtIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpICk7IC8vIGlzIGFuIElUVCBvYmplY3QgbmVlZGVkIGhlcmU/CisgICAjZW5kaWYKKworICAgIEtNUF9NQigpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtICk7CisgICAgS01QX0FTU0VSVCggICAgICAgc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF90ZWFtID09IHNlcmlhbF90ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gIT0gdGhpc190aHItPnRoLnRoX3Jvb3QtPnIucl9yb290X3RlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSAtPiB0LnRfdGhyZWFkcyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtIC0+IHQudF90aHJlYWRzWzBdID09IHRoaXNfdGhyICk7CisKKyAgICAvKiBJZiBuZWNlc3NhcnksIHBvcCB0aGUgaW50ZXJuYWwgY29udHJvbCBzdGFjayB2YWx1ZXMgYW5kIHJlcGxhY2UgdGhlIHRlYW0gdmFsdWVzICovCisgICAgdG9wID0gc2VyaWFsX3RlYW0gLT4gdC50X2NvbnRyb2xfc3RhY2tfdG9wOworICAgIGlmICggdG9wICYmIHRvcCAtPiBzZXJpYWxfbmVzdGluZ19sZXZlbCA9PSBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgY29weV9pY3ZzKCAmc2VyaWFsX3RlYW0gLT4gdC50X3RocmVhZHNbMF0gLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMsIHRvcCApOworICAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfY29udHJvbF9zdGFja190b3AgPSB0b3AgLT4gbmV4dDsKKyAgICAgICAgX19rbXBfZnJlZSh0b3ApOworICAgIH0KKworICAgIC8vaWYoIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkID4gMSApCisgICAgc2VyaWFsX3RlYW0gLT4gdC50X2xldmVsLS07CisKKyAgICAvKiBwb3AgZGlzcGF0Y2ggYnVmZmVycyBzdGFjayAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIpOworICAgIHsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKiBkaXNwX2J1ZmZlciA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyOworICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlci0+bmV4dDsKKyAgICAgICAgX19rbXBfZnJlZSggZGlzcF9idWZmZXIgKTsKKyAgICB9CisKKyAgICAtLSBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICBpZiAoIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkID09IDAgKSB7CisKKyAgICAgICAgLyogcmV0dXJuIHRvIHRoZSBwYXJhbGxlbCBzZWN0aW9uICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgIGlmICggX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICYmIHNlcmlhbF90ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCApIHsKKyAgICAgICAgICAgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgICAgICAgICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZzZXJpYWxfdGVhbS0+dC50X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgICAgICAgICBfX2ttcF9sb2FkX214Y3NyKCAmc2VyaWFsX3RlYW0tPnQudF9teGNzciApOworICAgICAgICB9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gICAgICAgICAgID0gc2VyaWFsX3RlYW0gLT4gdC50X3BhcmVudDsKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc190aWQgPSBzZXJpYWxfdGVhbSAtPiB0LnRfbWFzdGVyX3RpZDsKKworICAgICAgICAvKiByZXN0b3JlIHZhbHVlcyBjYWNoZWQgaW4gdGhlIHRocmVhZCAqLworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX25wcm9jICAgICA9IHNlcmlhbF90ZWFtIC0+IHQudF9wYXJlbnQgLT4gdC50X25wcm9jOyAgICAgICAgICAvKiAgSlBIICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbWFzdGVyICAgID0gc2VyaWFsX3RlYW0gLT4gdC50X3BhcmVudCAtPiB0LnRfdGhyZWFkc1swXTsgICAgIC8qIEpQSCAqLworICAgICAgICB0aGlzX3RociAtPiB0aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkOworCisgICAgICAgIC8qIFRPRE8gdGhlIGJlbG93IHNob3VsZG4ndCBuZWVkIHRvIGJlIGFkanVzdGVkIGZvciBzZXJpYWxpemVkIHRlYW1zICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2Rpc3BhdGNoICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF90ZWFtIC0+CisgICAgICAgICAgICB0LnRfZGlzcGF0Y2hbIHNlcmlhbF90ZWFtIC0+IHQudF9tYXN0ZXJfdGlkIF07CisKKyAgICAgICAgX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZCggdGhpc190aHIgKTsKKworICAgICAgICBLTVBfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID09IDAgKTsKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7CisKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIC8vIENvcHkgdGhlIHRhc2sgdGVhbSBmcm9tIHRoZSBuZXcgY2hpbGQgLyBvbGQgcGFyZW50IHRlYW0gdG8gdGhlIHRocmVhZC4KKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV07CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCByZXN0b3JpbmcgdGFza190ZWFtICVwIC8gdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCB0aGlzX3RociAtPiB0aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gKSApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIGRlY3JlYXNpbmcgbmVzdGluZyBkZXB0aCBvZiBzZXJpYWwgdGVhbSAlcCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBzZXJpYWxfdGVhbSwgc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3BfcGFyYWxsZWwoIGdsb2JhbF90aWQsIE5VTEwgKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKworRXhlY3V0ZSA8dHQ+Zmx1c2g8L3R0Pi4gVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIGZ1bGwgbWVtb3J5IGZlbmNlLiAoVGhvdWdoCitkZXBlbmRpbmcgb24gdGhlIG1lbW9yeSBvcmRlcmluZyBjb252ZW50aW9uIG9iZXllZCBieSB0aGUgY29tcGlsZXIKK2V2ZW4gdGhhdCBtYXkgbm90IGJlIG5lY2Vzc2FyeSkuCisqLwordm9pZAorX19rbXBjX2ZsdXNoKGlkZW50X3QgKmxvYykKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2ZsdXNoOiBjYWxsZWRcbiIgKSApOworCisgICAgLyogbmVlZCBleHBsaWNpdCBfX21mKCkgaGVyZSBzaW5jZSB1c2Ugdm9sYXRpbGUgaW5zdGVhZCBpbiBsaWJyYXJ5ICovCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAjaWYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgI2lmIEtNUF9NSUMKKyAgICAgICAgICAgIC8vIGZlbmNlLXN0eWxlIGluc3RydWN0aW9ucyBkbyBub3QgZXhpc3QsIGJ1dCBsb2NrOyB4YWRkbCAkMCwoJXJzcCkgY2FuIGJlIHVzZWQuCisgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgbmVlZCBpdCwgdGhvdWdoLCBzaW5jZSB0aGUgQUJJIHJ1bGVzIHJlcXVpcmUgdGhhdAorICAgICAgICAgICAgLy8gKiBJZiB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIE5HTyBzdG9yZXMgaXQgYWxzbyBnZW5lcmF0ZXMgdGhlIGZlbmNlCisgICAgICAgICAgICAvLyAqIElmIHVzZXJzIGhhbmQtY29kZSBOR08gc3RvcmVzIHRoZXkgc2hvdWxkIGluc2VydCB0aGUgZmVuY2UKKyAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBubyBpbmNvbXBsZXRlIHVub3JkZXJlZCBzdG9yZXMgc2hvdWxkIGJlIHZpc2libGUuCisgICAgICAgICNlbHNlCisgICAgICAgICAgICAvLyBDNzQ0MDQKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gYWRkcmVzcyBub24tdGVtcG9yYWwgc3RvcmUgaW5zdHJ1Y3Rpb25zIChzZmVuY2UgbmVlZGVkKS4KKyAgICAgICAgICAgIC8vIFRoZSBjbGZsdXNoIGluc3RydWN0aW9uIGlzIGFkZHJlc3NlZCBlaXRoZXIgKG1mZW5jZSBuZWVkZWQpLgorICAgICAgICAgICAgLy8gUHJvYmFibHkgdGhlIG5vbi10ZW1wb3JhbCBsb2FkIG1vbnZ0ZHFhIGluc3RydWN0aW9uIHNob3VsZCBhbHNvIGJlIGFkZHJlc3NlZC4KKyAgICAgICAgICAgIC8vIG1mZW5jZSBpcyBhIFNTRTIgaW5zdHJ1Y3Rpb24uIERvIG5vdCBleGVjdXRlIGl0IGlmIENQVSBpcyBub3QgU1NFMi4KKyAgICAgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLmluaXRpYWxpemVkICkgeworICAgICAgICAgICAgICAgIF9fa21wX3F1ZXJ5X2NwdWlkKCAmIF9fa21wX2NwdWluZm8gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoICEgX19rbXBfY3B1aW5mby5zc2UyICkgeworICAgICAgICAgICAgICAgIC8vIENQVSBjYW5ub3QgZXhlY3V0ZSBTU0UyIGluc3RydWN0aW9ucy4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAgICAgICAgICAgICBfbW1fbWZlbmNlKCk7CisgICAgICAgICAgICAgICAgI2VsaWYgS01QX0NPTVBJTEVSX01TVkMKKyAgICAgICAgICAgICAgICBNZW1vcnlCYXJyaWVyKCk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0NPTVBJTEVSX0lDQworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgI2VuZGlmIC8vIEtNUF9NSUMKKyAgICAjZWxpZiAoS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQgfHwgS01QX0FSQ0hfTUlQUyB8fCBLTVBfQVJDSF9NSVBTNjQpCisgICAgICAgIC8vIE5vdGhpbmcgdG8gc2VlIGhlcmUgbW92ZSBhbG9uZworICAgICNlbGlmIEtNUF9BUkNIX1BQQzY0CisgICAgICAgIC8vIE5vdGhpbmcgbmVlZGVkIGhlcmUgKHdlIGhhdmUgYSByZWFsIE1CIGFib3ZlKS4KKyAgICAgICAgI2lmIEtNUF9PU19DTksKKyAgICAgICAgLy8gVGhlIGZsdXNoaW5nIHRocmVhZCBuZWVkcyB0byB5aWVsZCBoZXJlOyB0aGlzIHByZXZlbnRzIGEKKyAgICAgICAvLyBidXN5LXdhaXRpbmcgdGhyZWFkIGZyb20gc2F0dXJhdGluZyB0aGUgcGlwZWxpbmUuIGZsdXNoIGlzCisgICAgICAgICAgLy8gb2Z0ZW4gdXNlZCBpbiBsb29wcyBsaWtlIHRoaXM6CisgICAgICAgICAgIC8vIHdoaWxlICghZmxhZykgeworICAgICAgICAgICAvLyAgICNwcmFnbWEgb21wIGZsdXNoKGZsYWcpCisgICAgICAgICAgIC8vIH0KKyAgICAgICAvLyBhbmQgYWRkaW5nIHRoZSB5aWVsZCBoZXJlIGlzIGdvb2QgZm9yIGF0IGxlYXN0IGEgMTB4IHNwZWVkdXAKKyAgICAgICAgICAvLyB3aGVuIHJ1bm5pbmcgPjIgdGhyZWFkcyBwZXIgY29yZSAob24gdGhlIE5BUyBMVSBiZW5jaG1hcmspLgorICAgICAgICAgICAgX19rbXBfeWllbGQoVFJVRSk7CisgICAgICAgICNlbmRpZgorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZQorICAgICNlbmRpZgorCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorCitFeGVjdXRlIGEgYmFycmllci4KKyovCit2b2lkCitfX2ttcGNfYmFycmllcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfQkFSUklFUik7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19iYXJyaWVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggbG9jID09IDAgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQ29uc3RydWN0SWRlbnRJbnZhbGlkICk7IC8vID8/PyBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgdGhlIHVzZXI/CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgX19rbXBfY2hlY2tfYmFycmllciggZ2xvYmFsX3RpZCwgY3RfYmFycmllciwgbG9jICk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBvbXB0X2ZyYW1lX3QgKiBvbXB0X2ZyYW1lOworICAgIGlmIChvbXB0X2VuYWJsZWQgKSB7CisgICAgICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICAgIGlmICggb21wdF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID09IE5VTEwgKQorICAgICAgICAgICAgb21wdF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgICAgfQorI2VuZGlmCisgICAgX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdLT50aC50aF9pZGVudCA9IGxvYzsKKyAgICAvLyBUT0RPOiBleHBsaWNpdCBiYXJyaWVyX3dhaXRfaWQ6CisgICAgLy8gICB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuICdiYXJyaWVyJyBkaXJlY3RpdmUgaXMgcHJlc2VudCBvcgorICAgIC8vICAgaW1wbGljaXQgYmFycmllciBhdCB0aGUgZW5kIG9mIGEgd29ya3NoYXJpbmcgY29uc3RydWN0LgorICAgIC8vIDEpIGJldHRlciB0byBhZGQgYSBwZXItdGhyZWFkIGJhcnJpZXIgY291bnRlciB0byBhIHRocmVhZCBkYXRhIHN0cnVjdHVyZQorICAgIC8vIDIpIHNldCB0byAwIHdoZW4gYSBuZXcgdGVhbSBpcyBjcmVhdGVkCisgICAgLy8gNCkgbm8gc3luYyBpcyByZXF1aXJlZAorCisgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgKSB7CisgICAgICAgIG9tcHRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgfQorI2VuZGlmCit9CisKKy8qIFRoZSBCQVJSSUVSIGZvciBhIE1BU1RFUiBzZWN0aW9uIGlzIGFsd2F5cyBleHBsaWNpdCAgICovCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0ByZXR1cm4gMSBpZiB0aGlzIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgPHR0Pm1hc3RlcjwvdHQ+IGJsb2NrLCAwIG90aGVyd2lzZS4KKyovCitrbXBfaW50MzIKK19fa21wY19tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfbWFzdGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgaWYoIEtNUF9NQVNURVJfR1RJRCggZ2xvYmFsX3RpZCApKSB7CisgICAgICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfTUFTVEVSKTsKKyAgICAgICAgS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX21hc3Rlcik7CisgICAgICAgIHN0YXR1cyA9IDE7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9tYXN0ZXJfYmVnaW4pKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICAqdGhpc190aHIgICAgICAgID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgICAgICAgICAga21wX3RlYW1fdCAgKnRlYW0gICAgICAgICAgICA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW07CisKKyAgICAgICAgICAgIGludCAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbikoCisgICAgICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCwgMCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ttcF9jaGVja19zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCwgMCApOworI2Vsc2UKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MsIE5VTEwgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19rbXBfY2hlY2tfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MsIE5VTEwgKTsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgLgorCitNYXJrIHRoZSBlbmQgb2YgYSA8dHQ+bWFzdGVyPC90dD4gcmVnaW9uLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgdGhyZWFkCit0aGF0IGV4ZWN1dGVzIHRoZSA8dHQ+bWFzdGVyPC90dD4gcmVnaW9uLgorKi8KK3ZvaWQKK19fa21wY19lbmRfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfbWFzdGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSk7CisgICAgS01QX1BPUF9QQVJUSVRJT05FRF9USU1FUigpOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBrbXBfaW5mb190ICAqdGhpc190aHIgICAgICAgID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgIGttcF90ZWFtX3QgICp0ZWFtICAgICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X21hc3Rlcl9lbmQpKSB7CisgICAgICAgIGludCAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbWFzdGVyX2VuZCkoCisgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiggZ2xvYmFsX3RpZCA8IDAgKQorICAgICAgICAgICAgS01QX1dBUk5JTkcoIFRocmVhZElkZW50SW52YWxpZCApOworCisgICAgICAgIGlmKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYyApOworICAgIH0KK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBndGlkICBnbG9iYWwgdGhyZWFkIG51bWJlci4KKworU3RhcnQgZXhlY3V0aW9uIG9mIGFuIDx0dD5vcmRlcmVkPC90dD4gY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY19vcmRlcmVkKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IGNpZCA9IDA7CisgICAga21wX2luZm9fdCAqdGg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfb3JkZXJlZDogY2FsbGVkIFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAoIGd0aWQgKTsKKyAgICAvLyBUT0RPOiBvcmRlcmVkX3dhaXRfaWQKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAvKiBPTVBUIHN0YXRlIHVwZGF0ZSAqLworICAgICAgICB0aC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gKHVpbnQ2NF90KSBsb2M7CisgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93YWl0X29yZGVyZWQ7CisKKyAgICAgICAgLyogT01QVCBldmVudCBjYWxsYmFjayAqLworICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCkpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X29yZGVyZWQpKAorICAgICAgICAgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gIT0gMCApCisgICAgICAgICgqdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuKSggJiBndGlkLCAmIGNpZCwgbG9jICk7CisgICAgZWxzZQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9kZW8oICYgZ3RpZCwgJiBjaWQsIGxvYyApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8qIE9NUFQgc3RhdGUgdXBkYXRlICovCisgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgICAgICB0aC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKworICAgICAgICAvKiBPTVBUIGV2ZW50IGNhbGxiYWNrICovCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfb3JkZXJlZCkpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkKSgKKyAgICAgICAgICAgICAgICB0aC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0KCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGd0aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorCitFbmQgZXhlY3V0aW9uIG9mIGFuIDx0dD5vcmRlcmVkPC90dD4gY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY19lbmRfb3JkZXJlZCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCBjaWQgPSAwOworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfb3JkZXJlZDogY2FsbGVkIFQjJWRcbiIsIGd0aWQgKSApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9vcmRlcmVkX2VuZCggZ3RpZCApOworICAgIC8vIFRPRE86IG9yZGVyZWRfd2FpdF9pZAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgaWYgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuICE9IDAgKQorICAgICAgICAoKnRoLT50aC50aF9kaXNwYXRjaC0+dGhfZHhvX2ZjbikoICYgZ3RpZCwgJiBjaWQsIGxvYyApOworICAgIGVsc2UKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfZHhvKCAmIGd0aWQsICYgY2lkLCBsb2MgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkKSgKKyAgICAgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQpOworICAgIH0KKyNlbmRpZgorfQorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworc3RhdGljIF9fZm9yY2VpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9pbmRpcmVjdF9jc3B0cihrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQsIGlkZW50X3QgY29uc3QgKiBsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW5kaXJlY3RfbG9ja3RhZ190IHRhZykKK3sKKyAgICAvLyBQb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgaW5kaXJlY3QgbG9jayBpcyB3cml0dGVuIHRvIGNyaXQsIHdoaWxlIGluZGV4aW5nIGlzIGlnbm9yZWQuCisgICAgdm9pZCAqaWR4OworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKipsY2s7CisgICAgbGNrID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopY3JpdDsKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSBfX2ttcF9hbGxvY2F0ZV9pbmRpcmVjdF9sb2NrKCZpZHgsIGd0aWQsIHRhZyk7CisgICAgS01QX0lfTE9DS19GVU5DKGlsaywgaW5pdCkoaWxrLT5sb2NrKTsKKyAgICBLTVBfU0VUX0lfTE9DS19MT0NBVElPTihpbGssIGxvYyk7CisgICAgS01QX1NFVF9JX0xPQ0tfRkxBR1MoaWxrLCBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbik7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaW5pdF9pbmRpcmVjdF9jc3B0cjogaW5pdGlhbGl6ZWQgaW5kaXJlY3QgbG9jayAjJWRcbiIsIHRhZykpOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoaWxrLT5sb2NrLCBsb2MpOworI2VuZGlmCisgICAgaW50IHN0YXR1cyA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIobGNrLCAwLCBpbGspOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2NyaXRpY2FsX2Rlc3Ryb3llZChpbGstPmxvY2spOworI2VuZGlmCisgICAgICAgIC8vIFdlIGRvbid0IHJlYWxseSBuZWVkIHRvIGRlc3Ryb3kgdGhlIHVuY2xhaW1lZCBsb2NrIGhlcmUgc2luY2UgaXQgd2lsbCBiZSBjbGVhbmVkIHVwIGF0IHByb2dyYW0gZXhpdC4KKyAgICAgICAgLy9LTVBfRF9MT0NLX0ZVTkMoJmlkeCwgZGVzdHJveSkoKGttcF9keW5hX2xvY2tfdCAqKSZpZHgpOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCpsY2sgIT0gTlVMTCk7Cit9CisKKy8vIEZhc3QtcGF0aCBhY3F1aXJlIHRhcyBsb2NrCisjZGVmaW5lIEtNUF9BQ1FVSVJFX1RBU19MT0NLKGxvY2ssIGd0aWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfdGFzX2xvY2tfdCAqbCA9IChrbXBfdGFzX2xvY2tfdCAqKWxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsLT5say5wb2xsICE9IEtNUF9MT0NLX0ZSRUUodGFzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmKGwtPmxrLnBvbGwpLCBLTVBfTE9DS19GUkVFKHRhcyksIEtNUF9MT0NLX0JVU1koZ3RpZCsxLCB0YXMpKSkgeyAgICAgIFwKKyAgICAgICAga21wX3VpbnQzMiBzcGluczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRlNZTkNfUFJFUEFSRShsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX1lJRUxEKFRSVUUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9iYWNrb2ZmX3QgYmFja29mZiA9IF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKGwtPmxrLnBvbGwgIT0gS01QX0xPQ0tfRlJFRSh0YXMpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgdGFzKSkpIHsgICBcCisgICAgICAgICAgICBfX2ttcF9zcGluX2JhY2tvZmYoJmJhY2tvZmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9ZSUVMRChUUlVFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEZhc3QtcGF0aCB0ZXN0IHRhcyBsb2NrCisjZGVmaW5lIEtNUF9URVNUX1RBU19MT0NLKGxvY2ssIGd0aWQsIHJjKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF90YXNfbG9ja190ICpsID0gKGttcF90YXNfbG9ja190ICopbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByYyA9IGwtPmxrLnBvbGwgPT0gS01QX0xPQ0tfRlJFRSh0YXMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgdGFzKSk7ICAgXAorfQorCisvLyBGYXN0LXBhdGggcmVsZWFzZSB0YXMgbG9jaworI2RlZmluZSBLTVBfUkVMRUFTRV9UQVNfTE9DSyhsb2NrLCBndGlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVENXXzQoKChrbXBfdGFzX2xvY2tfdCAqKWxvY2spLT5say5wb2xsLCBLTVBfTE9DS19GUkVFKHRhcykpOyAgIFwKKyAgICBLTVBfTUIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWYgS01QX1VTRV9GVVRFWAorCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorIyBpZm5kZWYgRlVURVhfV0FJVAorIyAgZGVmaW5lIEZVVEVYX1dBSVQgMAorIyBlbmRpZgorIyBpZm5kZWYgRlVURVhfV0FLRQorIyAgZGVmaW5lIEZVVEVYX1dBS0UgMQorIyBlbmRpZgorCisvLyBGYXN0LXBhdGggYWNxdWlyZSBmdXRleCBsb2NrCisjZGVmaW5lIEtNUF9BQ1FVSVJFX0ZVVEVYX0xPQ0sobG9jaywgZ3RpZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfZnV0ZXhfbG9ja190ICpmdHggPSAoa21wX2Z1dGV4X2xvY2tfdCAqKWxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF9pbnQzMiBndGlkX2NvZGUgPSAoZ3RpZCsxKSA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX01CKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRlNZTkNfUFJFUEFSRShmdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF9pbnQzMiBwb2xsX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKChwb2xsX3ZhbCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMigmKGZ0eC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9MT0NLX0JVU1koZ3RpZF9jb2RlLCBmdXRleCkpKSAhPSBLTVBfTE9DS19GUkVFKGZ1dGV4KSkgeyAgICAgXAorICAgICAgICBrbXBfaW50MzIgY29uZCA9IEtNUF9MT0NLX1NUUklQKHBvbGxfdmFsKSAmIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghY29uZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICghS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCYoZnR4LT5say5wb2xsKSwgcG9sbF92YWwsIHBvbGxfdmFsIHwgS01QX0xPQ0tfQlVTWSgxLCBmdXRleCkpKSB7ICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHBvbGxfdmFsIHw9IEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9pbnQzMiByYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChyYyA9IHN5c2NhbGwoX19OUl9mdXRleCwgJihmdHgtPmxrLnBvbGwpLCBGVVRFWF9XQUlULCBwb2xsX3ZhbCwgTlVMTCwgTlVMTCwgMCkpICE9IDApIHsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ3RpZF9jb2RlIHw9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGZ0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gRmFzdC1wYXRoIHRlc3QgZnV0ZXggbG9jaworI2RlZmluZSBLTVBfVEVTVF9GVVRFWF9MT0NLKGxvY2ssIGd0aWQsIHJjKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX2Z1dGV4X2xvY2tfdCAqZnR4ID0gKGttcF9mdXRleF9sb2NrX3QgKilsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYoZnR4LT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRShmdXRleCksIEtNUF9MT0NLX0JVU1koZ3RpZCsxIDw8IDEsIGZ1dGV4KSkpIHsgICAgXAorICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoZnR4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJjID0gVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByYyA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gRmFzdC1wYXRoIHJlbGVhc2UgZnV0ZXggbG9jaworI2RlZmluZSBLTVBfUkVMRUFTRV9GVVRFWF9MT0NLKGxvY2ssIGd0aWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfZnV0ZXhfbG9ja190ICpmdHggPSAoa21wX2Z1dGV4X2xvY2tfdCAqKWxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX01CKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcoZnR4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfaW50MzIgcG9sbF92YWwgPSBLTVBfWENIR19GSVhFRDMyKCYoZnR4LT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRShmdXRleCkpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEtNUF9MT0NLX1NUUklQKHBvbGxfdmFsKSAmIDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzeXNjYWxsKF9fTlJfZnV0ZXgsICYoZnR4LT5say5wb2xsKSwgRlVURVhfV0FLRSwgS01QX0xPQ0tfQlVTWSgxLCBmdXRleCksIE5VTEwsIE5VTEwsIDApOyAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX01CKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ZSUVMRChUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKTsgICAgICAgICAgICAgIFwKK30KKworI2VuZGlmIC8vIEtNUF9VU0VfRlVURVgKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworc3RhdGljIGttcF91c2VyX2xvY2tfcAorX19rbXBfZ2V0X2NyaXRpY2FsX3NlY3Rpb25fcHRyKCBrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQsIGlkZW50X3QgY29uc3QgKiBsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdXNlcl9sb2NrX3AgKmxja19wcCA9IChrbXBfdXNlcl9sb2NrX3AgKiljcml0OworCisgICAgLy8KKyAgICAvLyBCZWNhdXNlIG9mIHRoZSBkb3VibGUtY2hlY2ssIHRoZSBmb2xsb3dpbmcgbG9hZAorICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSB2b2xhdGlsZS4KKyAgICAvLworICAgIGttcF91c2VyX2xvY2tfcCBsY2sgPSAoa21wX3VzZXJfbG9ja19wKVRDUl9QVFIoICpsY2tfcHAgKTsKKworICAgIGlmICggbGNrID09IE5VTEwgKSB7CisgICAgICAgIHZvaWQgKiBpZHg7CisKKyAgICAgICAgLy8gQWxsb2NhdGUgJiBpbml0aWFsaXplIHRoZSBsb2NrLgorICAgICAgICAvLyBSZW1lbWJlciBhbGxvY2F0ZWQgbG9ja3MgaW4gdGFibGUgaW4gb3JkZXIgdG8gZnJlZSB0aGVtIGluIF9fa21wX2NsZWFudXAoKQorICAgICAgICBsY2sgPSBfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoICZpZHgsIGd0aWQsIGttcF9sZl9jcml0aWNhbF9zZWN0aW9uICk7CisgICAgICAgIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2sgKTsKKyAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrLCBsb2MgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZyggbGNrICk7CisgICAgICAgICAgICAvLyBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoKSBzaG91bGQgYmUgY2FsbGVkICpiZWZvcmUqIHRoZSBmaXJzdCB1c2FnZSBvZiB1bmRlcmx5aW5nCisgICAgICAgICAgICAvLyBsb2NrLiBJdCBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBjYW4gZ3VhcmFudGVlIGl0LiBUaGVyZSBhcmUgY2hhbmNlcyB0aGUgbG9jayB3aWxsCisgICAgICAgICAgICAvLyBkZXN0cm95ZWQgd2l0aCBubyB1c2FnZSwgYnV0IGl0IGlzIG5vdCBhIHByb2JsZW0sIGJlY2F1c2UgdGhpcyBpcyBub3QgcmVhbCBldmVudCBzZWVuCisgICAgICAgICAgICAvLyBieSB1c2VyIGJ1dCByYXRoZXIgc2V0dGluZyBuYW1lIGZvciBvYmplY3QgKGxvY2spLiBTZWUgbW9yZSBkZXRhaWxzIGluIGttcF9pdHQuaC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIGEgY21weGNoZyBpbnN0cnVjdGlvbiB0byBzbGFtIHRoZSBzdGFydCBvZiB0aGUgY3JpdGljYWwKKyAgICAgICAgLy8gc2VjdGlvbiB3aXRoIHRoZSBsb2NrIHBvaW50ZXIuICBJZiBhbm90aGVyIHRocmVhZCBiZWF0IHVzCisgICAgICAgIC8vIHRvIGl0LCBkZWFsbG9jYXRlIHRoZSBsb2NrLCBhbmQgdXNlIHRoZSBsb2NrIHRoYXQgdGhlIG90aGVyCisgICAgICAgIC8vIHRocmVhZCBhbGxvY2F0ZWQuCisgICAgICAgIC8vCisgICAgICAgIGludCBzdGF0dXMgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKCBsY2tfcHAsIDAsIGxjayApOworCisgICAgICAgIGlmICggc3RhdHVzID09IDAgKSB7CisgICAgICAgICAgICAvLyBEZWFsbG9jYXRlIHRoZSBsb2NrIGFuZCByZWxvYWQgdGhlIHZhbHVlLgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoIGxjayApOworICAgICAgICAgICAgICAgIC8vIExldCBJVFQga25vdyB0aGUgbG9jayBpcyBkZXN0cm95ZWQgYW5kIHRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbiBtYXkgYmUgcmV1c2VkIGZvcgorICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgcHVycG9zZS4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfZnJlZSggJmlkeCwgZ3RpZCwgbGNrICk7CisgICAgICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKVRDUl9QVFIoICpsY2tfcHAgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayAhPSBOVUxMICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxjazsKK30KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgLgorQHBhcmFtIGNyaXQgaWRlbnRpdHkgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24uIFRoaXMgY291bGQgYmUgYSBwb2ludGVyIHRvIGEgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGNyaXRpY2FsIHNlY3Rpb24sIG9yCitzb21lIG90aGVyIHN1aXRhYmx5IHVuaXF1ZSB2YWx1ZS4KKworRW50ZXIgY29kZSBwcm90ZWN0ZWQgYnkgYSBgY3JpdGljYWxgIGNvbnN0cnVjdC4KK1RoaXMgZnVuY3Rpb24gYmxvY2tzIHVudGlsIHRoZSBleGVjdXRpbmcgdGhyZWFkIGNhbiBlbnRlciB0aGUgY3JpdGljYWwgc2VjdGlvbi4KKyovCit2b2lkCitfX2ttcGNfY3JpdGljYWwoIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQgKQoreworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgX19rbXBjX2NyaXRpY2FsX3dpdGhfaGludChsb2MsIGdsb2JhbF90aWQsIGNyaXQsIG9tcF9sb2NrX2hpbnRfbm9uZSk7CisjZWxzZQorICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfQ1JJVElDQUwpOworICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9jcml0aWNhbF93YWl0KTsgICAgICAgIC8qIFRpbWUgc3BlbnQgd2FpdGluZyB0byBlbnRlciB0aGUgY3JpdGljYWwgc2VjdGlvbiAqLworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NyaXRpY2FsOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvL1RPRE86IGFkZCBUSFJfT1ZIRF9TVEFURQorCisgICAgS01QX0NIRUNLX1VTRVJfTE9DS19JTklUKCk7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0NSSVRJQ0FMX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsgLy8gdGlja2V0LCBxdWV1aW5nIG9yIGRyZHBhCisgICAgICAgIGxjayA9IF9fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0ciggY3JpdCwgbG9jLCBnbG9iYWxfdGlkICk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjayApOworCisgICAgLyogc2luY2UgdGhlIGNyaXRpY2FsIGRpcmVjdGl2ZSBiaW5kcyB0byBhbGwgdGhyZWFkcywgbm90IGp1c3QKKyAgICAgKiB0aGUgY3VycmVudCB0ZWFtIHdlIGhhdmUgdG8gY2hlY2sgdGhpcyBldmVuIGlmIHdlIGFyZSBpbiBhCisgICAgICogc2VyaWFsaXplZCB0ZWFtICovCisgICAgLyogYWxzbywgZXZlbiBpZiB3ZSBhcmUgdGhlIHViZXIgdGhyZWFkLCB3ZSBzdGlsbCBoYXZlIHRvIGNvbmR1Y3QgdGhlIGxvY2ssCisgICAgICogYXMgd2UgaGF2ZSB0byBjb250ZW5kIHdpdGggc2libGluZyB0aHJlYWRzICovCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIC8vIFZhbHVlIG9mICdjcml0JyBzaG91bGQgYmUgZ29vZCBmb3IgdXNpbmcgYXMgYSBjcml0aWNhbF9pZCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBkaXJlY3RpdmUuCisgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJlZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKE9NUF9jcml0aWNhbCk7CisgICAgS0FfVFJBQ0UoIDE1LCAoIl9fa21wY19jcml0aWNhbDogZG9uZSBUIyVkXG4iLCBnbG9iYWxfdGlkICkpOworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gaGludCB0byBhbiBpbnRlcm5hbCBsb2NrIGltcGxlbWVudGF0aW9uCitzdGF0aWMgX19mb3JjZWlubGluZSBrbXBfZHluYV9sb2Nrc2VxX3QKK19fa21wX21hcF9oaW50X3RvX2xvY2sodWludHB0cl90IGhpbnQpCit7CisjaWYgS01QX1VTRV9UU1gKKyMgZGVmaW5lIEtNUF9UU1hfTE9DSyhzZXEpIGxvY2tzZXFfIyNzZXEKKyNlbHNlCisjIGRlZmluZSBLTVBfVFNYX0xPQ0soc2VxKSBfX2ttcF91c2VyX2xvY2tfc2VxCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIEtNUF9DUFVJTkZPX1JUTSAoX19rbXBfY3B1aW5mby5ydG0pCisjZWxzZQorIyBkZWZpbmUgS01QX0NQVUlORk9fUlRNIDAKKyNlbmRpZgorCisgICAgLy8gSGludHMgdGhhdCBkbyBub3QgcmVxdWlyZSBmdXJ0aGVyIGxvZ2ljCisgICAgaWYgKGhpbnQgJiBrbXBfbG9ja19oaW50X2hsZSkKKyAgICAgICAgcmV0dXJuIEtNUF9UU1hfTE9DSyhobGUpOworICAgIGlmIChoaW50ICYga21wX2xvY2tfaGludF9ydG0pCisgICAgICAgIHJldHVybiBLTVBfQ1BVSU5GT19SVE0gPyBLTVBfVFNYX0xPQ0socnRtKTogX19rbXBfdXNlcl9sb2NrX3NlcTsKKyAgICBpZiAoaGludCAmIGttcF9sb2NrX2hpbnRfYWRhcHRpdmUpCisgICAgICAgIHJldHVybiBLTVBfQ1BVSU5GT19SVE0gPyBLTVBfVFNYX0xPQ0soYWRhcHRpdmUpOiBfX2ttcF91c2VyX2xvY2tfc2VxOworCisgICAgLy8gUnVsZSBvdXQgY29uZmxpY3RpbmcgaGludHMgZmlyc3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0IGxvY2sKKyAgICBpZiAoKGhpbnQgJiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCkgJiYgKGhpbnQgJiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkKSkKKyAgICAgICAgcmV0dXJuIF9fa21wX3VzZXJfbG9ja19zZXE7CisgICAgaWYgKChoaW50ICYgb21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSkgJiYgKGhpbnQgJiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlKSkKKyAgICAgICAgcmV0dXJuIF9fa21wX3VzZXJfbG9ja19zZXE7CisKKyAgICAvLyBEbyBub3QgZXZlbiBjb25zaWRlciBzcGVjdWxhdGlvbiB3aGVuIGl0IGFwcGVhcnMgdG8gYmUgY29udGVuZGVkCisgICAgaWYgKGhpbnQgJiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCkKKyAgICAgICAgcmV0dXJuIGxvY2tzZXFfcXVldWluZzsKKworICAgIC8vIFVuY29udGVuZGVkIGxvY2sgd2l0aG91dCBzcGVjdWxhdGlvbgorICAgIGlmICgoaGludCAmIG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQpICYmICEoaGludCAmIG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpKQorICAgICAgICByZXR1cm4gbG9ja3NlcV90YXM7CisKKyAgICAvLyBITEUgbG9jayBmb3Igc3BlY3VsYXRpb24KKyAgICBpZiAoaGludCAmIG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpCisgICAgICAgIHJldHVybiBLTVBfVFNYX0xPQ0soaGxlKTsKKworICAgIHJldHVybiBfX2ttcF91c2VyX2xvY2tfc2VxOworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorQHBhcmFtIGNyaXQgaWRlbnRpdHkgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24uIFRoaXMgY291bGQgYmUgYSBwb2ludGVyIHRvIGEgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGNyaXRpY2FsIHNlY3Rpb24sCitvciBzb21lIG90aGVyIHN1aXRhYmx5IHVuaXF1ZSB2YWx1ZS4KK0BwYXJhbSBoaW50IHRoZSBsb2NrIGhpbnQuCisKK0VudGVyIGNvZGUgcHJvdGVjdGVkIGJ5IGEgYGNyaXRpY2FsYCBjb25zdHJ1Y3Qgd2l0aCBhIGhpbnQuIFRoZSBoaW50IHZhbHVlIGlzIHVzZWQgdG8gc3VnZ2VzdCBhIGxvY2sgaW1wbGVtZW50YXRpb24uCitUaGlzIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCB0aGUgZXhlY3V0aW5nIHRocmVhZCBjYW4gZW50ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdW5sZXNzIHRoZSBoaW50IHN1Z2dlc3RzIHVzZSBvZgorc3BlY3VsYXRpdmUgZXhlY3V0aW9uIGFuZCB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgaXQuCisqLwordm9pZAorX19rbXBjX2NyaXRpY2FsX3dpdGhfaGludCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCwgdWludHB0cl90IGhpbnQgKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfQ1JJVElDQUwpOworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NyaXRpY2FsOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBrbXBfZHluYV9sb2NrX3QgKmxrID0gKGttcF9keW5hX2xvY2tfdCAqKWNyaXQ7CisgICAgLy8gQ2hlY2sgaWYgaXQgaXMgaW5pdGlhbGl6ZWQuCisgICAgaWYgKCpsayA9PSAwKSB7CisgICAgICAgIGttcF9keW5hX2xvY2tzZXFfdCBsY2tzZXEgPSBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpOworICAgICAgICBpZiAoS01QX0lTX0RfTE9DSyhsY2tzZXEpKSB7CisgICAgICAgICAgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKWNyaXQsIDAsIEtNUF9HRVRfRF9UQUcobGNrc2VxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyKGNyaXQsIGxvYywgZ2xvYmFsX3RpZCwgS01QX0dFVF9JX1RBRyhsY2tzZXEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBCcmFuY2ggZm9yIGFjY2Vzc2luZyB0aGUgYWN0dWFsIGxvY2sgb2JqZWN0IGFuZCBzZXQgb3BlcmF0aW9uLiBUaGlzIGJyYW5jaGluZyBpcyBpbmV2aXRhYmxlIHNpbmNlCisgICAgLy8gdGhpcyBsb2NrIGluaXRpYWxpemF0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUgbm9ybWFsIGRpc3BhdGNoIHBhdGggKGxvY2sgdGFibGUgaXMgbm90IHVzZWQpLgorICAgIGlmIChLTVBfRVhUUkFDVF9EX1RBRyhsaykgIT0gMCkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWxrOworICAgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYywgbGNrLCBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpKTsKKyAgICAgICAgfQorIyBpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcobGNrKTsKKyMgZW5kaWYKKyMgaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICAgICAgICBpZiAoX19rbXBfdXNlcl9sb2NrX3NlcSA9PSBsb2Nrc2VxX3RhcyAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBLTVBfQUNRVUlSRV9UQVNfTE9DSyhsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9IGVsc2UKKyMgZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgICAgICAgaWYgKF9fa21wX3VzZXJfbG9ja19zZXEgPT0gbG9ja3NlcV9mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBLTVBfQUNRVUlSRV9GVVRFWF9MT0NLKGxjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0gZWxzZQorIyBlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBLTVBfRF9MT0NLX0ZVTkMobGssIHNldCkobGssIGdsb2JhbF90aWQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKilsayk7CisgICAgICAgIGxjayA9IGlsay0+bG9jazsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywgX19rbXBfbWFwX2hpbnRfdG9fbG9jayhoaW50KSk7CisgICAgICAgIH0KKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyaW5nKGxjayk7CisjIGVuZGlmCisgICAgICAgIEtNUF9JX0xPQ0tfRlVOQyhpbGssIHNldCkobGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfY3JpdGljYWwpOworICAgIEtBX1RSQUNFKCAxNSwgKCJfX2ttcGNfY3JpdGljYWw6IGRvbmUgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKK30gLy8gX19rbXBjX2NyaXRpY2FsX3dpdGhfaGludAorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAuCitAcGFyYW0gY3JpdCBpZGVudGl0eSBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHBvaW50ZXIgdG8gYSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3JpdGljYWwgc2VjdGlvbiwgb3IKK3NvbWUgb3RoZXIgc3VpdGFibHkgdW5pcXVlIHZhbHVlLgorCitMZWF2ZSBhIGNyaXRpY2FsIHNlY3Rpb24sIHJlbGVhc2luZyBhbnkgbG9jayB0aGF0IHdhcyBoZWxkIGR1cmluZyBpdHMgZXhlY3V0aW9uLgorKi8KK3ZvaWQKK19fa21wY19lbmRfY3JpdGljYWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmNyaXQpCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX2NyaXRpY2FsOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaWYgKEtNUF9JU19EX0xPQ0soX19rbXBfdXNlcl9sb2NrX3NlcSkpIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgICAgICBLTVBfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyk7CisgICAgICAgIH0KKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfcmVsZWFzaW5nKCBsY2sgKTsKKyMgZW5kaWYKKyMgaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICAgICAgICBpZiAoX19rbXBfdXNlcl9sb2NrX3NlcSA9PSBsb2Nrc2VxX3RhcyAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBLTVBfUkVMRUFTRV9UQVNfTE9DSyhsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9IGVsc2UKKyMgZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgICAgICAgaWYgKF9fa21wX3VzZXJfbG9ja19zZXEgPT0gbG9ja3NlcV9mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBLTVBfUkVMRUFTRV9GVVRFWF9MT0NLKGxjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0gZWxzZQorIyBlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBLTVBfRF9MT0NLX0ZVTkMobGNrLCB1bnNldCkoKGttcF9keW5hX2xvY2tfdCAqKWxjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKVRDUl9QVFIoKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKiljcml0KSk7CisgICAgICAgIEtNUF9BU1NFUlQoaWxrICE9IE5VTEwpOworICAgICAgICBsY2sgPSBpbGstPmxvY2s7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MpOworICAgICAgICB9CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZyggbGNrICk7CisjIGVuZGlmCisgICAgICAgIEtNUF9JX0xPQ0tfRlVOQyhpbGssIHVuc2V0KShsY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfQ1JJVElDQUxfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0NSSVRJQ0FMX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeyAvLyB0aWNrZXQsIHF1ZXVpbmcgb3IgZHJkcGEKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCkgVENSX1BUUigqKChrbXBfdXNlcl9sb2NrX3AgKiljcml0KSk7CisgICAgfQorCisgICAgS01QX0FTU0VSVChsY2sgIT0gTlVMTCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIC8vIFZhbHVlIG9mICdjcml0JyBzaG91bGQgYmUgZ29vZCBmb3IgdXNpbmcgYXMgYSBjcml0aWNhbF9pZCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBkaXJlY3RpdmUuCisgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX2NyaXRpY2FsKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9jcml0aWNhbCkoCisgICAgICAgICAgICAodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIEtNUF9QT1BfUEFSVElUSU9ORURfVElNRVIoKTsKKyAgICBLQV9UUkFDRSggMTUsICgiX19rbXBjX2VuZF9jcml0aWNhbDogZG9uZSBUIyVkXG4iLCBnbG9iYWxfdGlkICkpOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIHRocmVhZCBpZC4KK0ByZXR1cm4gb25lIGlmIHRoZSB0aHJlYWQgc2hvdWxkIGV4ZWN1dGUgdGhlIG1hc3RlciBibG9jaywgemVybyBvdGhlcndpc2UKKworU3RhcnQgZXhlY3V0aW9uIG9mIGEgY29tYmluZWQgYmFycmllciBhbmQgbWFzdGVyLiBUaGUgYmFycmllciBpcyBleGVjdXRlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbi4KKyovCitrbXBfaW50MzIKK19fa21wY19iYXJyaWVyX21hc3RlcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2JhcnJpZXJfbWFzdGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9jaGVja19iYXJyaWVyKCBnbG9iYWxfdGlkLCBjdF9iYXJyaWVyLCBsb2MgKTsKKworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICBzdGF0dXMgPSBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBUUlVFLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICByZXR1cm4gKHN0YXR1cyAhPSAwKSA/IDAgOiAxOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIHRocmVhZCBpZC4KKworQ29tcGxldGUgdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbWJpbmVkIGJhcnJpZXIgYW5kIG1hc3Rlci4gVGhpcyBmdW5jdGlvbiBzaG91bGQKK29ubHkgYmUgY2FsbGVkIGF0IHRoZSBjb21wbGV0aW9uIG9mIHRoZSA8dHQ+bWFzdGVyPC90dD4gY29kZS4gT3RoZXIgdGhyZWFkcyB3aWxsCitzdGlsbCBiZSB3YWl0aW5nIGF0IHRoZSBiYXJyaWVyIGFuZCB0aGlzIGNhbGwgcmVsZWFzZXMgdGhlbS4KKyovCit2b2lkCitfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfYmFycmllcl9tYXN0ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkpOworCisgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIgKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkICk7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorQHJldHVybiBvbmUgaWYgdGhlIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgbWFzdGVyIGJsb2NrLCB6ZXJvIG90aGVyd2lzZQorCitTdGFydCBleGVjdXRpb24gb2YgYSBjb21iaW5lZCBiYXJyaWVyIGFuZCBtYXN0ZXIobm93YWl0KSBjb25zdHJ1Y3QuCitUaGUgYmFycmllciBpcyBleGVjdXRlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbi4KK1RoZXJlIGlzIG5vIGVxdWl2YWxlbnQgImVuZCIgZnVuY3Rpb24sIHNpbmNlIHRoZQorKi8KK2ttcF9pbnQzMgorX19rbXBjX2JhcnJpZXJfbWFzdGVyX25vd2FpdCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGttcF9pbnQzMiByZXQ7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2JhcnJpZXJfbWFzdGVyX25vd2FpdDogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggbG9jID09IDAgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQ29uc3RydWN0SWRlbnRJbnZhbGlkICk7IC8vID8/PyBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgdGhlIHVzZXI/CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfY2hlY2tfYmFycmllciggZ2xvYmFsX3RpZCwgY3RfYmFycmllciwgbG9jICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICByZXQgPSBfX2ttcGNfbWFzdGVyIChsb2MsIGdsb2JhbF90aWQpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIC8qICB0aGVyZSdzIG5vIF9fa21wY19lbmRfbWFzdGVyIGNhbGxlZDsgc28gdGhlIChzdGF0cykgKi8KKyAgICAgICAgLyogIGFjdGlvbnMgb2YgX19rbXBjX2VuZF9tYXN0ZXIgYXJlIGRvbmUgaGVyZSAgICAgICAgICAqLworCisgICAgICAgIGlmICggZ2xvYmFsX3RpZCA8IDAgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggVGhyZWFkSWRlbnRJbnZhbGlkICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgLyogb25seSBvbmUgdGhyZWFkIHNob3VsZCBkbyB0aGUgcG9wIHNpbmNlIG9ubHkgKi8KKyAgICAgICAgICAgIC8qIG9uZSBkaWQgdGhlIHB1c2ggKHNlZSBfX2ttcGNfbWFzdGVyKCkpICAgICAgICovCisKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYyApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChyZXQpOworfQorCisvKiBUaGUgQkFSUklFUiBmb3IgYSBTSU5HTEUgcHJvY2VzcyBzZWN0aW9uIGlzIGFsd2F5cyBleHBsaWNpdCAgICovCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0ByZXR1cm4gT25lIGlmIHRoaXMgdGhyZWFkIHNob3VsZCBleGVjdXRlIHRoZSBzaW5nbGUgY29uc3RydWN0LCB6ZXJvIG90aGVyd2lzZS4KKworVGVzdCB3aGV0aGVyIHRvIGV4ZWN1dGUgYSA8dHQ+c2luZ2xlPC90dD4gY29uc3RydWN0LgorVGhlcmUgYXJlIG5vIGltcGxpY2l0IGJhcnJpZXJzIGluIHRoZSB0d28gInNpbmdsZSIgY2FsbHMsIHJhdGhlciB0aGUgY29tcGlsZXIgc2hvdWxkCitpbnRyb2R1Y2UgYW4gZXhwbGljaXQgYmFycmllciBpZiBpdCBpcyByZXF1aXJlZC4KKyovCisKK2ttcF9pbnQzMgorX19rbXBjX3NpbmdsZShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcF9pbnQzMiByYyA9IF9fa21wX2VudGVyX3NpbmdsZSggZ2xvYmFsX3RpZCwgbG9jLCBUUlVFICk7CisKKyAgICBpZiAocmMpIHsKKyAgICAgICAgLy8gV2UgYXJlIGdvaW5nIHRvIGV4ZWN1dGUgdGhlIHNpbmdsZSBzdGF0ZW1lbnQsIHNvIHdlIHNob3VsZCBjb3VudCBpdC4KKyAgICAgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9TSU5HTEUpOworICAgICAgICBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfc2luZ2xlKTsKKyAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyICAgICAgICA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtICAgICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfYmVnaW4pKSB7CisgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19iZWdpbikoCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCwKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5taWNyb3Rhc2spOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2JlZ2luKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93YWl0X3NpbmdsZTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHJjOworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIKKworTWFyayB0aGUgZW5kIG9mIGEgPHR0PnNpbmdsZTwvdHQ+IGNvbnN0cnVjdC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkCitvbmx5IGJlIGNhbGxlZCBieSB0aGUgdGhyZWFkIHRoYXQgZXhlY3V0ZWQgdGhlIGJsb2NrIG9mIGNvZGUgcHJvdGVjdGVkCitieSB0aGUgYHNpbmdsZWAgY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY19lbmRfc2luZ2xlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgX19rbXBfZXhpdF9zaW5nbGUoIGdsb2JhbF90aWQgKTsKKyAgICBLTVBfUE9QX1BBUlRJVElPTkVEX1RJTUVSKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyICAgICAgICA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtICAgICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2VuZCkoCisgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBHbG9iYWwgdGhyZWFkIGlkCisKK01hcmsgdGhlIGVuZCBvZiBhIHN0YXRpY2FsbHkgc2NoZWR1bGVkIGxvb3AuCisqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfZmluaSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19mb3Jfc3RhdGljX2ZpbmkgY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9lbmQpKSB7CisgICAgICAgIG9tcHRfdGVhbV9pbmZvX3QgKnRlYW1faW5mbyA9IF9fb21wdF9nZXRfdGVhbWluZm8oMCwgTlVMTCk7CisgICAgICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCkoCisgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF9wZG8sIGxvYyApOworfQorCisvKgorICogVXNlciByb3V0aW5lcyB3aGljaCB0YWtlIEMtc3R5bGUgYXJndW1lbnRzIChjYWxsIGJ5IHZhbHVlKQorICogZGlmZmVyZW50IGZyb20gdGhlIEZvcnRyYW4gZXF1aXZhbGVudCByb3V0aW5lcworICovCisKK3ZvaWQKK29tcGNfc2V0X251bV90aHJlYWRzKCBpbnQgYXJnICkKK3sKKy8vICEhISEhIFRPRE86IGNoZWNrIHRoZSBwZXItdGFzayBiaW5kaW5nCisgICAgX19rbXBfc2V0X251bV90aHJlYWRzKCBhcmcsIF9fa21wX2VudHJ5X2d0aWQoKSApOworfQorCit2b2lkCitvbXBjX3NldF9keW5hbWljKCBpbnQgZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgc2V0X19keW5hbWljKCB0aHJlYWQsIGZsYWcgPyBUUlVFIDogRkFMU0UgKTsKK30KKwordm9pZAorb21wY19zZXRfbmVzdGVkKCBpbnQgZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX25lc3RlZCggdGhyZWFkLCBmbGFnID8gVFJVRSA6IEZBTFNFICk7Cit9CisKK3ZvaWQKK29tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgbWF4X2FjdGl2ZV9sZXZlbHMgKQoreworICAgIC8qIFRPIERPICovCisgICAgLyogd2Ugd2FudCBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVybmFsIGNvbnRyb2wgKi8KKworICAgIC8qIEZvciB0aGUgcGVyLXRocmVhZCBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICAgIF9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggX19rbXBfZW50cnlfZ3RpZCgpLCBtYXhfYWN0aXZlX2xldmVscyApOworfQorCit2b2lkCitvbXBjX3NldF9zY2hlZHVsZSggb21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICkKK3sKKy8vICEhISEhIFRPRE86IGNoZWNrIHRoZSBwZXItdGFzayBiaW5kaW5nCisgICAgX19rbXBfc2V0X3NjaGVkdWxlKCBfX2ttcF9lbnRyeV9ndGlkKCksICgga21wX3NjaGVkX3QgKSBraW5kLCBtb2RpZmllciApOworfQorCitpbnQKK29tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIGludCBsZXZlbCApCit7CisgICAgcmV0dXJuIF9fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBfX2ttcF9lbnRyeV9ndGlkKCksIGxldmVsICk7Cit9CisKK2ludAorb21wY19nZXRfdGVhbV9zaXplKCBpbnQgbGV2ZWwgKQoreworICAgIHJldHVybiBfX2ttcF9nZXRfdGVhbV9zaXplKCBfX2ttcF9lbnRyeV9ndGlkKCksIGxldmVsICk7Cit9CisKK3ZvaWQKK2ttcGNfc2V0X3N0YWNrc2l6ZSggaW50IGFyZyApCit7CisgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIGFyZyApOworfQorCit2b2lkCitrbXBjX3NldF9zdGFja3NpemVfcyggc2l6ZV90IGFyZyApCit7CisgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIGFyZyApOworfQorCit2b2lkCitrbXBjX3NldF9ibG9ja3RpbWUoIGludCBhcmcgKQoreworICAgIGludCBndGlkLCB0aWQ7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICBfX2ttcF9hdXhfc2V0X2Jsb2NrdGltZSggYXJnLCB0aHJlYWQsIHRpZCApOworfQorCit2b2lkCitrbXBjX3NldF9saWJyYXJ5KCBpbnQgYXJnICkKK3sKKyAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIChlbnVtIGxpYnJhcnlfdHlwZSlhcmcgKTsKK30KKwordm9pZAora21wY19zZXRfZGVmYXVsdHMoIGNoYXIgY29uc3QgKiBzdHIgKQoreworICAgIC8vIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgX19rbXBfYXV4X3NldF9kZWZhdWx0cyggc3RyLCBLTVBfU1RSTEVOKCBzdHIgKSApOworfQorCit2b2lkCitrbXBjX3NldF9kaXNwX251bV9idWZmZXJzKCBpbnQgYXJnICkKK3sKKyAgICAvLyBpZ25vcmUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gYmVjYXVzZSBzb21lIHRlYW1zIGhhdmUgYWxyZWFkeQorICAgIC8vIGFsbG9jYXRlZCBkaXNwYXRjaCBidWZmZXJzCisgICAgaWYoIF9fa21wX2luaXRfc2VyaWFsID09IDAgJiYgYXJnID4gMCApCisgICAgICAgIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzID0gYXJnOworfQorCitpbnQKK2ttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBwcm9jLCBtYXNrICk7CisjZW5kaWYKK30KKworaW50CitrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIHByb2MsIG1hc2sgKTsKKyNlbmRpZgorfQorCitpbnQKK2ttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyggaW50IHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKCBwcm9jLCBtYXNrICk7CisjZW5kaWYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyohCitAaW5ncm91cCBUSFJFQURQUklWQVRFCitAcGFyYW0gbG9jICAgICAgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGd0aWQgICAgICBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIGNweV9zaXplICBzaXplIG9mIHRoZSBjcHlfZGF0YSBidWZmZXIKK0BwYXJhbSBjcHlfZGF0YSAgcG9pbnRlciB0byBkYXRhIHRvIGJlIGNvcGllZAorQHBhcmFtIGNweV9mdW5jICBoZWxwZXIgZnVuY3Rpb24gdG8gY2FsbCBmb3IgY29weWluZyBkYXRhCitAcGFyYW0gZGlkaXQgICAgIGZsYWcgdmFyaWFibGU6IDE9c2luZ2xlIHRocmVhZDsgMD1ub3Qgc2luZ2xlIHRocmVhZAorCitfX2ttcGNfY29weXByaXZhdGUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgcHJpdmF0ZSBkYXRhIGJyb2FkY2FzdCBuZWVkZWQgZm9yCit0aGUgY29weXByaXZhdGUgY2xhdXNlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSByZWdpb24gaW4gYW4gT3Blbk1QPHN1cD4qPC9zdXA+IHByb2dyYW0gKGJvdGggQyBhbmQgRm9ydHJhbikuCitBbGwgdGhyZWFkcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBwYXJhbGxlbCByZWdpb24gY2FsbCB0aGlzIHJvdXRpbmUuCitPbmUgb2YgdGhlIHRocmVhZHMgKGNhbGxlZCB0aGUgc2luZ2xlIHRocmVhZCkgc2hvdWxkIGhhdmUgdGhlIDx0dD5kaWRpdDwvdHQ+IHZhcmlhYmxlIHNldCB0byAxCithbmQgYWxsIG90aGVyIHRocmVhZHMgc2hvdWxkIGhhdmUgdGhhdCB2YXJpYWJsZSBzZXQgdG8gMC4KK0FsbCB0aHJlYWRzIHBhc3MgYSBwb2ludGVyIHRvIGEgZGF0YSBidWZmZXIgKGNweV9kYXRhKSB0aGF0IHRoZXkgaGF2ZSBidWlsdC4KKworVGhlIE9wZW5NUCBzcGVjaWZpY2F0aW9uIGZvcmJpZHMgdGhlIHVzZSBvZiBub3dhaXQgb24gdGhlIHNpbmdsZSByZWdpb24gd2hlbiBhIGNvcHlwcml2YXRlCitjbGF1c2UgaXMgcHJlc2VudC4gSG93ZXZlciwgQHJlZiBfX2ttcGNfY29weXByaXZhdGUgaW1wbGVtZW50cyBhIGJhcnJpZXIgaW50ZXJuYWxseSB0byBhdm9pZAorcmFjZSBjb25kaXRpb25zLCBzbyB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciB0aGUgc2luZ2xlIHJlZ2lvbiBzaG91bGQgYXZvaWQgZ2VuZXJhdGluZyBhIGJhcnJpZXIKK2FmdGVyIHRoZSBjYWxsIHRvIEByZWYgX19rbXBjX2NvcHlwcml2YXRlLgorCitUaGUgPHR0Pmd0aWQ8L3R0PiBwYXJhbWV0ZXIgaXMgdGhlIGdsb2JhbCB0aHJlYWQgaWQgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KK1RoZSA8dHQ+bG9jPC90dD4gcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCisKK0ludGVybmFsIGltcGxlbWVudGF0aW9uOiBUaGUgc2luZ2xlIHRocmVhZCB3aWxsIGZpcnN0IGNvcHkgaXRzIGRlc2NyaXB0b3IgYWRkcmVzcyAoY3B5X2RhdGEpCit0byBhIHRlYW0tcHJpdmF0ZSBsb2NhdGlvbiwgdGhlbiB0aGUgb3RoZXIgdGhyZWFkcyB3aWxsIGVhY2ggY2FsbCB0aGUgZnVuY3Rpb24gcG9pbnRlZCB0byBieQordGhlIHBhcmFtZXRlciBjcHlfZnVuYywgd2hpY2ggY2FycmllcyBvdXQgdGhlIGNvcHkgYnkgY29weWluZyB0aGUgZGF0YSB1c2luZyB0aGUgY3B5X2RhdGEgYnVmZmVyLgorCitUaGUgY3B5X2Z1bmMgcm91dGluZSB1c2VkIGZvciB0aGUgY29weSBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIGFyZWEgZGVmaW5lZCBieSBjcHlfZGF0YQorYW5kIGNweV9zaXplIG1heSBiZSBidWlsdCBpbiBhbnkgZmFzaGlvbiB0aGF0IHdpbGwgYWxsb3cgdGhlIGNvcHkgdG8gYmUgZG9uZS4gRm9yIGluc3RhbmNlLAordGhlIGNweV9kYXRhIGJ1ZmZlciBjYW4gaG9sZCB0aGUgYWN0dWFsIGRhdGEgdG8gYmUgY29waWVkIG9yIGl0IG1heSBob2xkIGEgbGlzdCBvZiBwb2ludGVycwordG8gdGhlIGRhdGEuIFRoZSBjcHlfZnVuYyByb3V0aW5lIG11c3QgaW50ZXJwcmV0IHRoZSBjcHlfZGF0YSBidWZmZXIgYXBwcm9wcmlhdGVseS4KKworVGhlIGludGVyZmFjZSB0byBjcHlfZnVuYyBpcyBhcyBmb2xsb3dzOgorQGNvZGUKK3ZvaWQgY3B5X2Z1bmMoIHZvaWQgKmRlc3RpbmF0aW9uLCB2b2lkICpzb3VyY2UgKQorQGVuZGNvZGUKK3doZXJlIHZvaWQgKmRlc3RpbmF0aW9uIGlzIHRoZSBjcHlfZGF0YSBwb2ludGVyIGZvciB0aGUgdGhyZWFkIGJlaW5nIGNvcGllZCB0bworYW5kIHZvaWQgKnNvdXJjZSBpcyB0aGUgY3B5X2RhdGEgcG9pbnRlciBmb3IgdGhlIHRocmVhZCBiZWluZyBjb3BpZWQgZnJvbS4KKyovCit2b2lkCitfX2ttcGNfY29weXByaXZhdGUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHNpemVfdCBjcHlfc2l6ZSwgdm9pZCAqY3B5X2RhdGEsIHZvaWQoKmNweV9mdW5jKSh2b2lkKix2b2lkKiksIGttcF9pbnQzMiBkaWRpdCApCit7CisgICAgdm9pZCAqKmRhdGFfcHRyOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jb3B5cHJpdmF0ZTogY2FsbGVkIFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICBLTVBfTUIoKTsKKworICAgIGRhdGFfcHRyID0gJiBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApLT50LnRfY29weXByaXZfZGF0YTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIGxvYyA9PSAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENvbnN0cnVjdElkZW50SW52YWxpZCApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVG9EbzogT3B0aW1pemUgdGhlIGZvbGxvd2luZyB0d28gYmFycmllcnMgaW50byBzb21lIGtpbmQgb2Ygc3BsaXQgYmFycmllciAqLworCisgICAgaWYgKGRpZGl0KSAqZGF0YV9wdHIgPSBjcHlfZGF0YTsKKworICAgIC8qIFRoaXMgYmFycmllciBpcyBub3QgYSBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyeSAqLworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSAsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIGlmICghIGRpZGl0KSAoKmNweV9mdW5jKSggY3B5X2RhdGEsICpkYXRhX3B0ciApOworCisgICAgLyogQ29uc2lkZXIgbmV4dCBiYXJyaWVyIHRoZSB1c2VyLXZpc2libGUgYmFycmllciBmb3IgYmFycmllciByZWdpb24gYm91bmRhcmllcyAqLworICAgIC8qIE5lc3RpbmcgY2hlY2tzIGFyZSBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIHNpbmdsZSBjb25zdHJ1Y3QgY2hlY2tzICovCisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOyAvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyBuZWVkZWQgKGUuZy4gdGFza3MgY2FuIG92ZXJ3cml0ZSB0aGUgbG9jYXRpb24pCisjZW5kaWYKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSAsIDAsIE5VTEwsIE5VTEwgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBJTklUX0xPQ0sgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIElOSVRfTkVTVEVEX0xPQ0sgICAgICAgICAgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIEFDUVVJUkVfTE9DSyAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgQUNRVUlSRV9MT0NLX1RJTUVEICAgICAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBBQ1FVSVJFX05FU1RFRF9MT0NLICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBBQ1FVSVJFX05FU1RFRF9MT0NLX1RJTUVEIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBSRUxFQVNFX0xPQ0sgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFJFTEVBU0VfTkVTVEVEX0xPQ0sgICAgICAgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFRFU1RfTE9DSyAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgVEVTVF9ORVNURURfTE9DSyAgICAgICAgICBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgREVTVFJPWV9MT0NLICAgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBERVNUUk9ZX05FU1RFRF9MT0NLICAgICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworCisKKy8qCisgKiBUT0RPOiBNYWtlIGNoZWNrIGFib3J0IG1lc3NhZ2VzIHVzZSBsb2NhdGlvbiBpbmZvICYgcGFzcyBpdAorICogaW50byB3aXRoX2NoZWNrcyByb3V0aW5lcworICovCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLyBpbnRlcm5hbCBsb2NrIGluaXRpYWxpemVyCitzdGF0aWMgX19mb3JjZWlubGluZSB2b2lkCitfX2ttcF9pbml0X2xvY2tfd2l0aF9oaW50KGlkZW50X3QgKmxvYywgdm9pZCAqKmxvY2ssIGttcF9keW5hX2xvY2tzZXFfdCBzZXEpCit7CisgICAgaWYgKEtNUF9JU19EX0xPQ0soc2VxKSkgeworICAgICAgICBLTVBfSU5JVF9EX0xPQ0sobG9jaywgc2VxKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKChrbXBfdXNlcl9sb2NrX3ApbG9jaywgTlVMTCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfSU5JVF9JX0xPQ0sobG9jaywgc2VxKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyhpbGstPmxvY2ssIGxvYyk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8vIGludGVybmFsIG5lc3QgbG9jayBpbml0aWFsaXplcgorc3RhdGljIF9fZm9yY2VpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KGlkZW50X3QgKmxvYywgdm9pZCAqKmxvY2ssIGttcF9keW5hX2xvY2tzZXFfdCBzZXEpCit7CisjaWYgS01QX1VTRV9UU1gKKyAgICAvLyBEb24ndCBoYXZlIG5lc3RlZCBsb2NrIGltcGxlbWVudGF0aW9uIGZvciBzcGVjdWxhdGl2ZSBsb2NrcworICAgIGlmIChzZXEgPT0gbG9ja3NlcV9obGUgfHwgc2VxID09IGxvY2tzZXFfcnRtIHx8IHNlcSA9PSBsb2Nrc2VxX2FkYXB0aXZlKQorICAgICAgICBzZXEgPSBfX2ttcF91c2VyX2xvY2tfc2VxOworI2VuZGlmCisgICAgc3dpdGNoIChzZXEpIHsKKyAgICAgICAgY2FzZSBsb2Nrc2VxX3RhczoKKyAgICAgICAgICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX3RhczsKKyAgICAgICAgICAgIGJyZWFrOworI2lmIEtNUF9VU0VfRlVURVgKKyAgICAgICAgY2FzZSBsb2Nrc2VxX2Z1dGV4OgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfZnV0ZXg7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIGxvY2tzZXFfdGlja2V0OgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfdGlja2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbG9ja3NlcV9xdWV1aW5nOgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfcXVldWluZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGxvY2tzZXFfZHJkcGE6CisgICAgICAgICAgICBzZXEgPSBsb2Nrc2VxX25lc3RlZF9kcmRwYTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfcXVldWluZzsKKyAgICB9CisgICAgS01QX0lOSVRfSV9MT0NLKGxvY2ssIHNlcSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKGlsay0+bG9jaywgbG9jKTsKKyNlbmRpZgorfQorCisvKiBpbml0aWFsaXplIHRoZSBsb2NrIHdpdGggYSBoaW50ICovCit2b2lkCitfX2ttcGNfaW5pdF9sb2NrX3dpdGhfaGludChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgaGludCkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmIHVzZXJfbG9jayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCAib21wX2luaXRfbG9ja193aXRoX2hpbnQiKTsKKyAgICB9CisKKyAgICBfX2ttcF9pbml0X2xvY2tfd2l0aF9oaW50KGxvYywgdXNlcl9sb2NrLCBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayB3aXRoIGEgaGludCAqLwordm9pZAorX19rbXBjX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgaGludCkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmIHVzZXJfbG9jayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCAib21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCIpOworICAgIH0KKworICAgIF9fa21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChsb2MsIHVzZXJfbG9jaywgX19rbXBfbWFwX2hpbnRfdG9fbG9jayhoaW50KSk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkCitfX2ttcGNfaW5pdF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAmJiB1c2VyX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgIm9tcF9pbml0X2xvY2siKTsKKyAgICB9CisgICAgX19rbXBfaW5pdF9sb2NrX3dpdGhfaGludChsb2MsIHVzZXJfbG9jaywgX19rbXBfdXNlcl9sb2NrX3NlcSk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2luaXRfbG9jayI7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggdXNlcl9sb2NrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX1VTRV9GVVRFWAorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSggdXNlcl9sb2NrLCBndGlkLCAwICk7CisgICAgfQorICAgIElOSVRfTE9DSyggbGNrICk7CisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrLCBsb2MgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW5pdF9sb2NrKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW5pdF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9IC8vIF9fa21wY19pbml0X2xvY2sKKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX2luaXRfbmVzdF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgdXNlcl9sb2NrID09IE5VTEwpIHsKKyAgICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsICJvbXBfaW5pdF9uZXN0X2xvY2siKTsKKyAgICB9CisgICAgX19rbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KGxvYywgdXNlcl9sb2NrLCBfX2ttcF91c2VyX2xvY2tfc2VxKTsKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfaW5pdF9uZXN0X2xvY2siOworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIHVzZXJfbG9jayA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB1c2VyX2xvY2ssIGd0aWQsIDAgKTsKKyAgICB9CisKKyAgICBJTklUX05FU1RFRF9MT0NLKCBsY2sgKTsKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBsY2ssIGxvYyApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbml0X25lc3RfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9IC8vIF9fa21wY19pbml0X25lc3RfbG9jaworCit2b2lkCitfX2ttcGNfZGVzdHJveV9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworIyBpZiBVU0VfSVRUX0JVSUxECisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBpZiAoS01QX0VYVFJBQ1RfRF9UQUcodXNlcl9sb2NrKSA9PSAwKSB7CisgICAgICAgIGxjayA9ICgoa21wX2luZGlyZWN0X2xvY2tfdCAqKUtNUF9MT09LVVBfSV9MT0NLKHVzZXJfbG9jaykpLT5sb2NrOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyAgICBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQobGNrKTsKKyMgZW5kaWYKKyAgICBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCBkZXN0cm95KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrKTsKKyNlbHNlCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfZGVzdHJveV9sb2NrIiApOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgREVTVFJPWV9MT0NLKCBsY2sgKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgOworICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19mcmVlKCB1c2VyX2xvY2ssIGd0aWQsIGxjayApOworICAgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfSAvLyBfX2ttcGNfZGVzdHJveV9sb2NrCisKKy8qIGRlc3Ryb3kgdGhlIGxvY2sgKi8KK3ZvaWQKK19fa21wY19kZXN0cm95X25lc3RfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKHVzZXJfbG9jayk7CisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKGlsay0+bG9jayk7CisjIGVuZGlmCisgICAgS01QX0RfTE9DS19GVU5DKHVzZXJfbG9jaywgZGVzdHJveSkoKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jayk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkKKyAgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX1VTRV9GVVRFWAorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfZGVzdHJveV9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBERVNUUk9ZX05FU1RFRF9MT0NLKCBsY2sgKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICA7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19mcmVlKCB1c2VyX2xvY2ssIGd0aWQsIGxjayApOworICAgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfSAvLyBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2sKKwordm9pZAorX19rbXBjX3NldF9sb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKiB1c2VyX2xvY2sgKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9zZXRfbG9jayk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpbnQgdGFnID0gS01QX0VYVFJBQ1RfRF9UQUcodXNlcl9sb2NrKTsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsgLy8gaXR0IGZ1bmN0aW9uIHdpbGwgZ2V0IHRvIHRoZSByaWdodCBsb2NrIG9iamVjdC4KKyMgZW5kaWYKKyMgaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICAgIGlmICh0YWcgPT0gbG9ja3RhZ190YXMgJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBLTVBfQUNRVUlSRV9UQVNfTE9DSyh1c2VyX2xvY2ssIGd0aWQpOworICAgIH0gZWxzZQorIyBlbGlmIEtNUF9VU0VfSU5MSU5FRF9GVVRFWAorICAgIGlmICh0YWcgPT0gbG9ja3RhZ19mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIEtNUF9BQ1FVSVJFX0ZVVEVYX0xPQ0sodXNlcl9sb2NrLCBndGlkKTsKKyAgICB9IGVsc2UKKyMgZW5kaWYKKyAgICB7CisgICAgICAgIF9fa21wX2RpcmVjdF9zZXRbdGFnXSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyAgICB9CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjaWYgS01QX1VTRV9GVVRFWAorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF9zZXRfbG9jayIgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBBQ1FVSVJFX0xPQ0soIGxjaywgZ3RpZCApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2spKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9sb2NrKSgodWludDY0X3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCit2b2lkCitfX2ttcGNfc2V0X25lc3RfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisgICAgS01QX0RfTE9DS19GVU5DKHVzZXJfbG9jaywgc2V0KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8vIG1pc3Npbmcgc3VwcG9ydCBoZXJlOiBuZWVkIHRvIGtub3cgd2hldGhlciBhY3F1aXJlZCBmaXJzdCBvciBub3QKKyAgICB9CisjZW5kaWYKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpbnQgYWNxdWlyZV9zdGF0dXM7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3NldF9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgQUNRVUlSRV9ORVNURURfTE9DSyggbGNrLCBndGlkLCAmYWNxdWlyZV9zdGF0dXMgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChhY3F1aXJlX3N0YXR1cyA9PSBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVCkgeworICAgICAgICAgICBpZihvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX2ZpcnN0KSkKKyAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCkoKHVpbnQ2NF90KSBsY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBpZihvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQpKQorICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQpKCh1aW50NjRfdCkgbGNrKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKwordm9pZAorX19rbXBjX3Vuc2V0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBpbnQgdGFnID0gS01QX0VYVFJBQ1RfRF9UQUcodXNlcl9sb2NrKTsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisjIGlmIEtNUF9VU0VfSU5MSU5FRF9UQVMKKyAgICBpZiAodGFnID09IGxvY2t0YWdfdGFzICYmICFfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgS01QX1JFTEVBU0VfVEFTX0xPQ0sodXNlcl9sb2NrLCBndGlkKTsKKyAgICB9IGVsc2UKKyMgZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgICBpZiAodGFnID09IGxvY2t0YWdfZnV0ZXggJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBLTVBfUkVMRUFTRV9GVVRFWF9MT0NLKHVzZXJfbG9jaywgZ3RpZCk7CisgICAgfSBlbHNlCisjIGVuZGlmCisgICAgeworICAgICAgICBfX2ttcF9kaXJlY3RfdW5zZXRbdGFnXSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyAgICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworICAgIC8qIHJlbGVhc2UgdGhlIGxvY2sgKi8KKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICAgIC8vICJmYXN0IiBwYXRoIGltcGxlbWVudGVkIHRvIGZpeCBjdXN0b21lciBwZXJmb3JtYW5jZSBpc3N1ZQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgVENXXzQoKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKS0+dGFzLmxrLnBvbGwsIDApOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuOworI2Vsc2UKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisjZW5kaWYKKyAgICB9CisjaWYgS01QX1VTRV9GVVRFWAorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF91bnNldF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIFJFTEVBU0VfTE9DSyggbGNrLCBndGlkICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaykoKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworLyogcmVsZWFzZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX3Vuc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApCit7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCB1bnNldCkoKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jaywgZ3RpZCk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkKKyAgICAgICsgc2l6ZW9mKCBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICAgICAgLy8gImZhc3QiIHBhdGggaW1wbGVtZW50ZWQgdG8gZml4IGN1c3RvbWVyIHBlcmZvcm1hbmNlIGlzc3VlCisgICAgICAgIGttcF90YXNfbG9ja190ICp0bCA9IChrbXBfdGFzX2xvY2tfdCopdXNlcl9sb2NrOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgaWYgKCAtLSh0bC0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICAgICAgVENXXzQodGwtPmxrLnBvbGwsIDApOworICAgICAgICB9CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR1cm47CisjZWxzZQorICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyNlbmRpZgorICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF91bnNldF9uZXN0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgaW50IHJlbGVhc2Vfc3RhdHVzOworICAgIHJlbGVhc2Vfc3RhdHVzID0gUkVMRUFTRV9ORVNURURfTE9DSyggbGNrLCBndGlkICk7CisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChyZWxlYXNlX3N0YXR1cyA9PSBLTVBfTE9DS19SRUxFQVNFRCkgeworICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0KSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0KSgKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSBsY2spOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2KSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYpKAorICAgICAgICAgICAgICAgICh1aW50NjRfdCkgbGNrKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworLyogdHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgKi8KK2ludAorX19rbXBjX3Rlc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF90ZXN0X2xvY2spOworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpbnQgcmM7CisgICAgaW50IHRhZyA9IEtNUF9FWFRSQUNUX0RfVEFHKHVzZXJfbG9jayk7CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworIyBlbmRpZgorIyBpZiBLTVBfVVNFX0lOTElORURfVEFTCisgICAgaWYgKHRhZyA9PSBsb2NrdGFnX3RhcyAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIEtNUF9URVNUX1RBU19MT0NLKHVzZXJfbG9jaywgZ3RpZCwgcmMpOworICAgIH0gZWxzZQorIyBlbGlmIEtNUF9VU0VfSU5MSU5FRF9GVVRFWAorICAgIGlmICh0YWcgPT0gbG9ja3RhZ19mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIEtNUF9URVNUX0ZVVEVYX0xPQ0sodXNlcl9sb2NrLCBndGlkLCByYyk7CisgICAgfSBlbHNlCisjIGVuZGlmCisgICAgeworICAgICAgICByYyA9IF9fa21wX2RpcmVjdF90ZXN0W3RhZ10oKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jaywgZ3RpZCk7CisgICAgfQorICAgIGlmIChyYykgeworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICAgICAgcmV0dXJuIEZUTl9UUlVFOworICAgIH0gZWxzZSB7CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfY2FuY2VsbGVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICAgICAgcmV0dXJuIEZUTl9GQUxTRTsKKyAgICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIGludCAgICAgICAgICByYzsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfdGVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHJjID0gVEVTVF9MT0NLKCBsY2ssIGd0aWQgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCByYyApIHsKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGxjayApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCggbGNrICk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICByZXR1cm4gKCByYyA/IEZUTl9UUlVFIDogRlROX0ZBTFNFICk7CisKKyAgICAvKiBDYW4ndCB1c2Ugc2VyaWFsIGludGVydmFsIHNpbmNlIG5vdCBibG9jayBzdHJ1Y3R1cmVkICovCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCisvKiB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayAqLworaW50CitfX2ttcGNfdGVzdF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaW50IHJjOworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyAgICByYyA9IEtNUF9EX0xPQ0tfRlVOQyh1c2VyX2xvY2ssIHRlc3QpKChrbXBfZHluYV9sb2NrX3QgKil1c2VyX2xvY2ssIGd0aWQpOworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKHJjKSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworICAgIH0KKyMgZW5kaWYKKyAgICByZXR1cm4gcmM7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIGludCAgICAgICAgICByYzsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3Rlc3RfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHJjID0gVEVTVF9ORVNURURfTE9DSyggbGNrLCBndGlkICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggcmMgKSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGxjayApOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgcmV0dXJuIHJjOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEludGVyZmFjZSB0byBmYXN0IHNjYWxhYmxlIHJlZHVjZSBtZXRob2RzIHJvdXRpbmVzCisgKi8KKworLy8ga2VlcCB0aGUgc2VsZWN0ZWQgbWV0aG9kIGluIGEgdGhyZWFkIGxvY2FsIHN0cnVjdHVyZSBmb3IgY3Jvc3MtZnVuY3Rpb24gdXNhZ2U6IHdpbGwgYmUgdXNlZCBpbiBfX2ttcGNfZW5kX3JlZHVjZSogZnVuY3Rpb25zOworLy8gYW5vdGhlciBzb2x1dGlvbjogdG8gcmUtZGV0ZXJtaW5lIHRoZSBtZXRob2Qgb25lIG1vcmUgdGltZSBpbiBfX2ttcGNfZW5kX3JlZHVjZSogZnVuY3Rpb25zIChuZXcgcHJvdG90eXBlIHJlcXVpcmVkIHRoZW4pCisvLyBBVDogd2hpY2ggc29sdXRpb24gaXMgYmV0dGVyPworI2RlZmluZSBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRChndGlkLHJtZXRob2QpIFwKKyAgICAgICAgICAgICAgICAgICAoICggX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF9sb2NhbC5wYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApID0gKCBybWV0aG9kICkgKQorCisjZGVmaW5lIF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9EKGd0aWQpIFwKKyAgICAgICAgICAgICAgICAgICAoIF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfbG9jYWwucGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKQorCisvLyBkZXNjcmlwdGlvbiBvZiB0aGUgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFyaWFibGU6IGxvb2sgYXQgdGhlIG1hY3JvcyBpbiBrbXAuaAorCisKKy8vIHVzZWQgaW4gYSBjcml0aWNhbCBzZWN0aW9uIHJlZHVjZSBibG9jaworc3RhdGljIF9fZm9yY2VpbmxpbmUgdm9pZAorX19rbXBfZW50ZXJfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQgKSB7CisKKyAgICAvLyB0aGlzIGxvY2sgd2FzIHZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZGluZyBwcm9maWxlIHRvb2wgYXMgYSBzZXJpYWwgb3ZlcmhlYWQgc3BhbgorICAgIC8vICAgICAgICAgICAgKGFsdGhvdWdoIGl0J3MgdXNlZCBmb3IgYW4gaW50ZXJuYWwgcHVycG9zZSBvbmx5KQorICAgIC8vICAgICAgICAgICAgd2h5IHdhcyBpdCB2aXNpYmxlIGluIHByZXZpb3VzIGltcGxlbWVudGF0aW9uPworICAgIC8vICAgICAgICAgICAgc2hvdWxkIHdlIGtlZXAgaXQgdmlzaWJsZSBpbiBuZXcgcmVkdWNlIGJsb2NrPworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAga21wX2R5bmFfbG9ja190ICpsayA9IChrbXBfZHluYV9sb2NrX3QgKiljcml0OworICAgIC8vIENoZWNrIGlmIGl0IGlzIGluaXRpYWxpemVkLgorICAgIGlmICgqbGsgPT0gMCkgeworICAgICAgICBpZiAoS01QX0lTX0RfTE9DSyhfX2ttcF91c2VyX2xvY2tfc2VxKSkgeworICAgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKiljcml0LCAwLCBLTVBfR0VUX0RfVEFHKF9fa21wX3VzZXJfbG9ja19zZXEpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2luaXRfaW5kaXJlY3RfY3NwdHIoY3JpdCwgbG9jLCBnbG9iYWxfdGlkLCBLTVBfR0VUX0lfVEFHKF9fa21wX3VzZXJfbG9ja19zZXEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBCcmFuY2ggZm9yIGFjY2Vzc2luZyB0aGUgYWN0dWFsIGxvY2sgb2JqZWN0IGFuZCBzZXQgb3BlcmF0aW9uLiBUaGlzIGJyYW5jaGluZyBpcyBpbmV2aXRhYmxlIHNpbmNlCisgICAgLy8gdGhpcyBsb2NrIGluaXRpYWxpemF0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUgbm9ybWFsIGRpc3BhdGNoIHBhdGggKGxvY2sgdGFibGUgaXMgbm90IHVzZWQpLgorICAgIGlmIChLTVBfRVhUUkFDVF9EX1RBRyhsaykgIT0gMCkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWxrOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywgX19rbXBfdXNlcl9sb2NrX3NlcSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0RfTE9DS19GVU5DKGxrLCBzZXQpKGxrLCBnbG9iYWxfdGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSAqKChrbXBfaW5kaXJlY3RfbG9ja190ICoqKWxrKTsKKyAgICAgICAgbGNrID0gaWxrLT5sb2NrOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywgX19rbXBfdXNlcl9sb2NrX3NlcSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lfTE9DS19GVU5DKGlsaywgc2V0KShsY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgZmFzdCByZWR1Y3Rpb24gY29kZSBpcyBvbmx5IGVtaXR0ZWQgYnkgSW50ZWwgY29tcGlsZXJzCisgICAgLy8gd2l0aCAzMiBieXRlIGNyaXRpY2FsIHNlY3Rpb25zLiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UsIHRoZW4gd2UKKyAgICAvLyBoYXZlIHRvIHVzZSBhIHBvaW50ZXIuCisgICAgaWYgKCBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplIDw9IElOVEVMX0NSSVRJQ0FMX1NJWkUgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0ciggY3JpdCwgbG9jLCBnbG9iYWxfdGlkICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayAhPSBOVUxMICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYywgbGNrICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrLCBnbG9iYWxfdGlkICk7CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCisvLyB1c2VkIGluIGEgY3JpdGljYWwgc2VjdGlvbiByZWR1Y2UgYmxvY2sKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogY3JpdCApIHsKKworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAgaWYgKEtNUF9JU19EX0xPQ0soX19rbXBfdXNlcl9sb2NrX3NlcSkpIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyk7CisgICAgICAgIEtNUF9EX0xPQ0tfRlVOQyhsY2ssIHVuc2V0KSgoa21wX2R5bmFfbG9ja190ICopbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKVRDUl9QVFIoKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKiljcml0KSk7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spCisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jKTsKKyAgICAgICAgS01QX0lfTE9DS19GVU5DKGlsaywgdW5zZXQpKGlsay0+bG9jaywgZ2xvYmFsX3RpZCk7CisgICAgfQorCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBmYXN0IHJlZHVjdGlvbiBjb2RlIGlzIG9ubHkgZW1pdHRlZCBieSBJbnRlbCBjb21waWxlcnMgd2l0aCAzMiBieXRlIGNyaXRpY2FsCisgICAgLy8gc2VjdGlvbnMuIElmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSwgdGhlbiB3ZSBoYXZlIHRvIHVzZSBhIHBvaW50ZXIuCisgICAgaWYgKCBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID4gMzIgKSB7CisgICAgICAgIGxjayA9ICooIChrbXBfdXNlcl9sb2NrX3AgKikgY3JpdCApOworICAgICAgICBLTVBfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIGNyaXQ7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyApOworCisgICAgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30gLy8gX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrCisKKworLyogMi5hLmkuIFJlZHVjZSBCbG9jayB3aXRob3V0IGEgdGVybWluYXRpbmcgYmFycmllciAqLworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV92YXJzIG51bWJlciBvZiBpdGVtcyAodmFyaWFibGVzKSB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX3NpemUgc2l6ZSBvZiBkYXRhIGluIGJ5dGVzIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZGF0YSBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9mdW5jIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGluZyByZWR1Y3Rpb24gb3BlcmF0aW9uIG9uIHR3byBvcGVyYW5kcyBhbmQgcmV0dXJuaW5nIHJlc3VsdCBvZiByZWR1Y3Rpb24gaW4gbGhzX2RhdGEKK0BwYXJhbSBsY2sgcG9pbnRlciB0byB0aGUgdW5pcXVlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUKK0ByZXN1bHQgMSBmb3IgdGhlIG1hc3RlciB0aHJlYWQsIDAgZm9yIGFsbCBvdGhlciB0ZWFtIHRocmVhZHMsIDIgZm9yIGFsbCB0ZWFtIHRocmVhZHMgaWYgYXRvbWljIHJlZHVjdGlvbiBuZWVkZWQKKworVGhlIG5vd2FpdCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGEgcmVkdWNlIGNsYXVzZSB3aXRoIHRoZSBub3dhaXQgYXJndW1lbnQuCisqLwora21wX2ludDMyCitfX2ttcGNfcmVkdWNlX25vd2FpdCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soUkVEVUNFX25vd2FpdCk7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqdGg7CisgICAgaW50IHRlYW1zX3N3YXBwZWQgPSAwLCB0YXNrX3N0YXRlOworI2VuZGlmCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfcmVkdWNlX25vd2FpdCgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvLyB3aHkgZG8gd2UgbmVlZCB0aGlzIGluaXRpYWxpemF0aW9uIGhlcmUgYXQgYWxsPworICAgIC8vIFJlZHVjdGlvbiBjbGF1c2UgY2FuIG5vdCBiZSB1c2VkIGFzIGEgc3RhbmQtYWxvbmUgZGlyZWN0aXZlLgorCisgICAgLy8gZG8gbm90IGNhbGwgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKSwgaXQgd2lsbCBiZSBjYWxsZWQgYnkgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpIGlmIG5lZWRlZAorICAgIC8vIHBvc3NpYmxlIGRldGVjdGlvbiBvZiBmYWxzZS1wb3NpdGl2ZSByYWNlIGJ5IHRoZSB0aHJlYWRjaGVja2VyID8/PworICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAvLyBjaGVjayBjb3JyZWN0bmVzcyBvZiByZWR1Y2UgYmxvY2sgbmVzdGluZworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jLCBOVUxMLCAwICk7CisjZWxzZQorICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYywgTlVMTCApOworI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRoID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKyAgICBpZiggdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsgICAvLyBBQzogY2hlY2sgaWYgd2UgYXJlIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0PworICAgICAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgICAgIGlmKCB0ZWFtLT50LnRfbGV2ZWwgPT0gdGgtPnRoLnRoX3RlYW1zX2xldmVsICkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyByZWR1Y3Rpb24gYXQgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCF0aC0+dGgudGhfaW5mby5kcy5kc190aWQpOyAgLy8gQUM6IGNoZWNrIHRoYXQgdGlkID09IDAKKyAgICAgICAgICAgIC8vIExldCdzIHN3YXAgdGVhbXMgdGVtcG9yYXJpbHkgZm9yIHRoZSByZWR1Y3Rpb24gYmFycmllcgorICAgICAgICAgICAgdGVhbXNfc3dhcHBlZCA9IDE7CisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICAgICAgICAgIHRoLT50aC50aF90ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIHRoLT50aC50aF90ZWFtX25wcm9jID0gdGgtPnRoLnRoX3RlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIHRoLT50aC50aF90YXNrX3RlYW0gPSB0aC0+dGgudGhfdGVhbS0+dC50X3Rhc2tfdGVhbVswXTsKKyAgICAgICAgICAgIHRhc2tfc3RhdGUgPSB0aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgIHRoLT50aC50aF90YXNrX3N0YXRlID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisgICAgLy8gcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFsdWUgd2lsbCBiZSByZXVzZWQgYnkgX19rbXBfZW5kX3JlZHVjZSogZnVuY3Rpb24sIHRoZSB2YWx1ZSBzaG91bGQgYmUga2VwdCBpbiBhIHZhcmlhYmxlCisgICAgLy8gdGhlIHZhcmlhYmxlIHNob3VsZCBiZSBlaXRoZXIgYSBjb25zdHJ1Y3Qtc3BlY2lmaWMgb3IgdGhyZWFkLXNwZWNpZmljIHByb3BlcnR5LCBub3QgYSB0ZWFtIHNwZWNpZmljIHByb3BlcnR5CisgICAgLy8gICAgIChhIHRocmVhZCBjYW4gcmVhY2ggdGhlIG5leHQgcmVkdWNlIGJsb2NrIG9uIHRoZSBuZXh0IGNvbnN0cnVjdCwgcmVkdWNlIG1ldGhvZCBtYXkgZGlmZmVyIG9uIHRoZSBuZXh0IGNvbnN0cnVjdCkKKyAgICAvLyBhbiBpZGVudF90ICJsb2MiIHBhcmFtZXRlciBjb3VsZCBiZSB1c2VkIGFzIGEgY29uc3RydWN0LXNwZWNpZmljIHByb3BlcnR5ICh3aGF0IGlmIGxvYyA9PSAwPykKKyAgICAvLyAgICAgKGlmIGJvdGggY29uc3RydWN0LXNwZWNpZmljIGFuZCB0ZWFtLXNwZWNpZmljIHZhcmlhYmxlcyB3ZXJlIHNoYXJlZCwgdGhlbiB1bm5lc3MgZXh0cmEgc3luY3Mgc2hvdWxkIGJlIG5lZWRlZCkKKyAgICAvLyBhIHRocmVhZC1zcGVjaWZpYyB2YXJpYWJsZSBpcyBiZXR0ZXIgcmVnYXJkaW5nIHR3byBpc3N1ZXMgYWJvdmUgKG5leHQgY29uc3RydWN0IGFuZCBleHRyYSBzeW5jcykKKyAgICAvLyBhIHRocmVhZC1zcGVjaWZpYyAidGhfbG9jYWwucmVkdWN0aW9uX21ldGhvZCIgdmFyaWFibGUgaXMgdXNlZCBjdXJyZW50bHkKKyAgICAvLyBlYWNoIHRocmVhZCBleGVjdXRlcyAnZGV0ZXJtaW5lJyBhbmQgJ3NldCcgbGluZXMgKG5vIG5lZWQgdG8gZXhlY3V0ZSBieSBvbmUgdGhyZWFkLCB0byBhdm9pZCB1bm5lc3MgZXh0cmEgc3luY3MpCisKKyAgICBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9IF9fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBsb2MsIGdsb2JhbF90aWQsIG51bV92YXJzLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jLCBsY2sgKTsKKyAgICBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRCggZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKTsKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW50ZXJfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGxvYywgZ2xvYmFsX3RpZCwgbGNrICk7CisgICAgICAgIHJldHZhbCA9IDE7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKyAgICAgICAgcmV0dmFsID0gMTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICByZXR2YWwgPSAyOworCisgICAgICAgIC8vIGFsbCB0aHJlYWRzIHNob3VsZCBkbyB0aGlzIHBvcCBoZXJlIChiZWNhdXNlIF9fa21wY19lbmRfcmVkdWNlX25vd2FpdCgpIHdvbid0IGJlIGNhbGxlZCBieSB0aGUgY29kZSBnZW4pCisgICAgICAgIC8vICAgICAoaXQncyBub3QgcXVpdGUgZ29vZCwgYmVjYXVzZSB0aGUgY2hlY2tpbmcgYmxvY2sgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoaXMgJ3BvcCcsCisgICAgICAgIC8vICAgICAgYnV0IGF0b21pYyBvcGVyYXRpb24gaGFzIG5vdCBiZWVuIGV4ZWN1dGVkIHlldCwgd2lsbCBiZSBleGVjdXRlZCBzbGlnaHRseSBsYXRlciwgbGl0ZXJhbGx5IG9uIG5leHQgaW5zdHJ1Y3Rpb24pCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworCisgICAgfSBlbHNlIGlmKCBURVNUX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCB0cmVlX3JlZHVjZV9ibG9jayApICkgeworCisgICAgICAgIC8vQVQ6IHBlcmZvcm1hbmNlIGlzc3VlOiBhIHJlYWwgYmFycmllciBoZXJlCisgICAgICAgIC8vQVQ6ICAgICAoaWYgbWFzdGVyIGdvZXMgc2xvdywgb3RoZXIgdGhyZWFkcyBhcmUgYmxvY2tlZCBoZXJlIHdhaXRpbmcgZm9yIHRoZSBtYXN0ZXIgdG8gY29tZSBhbmQgcmVsZWFzZSB0aGVtKQorICAgICAgICAvL0FUOiAgICAgKGl0J3Mgbm90IHdoYXQgYSBjdXN0b21lciBtaWdodCBleHBlY3Qgc3BlY2lmeWluZyBOT1dBSVQgY2xhdXNlKQorICAgICAgICAvL0FUOiAgICAgKHNwZWNpZnlpbmcgTk9XQUlUIHdvbid0IHJlc3VsdCBpbiBpbXByb3ZlbWVudCBvZiBwZXJmb3JtYW5jZSwgaXQnbGwgYmUgY29uZnVzaW5nIHRvIGEgY3VzdG9tZXIpCisgICAgICAgIC8vQVQ6IGFub3RoZXIgaW1wbGVtZW50YXRpb24gb2YgKmJhcnJpZXJfZ2F0aGVyKm5vd2FpdCgpIChvciBzb21lIG90aGVyIGRlc2lnbikgbWlnaHQgZ28gZmFzdGVyCisgICAgICAgIC8vICAgICAgICBhbmQgYmUgbW9yZSBpbiBsaW5lIHdpdGggc2Vuc2Ugb2YgTk9XQUlUCisgICAgICAgIC8vQVQ6IFRPIERPOiBkbyBlcGNjIHRlc3QgYW5kIGNvbXBhcmUgdGltZXMKKworICAgICAgICAvLyB0aGlzIGJhcnJpZXIgc2hvdWxkIGJlIGludmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkaW5nIHByb2ZpbGUgdG9vbAorICAgICAgICAvLyAgICAgICAgICAgICAgKGl0J3MgbmVpdGhlciBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgbm9yIGN1c3RvbWVyJ3MgY29kZSwgaXQncyB1c2VkIGZvciBhbiBpbnRlcm5hbCBwdXJwb3NlKQorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgICAgIHJldHZhbCA9IF9fa21wX2JhcnJpZXIoIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSwgZ2xvYmFsX3RpZCwgRkFMU0UsIHJlZHVjZV9zaXplLCByZWR1Y2VfZGF0YSwgcmVkdWNlX2Z1bmMgKTsKKyAgICAgICAgcmV0dmFsID0gKCByZXR2YWwgIT0gMCApID8gKCAwICkgOiAoIDEgKTsKKworICAgICAgICAvLyBhbGwgb3RoZXIgd29ya2VycyBleGNlcHQgbWFzdGVyIHNob3VsZCBkbyB0aGlzIHBvcCBoZXJlCisgICAgICAgIC8vICAgICAoIG5vbmUgb2Ygb3RoZXIgd29ya2VycyB3aWxsIGdldCB0byBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSApCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgaWYoIHJldHZhbCA9PSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYoIHRlYW1zX3N3YXBwZWQgKSB7CisgICAgICAgIC8vIFJlc3RvcmUgdGhyZWFkIHN0cnVjdHVyZQorICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSAwOworICAgICAgICB0aC0+dGgudGhfdGVhbSA9IHRlYW07CisgICAgICAgIHRoLT50aC50aF90ZWFtX25wcm9jID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICB0aC0+dGgudGhfdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0YXNrX3N0YXRlXTsKKyAgICAgICAgdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSB0YXNrX3N0YXRlOworICAgIH0KKyNlbmRpZgorICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZV9ub3dhaXQoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHgsIHJldHVybnMgJTA4eFxuIiwgZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHJldHZhbCApICk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgaWQuCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCisKK0ZpbmlzaCB0aGUgZXhlY3V0aW9uIG9mIGEgcmVkdWNlIG5vd2FpdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRCggZ2xvYmFsX3RpZCApOworCisgICAgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICBfX2ttcF9lbmRfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGxvYywgZ2xvYmFsX3RpZCwgbGNrICk7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIG9uIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyBuZWl0aGVyIG1hc3RlciBub3Igb3RoZXIgd29ya2VycyBzaG91bGQgZ2V0IGhlcmUKKyAgICAgICAgLy8gICAgIChjb2RlIGdlbiBkb2VzIG5vdCBnZW5lcmF0ZSB0aGlzIGNhbGwgaW4gY2FzZSAyOiBhdG9taWMgcmVkdWNlIGJsb2NrKQorICAgICAgICAvLyBhY3R1YWxseSBpdCdzIGJldHRlciB0byByZW1vdmUgdGhpcyBlbHNlaWYgYXQgYWxsOworICAgICAgICAvLyBhZnRlciByZW1vdmFsIHRoaXMgdmFsdWUgd2lsbCBjaGVja2VkIGJ5IHRoZSAnZWxzZScgYW5kIHdpbGwgYXNzZXJ0CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy8gb25seSBtYXN0ZXIgZ2V0cyBoZXJlCisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4XG4iLCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICk7CisKKyAgICByZXR1cm47Cit9CisKKy8qIDIuYS5paS4gUmVkdWNlIEJsb2NrIHdpdGggYSB0ZXJtaW5hdGluZyBiYXJyaWVyICovCisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdmFycyBudW1iZXIgb2YgaXRlbXMgKHZhcmlhYmxlcykgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9zaXplIHNpemUgb2YgZGF0YSBpbiBieXRlcyB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX2RhdGEgcG9pbnRlciB0byBkYXRhIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZnVuYyBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRpbmcgcmVkdWN0aW9uIG9wZXJhdGlvbiBvbiB0d28gb3BlcmFuZHMgYW5kIHJldHVybmluZyByZXN1bHQgb2YgcmVkdWN0aW9uIGluIGxoc19kYXRhCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCitAcmVzdWx0IDEgZm9yIHRoZSBtYXN0ZXIgdGhyZWFkLCAwIGZvciBhbGwgb3RoZXIgdGVhbSB0aHJlYWRzLCAyIGZvciBhbGwgdGVhbSB0aHJlYWRzIGlmIGF0b21pYyByZWR1Y3Rpb24gbmVlZGVkCisKK0EgYmxvY2tpbmcgcmVkdWNlIHRoYXQgaW5jbHVkZXMgYW4gaW1wbGljaXQgYmFycmllci4KKyovCitrbXBfaW50MzIKK19fa21wY19yZWR1Y2UoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsCisgICAgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhSRURVQ0Vfd2FpdCk7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZSgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvLyB3aHkgZG8gd2UgbmVlZCB0aGlzIGluaXRpYWxpemF0aW9uIGhlcmUgYXQgYWxsPworICAgIC8vIFJlZHVjdGlvbiBjbGF1c2UgY2FuIG5vdCBiZSBhIHN0YW5kLWFsb25lIGRpcmVjdGl2ZS4KKworICAgIC8vIGRvIG5vdCBjYWxsIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCksIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKSBpZiBuZWVkZWQKKyAgICAvLyBwb3NzaWJsZSBkZXRlY3Rpb24gb2YgZmFsc2UtcG9zaXRpdmUgcmFjZSBieSB0aGUgdGhyZWFkY2hlY2tlciA/Pz8KKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8gY2hlY2sgY29ycmVjdG5lc3Mgb2YgcmVkdWNlIGJsb2NrIG5lc3RpbmcKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYywgTlVMTCwgMCApOworI2Vsc2UKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwgKTsKKyNlbmRpZgorCisgICAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX2ttcF9kZXRlcm1pbmVfcmVkdWN0aW9uX21ldGhvZCggbG9jLCBnbG9iYWxfdGlkLCBudW1fdmFycywgcmVkdWNlX3NpemUsIHJlZHVjZV9kYXRhLCByZWR1Y2VfZnVuYywgbGNrICk7CisgICAgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICk7CisKKyAgICBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIF9fa21wX2VudGVyX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworICAgICAgICByZXR2YWwgPSAxOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBlbXB0eV9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBJbnRlbCBwbGF0Zm9ybXMgb25seSApCisgICAgICAgIHJldHZhbCA9IDE7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgcmV0dmFsID0gMjsKKworICAgIH0gZWxzZSBpZiggVEVTVF9SRURVQ1RJT05fTUVUSE9EKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgdHJlZV9yZWR1Y2VfYmxvY2sgKSApIHsKKworICAgICAgICAvL2Nhc2UgdHJlZV9yZWR1Y2VfYmxvY2s6CisgICAgICAgIC8vIHRoaXMgYmFycmllciBzaG91bGQgYmUgdmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkaW5nIHByb2ZpbGUgdG9vbAorICAgICAgICAvLyAgICAgICAgICAgICAgKGl0J3MgYSB0ZXJtaW5hdGluZyBiYXJyaWVyIG9uIGNvbnN0cnVjdHMgaWYgTk9XQUlUIG5vdCBzcGVjaWZpZWQpCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7IC8vIG5lZWRlZCBmb3IgY29ycmVjdCBub3RpZmljYXRpb24gb2YgZnJhbWVzCisjZW5kaWYKKyAgICAgICAgcmV0dmFsID0gX19rbXBfYmFycmllciggVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApLCBnbG9iYWxfdGlkLCBUUlVFLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jICk7CisgICAgICAgIHJldHZhbCA9ICggcmV0dmFsICE9IDAgKSA/ICggMCApIDogKCAxICk7CisKKyAgICAgICAgLy8gYWxsIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciBzaG91bGQgZG8gdGhpcyBwb3AgaGVyZQorICAgICAgICAvLyAgICAgKCBub25lIG9mIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciB3aWxsIGVudGVyIF9fa21wY19lbmRfcmVkdWNlKCkgKQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmKCByZXR2YWwgPT0gMCApIHsgLy8gMDogYWxsIG90aGVyIHdvcmtlcnM7IDE6IG1hc3RlcgorICAgICAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfcmVkdWNlKCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4LCByZXR1cm5zICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCByZXR2YWwgKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIGlkLgorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorCitGaW5pc2ggdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NraW5nIHJlZHVjZS4KK1RoZSA8dHQ+bGNrPC90dD4gcG9pbnRlciBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoYXQgdXNlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBzdGFydCBmdW5jdGlvbi4KKyovCit2b2lkCitfX2ttcGNfZW5kX3JlZHVjZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApIHsKKworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcGFja2VkX3JlZHVjdGlvbl9tZXRob2Q7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19lbmRfcmVkdWNlKCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19LTVBfR0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQgKTsKKworICAgIC8vIHRoaXMgYmFycmllciBzaG91bGQgYmUgdmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkaW5nIHByb2ZpbGUgdG9vbAorICAgIC8vICAgICAgICAgICAgICAoaXQncyBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgb24gY29uc3RydWN0cyBpZiBOT1dBSVQgbm90IHNwZWNpZmllZCkKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworCisgICAgICAgIC8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICAgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gZW1wdHlfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIHVzYWdlOiBpZiB0ZWFtIHNpemUgPT0gMSwgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkICggSW50ZWwgcGxhdGZvcm1zIG9ubHkgKQorCisgICAgICAgIC8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICAgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyBUT0RPOiBpbXBsaWNpdCBiYXJyaWVyOiBzaG91bGQgYmUgZXhwb3NlZAorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy8gb25seSBtYXN0ZXIgZXhlY3V0ZXMgaGVyZSAobWFzdGVyIHJlbGVhc2VzIGFsbCBvdGhlciB3b3JrZXJzKQorICAgICAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciggVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApLCBnbG9iYWxfdGlkICk7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGJsb2NrCisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuZXhwZWN0ZWQgbWV0aG9kIgorCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2UoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgKTsKKworICAgIHJldHVybjsKK30KKworI3VuZGVmIF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9ECisjdW5kZWYgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QKKworLyotLSBlbmQgb2YgaW50ZXJmYWNlIHRvIGZhc3Qgc2NhbGFibGUgcmVkdWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ttcF91aW50NjQKK19fa21wY19nZXRfdGFza2lkKCkgeworCisgICAga21wX2ludDMyICAgIGd0aWQ7CisgICAga21wX2luZm9fdCAqIHRocmVhZDsKKworICAgIGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIGlmICggZ3RpZCA8IDAgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07IC8vIGlmCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIHJldHVybiB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfdGFza19pZDsKKworfSAvLyBfX2ttcGNfZ2V0X3Rhc2tpZAorCisKK2ttcF91aW50NjQKK19fa21wY19nZXRfcGFyZW50X3Rhc2tpZCgpIHsKKworICAgIGttcF9pbnQzMiAgICAgICAgZ3RpZDsKKyAgICBrbXBfaW5mb190ICogICAgIHRocmVhZDsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHBhcmVudF90YXNrOworCisgICAgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsgLy8gaWYKKyAgICB0aHJlYWQgICAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBwYXJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9wYXJlbnQ7CisgICAgcmV0dXJuICggcGFyZW50X3Rhc2sgPT0gTlVMTCA/IDAgOiBwYXJlbnRfdGFzay0+dGRfdGFza19pZCApOworCit9IC8vIF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZAorCit2b2lkIF9fa21wY19wbGFjZV90aHJlYWRzKGludCBuUywgaW50IHNPLCBpbnQgbkMsIGludCBjTywgaW50IG5UKQoreworICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgPSBuUzsKKyAgICBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0ID0gc087CisgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbkM7CisgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBjTzsKKyAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG5UOworfQorCisjaWYgT01QXzQ1X0VOQUJMRUQKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIuCitAcGFyYW0gbnVtX2RpbXMgIG51bWJlciBvZiBhc3NvY2lhdGVkIGRvYWNyb3NzIGxvb3BzLgorQHBhcmFtIGRpbXMgIGluZm8gb24gbG9vcHMgYm91bmRzLgorCitJbml0aWFsaXplIGRvYWNyb3NzIGxvb3AgaW5mb3JtYXRpb24uCitFeHBlY3QgY29tcGlsZXIgc2VuZCB1cyBpbmNsdXNpdmUgYm91bmRzLAorZS5nLiBmb3IoaT0yO2k8OTtpKz0yKSBsbz0yLCB1cD04LCBzdD0yLgorKi8KK3ZvaWQKK19fa21wY19kb2Fjcm9zc19pbml0KGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGludCBudW1fZGltcywgc3RydWN0IGttcF9kaW0gKiBkaW1zKQoreworICAgIGludCBqLCBpZHg7CisgICAga21wX2ludDY0IGxhc3QsIHRyYWNlX2NvdW50OworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAga21wX3VpbnQzMiAqZmxhZ3M7CisgICAga21wX2Rpc3BfdCAqcHJfYnVmID0gdGgtPnRoLnRoX2Rpc3BhdGNoOworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QgKnNoX2J1ZjsKKworICAgIEtBX1RSQUNFKDIwLCgiX19rbXBjX2RvYWNyb3NzX2luaXQoKSBlbnRlcjogY2FsbGVkIFQjJWQsIG51bSBkaW1zICVkLCBhY3RpdmUgJWRcbiIsCisgICAgICAgICAgICAgICAgIGd0aWQsIG51bV9kaW1zLCAhdGVhbS0+dC50X3NlcmlhbGl6ZWQpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGRpbXMgIT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChudW1fZGltcyA+IDApOworCisgICAgaWYoIHRlYW0tPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLQV9UUkFDRSgyMCwoIl9fa21wY19kb2Fjcm9zc19pbml0KCkgZXhpdDogc2VyaWFsaXplZCB0ZWFtXG4iKSk7CisgICAgICAgIHJldHVybjsgLy8gbm8gZGVwZW5kZW5jaWVzIGlmIHRlYW0gaXMgc2VyaWFsaXplZAorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9ucHJvYyA+IDEpOworICAgIGlkeCA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfYnVmX2lkeCsrOyAvLyBJbmNyZW1lbnQgaW5kZXggb2Ygc2hhcmVkIGJ1ZmZlciBmb3IgdGhlIG5leHQgbG9vcAorICAgIHNoX2J1ZiA9ICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbaWR4ICUgX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnNdOworCisgICAgLy8gU2F2ZSBib3VuZHMgaW5mbyBpbnRvIGFsbG9jYXRlZCBwcml2YXRlIGJ1ZmZlcgorICAgIEtNUF9ERUJVR19BU1NFUlQocHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvID09IE5VTEwpOworICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mbyA9CisgICAgICAgIChrbXBfaW50NjQqKV9fa21wX3RocmVhZF9tYWxsb2ModGgsIHNpemVvZihrbXBfaW50NjQpKig0ICogbnVtX2RpbXMgKyAxKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChwcl9idWYtPnRoX2RvYWNyb3NzX2luZm8gIT0gTlVMTCk7CisgICAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzBdID0gKGttcF9pbnQ2NCludW1fZGltczsgLy8gZmlyc3QgZWxlbWVudCBpcyBudW1iZXIgb2YgZGltZW5zaW9ucworICAgIC8vIFNhdmUgYWxzbyBhZGRyZXNzIG9mIG51bV9kb25lIGluIG9yZGVyIHRvIGFjY2VzcyBpdCBsYXRlciB3aXRob3V0IGtub3dpbmcgdGhlIGJ1ZmZlciBpbmRleAorICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1sxXSA9IChrbXBfaW50NjQpJnNoX2J1Zi0+ZG9hY3Jvc3NfbnVtX2RvbmU7CisgICAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzJdID0gZGltc1swXS5sbzsKKyAgICBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bM10gPSBkaW1zWzBdLnVwOworICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1s0XSA9IGRpbXNbMF0uc3Q7CisgICAgbGFzdCA9IDU7CisgICAgZm9yKCBqID0gMTsgaiA8IG51bV9kaW1zOyArK2ogKSB7CisgICAgICAgIGttcF9pbnQ2NCByYW5nZV9sZW5ndGg7IC8vIFRvIGtlZXAgcmFuZ2VzIG9mIGFsbCBkaW1lbnNpb25zIGJ1dCB0aGUgZmlyc3QgZGltc1swXQorICAgICAgICBpZiggZGltc1tqXS5zdCA9PSAxICkgeyAvLyBtb3N0IGNvbW1vbiBjYXNlCisgICAgICAgICAgICAvLyBBQzogc2hvdWxkIHdlIGNhcmUgb2YgcmFuZ2VzIGJpZ2dlciB0aGFuIExMT05HX01BWD8gKG5vdCBmb3Igbm93KQorICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoID0gZGltc1tqXS51cCAtIGRpbXNbal0ubG8gKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYoIGRpbXNbal0uc3QgPiAwICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZGltc1tqXS51cCA+IGRpbXNbal0ubG8pOworICAgICAgICAgICAgICAgIHJhbmdlX2xlbmd0aCA9IChrbXBfdWludDY0KShkaW1zW2pdLnVwIC0gZGltc1tqXS5sbykgLyBkaW1zW2pdLnN0ICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgLy8gbmVnYXRpdmUgaW5jcmVtZW50CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChkaW1zW2pdLmxvID4gZGltc1tqXS51cCk7CisgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoID0gKGttcF91aW50NjQpKGRpbXNbal0ubG8gLSBkaW1zW2pdLnVwKSAvICgtZGltc1tqXS5zdCkgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tsYXN0KytdID0gcmFuZ2VfbGVuZ3RoOworICAgICAgICBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bbGFzdCsrXSA9IGRpbXNbal0ubG87CisgICAgICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tsYXN0KytdID0gZGltc1tqXS51cDsKKyAgICAgICAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvW2xhc3QrK10gPSBkaW1zW2pdLnN0OworICAgIH0KKworICAgIC8vIENvbXB1dGUgdG90YWwgdHJpcCBjb3VudC4KKyAgICAvLyBTdGFydCB3aXRoIHJhbmdlIG9mIGRpbXNbMF0gd2hpY2ggd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGluIHRoZSBidWZmZXIuCisgICAgaWYoIGRpbXNbMF0uc3QgPT0gMSApIHsgLy8gbW9zdCBjb21tb24gY2FzZQorICAgICAgICB0cmFjZV9jb3VudCA9IGRpbXNbMF0udXAgLSBkaW1zWzBdLmxvICsgMTsKKyAgICB9IGVsc2UgaWYoIGRpbXNbMF0uc3QgPiAwICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGRpbXNbMF0udXAgPiBkaW1zWzBdLmxvKTsKKyAgICAgICAgdHJhY2VfY291bnQgPSAoa21wX3VpbnQ2NCkoZGltc1swXS51cCAtIGRpbXNbMF0ubG8pIC8gZGltc1swXS5zdCArIDE7CisgICAgfSBlbHNlIHsgICAvLyBuZWdhdGl2ZSBpbmNyZW1lbnQKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChkaW1zWzBdLmxvID4gZGltc1swXS51cCk7CisgICAgICAgIHRyYWNlX2NvdW50ID0gKGttcF91aW50NjQpKGRpbXNbMF0ubG8gLSBkaW1zWzBdLnVwKSAvICgtZGltc1swXS5zdCkgKyAxOworICAgIH0KKyAgICBmb3IoIGogPSAxOyBqIDwgbnVtX2RpbXM7ICsraiApIHsKKyAgICAgICAgdHJhY2VfY291bnQgKj0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzQgKiBqICsgMV07IC8vIHVzZSBrZXB0IHJhbmdlcworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRyYWNlX2NvdW50ID4gMCk7CisKKyAgICAvLyBDaGVjayBpZiBzaGFyZWQgYnVmZmVyIGlzIG5vdCBvY2N1cGllZCBieSBvdGhlciBsb29wIChpZHggLSBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVycykKKyAgICBpZiggaWR4ICE9IHNoX2J1Zi0+ZG9hY3Jvc3NfYnVmX2lkeCApIHsKKyAgICAgICAgLy8gU2hhcmVkIGJ1ZmZlciBpcyBvY2N1cGllZCwgd2FpdCBmb3IgaXQgdG8gYmUgZnJlZQorICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzQoIChrbXBfdWludDMyKikmc2hfYnVmLT5kb2Fjcm9zc19idWZfaWR4LCBpZHgsIF9fa21wX2VxXzQsIE5VTEwgKTsKKyAgICB9CisgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHRoZSBmaXJzdCB0aHJlYWQuIEFmdGVyIHRoZSBDQVMgdGhlIGZpcnN0IHRocmVhZCBnZXRzIDAsCisgICAgLy8gb3RoZXJzIGdldCAxIGlmIGluaXRpYWxpemF0aW9uIGlzIGluIHByb2dyZXNzLCBhbGxvY2F0ZWQgcG9pbnRlciBvdGhlcndpc2UuCisgICAgZmxhZ3MgPSAoa21wX3VpbnQzMiopS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDY0KAorICAgICAgICAoa21wX2ludDY0Kikmc2hfYnVmLT5kb2Fjcm9zc19mbGFncyxOVUxMLChrbXBfaW50NjQpMSk7CisgICAgaWYoIGZsYWdzID09IE5VTEwgKSB7CisgICAgICAgIC8vIHdlIGFyZSB0aGUgZmlyc3QgdGhyZWFkLCBhbGxvY2F0ZSB0aGUgYXJyYXkgb2YgZmxhZ3MKKyAgICAgICAga21wX2ludDY0IHNpemUgPSB0cmFjZV9jb3VudCAvIDggKyA4OyAvLyBpbiBieXRlcywgdXNlIHNpbmdsZSBiaXQgcGVyIGl0ZXJhdGlvbgorICAgICAgICBzaF9idWYtPmRvYWNyb3NzX2ZsYWdzID0gKGttcF91aW50MzIqKV9fa21wX3RocmVhZF9jYWxsb2ModGgsIHNpemUsIDEpOworICAgIH0gZWxzZSBpZiggKGttcF9pbnQ2NClmbGFncyA9PSAxICkgeworICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBpcyBzdGlsbCBpbiBwcm9ncmVzcywgbmVlZCB0byB3YWl0CisgICAgICAgIHdoaWxlKCAodm9sYXRpbGUga21wX2ludDY0KXNoX2J1Zi0+ZG9hY3Jvc3NfZmxhZ3MgPT0gMSApIHsKKyAgICAgICAgICAgIEtNUF9ZSUVMRChUUlVFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKChrbXBfaW50NjQpc2hfYnVmLT5kb2Fjcm9zc19mbGFncyA+IDEpOyAvLyBjaGVjayB2YWx1ZSBvZiBwb2ludGVyCisgICAgcHJfYnVmLT50aF9kb2Fjcm9zc19mbGFncyA9IHNoX2J1Zi0+ZG9hY3Jvc3NfZmxhZ3M7ICAgICAgLy8gc2F2ZSBwcml2YXRlIGNvcHkgaW4gb3JkZXIgdG8gbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG91Y2ggc2hhcmVkIGJ1ZmZlciBvbiBlYWNoIGl0ZXJhdGlvbgorICAgIEtBX1RSQUNFKDIwLCgiX19rbXBjX2RvYWNyb3NzX2luaXQoKSBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKK3ZvaWQKK19fa21wY19kb2Fjcm9zc193YWl0KGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGxvbmcgbG9uZyAqdmVjKQoreworICAgIGttcF9pbnQzMiBzaGZ0LCBudW1fZGltcywgaTsKKyAgICBrbXBfdWludDMyIGZsYWc7CisgICAga21wX2ludDY0IGl0ZXJfbnVtYmVyOyAvLyBpdGVyYXRpb24gbnVtYmVyIG9mICJjb2xsYXBzZWQiIGxvb3AgbmVzdAorICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAga21wX2Rpc3BfdCAqcHJfYnVmOworICAgIGttcF9pbnQ2NCBsbywgdXAsIHN0OworCisgICAgS0FfVFJBQ0UoMjAsKCJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ3RpZCkpOworICAgIGlmKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsKCJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGV4aXQ6IHNlcmlhbGl6ZWQgdGVhbVxuIikpOworICAgICAgICByZXR1cm47IC8vIG5vIGRlcGVuZGVuY2llcyBpZiB0ZWFtIGlzIHNlcmlhbGl6ZWQKKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgc2VxdWVudGlhbCBpdGVyYXRpb24gbnVtYmVyIGFuZCBjaGVjayBvdXQtb2YtYm91bmRzIGNvbmRpdGlvbgorICAgIHByX2J1ZiA9IHRoLT50aC50aF9kaXNwYXRjaDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mbyAhPSBOVUxMKTsKKyAgICBudW1fZGltcyA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1swXTsKKyAgICBsbyA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1syXTsKKyAgICB1cCA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1szXTsKKyAgICBzdCA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1s0XTsKKyAgICBpZiggc3QgPT0gMSApIHsgLy8gbW9zdCBjb21tb24gY2FzZQorICAgICAgICBpZiggdmVjWzBdIDwgbG8gfHwgdmVjWzBdID4gdXAgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwoCisgICAgICAgICAgICAgICAgIl9fa21wY19kb2Fjcm9zc193YWl0KCkgZXhpdDogVCMlZCBpdGVyICVsbGQgaXMgb3V0IG9mIGJvdW5kcyBbJWxsZCwlbGxkXVxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB2ZWNbMF0sIGxvLCB1cCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGl0ZXJfbnVtYmVyID0gdmVjWzBdIC0gbG87CisgICAgfSBlbHNlIGlmKCBzdCA+IDAgKSB7CisgICAgICAgIGlmKCB2ZWNbMF0gPCBsbyB8fCB2ZWNbMF0gPiB1cCApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDIwLCgKKyAgICAgICAgICAgICAgICAiX19rbXBjX2RvYWNyb3NzX3dhaXQoKSBleGl0OiBUIyVkIGl0ZXIgJWxsZCBpcyBvdXQgb2YgYm91bmRzIFslbGxkLCVsbGRdXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIHZlY1swXSwgbG8sIHVwKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaXRlcl9udW1iZXIgPSAoa21wX3VpbnQ2NCkodmVjWzBdIC0gbG8pIC8gc3Q7CisgICAgfSBlbHNlIHsgICAgICAgIC8vIG5lZ2F0aXZlIGluY3JlbWVudAorICAgICAgICBpZiggdmVjWzBdID4gbG8gfHwgdmVjWzBdIDwgdXAgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwoCisgICAgICAgICAgICAgICAgIl9fa21wY19kb2Fjcm9zc193YWl0KCkgZXhpdDogVCMlZCBpdGVyICVsbGQgaXMgb3V0IG9mIGJvdW5kcyBbJWxsZCwlbGxkXVxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB2ZWNbMF0sIGxvLCB1cCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGl0ZXJfbnVtYmVyID0gKGttcF91aW50NjQpKGxvIC0gdmVjWzBdKSAvICgtc3QpOworICAgIH0KKyAgICBmb3IoIGkgPSAxOyBpIDwgbnVtX2RpbXM7ICsraSApIHsKKyAgICAgICAga21wX2ludDY0IGl0ZXIsIGxuOworICAgICAgICBrbXBfaW50MzIgaiA9IGkgKiA0OworICAgICAgICBsbiA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tqICsgMV07CisgICAgICAgIGxvID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvW2ogKyAyXTsKKyAgICAgICAgdXAgPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9baiArIDNdOworICAgICAgICBzdCA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tqICsgNF07CisgICAgICAgIGlmKCBzdCA9PSAxICkgeworICAgICAgICAgICAgaWYoIHZlY1tpXSA8IGxvIHx8IHZlY1tpXSA+IHVwICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wY19kb2Fjcm9zc193YWl0KCkgZXhpdDogVCMlZCBpdGVyICVsbGQgaXMgb3V0IG9mIGJvdW5kcyBbJWxsZCwlbGxkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdmVjW2ldLCBsbywgdXApKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdGVyID0gdmVjW2ldIC0gbG87CisgICAgICAgIH0gZWxzZSBpZiggc3QgPiAwICkgeworICAgICAgICAgICAgaWYoIHZlY1tpXSA8IGxvIHx8IHZlY1tpXSA+IHVwICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wY19kb2Fjcm9zc193YWl0KCkgZXhpdDogVCMlZCBpdGVyICVsbGQgaXMgb3V0IG9mIGJvdW5kcyBbJWxsZCwlbGxkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdmVjW2ldLCBsbywgdXApKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdGVyID0gKGttcF91aW50NjQpKHZlY1tpXSAtIGxvKSAvIHN0OworICAgICAgICB9IGVsc2UgeyAgIC8vIHN0IDwgMAorICAgICAgICAgICAgaWYoIHZlY1tpXSA+IGxvIHx8IHZlY1tpXSA8IHVwICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wY19kb2Fjcm9zc193YWl0KCkgZXhpdDogVCMlZCBpdGVyICVsbGQgaXMgb3V0IG9mIGJvdW5kcyBbJWxsZCwlbGxkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdmVjW2ldLCBsbywgdXApKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdGVyID0gKGttcF91aW50NjQpKGxvIC0gdmVjW2ldKSAvICgtc3QpOworICAgICAgICB9CisgICAgICAgIGl0ZXJfbnVtYmVyID0gaXRlciArIGxuICogaXRlcl9udW1iZXI7CisgICAgfQorICAgIHNoZnQgPSBpdGVyX251bWJlciAlIDMyOyAvLyB1c2UgMzItYml0IGdyYW51bGFyaXR5CisgICAgaXRlcl9udW1iZXIgPj49IDU7ICAgICAgIC8vIGRpdmlkZWQgYnkgMzIKKyAgICBmbGFnID0gMSA8PCBzaGZ0OworICAgIHdoaWxlKCAoZmxhZyAmIHByX2J1Zi0+dGhfZG9hY3Jvc3NfZmxhZ3NbaXRlcl9udW1iZXJdKSA9PSAwICkgeworICAgICAgICBLTVBfWUlFTEQoVFJVRSk7CisgICAgfQorICAgIEtBX1RSQUNFKDIwLCgiX19rbXBjX2RvYWNyb3NzX3dhaXQoKSBleGl0OiBUIyVkIHdhaXQgZm9yIGl0ZXIgJWxsZCBjb21wbGV0ZWRcbiIsCisgICAgICAgICAgICAgICAgIGd0aWQsIChpdGVyX251bWJlcjw8NSkrc2hmdCkpOworfQorCit2b2lkCitfX2ttcGNfZG9hY3Jvc3NfcG9zdChpZGVudF90ICpsb2MsIGludCBndGlkLCBsb25nIGxvbmcgKnZlYykKK3sKKyAgICBrbXBfaW50MzIgc2hmdCwgbnVtX2RpbXMsIGk7CisgICAga21wX3VpbnQzMiBmbGFnOworICAgIGttcF9pbnQ2NCBpdGVyX251bWJlcjsgLy8gaXRlcmF0aW9uIG51bWJlciBvZiAiY29sbGFwc2VkIiBsb29wIG5lc3QKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgIGttcF9kaXNwX3QgKnByX2J1ZjsKKyAgICBrbXBfaW50NjQgbG8sIHN0OworCisgICAgS0FfVFJBQ0UoMjAsKCJfX2ttcGNfZG9hY3Jvc3NfcG9zdCgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ3RpZCkpOworICAgIGlmKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsKCJfX2ttcGNfZG9hY3Jvc3NfcG9zdCgpIGV4aXQ6IHNlcmlhbGl6ZWQgdGVhbVxuIikpOworICAgICAgICByZXR1cm47IC8vIG5vIGRlcGVuZGVuY2llcyBpZiB0ZWFtIGlzIHNlcmlhbGl6ZWQKKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgc2VxdWVudGlhbCBpdGVyYXRpb24gbnVtYmVyIChzYW1lIGFzIGluICJ3YWl0IiBidXQgbm8gb3V0LW9mLWJvdW5kcyBjaGVja3MpCisgICAgcHJfYnVmID0gdGgtPnRoLnRoX2Rpc3BhdGNoOworICAgIEtNUF9ERUJVR19BU1NFUlQocHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvICE9IE5VTEwpOworICAgIG51bV9kaW1zID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzBdOworICAgIGxvID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzJdOworICAgIHN0ID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzRdOworICAgIGlmKCBzdCA9PSAxICkgeyAvLyBtb3N0IGNvbW1vbiBjYXNlCisgICAgICAgIGl0ZXJfbnVtYmVyID0gdmVjWzBdIC0gbG87CisgICAgfSBlbHNlIGlmKCBzdCA+IDAgKSB7CisgICAgICAgIGl0ZXJfbnVtYmVyID0gKGttcF91aW50NjQpKHZlY1swXSAtIGxvKSAvIHN0OworICAgIH0gZWxzZSB7ICAgICAgICAvLyBuZWdhdGl2ZSBpbmNyZW1lbnQKKyAgICAgICAgaXRlcl9udW1iZXIgPSAoa21wX3VpbnQ2NCkobG8gLSB2ZWNbMF0pIC8gKC1zdCk7CisgICAgfQorICAgIGZvciggaSA9IDE7IGkgPCBudW1fZGltczsgKytpICkgeworICAgICAgICBrbXBfaW50NjQgaXRlciwgbG47CisgICAgICAgIGttcF9pbnQzMiBqID0gaSAqIDQ7CisgICAgICAgIGxuID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvW2ogKyAxXTsKKyAgICAgICAgbG8gPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9baiArIDJdOworICAgICAgICBzdCA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tqICsgNF07CisgICAgICAgIGlmKCBzdCA9PSAxICkgeworICAgICAgICAgICAgaXRlciA9IHZlY1tpXSAtIGxvOworICAgICAgICB9IGVsc2UgaWYoIHN0ID4gMCApIHsKKyAgICAgICAgICAgIGl0ZXIgPSAoa21wX3VpbnQ2NCkodmVjW2ldIC0gbG8pIC8gc3Q7CisgICAgICAgIH0gZWxzZSB7ICAgLy8gc3QgPCAwCisgICAgICAgICAgICBpdGVyID0gKGttcF91aW50NjQpKGxvIC0gdmVjW2ldKSAvICgtc3QpOworICAgICAgICB9CisgICAgICAgIGl0ZXJfbnVtYmVyID0gaXRlciArIGxuICogaXRlcl9udW1iZXI7CisgICAgfQorICAgIHNoZnQgPSBpdGVyX251bWJlciAlIDMyOyAvLyB1c2UgMzItYml0IGdyYW51bGFyaXR5CisgICAgaXRlcl9udW1iZXIgPj49IDU7ICAgICAgIC8vIGRpdmlkZWQgYnkgMzIKKyAgICBmbGFnID0gMSA8PCBzaGZ0OworICAgIGlmKCAoZmxhZyAmIHByX2J1Zi0+dGhfZG9hY3Jvc3NfZmxhZ3NbaXRlcl9udW1iZXJdKSA9PSAwICkKKyAgICAgICAgS01QX1RFU1RfVEhFTl9PUjMyKCAoa21wX2ludDMyKikmcHJfYnVmLT50aF9kb2Fjcm9zc19mbGFnc1tpdGVyX251bWJlcl0sIChrbXBfaW50MzIpZmxhZyApOworICAgIEtBX1RSQUNFKDIwLCgiX19rbXBjX2RvYWNyb3NzX3Bvc3QoKSBleGl0OiBUIyVkIGl0ZXIgJWxsZCBwb3N0ZWRcbiIsCisgICAgICAgICAgICAgICAgIGd0aWQsIChpdGVyX251bWJlcjw8NSkrc2hmdCkpOworfQorCit2b2lkCitfX2ttcGNfZG9hY3Jvc3NfZmluaShpZGVudF90ICpsb2MsIGludCBndGlkKQoreworICAgIGttcF9pbnQ2NCBudW1fZG9uZTsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgIGttcF9kaXNwX3QgKnByX2J1ZiA9IHRoLT50aC50aF9kaXNwYXRjaDsKKworICAgIEtBX1RSQUNFKDIwLCgiX19rbXBjX2RvYWNyb3NzX2ZpbmkoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGd0aWQpKTsKKyAgICBpZiggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCgiX19rbXBjX2RvYWNyb3NzX2ZpbmkoKSBleGl0OiBzZXJpYWxpemVkIHRlYW0gJXBcbiIsIHRlYW0pKTsKKyAgICAgICAgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCisgICAgfQorICAgIG51bV9kb25lID0gS01QX1RFU1RfVEhFTl9JTkM2NCgoa21wX2ludDY0Kilwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bMV0pICsgMTsKKyAgICBpZiggbnVtX2RvbmUgPT0gdGgtPnRoLnRoX3RlYW1fbnByb2MgKSB7CisgICAgICAgIC8vIHdlIGFyZSB0aGUgbGFzdCB0aHJlYWQsIG5lZWQgdG8gZnJlZSBzaGFyZWQgcmVzb3VyY2VzCisgICAgICAgIGludCBpZHggPSBwcl9idWYtPnRoX2RvYWNyb3NzX2J1Zl9pZHggLSAxOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ICpzaF9idWYgPSAmdGVhbS0+dC50X2Rpc3BfYnVmZmVyW2lkeCAlIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzXTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bMV0gPT0gKGttcF9pbnQ2NCkmc2hfYnVmLT5kb2Fjcm9zc19udW1fZG9uZSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobnVtX2RvbmUgPT0gKGttcF9pbnQ2NClzaF9idWYtPmRvYWNyb3NzX251bV9kb25lKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChpZHggPT0gc2hfYnVmLT5kb2Fjcm9zc19idWZfaWR4KTsKKyAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUodGgsICh2b2lkKilzaF9idWYtPmRvYWNyb3NzX2ZsYWdzKTsKKyAgICAgICAgc2hfYnVmLT5kb2Fjcm9zc19mbGFncyA9IE5VTEw7CisgICAgICAgIHNoX2J1Zi0+ZG9hY3Jvc3NfbnVtX2RvbmUgPSAwOworICAgICAgICBzaF9idWYtPmRvYWNyb3NzX2J1Zl9pZHggKz0gX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnM7IC8vIGZyZWUgYnVmZmVyIGZvciBmdXR1cmUgcmUtdXNlCisgICAgfQorICAgIC8vIGZyZWUgcHJpdmF0ZSByZXNvdXJjZXMgKG5lZWQgdG8ga2VlcCBidWZmZXIgaW5kZXggZm9yZXZlcikKKyAgICBfX2ttcF90aHJlYWRfZnJlZSh0aCwgKHZvaWQqKXByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mbyk7CisgICAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvID0gTlVMTDsKKyAgICBLQV9UUkFDRSgyMCwoIl9fa21wY19kb2Fjcm9zc19maW5pKCkgZXhpdDogVCMlZFxuIiwgZ3RpZCkpOworfQorI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfZGVidWcuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3YjkwNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZGVidWcuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICoga21wX2RlYnVnLmNwcCAtLSBkZWJ1ZyB1dGlsaXRpZXMgZm9yIHRoZSBHdWlkZSBsaWJyYXJ5CisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIgLyogcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisjaWZkZWYgS01QX0RFQlVHCit2b2lkCitfX2ttcF9kZWJ1Z19wcmludGZfc3Rkb3V0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9vdXQsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZChhcCk7Cit9CisjZW5kaWYKKwordm9pZAorX19rbXBfZGVidWdfcHJpbnRmKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKworI2lmZGVmIEtNUF9VU0VfQVNTRVJUCisgICAgaW50CisgICAgX19rbXBfZGVidWdfYXNzZXJ0KAorICAgICAgICBjaGFyIGNvbnN0ICogIG1zZywKKyAgICAgICAgY2hhciBjb25zdCAqICBmaWxlLAorICAgICAgICBpbnQgICAgICAgICAgIGxpbmUKKyAgICApIHsKKworICAgICAgICBpZiAoIGZpbGUgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGZpbGUgPSBLTVBfSTE4Tl9TVFIoIFVua25vd25GaWxlICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgZGlyZWN0b3JpZXMgZnJvbSBwYXRoLCBsZWF2ZSBvbmx5IGZpbGUgbmFtZS4gRmlsZSBuYW1lIGlzIGVub3VnaCwgdGhlcmUgaXMgbm8gbmVlZAorICAgICAgICAgICAgLy8gaW4gYm90aGVyaW5nIGRldmVsb3BlcnMgYW5kIGN1c3RvbWVycyB3aXRoIGZ1bGwgcGF0aHMuCisgICAgICAgICAgICBjaGFyIGNvbnN0ICogc2xhc2ggPSBzdHJyY2hyKCBmaWxlLCAnLycgKTsKKyAgICAgICAgICAgIGlmICggc2xhc2ggIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBmaWxlID0gc2xhc2ggKyAxOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIkFzc2VydGlvbiBmYWlsdXJlIGF0ICVzKCVkKTogJXMuXG4iLCBmaWxlLCBsaW5lLCBtc2cgKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgICAgICAgICAgI2lmZGVmIFVTRV9BU1NFUlRfQlJFQUsKKyAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAgICAgRGVidWdCcmVhaygpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgI2VuZGlmIC8vIFVTRV9BU1NFUlRfQlJFQUsKKyAgICAgICAgICAgICNpZmRlZiBVU0VfQVNTRVJUX1NUQUxMCisgICAgICAgICAgICAgICAgLyogICAgX19rbXBfaW5maW5pdGVfbG9vcCgpOyAqLworICAgICAgICAgICAgICAgIGZvcig7Oyk7CisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9TVEFMTAorICAgICAgICAgICAgI2lmZGVmIFVTRV9BU1NFUlRfU0VHCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgdm9sYXRpbGUgKiBaRVJPID0gKGludCopIDA7CisgICAgICAgICAgICAgICAgICAgICsrICgqWkVSTyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8vIFVTRV9BU1NFUlRfU0VHCisgICAgICAgICNlbmRpZgorCisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEFzc2VydGlvbkZhaWx1cmUsIGZpbGUsIGxpbmUgKSwKKyAgICAgICAgICAgIEtNUF9ITlQoIFN1Ym1pdEJ1Z1JlcG9ydCApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKworICAgICAgICByZXR1cm4gMDsKKworICAgIH0gLy8gX19rbXBfZGVidWdfYXNzZXJ0CisKKyNlbmRpZiAvLyBLTVBfVVNFX0FTU0VSVAorCisvKiBEdW1wIGRlYnVnZ2luZyBidWZmZXIgdG8gc3RkZXJyICovCit2b2lkCitfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlciggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWZmZXIgIT0gTlVMTCApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBkYyA9IF9fa21wX2RlYnVnX2NvdW50OworICAgICAgICBjaGFyICpkYiA9ICYgX19rbXBfZGVidWdfYnVmZmVyWyAoZGMgJSBfX2ttcF9kZWJ1Z19idWZfbGluZXMpICogX19rbXBfZGVidWdfYnVmX2NoYXJzIF07CisgICAgICAgIGNoYXIgKmRiX2VuZCA9ICYgX19rbXBfZGVidWdfYnVmZmVyWyBfX2ttcF9kZWJ1Z19idWZfbGluZXMgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgY2hhciAqZGIyOworCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlxuU3RhcnQgZHVtcCBvZiBkZWJ1Z2dpbmcgYnVmZmVyIChlbnRyeT0lZCk6XG4iLAorICAgICAgICAgICAgICAgICBkYyAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcyApOworCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfZGVidWdfYnVmX2xpbmVzOyBpKysgKSB7CisKKyAgICAgICAgICAgIGlmICggKmRiICE9ICdcMCcgKSB7CisgICAgICAgICAgICAgICAgLyogRml4IHVwIHdoZXJlIG5vIGNhcnJpYWdlIHJldHVybiBiZWZvcmUgc3RyaW5nIHRlcm1pbmF0aW9uIGNoYXIgKi8KKyAgICAgICAgICAgICAgICBmb3IgKCBkYjIgPSBkYiArIDE7IGRiMiA8IGRiICsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMTsgZGIyICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKmRiMiA9PSAnXDAnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqKGRiMi0xKSAhPSAnXG4nICkgeyAqZGIyID0gJ1xuJzsgKihkYjIrMSkgPSAnXDAnOyB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBIYW5kbGUgY2FzZSBhdCBlbmQgYnkgc2hvcnRlbmluZyB0aGUgcHJpbnRlZCBtZXNzYWdlIGJ5IG9uZSBjaGFyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgICAgIGlmICggZGIyID09IGRiICsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgKmRiMiA9PSAnXDAnICYmICooZGIyLTEpICE9ICdcbicgKSB7CisgICAgICAgICAgICAgICAgICAgICooZGIyLTEpID0gJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIiU0ZDogJS4qcyIsIGksIF9fa21wX2RlYnVnX2J1Zl9jaGFycywgZGIgKTsKKyAgICAgICAgICAgICAgICAqZGIgPSAnXDAnOyAvKiBvbmx5IGxldCBpdCBwcmludCBvbmNlISAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYiArPSBfX2ttcF9kZWJ1Z19idWZfY2hhcnM7CisgICAgICAgICAgICBpZiAoIGRiID49IGRiX2VuZCApCisgICAgICAgICAgICAgICAgZGIgPSBfX2ttcF9kZWJ1Z19idWZmZXI7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIkVuZCBkdW1wIG9mIGRlYnVnZ2luZyBidWZmZXIgKGVudHJ5PSVkKS5cblxuIiwKKyAgICAgICAgICAgICAgICAgKCBkYytpLTEgKSAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcyApOworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2RlYnVnLmggYi9yYzMvcnVudGltZS9zcmMva21wX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5ODdmNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZGVidWcuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIGttcF9kZWJ1Zy5oIC0tIGRlYnVnIC8gYXNzZXJ0aW9uIGNvZGUgZm9yIEFzc3VyZSBsaWJyYXJ5CisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0RFQlVHX0gKKyNkZWZpbmUgS01QX0RFQlVHX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCdWlsZC10aW1lIGFzc2VydGlvbi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgICBCdWlsZC10aW1lIGFzc2VydGlvbiBjYW4gZG8gY29tcGlsZS10aW1lIGNoZWNraW5nIG9mIGRhdGEgc3RydWN0dXJlIHNpemVzLCBldGMuIFRoaXMgd29ya3MgYnkKKyAgICBkZWNsYXJpbmcgYSBuZWdhdGl2ZS1sZW5ndGggYXJyYXkgaWYgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLiAgSW4gdGhhdAorICAgIGNhc2UsIHRoZSBjb21waWxlciBpc3N1ZXMgYSBzeW50YXggZXJyb3IgYW5kIHN0b3BzIHRoZSBjb21waWxhdGlvbi4gSWYgdGhlIGV4cHJlc3Npb24gaXMKKyAgICB0cnVlLCB3ZSBnZXQgYW4gZXh0cmFuZW91cyBzdGF0aWMgc2luZ2xlIGNoYXJhY3RlciBhcnJheSBpbiB0aGUgc2NvcGUgb2YgdGhlIG1hY3JvLgorCisgICAgVXNhZ2U6CisKKyAgICAgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBzb21lX3QgKSA8PSAzMiApOworICAgICAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggc29tZV90LCBmaWVsZCApICUgOCA9PSAwICk7CisKKyAgICBEbyBub3QgdXNlIF9LTVBfQlVJTERfQVNTRVJUIGFuZCBfX0tNUF9CVUlMRF9BU1NFUlQgZGlyZWN0bHksIGl0IGlzIHdvcmtpbmcgZ3V0cy4KKyovCisKKyNkZWZpbmUgX19LTVBfQlVJTERfQVNTRVJUKCBleHByLCBzdWZmaXggKSAgdHlwZWRlZiBjaGFyIF9fa21wX2J1aWxkX2NoZWNrXyMjc3VmZml4WyAoZXhwcikgPyAxIDogLTEgXQorI2RlZmluZSBfS01QX0JVSUxEX0FTU0VSVCggZXhwciwgc3VmZml4ICkgICBfX0tNUF9CVUlMRF9BU1NFUlQoIChleHByKSwgc3VmZml4ICkKKyNpZmRlZiBLTVBfVVNFX0FTU0VSVAorICAgICNkZWZpbmUgS01QX0JVSUxEX0FTU0VSVCggZXhwciApICAgICAgICAgICAgX0tNUF9CVUlMRF9BU1NFUlQoIChleHByKSwgX19MSU5FX18gKQorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9CVUlMRF9BU1NFUlQoIGV4cHIgKSAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSdW4tdGltZSBhc3NlcnRpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlciggdm9pZCApOworCisjaWZkZWYgS01QX1VTRV9BU1NFUlQKKyAgICBleHRlcm4gaW50IF9fa21wX2RlYnVnX2Fzc2VydCggY2hhciBjb25zdCAqIGV4cHIsIGNoYXIgY29uc3QgKiBmaWxlLCBpbnQgbGluZSApOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgI2RlZmluZSBLTVBfQVNTRVJUKCBjb25kICkgICAgICAgICAgICAgKCAoY29uZCkgPyAwIDogX19rbXBfZGVidWdfYXNzZXJ0KCAjY29uZCwgX19GSUxFX18sIF9fTElORV9fICkgKQorICAgICAgICAjZGVmaW5lIEtNUF9BU1NFUlQyKCBjb25kLCBtc2cgKSAgICAgICAoIChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoIChtc2cpLCBfX0ZJTEVfXywgX19MSU5FX18gKSApCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVCggY29uZCApICAgICAgIEtNUF9BU1NFUlQoIGNvbmQgKQorICAgICAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQyKCBjb25kLCBtc2cgKSBLTVBfQVNTRVJUMiggY29uZCwgbXNnICkKKyAgICAjZWxzZQorICAgICAgICAvLyBEbyBub3QgZXhwb3NlIGNvbmRpdGlvbiBpbiByZWxlYXNlIGJ1aWxkLiBVc2UgImFzc2VydGlvbiBmYWlsdXJlIi4KKyAgICAgICAgI2RlZmluZSBLTVBfQVNTRVJUKCBjb25kICkgICAgICAgICAgICAgKCAoY29uZCkgPyAwIDogX19rbXBfZGVidWdfYXNzZXJ0KCAiYXNzZXJ0aW9uIGZhaWx1cmUiLCBfX0ZJTEVfXywgX19MSU5FX18gKSApCisgICAgICAgICNkZWZpbmUgS01QX0FTU0VSVDIoIGNvbmQsIG1zZyApICAgICAgIEtNUF9BU1NFUlQoIGNvbmQgKQorICAgICAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQoIGNvbmQgKSAgICAgICAwCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVDIoIGNvbmQsIG1zZyApIDAKKyAgICAjZW5kaWYgLy8gS01QX0RFQlVHCisjZWxzZQorICAgICNkZWZpbmUgS01QX0FTU0VSVCggY29uZCApICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lIEtNUF9BU1NFUlQyKCBjb25kLCBtc2cgKSAgICAgICAwCisgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUKCBjb25kICkgICAgICAgMAorICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVDIoIGNvbmQsIG1zZyApIDAKKyNlbmRpZiAvLyBLTVBfVVNFX0FTU0VSVAorCisjaWZkZWYgS01QX0RFQlVHCisgICAgZXh0ZXJuIHZvaWQgX19rbXBfZGVidWdfcHJpbnRmX3N0ZG91dCggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX2RlYnVnX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CisKKyNpZmRlZiBLTVBfREVCVUcKKworICAgIGV4dGVybiBpbnQga21wX2FfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfYl9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9jX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2RfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfZV9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9mX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2RpYWc7CisKKyAgICAjZGVmaW5lIEtBX1RSQUNFKGQseCkgICAgIGlmIChrbXBfYV9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0JfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9iX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLQ19UUkFDRShkLHgpICAgICBpZiAoa21wX2NfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtEX1RSQUNFKGQseCkgICAgIGlmIChrbXBfZF9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0VfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9lX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLRl9UUkFDRShkLHgpICAgICBpZiAoa21wX2ZfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtfRElBRyhkLHgpICAgICAgIHtpZiAoa21wX2RpYWcgPT0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGZfc3Rkb3V0IHggOyB9IH0KKworICAgICNkZWZpbmUgS0FfRFVNUChkLHgpICAgICBpZiAoa21wX2FfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0JfRFVNUChkLHgpICAgICBpZiAoa21wX2JfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0NfRFVNUChkLHgpICAgICBpZiAoa21wX2NfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0RfRFVNUChkLHgpICAgICBpZiAoa21wX2RfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0VfRFVNUChkLHgpICAgICBpZiAoa21wX2VfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorICAgICNkZWZpbmUgS0ZfRFVNUChkLHgpICAgICBpZiAoa21wX2ZfZGVidWcgPj0gZCkgeyBpbnQga3M7IF9fa21wX2Rpc2FibGUoJmtzKTsgKHgpIDsgX19rbXBfZW5hYmxlKGtzKTsgfQorCisjZWxzZQorCisgICAgI2RlZmluZSBLQV9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLQl9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLQ19UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRF9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRV9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRl9UUkFDRShkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLX0RJQUcoZCx4KSAgICAgICB7fS8qIG5vdGhpbmcgdG8gZG8gKi8KKworICAgICNkZWZpbmUgS0FfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLQl9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtDX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0RfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRV9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtGX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Z2dlci5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2RlYnVnZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmZlMWUwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Z2dlci5jcHAKQEAgLTAsMCArMSwzMTUgQEAKKyNpZiBVU0VfREVCVUdHRVIKKy8qCisgKiBrbXBfZGVidWdnZXIuYyAtLSBkZWJ1Z2dlciBzdXBwb3J0LgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfb21wLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisvKgorICAgIE5PVEU6IEFsbCB2YXJpYWJsZSBuYW1lcyBhcmUga25vd24gdG8gdGhlIGRlYnVnZ2VyLCBkbyBub3QgY2hhbmdlIQorKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisgICAgICAgIGV4dGVybiBrbXBfb21wX3N0cnVjdF9pbmZvX3QgX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvOworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKK2ludCBfX2ttcF9kZWJ1Z2dpbmcgICAgICAgICAgPSBGQUxTRTsgICAgLy8gQm9vbGVhbiB3aGV0aGVyIGN1cnJlbnRseSBkZWJ1Z2dpbmcgT3Blbk1QIFJUTC4KKworI2RlZmluZSBvZmZzZXRfYW5kX3NpemVfb2YoIHN0cnVjdHVyZSwgZmllbGQgKSAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvZmZzZXRvZiggc3RydWN0dXJlLCAgICAgICAgICAgZmllbGQgKSwgICAgXAorICAgICAgICBzaXplb2YoICggKHN0cnVjdHVyZSAqKSBOVUxMKS0+ZmllbGQgKSAgICAgXAorICAgIH0KKworI2RlZmluZSBvZmZzZXRfYW5kX3NpemVfbm90X2F2YWlsYWJsZSBcCisgICAgeyAtMSwgLTEgfQorCisjZGVmaW5lIGFkZHJfYW5kX3NpemVfb2YoIHZhciApICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChrbXBfdWludDY0KSggJiB2YXIgKSwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNpemVvZiggdmFyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIG50aHJfYnVmZmVyX3NpemUgMTAyNAorc3RhdGljIGttcF9pbnQzMgora21wX29tcF9udGhyX2luZm9fYnVmZmVyWyBudGhyX2J1ZmZlcl9zaXplIF0gPQorICAgIHsgbnRocl9idWZmZXJfc2l6ZSAqIHNpemVvZigga21wX2ludDMyICkgfTsKKworLyogVE9ETzogQ2hlY2sgcHVuY3R1YXRpb24gZm9yIHZhcmlvdXMgcGxhdGZvcm1zIGhlcmUgKi8KK3N0YXRpYyBjaGFyIGZ1bmNfbWljcm90YXNrW10gICAgPSAiX19rbXBfaW52b2tlX21pY3JvdGFzayI7CitzdGF0aWMgY2hhciBmdW5jX2ZvcmtbXSAgICAgICAgID0gIl9fa21wY19mb3JrX2NhbGwiOworc3RhdGljIGNoYXIgZnVuY19mb3JrX3RlYW1zW10gICA9ICJfX2ttcGNfZm9ya190ZWFtcyI7CisKKworLy8gVmFyaW91cyBpbmZvIGFib3V0IHJ1bnRpbWUgc3RydWN0dXJlczogYWRkcmVzc2VzLCBmaWVsZCBvZmZzZXRzLCBzaXplcywgZXRjLgora21wX29tcF9zdHJ1Y3RfaW5mb190CitfX2ttcF9vbXBfZGVidWdfc3RydWN0X2luZm8gPSB7CisKKyAgICAvKiBDaGFuZ2UgdGhpcyBvbmx5IGlmIHlvdSBtYWtlIGEgZnVuZGFtZW50YWwgZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlIGhlcmUgKi8KKyAgICBLTVBfT01QX1ZFUlNJT04sCisKKyAgICAvKiBzYW5pdHkgY2hlY2suICBPbmx5IHNob3VsZCBiZSBjaGVja2VkIGlmIHZlcnNpb25zIGFyZSBpZGVudGljYWwKKyAgICAgKiBUaGlzIGlzIGFsc28gdXNlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0byBnZXQgdGhlIHJ1bnRpbWUKKyAgICAgKiBzdHJ1Y3R1cmUgc2l6ZSBpZiBpdCB0aGUgcnVudGltZSBpcyBvbGRlciB0aGFuIHRoZSBpbnRlcmZhY2UgKi8KKyAgICBzaXplb2YoIGttcF9vbXBfc3RydWN0X2luZm9fdCApLAorCisgICAgLyogT3Blbk1QIFJUTCB2ZXJzaW9uIGluZm8uICovCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdmVyc2lvbl9tYWpvciApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3ZlcnNpb25fbWlub3IgKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKCBfX2ttcF92ZXJzaW9uX2J1aWxkICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfb3Blbm1wX3ZlcnNpb24gKSwKKyAgICB7IChrbXBfdWludDY0KSggX19rbXBfY29weXJpZ2h0ICkgKyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4sIDAgfSwgICAgICAgIC8vIFNraXAgbWFnaWMgcHJlZml4LgorCisgICAgLyogVmFyaW91cyBnbG9iYWxzLiAqLworICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3RocmVhZHMgKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKCBfX2ttcF9yb290ICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdGhyZWFkc19jYXBhY2l0eSApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX21vbml0b3IgKSwKKyNpZiAhIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdXNlcl9sb2NrX3RhYmxlICksCisjZW5kaWYKKyAgICBhZGRyX2FuZF9zaXplX29mKCBmdW5jX21pY3JvdGFzayApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIGZ1bmNfZm9yayApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIGZ1bmNfZm9ya190ZWFtcyApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3RlYW1fY291bnRlciApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3Rhc2tfY291bnRlciApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIGttcF9vbXBfbnRocl9pbmZvX2J1ZmZlciApLAorICAgIHNpemVvZiggdm9pZCAqICksCisgICAgT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKiksCisgICAgYnNfbGFzdF9iYXJyaWVyLAorICAgIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFLAorCisgICAgLy8gdGhyZWFkIHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICAgIHNpemVvZigga21wX2Jhc2VfaW5mb190ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX2luZm8gKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfdGVhbSApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9yb290ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX3NlcmlhbF90ZWFtICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX2lkZW50ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX3NwaW5faGVyZSAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF9uZXh0X3dhaXRpbmcgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfdGFza190ZWFtICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX2N1cnJlbnRfdGFzayApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF90YXNrX3N0YXRlICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgICB0aF9iYXIgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9ic3RhdGVfdCwgICAgICBiX3dvcmtlcl9hcnJpdmVkICksCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vIHRlYW1zIGluZm9ybWF0aW9uCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX3RlYW1zX21pY3JvdGFzayksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX3RlYW1zX2xldmVsKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90ZWFtc19zaXplX3QsIG50ZWFtcyApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3RlYW1zX3NpemVfdCwgbnRoICksCisjZW5kaWYKKworICAgIC8vIGttcF9kZXNjIHN0cnVjdHVyZSAoZm9yIGluZm8gZmllbGQgYWJvdmUpCisgICAgc2l6ZW9mKCBrbXBfZGVzY19iYXNlX3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9kZXNjX2Jhc2VfdCwgZHNfdGlkICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfZGVzY19iYXNlX3QsIGRzX2d0aWQgICApLAorICAgIC8vIE9uIFdpbmRvd3MqIE9TLCBkc190aHJlYWQgY29udGFpbnMgYSB0aHJlYWQgL2hhbmRsZS8sIHdoaWNoIGlzIG5vdCB1c2FibGUsIHdoaWxlIHRocmVhZCAvaWQvCisgICAgLy8gaXMgaW4gZHNfdGhyZWFkX2lkLgorICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Rlc2NfYmFzZV90LCBkc190aHJlYWRfaWQpLAorICAgICNlbHNlCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfZGVzY19iYXNlX3QsIGRzX3RocmVhZCksCisgICAgI2VuZGlmCisKKyAgICAvLyB0ZWFtIHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICAgIHNpemVvZigga21wX2Jhc2VfdGVhbV90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9tYXN0ZXJfdGlkICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9pZGVudCAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9wYXJlbnQgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9ucHJvYyAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF90aHJlYWRzICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9zZXJpYWxpemVkICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9pZCAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9wa2ZuICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF90YXNrX3RlYW0gKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgKSwKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfY2FuY2VsX3JlcXVlc3QgKSwKKyNlbmRpZgorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfYmFyICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFsaWduX3RlYW1fdCwgYl9tYXN0ZXJfYXJyaXZlZCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2JhbGlnbl90ZWFtX3QsIGJfdGVhbV9hcnJpdmVkICksCisKKyAgICAvLyByb290IHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICAgIHNpemVvZigga21wX2Jhc2Vfcm9vdF90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9yb290X3QsIHJfcm9vdF90ZWFtICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3Jvb3RfdCwgcl9ob3RfdGVhbSAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2Vfcm9vdF90LCByX3ViZXJfdGhyZWFkICksCisgICAgb2Zmc2V0X2FuZF9zaXplX25vdF9hdmFpbGFibGUsCisKKyAgICAvLyBpZGVudCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2YoIGlkZW50X3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGlkZW50X3QsIHBzb3VyY2UgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGlkZW50X3QsIGZsYWdzICAgKSwKKworICAgIC8vIGxvY2sgc3RydWN0dXJlIGluZm9ybWF0aW9uCisgICAgc2l6ZW9mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIGluaXRpYWxpemVkICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIGxvY2F0aW9uICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgdGFpbF9pZCAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBoZWFkX2lkICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIG5leHRfdGlja2V0ICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIG5vd19zZXJ2aW5nICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIG93bmVyX2lkICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIGRlcHRoX2xvY2tlZCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIGZsYWdzICksCisKKyNpZiAhIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgLyogTG9jayB0YWJsZS4gKi8KKyAgICBzaXplb2YoIGttcF9sb2NrX3RhYmxlX3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9sb2NrX3RhYmxlX3QsIHVzZWQgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9sb2NrX3RhYmxlX3QsIGFsbG9jYXRlZCAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9sb2NrX3RhYmxlX3QsIHRhYmxlICAgICAgKSwKKyNlbmRpZgorCisgICAgLy8gVGFzayB0ZWFtIHN0cnVjdHVyZSBpbmZvcm1hdGlvbi4KKyAgICBzaXplb2YoIGttcF9iYXNlX3Rhc2tfdGVhbV90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90YXNrX3RlYW1fdCwgdHRfdGhyZWFkc19kYXRhICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90YXNrX3RlYW1fdCwgdHRfZm91bmRfdGFza3MgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90YXNrX3RlYW1fdCwgdHRfbnByb2MgICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90YXNrX3RlYW1fdCwgdHRfdW5maW5pc2hlZF90aHJlYWRzICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90YXNrX3RlYW1fdCwgdHRfYWN0aXZlICAgICAgICAgICAgICksCisKKyAgICAvLyB0YXNrX2RhdGFfdC4KKyAgICBzaXplb2YoIGttcF90YXNrZGF0YV90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfdGFza19pZCAgICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX2ZsYWdzICAgICAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF90ZWFtICAgICAgICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfcGFyZW50ICAgICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX2xldmVsICAgICAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9pZGVudCAgICAgICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX2luY29tcGxldGVfY2hpbGRfdGFza3MgKSwKKworICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX3Rhc2t3YWl0X2lkZW50ICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF90YXNrd2FpdF9jb3VudGVyICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfdGFza3dhaXRfdGhyZWFkICApLAorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF90YXNrZ3JvdXAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2dyb3VwX3QsIGNvdW50ICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tncm91cF90LCBjYW5jZWxfcmVxdWVzdCAgICAgKSwKKworICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX2RlcG5vZGUgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9kZXBub2RlX2xpc3RfdCwgbm9kZSAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfZGVwbm9kZV9saXN0X3QsIG5leHQgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfZGVwbm9kZV90LCBzdWNjZXNzb3JzICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2RlcG5vZGVfdCwgdGFzayAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9kZXBub2RlX3QsIG5wcmVkZWNlc3NvcnMgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfZGVwbm9kZV90LCBucmVmcyAgICAgICAgICAgKSwKKyNlbmRpZgorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tfdCwgcm91dGluZSAgICAgICAgICAgICAgICAgKSwKKworICAgIC8vIHRocmVhZF9kYXRhX3QuCisgICAgc2l6ZW9mKCBrbXBfdGhyZWFkX2RhdGFfdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGhyZWFkX2RhdGFfdCwgdGRfZGVxdWUgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIHRkX2RlcXVlX3NpemUgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZV9oZWFkICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGhyZWFkX2RhdGFfdCwgdGRfZGVxdWVfdGFpbCAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIHRkX2RlcXVlX250YXNrcyAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZV9sYXN0X3N0b2xlbiApLAorCisgICAgLy8gVGhlIGxhc3QgZmllbGQuCisgICAgS01QX09NUF9WRVJTSU9OLAorCit9OyAvLyBfX2ttcF9vbXBfZGVidWdfc3RydWN0X2luZm8KKworI3VuZGVmIG9mZnNldF9hbmRfc2l6ZV9vZgorI3VuZGVmIGFkZHJfYW5kX3NpemVfb2YKKworLyoKKyAgSW50ZWwgY29tcGlsZXIgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGlzc3VlcyBhIHdhcm5pbmcgImNvbnZlcnNpb24KKyAgZnJvbSAidW5zaWduZWQgbG9uZyBsb25nIiB0byAiY2hhciAqIiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzIgorICB3aGVuIDY0LWJpdCB2YWx1ZSBpcyBhc3NpZ25lZCB0byAzMi1iaXQgcG9pbnRlci4gVXNlIHRoaXMgZnVuY3Rpb24KKyAgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcuCisqLworc3RhdGljIGlubGluZQordm9pZCAqCitfX2ttcF9jb252ZXJ0X3RvX3B0cigKKyAgICBrbXBfdWludDY0ICAgIGFkZHIKKykgeworICAgICNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICNwcmFnbWEgd2FybmluZyggcHVzaCApCisgICAgICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogIDgxMCApIC8vIGNvbnZlcnNpb24gZnJvbSAidW5zaWduZWQgbG9uZyBsb25nIiB0byAiY2hhciAqIiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzCisgICAgICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMTE5NSApIC8vIGNvbnZlcnNpb24gZnJvbSBpbnRlZ2VyIHRvIHNtYWxsZXIgcG9pbnRlcgorICAgICNlbmRpZiAvLyBLTVBfQ09NUElMRVJfSUNDCisgICAgcmV0dXJuICh2b2lkICopIGFkZHI7CisgICAgI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorICAgICNlbmRpZiAvLyBLTVBfQ09NUElMRVJfSUNDCit9IC8vIF9fa21wX2NvbnZlcnRfdG9fcHRyCisKKworc3RhdGljIGludAora21wX2xvY2F0aW9uX21hdGNoKAorICAgIGttcF9zdHJfbG9jX3QgKiAgICAgICAgbG9jLAorICAgIGttcF9vbXBfbnRocl9pdGVtX3QgKiAgaXRlbQorKSB7CisKKyAgICBpbnQgZmlsZV9tYXRjaCA9IDA7CisgICAgaW50IGZ1bmNfbWF0Y2ggPSAwOworICAgIGludCBsaW5lX21hdGNoID0gMDsKKworICAgIGNoYXIgKiBmaWxlID0gKGNoYXIgKikgX19rbXBfY29udmVydF90b19wdHIoIGl0ZW0tPmZpbGUgKTsKKyAgICBjaGFyICogZnVuYyA9IChjaGFyICopIF9fa21wX2NvbnZlcnRfdG9fcHRyKCBpdGVtLT5mdW5jICk7CisgICAgZmlsZV9tYXRjaCA9IF9fa21wX3N0cl9mbmFtZV9tYXRjaCggJiBsb2MtPmZuYW1lLCBmaWxlICk7CisgICAgZnVuY19tYXRjaCA9CisgICAgICAgIGl0ZW0tPmZ1bmMgPT0gMCAgLy8gSWYgaXRlbS0+ZnVuYyBpcyBOVUxMLCBpdCBhbGxvd3MgYW55IGZ1bmMgbmFtZS4KKyAgICAgICAgfHwKKyAgICAgICAgc3RyY21wKCBmdW5jLCAiKiIgKSA9PSAwCisgICAgICAgIHx8CisgICAgICAgICggbG9jLT5mdW5jICE9IE5VTEwgJiYgc3RyY21wKCBsb2MtPmZ1bmMsIGZ1bmMgKSA9PSAwICk7CisgICAgbGluZV9tYXRjaCA9CisgICAgICAgIGl0ZW0tPmJlZ2luIDw9IGxvYy0+bGluZQorICAgICAgICAmJgorICAgICAgICAoIGl0ZW0tPmVuZCA8PSAwIHx8IGxvYy0+bGluZSA8PSBpdGVtLT5lbmQgKTsgLy8gaWYgaXRlbS0+ZW5kIDw9IDAsIGl0IG1lYW5zICJlbmQgb2YgZmlsZSIuCisKKyAgICByZXR1cm4gKCBmaWxlX21hdGNoICYmIGZ1bmNfbWF0Y2ggJiYgbGluZV9tYXRjaCApOworCit9IC8vIGttcF9sb2NhdGlvbl9tYXRjaAorCisKK2ludAorX19rbXBfb21wX251bV90aHJlYWRzKAorICAgIGlkZW50X3QgY29uc3QgKiBpZGVudAorKSB7CisKKyAgICBpbnQgbnVtX3RocmVhZHMgPSAwOworCisgICAga21wX29tcF9udGhyX2luZm9fdCAqIGluZm8gPQorICAgICAgICAoa21wX29tcF9udGhyX2luZm9fdCAqKSBfX2ttcF9jb252ZXJ0X3RvX3B0ciggIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mby5udGhyX2luZm8uYWRkciApOworICAgIGlmICggaW5mby0+bnVtID4gMCAmJiBpbmZvLT5hcnJheSAhPSAwICkgeworICAgICAgICBrbXBfb21wX250aHJfaXRlbV90ICogaXRlbXMgPSAoa21wX29tcF9udGhyX2l0ZW1fdCAqKSBfX2ttcF9jb252ZXJ0X3RvX3B0ciggaW5mby0+YXJyYXkgKTsKKyAgICAgICAga21wX3N0cl9sb2NfdCAgICAgICAgIGxvYyAgID0gX19rbXBfc3RyX2xvY19pbml0KCBpZGVudC0+cHNvdXJjZSwgMSApOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBpbmZvLT5udW07ICsrIGkgKSB7CisgICAgICAgICAgICBpZiAoIGttcF9sb2NhdGlvbl9tYXRjaCggJiBsb2MsICYgaXRlbXNbIGkgXSApICkgeworICAgICAgICAgICAgICAgIG51bV90aHJlYWRzID0gaXRlbXNbIGkgXS5udW1fdGhyZWFkczsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGZvcgorICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICYgbG9jICk7CisgICAgfTsgLy8gaWYKKworICAgIHJldHVybiBudW1fdGhyZWFkczs7CisKK30gLy8gX19rbXBfb21wX251bV90aHJlYWRzCisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2RlYnVnZ2VyLmggYi9yYzMvcnVudGltZS9zcmMva21wX2RlYnVnZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwYWQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuaApAQCAtMCwwICsxLDUxIEBACisjaWYgVVNFX0RFQlVHR0VSCisvKgorICoga21wX2RlYnVnZ2VyLmggLS0gZGVidWdnZXIgc3VwcG9ydC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfREVCVUdHRVJfSAorI2RlZmluZSBLTVBfREVCVUdHRVJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvKiAqIFRoaXMgZXh0ZXJuYWwgdmFyaWFibGUgY2FuIGJlIHNldCBieSBhbnkgZGVidWdnZXIgdG8gZmxhZyB0byB0aGUgcnVudGltZSB0aGF0IHdlCisgICBhcmUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnNpZGUgYSBkZWJ1Z2dlci4gIFRoaXMgd2lsbCBhbGxvdyB0aGUgZGVidWdnZXIgdG8gb3ZlcnJpZGUKKyAgIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBzcGF3bmVkIGluIGEgcGFyYWxsZWwgcmVnaW9uIGJ5IHVzaW5nIF9fa21wX29tcF9udW1fdGhyZWFkcygpIChiZWxvdykuCisgICAqIFdoZW4gX19rbXBfZGVidWdnaW5nIGlzIFRSVUUsIGVhY2ggdGVhbSBhbmQgZWFjaCB0YXNrIGdldHMgYSB1bmlxdWUgaW50ZWdlciBpZGVudGlmaWVyCisgICB0aGF0IGNhbiBiZSB1c2VkIGJ5IGRlYnVnZ2VyIHRvIGNvbnZlbmllbnRseSBpZGVudGlmeSB0ZWFtcyBhbmQgdGFza3MuCisgICAqIFRoZSBkZWJ1Z2dlciBoYXMgYWNjZXNzIHRvIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mbyB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbgorICAgYWJvdXQgdGhlIE9wZW5NUCBsaWJyYXJ5J3MgaW1wb3J0YW50IGludGVybmFsIHN0cnVjdHVyZXMuICBUaGlzIGFjY2VzcyB3aWxsIGFsbG93IHRoZSBkZWJ1Z2dlcgorICAgdG8gcmVhZCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0eXBpY2FsIE9wZW5NUCBjb25zdHJ1Y3RzICh0ZWFtcywgdGhyZWFkcywgdGFza2luZywgZXRjLiApCisgICBkdXJpbmcgYSBkZWJ1Z2dpbmcgc2Vzc2lvbiBhbmQgb2ZmZXIgZGV0YWlsZWQgYW5kIHVzZWZ1bCBpbmZvcm1hdGlvbiB3aGljaCB0aGUgdXNlciBjYW4gcHJvYmUKKyAgIGFib3V0IHRoZSBPcGVuTVAgcG9ydGlvbiBvZiB0aGVpciBjb2RlLgorICAgKi8KK2V4dGVybiBpbnQgX19rbXBfZGVidWdnaW5nOyAgICAgICAgICAgICAvKiBCb29sZWFuIHdoZXRoZXIgY3VycmVudGx5IGRlYnVnZ2luZyBPcGVuTVAgUlRMICovCisvLyBSZXR1cm4gbnVtYmVyIG9mIHRocmVhZHMgc3BlY2lmaWVkIGJ5IHRoZSBkZWJ1Z2dlciBmb3IgZ2l2ZW4gcGFyYWxsZWwgcmVnaW9uLgorLyogVGhlIGlkZW50IGZpZWxkLCB3aGljaCByZXByZXNlbnRzIGEgc291cmNlIGZpbGUgbG9jYXRpb24sIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlCisgICBkZWJ1Z2dlciBoYXMgY2hhbmdlZCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBwYXJhbGxlbCByZWdpb24gYXQgc291cmNlIGZpbGUKKyAgIGxvY2F0aW9uIGlkZW50LiAgVGhpcyB3YXksIHNwZWNpZmljIHBhcmFsbGVsIHJlZ2lvbnMnIG51bWJlciBvZiB0aHJlYWRzIGNhbiBiZSBjaGFuZ2VkCisgICBhdCB0aGUgZGVidWdnZXIncyByZXF1ZXN0LgorICovCitpbnQgX19rbXBfb21wX251bV90aHJlYWRzKCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworCisjZW5kaWYgLy8gS01QX0RFQlVHR0VSX0gKKworI2VuZGlmIC8vIFVTRV9ERUJVR0dFUgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9kaXNwYXRjaC5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDU4MzliCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9kaXNwYXRjaC5jcHAKQEAgLTAsMCArMSwyNzY4IEBACisvKgorICoga21wX2Rpc3BhdGNoLmNwcDogZHluYW1pYyBzY2hlZHVsaW5nIC0gaXRlcmF0aW9uIGluaXRpYWxpemF0aW9uIGFuZCBkaXNwYXRjaC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAqIER5bmFtaWMgc2NoZWR1bGluZyBpbml0aWFsaXphdGlvbiBhbmQgZGlzcGF0Y2guCisgKgorICogTk9URTogX19rbXBfbnRoIGlzIGEgY29uc3RhbnQgaW5zaWRlIG9mIGFueSBkaXNwYXRjaCBsb29wLCBob3dldmVyCisgKiAgICAgICBpdCBtYXkgY2hhbmdlIHZhbHVlcyBiZXR3ZWVuIHBhcmFsbGVsIHJlZ2lvbnMuICBfX2ttcF9tYXhfbnRoCisgKiAgICAgICBpcyB0aGUgbGFyZ2VzdCB2YWx1ZSBfX2ttcF9udGggbWF5IHRha2UsIDEgaXMgdGhlIHNtYWxsZXN0LgorICoKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBOZWVkIHRvIHJhaXNlIFdpbiB2ZXJzaW9uIGZyb20gWFAgdG8gVmlzdGEgaGVyZSBmb3Igc3VwcG9ydCBvZiBJbnRlcmxvY2tlZEV4Y2hhbmdlNjQKKyNpZiBkZWZpbmVkKF9XSU4zMl9XSU5OVCkgJiYgZGVmaW5lZChfTV9JWDg2KQorI3VuZGVmIF9XSU4zMl9XSU5OVAorI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNTAyCisjZW5kaWYKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAjaW5jbHVkZSA8ZmxvYXQuaD4KKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyB0ZW1wbGF0ZSBmb3IgdHlwZSBsaW1pdHMKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0cnVjdCBpX21heG1pbiB7CisgICAgc3RhdGljIGNvbnN0IFQgbXg7CisgICAgc3RhdGljIGNvbnN0IFQgbW47Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCBpbnQgPiB7CisgICAgc3RhdGljIGNvbnN0IGludCBteCA9IDB4N2ZmZmZmZmY7CisgICAgc3RhdGljIGNvbnN0IGludCBtbiA9IDB4ODAwMDAwMDA7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCB1bnNpZ25lZCBpbnQgPiB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBteCA9IDB4ZmZmZmZmZmY7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtbiA9IDB4MDAwMDAwMDA7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCBsb25nIGxvbmcgPiB7CisgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyBteCA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworICAgIHN0YXRpYyBjb25zdCBsb25nIGxvbmcgbW4gPSAweDgwMDAwMDAwMDAwMDAwMDBMTDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IHVuc2lnbmVkIGxvbmcgbG9uZyA+IHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIG14ID0gMHhmZmZmZmZmZmZmZmZmZmZmTEw7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBtbiA9IDB4MDAwMDAwMDAwMDAwMDAwMExMOworfTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECisKKyAgICAvLyByZXBsYWNlcyBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9IHN0cnVjdHVyZXMgYW5kIGRpc3BhdGNoX3ByaXZhdGVfaW5mb3szMiw2NH1fdCB0eXBlcworICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvWFhfdGVtcGxhdGUgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgICAgICBVVCBjb3VudDsgICAgICAgICAgICAgICAgLy8gdW5zaWduZWQKKyAgICAgICAgVCAgdWI7CisgICAgICAgIC8qIEFkZGluZyBLTVBfQUxJR05fQ0FDSEUgaGVyZSBkb2Vzbid0IGhlbHAgLyBjYW4gaHVydCBwZXJmb3JtYW5jZSAqLworICAgICAgICBUICBsYjsKKyAgICAgICAgU1Qgc3Q7ICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZAorICAgICAgICBVVCB0YzsgICAgICAgICAgICAgICAgICAgLy8gdW5zaWduZWQKKyAgICAgICAgVCAgc3RhdGljX3N0ZWFsX2NvdW50ZXI7IC8vIGZvciBzdGF0aWNfc3RlYWwgb25seTsgbWF5YmUgYmV0dGVyIHRvIHB1dCBhZnRlciB1YgorCisgICAgICAgIC8qIHBhcm1bMS00XSBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cyBieSBkaWZmZXJlbnQgc2NoZWR1bGluZyBhbGdvcml0aG1zICovCisKKyAgICAgICAgLy8gS01QX0FMSUdOKCAzMiApIGVuc3VyZXMgKCBpZiB0aGUgS01QX0FMSUdOIG1hY3JvIGlzIHR1cm5lZCBvbiApCisgICAgICAgIC8vICAgIGEpIHBhcm0zIGlzIHByb3Blcmx5IGFsaWduZWQgYW5kCisgICAgICAgIC8vICAgIGIpIGFsbCBwYXJtMS00IGFyZSBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICAgICAgICAvLyBCZWNhdXNlIG9mIHBhcm0xLTQgYXJlIHVzZWQgdG9nZXRoZXIsIHBlcmZvcm1hbmNlIHNlZW1zIHRvIGJlIGJldHRlcgorICAgICAgICAvLyBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBsaW5lIChub3QgbWVhc3VyZWQgdGhvdWdoKS4KKworICAgICAgICBzdHJ1Y3QgS01QX0FMSUdOKCAzMiApIHsgLy8gY29tcGlsZXIgZG9lcyBub3QgYWNjZXB0IHNpemVvZihUKSo0CisgICAgICAgICAgICBUICBwYXJtMTsKKyAgICAgICAgICAgIFQgIHBhcm0yOworICAgICAgICAgICAgVCAgcGFybTM7CisgICAgICAgICAgICBUICBwYXJtNDsKKyAgICAgICAgfTsKKworICAgICAgICBVVCBvcmRlcmVkX2xvd2VyOyAvLyB1bnNpZ25lZAorICAgICAgICBVVCBvcmRlcmVkX3VwcGVyOyAvLyB1bnNpZ25lZAorICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgVCAgbGFzdF91cHBlcjsKKyAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgfTsKKworI2Vsc2UgLyogS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICovCisKKyAgICAvLyByZXBsYWNlcyBkaXNwYXRjaF9wcml2YXRlX2luZm97MzIsNjR9IHN0cnVjdHVyZXMgYW5kIGRpc3BhdGNoX3ByaXZhdGVfaW5mb3szMiw2NH1fdCB0eXBlcworICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvWFhfdGVtcGxhdGUgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgICAgICBUICBsYjsKKyAgICAgICAgVCAgdWI7CisgICAgICAgIFNUIHN0OyAgICAgICAgICAgIC8vIHNpZ25lZAorICAgICAgICBVVCB0YzsgICAgICAgICAgICAvLyB1bnNpZ25lZAorCisgICAgICAgIFQgIHBhcm0xOworICAgICAgICBUICBwYXJtMjsKKyAgICAgICAgVCAgcGFybTM7CisgICAgICAgIFQgIHBhcm00OworCisgICAgICAgIFVUIGNvdW50OyAgICAgICAgIC8vIHVuc2lnbmVkCisKKyAgICAgICAgVVQgb3JkZXJlZF9sb3dlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgVVQgb3JkZXJlZF91cHBlcjsgLy8gdW5zaWduZWQKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisJVCAgbGFzdF91cHBlcjsKKyAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgfTsKKworI2VuZGlmIC8qIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCAqLworCisvLyByZXBsYWNlcyBkaXNwYXRjaF9wcml2YXRlX2luZm8gc3RydWN0dXJlIGFuZCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCB0eXBlCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZSB7CisgICAgLy8gZHVwbGljYXRlIGFsaWdubWVudCBoZXJlLCBvdGhlcndpc2Ugc2l6ZSBvZiBzdHJ1Y3R1cmUgaXMgbm90IGNvcnJlY3QgaW4gb3VyIGNvbXBpbGVyCisgICAgdW5pb24gS01QX0FMSUdOX0NBQ0hFIHByaXZhdGVfaW5mb190bXBsIHsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvWFhfdGVtcGxhdGU8IFQgPiBwOworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90ICAgICAgICAgICAgIHA2NDsKKyAgICB9IHU7CisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlOyAgLyogc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KKyAgICBrbXBfdWludDMyICAgICAgb3JkZXJlZDsgICAvKiBvcmRlcmVkIGNsYXVzZSBzcGVjaWZpZWQgKi8KKyAgICBrbXBfdWludDMyICAgICAgb3JkZXJlZF9idW1wZWQ7CisgICAga21wX2ludDMyICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtM107IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyCisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvICogbmV4dDsgLyogc3RhY2sgb2YgYnVmZmVycyBmb3IgbmVzdCBvZiBzZXJpYWwgcmVnaW9ucyAqLworICAgIGttcF91aW50MzIgICAgICBub21lcmdlOyAgIC8qIGRvbid0IG1lcmdlIGl0ZXJzIGlmIHNlcmlhbGl6ZWQgKi8KKyAgICBrbXBfdWludDMyICAgICAgdHlwZV9zaXplOworICAgIGVudW0gY29uc190eXBlICBwdXNoZWRfd3M7Cit9OworCisKKy8vIHJlcGxhY2VzIGRpc3BhdGNoX3NoYXJlZF9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZCBkaXNwYXRjaF9zaGFyZWRfaW5mb3szMiw2NH1fdCB0eXBlcwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mb1hYX3RlbXBsYXRlIHsKKyAgICAvKiBjaHVuayBpbmRleCB1bmRlciBkeW5hbWljLCBudW1iZXIgb2YgaWRsZSB0aHJlYWRzIHVuZGVyIHN0YXRpYy1zdGVhbDsKKyAgICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgICAgdm9sYXRpbGUgVVQgICAgIGl0ZXJhdGlvbjsKKyAgICB2b2xhdGlsZSBVVCAgICAgbnVtX2RvbmU7CisgICAgdm9sYXRpbGUgVVQgICAgIG9yZGVyZWRfaXRlcmF0aW9uOworICAgIFVUICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtM107IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorfTsKKworLy8gcmVwbGFjZXMgZGlzcGF0Y2hfc2hhcmVkX2luZm8gc3RydWN0dXJlIGFuZCBkaXNwYXRjaF9zaGFyZWRfaW5mb190IHR5cGUKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGUgeworICAgIC8vIHdlIG5lZWQgdW5pb24gaGVyZSB0byBrZWVwIHRoZSBzdHJ1Y3R1cmUgc2l6ZQorICAgIHVuaW9uIHNoYXJlZF9pbmZvX3RtcGwgeworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb1hYX3RlbXBsYXRlPCBVVCA+ICBzOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mbzY0X3QgICAgICAgICAgICAgICBzNjQ7CisgICAgfSB1OworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIGJ1ZmZlcl9pbmRleDsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgICAgIGRvYWNyb3NzX2J1Zl9pZHg7ICAvLyB0ZWFtd2lzZSBpbmRleAorICAgIGttcF91aW50MzIgICAgICAgICAgICAgKmRvYWNyb3NzX2ZsYWdzOyAgICAvLyBhcnJheSBvZiBpdGVyYXRpb24gZmxhZ3MgKDAvMSkKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICBkb2Fjcm9zc19udW1fZG9uZTsgLy8gY291bnQgZmluaXNoZWQgdGhyZWFkcworI2VuZGlmCisjaWYgS01QX1VTRV9IV0xPQworICAgIC8vIFdoZW4gbGlua2luZyB3aXRoIGxpYmh3bG9jLCB0aGUgT1JERVJFRCBFUENDIHRlc3Qgc2xvd3Nkb3duIG9uIGJpZworICAgIC8vIG1hY2hpbmVzICg+IDQ4IGNvcmVzKS4gUGVyZm9ybWFuY2UgYW5hbHlzaXMgc2hvd2VkIHRoYXQgYSBjYWNoZSB0aHJhc2gKKyAgICAvLyB3YXMgb2NjdXJyaW5nIGFuZCB0aGlzIHBhZGRpbmcgaGVscHMgYWxsZXZpYXRlIHRoZSBwcm9ibGVtLgorICAgIGNoYXIgcGFkZGluZ1s2NF07CisjZW5kaWYKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyN1bmRlZiBVU0VfVEVTVF9MT0NLUworCisvLyB0ZXN0X3RoZW5fYWRkIHRlbXBsYXRlIChnZW5lcmFsIHRlbXBsYXRlIHNob3VsZCBOT1QgYmUgdXNlZCkKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyBfX2ZvcmNlaW5saW5lIFQKK3Rlc3RfdGhlbl9hZGQoIHZvbGF0aWxlIFQgKnAsIFQgZCApOworCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgordGVzdF90aGVuX2FkZDwga21wX2ludDMyID4oIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKQoreworICAgIGttcF9pbnQzMiByOworICAgIHIgPSBLTVBfVEVTVF9USEVOX0FERDMyKCBwLCBkICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDY0Cit0ZXN0X3RoZW5fYWRkPCBrbXBfaW50NjQgPiggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApCit7CisgICAga21wX2ludDY0IHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fQURENjQoIHAsIGQgKTsKKyAgICByZXR1cm4gcjsKK30KKworLy8gdGVzdF90aGVuX2luY19hY3EgdGVtcGxhdGUgKGdlbmVyYWwgdGVtcGxhdGUgc2hvdWxkIE5PVCBiZSB1c2VkKQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUgVAordGVzdF90aGVuX2luY19hY3EoIHZvbGF0aWxlIFQgKnAgKTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK3Rlc3RfdGhlbl9pbmNfYWNxPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwICkKK3sKKyAgICBrbXBfaW50MzIgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9pbmNfYWNxPCBrbXBfaW50NjQgPiggdm9sYXRpbGUga21wX2ludDY0ICpwICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKworLy8gdGVzdF90aGVuX2luYyB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5faW5jKCB2b2xhdGlsZSBUICpwICk7CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDMyCit0ZXN0X3RoZW5faW5jPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwICkKK3sKKyAgICBrbXBfaW50MzIgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkMzMiggcCApOworICAgIHJldHVybiByOworfQorCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQ2NAordGVzdF90aGVuX2luYzwga21wX2ludDY0ID4oIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCApCit7CisgICAga21wX2ludDY0IHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fSU5DNjQoIHAgKTsKKyAgICByZXR1cm4gcjsKK30KKworLy8gY29tcGFyZV9hbmRfc3dhcCB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBrbXBfaW50MzIKK2NvbXBhcmVfYW5kX3N3YXAoIHZvbGF0aWxlIFQgKnAsIFQgYywgVCBzICk7CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDMyCitjb21wYXJlX2FuZF9zd2FwPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgYywga21wX2ludDMyIHMgKQoreworICAgIHJldHVybiBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIoIHAsIGMsIHMgKTsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK2NvbXBhcmVfYW5kX3N3YXA8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjLCBrbXBfaW50NjQgcyApCit7CisgICAgcmV0dXJuIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCggcCwgYywgcyApOworfQorCisvKgorICAgIFNwaW4gd2FpdCBsb29wIHRoYXQgZmlyc3QgZG9lcyBwYXVzZSwgdGhlbiB5aWVsZC4KKyAgICBXYWl0cyB1bnRpbCBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHdoZW4gY2FsbGVkIHdpdGggKnNwaW5uZXIgYW5kIGNoZWNrLgorICAgIERvZXMgTk9UIHB1dCB0aHJlYWRzIHRvIHNsZWVwLgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBBcmd1bWVudHM6CisgICAgICAgIG9iaiAtLSBpcyBoaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9iamVjdCB0byByZXBvcnQgdG8gaXR0bm90aWZ5LiBJdCBpcyB1c2VkIHRvIHJlcG9ydAorICAgICAgICAgICAgbG9ja3MgY29uc2lzdGVudGx5LiBGb3IgZXhhbXBsZSwgaWYgbG9jayBpcyBhY3F1aXJlZCBpbW1lZGlhdGVseSwgaXRzIGFkZHJlc3MgaXMKKyAgICAgICAgICAgIHJlcG9ydGVkIHRvIGl0dG5vdGlmeSB2aWEgS01QX0ZTWU5DX0FDUVVJUkVEKCkuIEhvd2V2ZXIsIGl0IGxvY2sgY2Fubm90IGJlIGFjcXVpcmVkCisgICAgICAgICAgICBpbW1lZGlhdGVseSBhbmQgbG9jayByb3V0aW5lIGNhbGxzIHRvIEtNUF9XQUlUX1lJRUxEKCksIHRoZSBsYXRlciBzaG91bGQgcmVwb3J0IHRoZSBzYW1lCisgICAgICAgICAgICBhZGRyZXNzLCBub3QgYW4gYWRkcmVzcyBvZiBsb3ctbGV2ZWwgc3Bpbm5lci4KKyNlbmRpZiAvLyBVU0VfSVRUX0JVSUxECisqLwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KKy8vIFRvRG86IG1ha2UgaW5saW5lIGZ1bmN0aW9uIChtb3ZlIHRvIGhlYWRlciBmaWxlIGZvciBpY2wpCitzdGF0aWMgVVQgIC8vIHVuc2lnbmVkIDQtIG9yIDgtYnl0ZSB0eXBlCitfX2ttcF93YWl0X3lpZWxkKCB2b2xhdGlsZSBVVCAqIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICBVVCAgICAgICAgICAgIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICgqIHByZWQpKCBVVCwgVVQgKQorICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAgICAgICAgKiBvYmopICAgIC8vIEhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCBvciBOVUxMLgorICAgICAgICAgICAgICAgICAgKQoreworICAgIC8vIG5vdGU6IHdlIG1heSBub3QgYmVsb25nIHRvIGEgdGVhbSBhdCB0aGlzIHBvaW50CisgICAgcmVnaXN0ZXIgdm9sYXRpbGUgVVQgICAgICAgICAqIHNwaW4gICAgICAgICAgPSBzcGlubmVyOworICAgIHJlZ2lzdGVyICAgICAgICAgIFVUICAgICAgICAgICBjaGVjayAgICAgICAgID0gY2hlY2tlcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgc3BpbnM7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAoKmYpICggVVQsIFVUICkgPSBwcmVkOworICAgIHJlZ2lzdGVyICAgICAgICAgIFVUICAgICAgICAgICByOworCisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopIHNwaW4gKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICAvLyBtYWluIHdhaXQgc3BpbiBsb29wCisgICAgd2hpbGUoIWYociA9ICpzcGluLCBjaGVjaykpCisgICAgeworICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBvYmogKTsKKyAgICAgICAgLyogR0VIIC0gcmVtb3ZlIHRoaXMgc2luY2UgaXQgd2FzIGFjY2lkZW50YWxseSBpbnRyb2R1Y2VkIHdoZW4ga21wX3dhaXQgd2FzIHNwbGl0LgorICAgICAgICAgICBJdCBjYXVzZXMgcHJvYmxlbXMgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24gYmVjYXVzZSBvZiBleGl0IGxvY2sgKi8KKyAgICAgICAgLyogaWYgKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICYmIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpCisgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoKTsgKi8KKworICAgICAgICAvLyBpZiB3ZSBhcmUgb3ZlcnN1YnNjcmliZWQsCisgICAgICAgIC8vIG9yIGhhdmUgd2FpdGVkIGEgYml0IChhbmQgS01QX0xJQlJBUlk9dGhyb3VnaHB1dCwgdGhlbiB5aWVsZAorICAgICAgICAvLyBwYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUKKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApOworICAgIHJldHVybiByOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIGttcF91aW50MzIgX19rbXBfZXEoIFVUIHZhbHVlLCBVVCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlID09IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9uZXEoIFVUIHZhbHVlLCBVVCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlICE9IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9sdCggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPCBjaGVja2VyOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIGttcF91aW50MzIgX19rbXBfZ2UoIFVUIHZhbHVlLCBVVCBjaGVja2VyKSB7CisgICAgcmV0dXJuIHZhbHVlID49IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9sZSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPD0gY2hlY2tlcjsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZGVvX2Vycm9yKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZF9yZWYgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICB0aCA9IF9fa21wX3RocmVhZHNbKmd0aWRfcmVmXTsKKyAgICAgICAgaWYgKCB0aCAtPiB0aC50aF9yb290IC0+IHIucl9hY3RpdmUKKyAgICAgICAgICAmJiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSApIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCAqZ3RpZF9yZWYsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLCBOVUxMLCAwICk7CisjZWxzZQorICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCAqZ3RpZF9yZWYsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLCBOVUxMICk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9kZW8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVVQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+ICogcHI7CisKKyAgICBpbnQgZ3RpZCA9ICpndGlkX3JlZjsKKy8vICAgIGludCAgY2lkID0gKmNpZF9yZWY7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGggLT4gdGgudGhfZGlzcGF0Y2ggKTsKKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICBpZiAoIHByIC0+IHB1c2hlZF93cyAhPSBjdF9ub25lICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLCBOVUxMLCAwICk7CisjZWxzZQorICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiwgTlVMTCApOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoICEgdGggLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gICogc2ggPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIFVUICBsb3dlcjsKKworICAgICAgICBpZiAoICEgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICB9CisgICAgICAgIGxvd2VyID0gcHItPnUucC5vcmRlcmVkX2xvd2VyOworCisgICAgICAgICNpZiAhIGRlZmluZWQoIEtNUF9HT01QX0NPTVBBVCApCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkX2J1bXBlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc011bHRpcGxlTmVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYgLyogIWRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworCisgICAgICAgIEtNUF9NQigpOworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfZGVvOiBUIyUlZCBiZWZvcmUgd2FpdDogb3JkZXJlZF9pdGVyOiUlJXMgbG93ZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZDwgVVQgPiggJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCBfX2ttcF9nZTwgVVQgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIEtNUF9NQigpOyAgLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJSVkIGFmdGVyIHdhaXQ6IG9yZGVyZWRfaXRlcjolJSVzIGxvd2VyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgIH0KKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZGVvOiBUIyVkIHJldHVybmVkXG4iLCBndGlkICkgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2R4b19lcnJvciggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBrbXBfaW5mb190ICp0aDsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICB0aCA9IF9fa21wX3RocmVhZHNbKmd0aWRfcmVmXTsKKyAgICAgICAgaWYgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50IC0+IHB1c2hlZF93cyAhPSBjdF9ub25lICkgeworICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoICpndGlkX3JlZiwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYgKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9keG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVVQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+ICogcHI7CisKKyAgICBpbnQgZ3RpZCA9ICpndGlkX3JlZjsKKy8vICAgIGludCAgY2lkID0gKmNpZF9yZWY7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGggLT4gdGgudGhfZGlzcGF0Y2ggKTsKKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9keG86IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICBpZiAoIHByIC0+IHB1c2hlZF93cyAhPSBjdF9ub25lICkgeworICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoICEgdGggLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gICogc2ggPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisKKyAgICAgICAgaWYgKCAhIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIH0KKworICAgICAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKCAmIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24gKTsKKyAgICAgICAgI2lmICEgZGVmaW5lZCggS01QX0dPTVBfQ09NUEFUICkKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWRfYnVtcGVkICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKyAgICAgICAgICAgICAgICAgICAgLyogSG93IHRvIHRlc3QgaXQ/IC0gT00gKi8KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNNdWx0aXBsZU5lc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgI2VuZGlmIC8qICFkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkgKi8KKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICBwci0+b3JkZXJlZF9idW1wZWQgKz0gMTsKKworICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIl9fa21wX2Rpc3BhdGNoX2R4bzogVCMlZCBidW1waW5nIG9yZGVyZWQgb3JkZXJlZF9idW1wZWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwci0+b3JkZXJlZF9idW1wZWQgKSApOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8qIFRPRE8gdXNlIGdlbmVyYWwgcmVsZWFzZSBwcm9jZWR1cmU/ICovCisgICAgICAgIHRlc3RfdGhlbl9pbmM8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24gKTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9CisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2R4bzogVCMlZCByZXR1cm5lZFxuIiwgZ3RpZCApICk7Cit9CisKKy8qIENvbXB1dGVzIGFuZCByZXR1cm5zIHggdG8gdGhlIHBvd2VyIG9mIHksIHdoZXJlIHkgbXVzdCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyICovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUgbG9uZyBkb3VibGUKK19fa21wX3Bvdyhsb25nIGRvdWJsZSB4LCBVVCB5KSB7CisgICAgbG9uZyBkb3VibGUgcz0xLjBMOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh4ID4gMC4wICYmIHggPCAxLjApOworICAgIC8vS01QX0RFQlVHX0FTU0VSVCh5ID49IDApOyAvLyB5IGlzIHVuc2lnbmVkCisgICAgd2hpbGUoeSkgeworICAgICAgICBpZiAoIHkgJiAxICkKKyAgICAgICAgICAgIHMgKj0geDsKKyAgICAgICAgeCAqPSB4OworICAgICAgICB5ID4+PSAxOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworLyogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmFzc2lnbmVkIGl0ZXJhdGlvbnMgYWZ0ZXIgaWR4IGNodW5rcyBoYXZlIGJlZW4gYXNzaWduZWQKKyAgICh0aGUgdG90YWwgbnVtYmVyIG9mIHVuYXNzaWduZWQgaXRlcmF0aW9ucyBpbiBjaHVua3Mgd2l0aCBpbmRleCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gaWR4KS4KKyAgIF9fZm9yY2VpbmxpbmUgc2VlbXMgdG8gYmUgYnJva2VuIHNvIHRoYXQgaWYgd2UgX19mb3JjZWlubGluZSB0aGlzIGZ1bmN0aW9uLCB0aGUgYmVoYXZpb3IgaXMgd3JvbmcKKyAgIChvbmUgb2YgdGhlIHVuaXQgdGVzdHMsIHNjaF9ndWlkZWRfYW5hbHl0aWNhbF9iYXNpYy5jcHAsIGZhaWxzKQorKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyBfX2lubGluZSB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90CitfX2ttcF9kaXNwYXRjaF9ndWlkZWRfcmVtYWluaW5nKAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6ZmxvYXRpbmdfdCBiYXNlLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgaWR4CispIHsKKyAgICAvKiBOb3RlOiBPbiBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0LCBhdAorICAgICAgIGxlYXN0IGZvciBJQ0wgOC4xLCBsb25nIGRvdWJsZSBhcml0aG1ldGljIG1heSBub3QgcmVhbGx5IGhhdmUKKyAgICAgICBsb25nIGRvdWJsZSBwcmVjaXNpb24sIGV2ZW4gd2l0aCAvUWxvbmdfZG91YmxlLiAgQ3VycmVudGx5LCB3ZQorICAgICAgIHdvcmthcm91bmQgdGhhdCBpbiB0aGUgY2FsbGVyIGNvZGUsIGJ5IG1hbmlwdWxhdGluZyB0aGUgRlBDVyBmb3IKKyAgICAgICBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuICBUaGUgbGFjayBvZiBwcmVjaXNpb24gaXMgbm90CisgICAgICAgZXhwZWN0ZWQgdG8gYmUgYSBjb3JyZWN0bmVzcyBpc3N1ZSwgdGhvdWdoLgorICAgICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKworICAgIGxvbmcgZG91YmxlIHggPSB0YyAqIF9fa21wX3BvdzwgVVQgPihiYXNlLCBpZHgpOworICAgIFVUIHIgPSAoVVQpIHg7CisgICAgaWYgKCB4ID09IHIgKQorICAgICAgICByZXR1cm4gcjsKKyAgICByZXR1cm4gciArIDE7Cit9CisKKy8vIFBhcmFtZXRlcnMgb2YgdGhlIGd1aWRlZC1pdGVyYXRpdmUgYWxnb3JpdGhtOgorLy8gICBwMiA9IG4gKiBucHJvYyAqICggY2h1bmsgKyAxICkgIC8vIHBvaW50IG9mIHN3aXRjaGluZyB0byBkeW5hbWljCisvLyAgIHAzID0gMSAvICggbiAqIG5wcm9jICkgICAgICAgICAgLy8gcmVtYWluaW5nIGl0ZXJhdGlvbnMgbXVsdGlwbGllcgorLy8gYnkgZGVmYXVsdCBuID0gMi4gRm9yIGV4YW1wbGUgd2l0aCBuID0gMyB0aGUgY2h1bmtzIGRpc3RyaWJ1dGlvbiB3aWxsIGJlIG1vcmUgZmxhdC4KKy8vIFdpdGggbiA9IDEgZmlyc3QgY2h1bmsgaXMgdGhlIHNhbWUgYXMgZm9yIHN0YXRpYyBzY2hlZHVsZSwgZS5nLiB0cmlwIC8gbnByb2MuCitzdGF0aWMgaW50IGd1aWRlZF9pbnRfcGFyYW0gPSAyOworc3RhdGljIGRvdWJsZSBndWlkZWRfZmx0X3BhcmFtID0gMC41Oy8vID0gMS4wIC8gZ3VpZGVkX2ludF9wYXJhbTsKKworLy8gVVQgLSB1bnNpZ25lZCBmbGF2b3Igb2YgVCwgU1QgLSBzaWduZWQgZmxhdm9yIG9mIFQsCisvLyBEQkwgLSBkb3VibGUgaWYgc2l6ZW9mKFQpPT00LCBvciBsb25nIGRvdWJsZSBpZiBzaXplb2YoVCk9PTgKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9pbml0KAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAqIGxvYywKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSAgICAgICAgICAgICAgICAgIHNjaGVkdWxlLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxiLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHViLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90IHN0LAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90IGNodW5rLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MKKykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OmZsb2F0aW5nX3QgIERCTDsKKyAgICBzdGF0aWMgY29uc3QgaW50IF9fX2ttcF9zaXplX3R5cGUgPSBzaXplb2YoIFVUICk7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZTsKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjOworICAgIGttcF9pbmZvX3QgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGg7CisgICAga21wX3RlYW1fdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtOworICAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfYnVmZmVyX2luZGV4OworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICAgICAgICAgICogcHI7CisgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gdm9sYXRpbGUgKiBzaDsKKworICAgIEtNUF9CVUlMRF9BU1NFUlQoIHNpemVvZiggZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gKSA9PSBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mbyApICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiApID09IHNpemVvZiggZGlzcGF0Y2hfc2hhcmVkX2luZm8gKSApOworCisgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyNpZiBJTkNMVURFX1NTQ19NQVJLUworICAgIFNTQ19NQVJLX0RJU1BBVENIX0lOSVQoKTsKKyNlbmRpZgorICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlJWQgY2FsbGVkOiBzY2hlZHVsZTolJWQgY2h1bms6JSUlcyBsYjolJSVzIHViOiUlJXMgc3Q6JSUlc1xuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgY2h1bmssIGxiLCB1Yiwgc3QgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgLyogc2V0dXAgZGF0YSAqLworICAgIHRoICAgICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB0ZWFtICAgPSB0aCAtPiB0aC50aF90ZWFtOworICAgIGFjdGl2ZSA9ICEgdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICB0aC0+dGgudGhfaWRlbnQgPSBsb2M7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAga21wX3VpbnQ2NCBjdXJfY2h1bmsgPSBjaHVuazsKKyAgICBpbnQgaXR0X25lZWRfbWV0YWRhdGFfcmVwb3J0aW5nID0gX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICYmCisgICAgICAgIEtNUF9NQVNURVJfR1RJRChndGlkKSAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0gMTsKKyNlbmRpZgorICAgIGlmICggISBhY3RpdmUgKSB7CisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4qID4KKyAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXIgKTsgLyogdG9wIG9mIHRoZSBzdGFjayAqLworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9kaXNwYXRjaCA9PQorICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworICAgICAgICBteV9idWZmZXJfaW5kZXggPSB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BfaW5kZXggKys7CisKKyAgICAgICAgLyogV2hhdCBoYXBwZW5zIHdoZW4gbnVtYmVyIG9mIHRocmVhZHMgY2hhbmdlcywgbmVlZCB0byByZXNpemUgYnVmZmVyPyAqLworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICAqID4KKyAgICAgICAgICAgICggJnRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BfYnVmZmVyWyBteV9idWZmZXJfaW5kZXggJSBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVycyBdICk7CisgICAgICAgIHNoID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gdm9sYXRpbGUgKiA+CisgICAgICAgICAgICAoICZ0ZWFtIC0+IHQudF9kaXNwX2J1ZmZlclsgbXlfYnVmZmVyX2luZGV4ICUgX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMgXSApOworICAgIH0KKworICAgICNpZiAgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKQorICAgIGlmICggU0NIRURVTEVfSEFTX05PTk1PTk9UT05JQyhzY2hlZHVsZSkgKQorICAgICAgICAvLyBBQzogd2Ugbm93IGhhdmUgb25seSBvbmUgaW1wbGVtZW50YXRpb24gb2Ygc3RlYWxpbmcsIHNvIHVzZSBpdAorICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfc3RhdGljX3N0ZWFsOworICAgIGVsc2UKKyAgICAjZW5kaWYKKyAgICAgICAgc2NoZWR1bGUgPSBTQ0hFRFVMRV9XSVRIT1VUX01PRElGSUVSUyhzY2hlZHVsZSk7CisKKyAgICAvKiBQaWNrIHVwIHRoZSBub21lcmdlL29yZGVyZWQgYml0cyBmcm9tIHRoZSBzY2hlZHVsaW5nIHR5cGUgKi8KKyAgICBpZiAoIChzY2hlZHVsZSA+PSBrbXBfbm1fbG93ZXIpICYmIChzY2hlZHVsZSA8IGttcF9ubV91cHBlcikgKSB7CisgICAgICAgIHByLT5ub21lcmdlID0gVFJVRTsKKyAgICAgICAgc2NoZWR1bGUgPSAoZW51bSBzY2hlZF90eXBlKSgoKGludClzY2hlZHVsZSkgLSAoa21wX25tX2xvd2VyIC0ga21wX3NjaF9sb3dlcikpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByLT5ub21lcmdlID0gRkFMU0U7CisgICAgfQorICAgIHByLT50eXBlX3NpemUgPSBfX19rbXBfc2l6ZV90eXBlOyAvLyByZW1lbWJlciB0aGUgc2l6ZSBvZiB2YXJpYWJsZXMKKyAgICBpZiAoIGttcF9vcmRfbG93ZXIgJiBzY2hlZHVsZSApIHsKKyAgICAgICAgcHItPm9yZGVyZWQgPSBUUlVFOworICAgICAgICBzY2hlZHVsZSA9IChlbnVtIHNjaGVkX3R5cGUpKCgoaW50KXNjaGVkdWxlKSAtIChrbXBfb3JkX2xvd2VyIC0ga21wX3NjaF9sb3dlcikpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByLT5vcmRlcmVkID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX3N0YXRpYyApIHsKKyAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9zdGF0aWM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX3J1bnRpbWUgKSB7CisgICAgICAgICAgICAvLyBVc2UgdGhlIHNjaGVkdWxpbmcgc3BlY2lmaWVkIGJ5IE9NUF9TQ0hFRFVMRSAob3IgX19rbXBfc2NoX2RlZmF1bHQgaWYgbm90IHNwZWNpZmllZCkKKyAgICAgICAgICAgIHNjaGVkdWxlID0gdGVhbSAtPiB0LnRfc2NoZWQucl9zY2hlZF90eXBlOworICAgICAgICAgICAgLy8gRGV0YWlsIHRoZSBzY2hlZHVsZSBpZiBuZWVkZWQgKGdsb2JhbCBjb250cm9scyBhcmUgZGlmZmVyZW50aWF0ZWQgYXBwcm9wcmlhdGVseSkKKyAgICAgICAgICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCApIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IF9fa21wX2d1aWRlZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfc3RhdGljOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVXNlIHRoZSBjaHVuayBzaXplIHNwZWNpZmllZCBieSBPTVBfU0NIRURVTEUgKG9yIGRlZmF1bHQgaWYgbm90IHNwZWNpZmllZCkKKyAgICAgICAgICAgIGNodW5rID0gdGVhbSAtPiB0LnRfc2NoZWQuY2h1bms7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgY3VyX2NodW5rID0gY2h1bms7CisjZW5kaWYKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJSVkIG5ldzogc2NoZWR1bGU6JSVkIGNodW5rOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAsICggYnVmZiwgZ3RpZCwgc2NoZWR1bGUsIGNodW5rICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICkgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfZ3VpZGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBjaHVuayA8PSAwICkgeworICAgICAgICAgICAgICAgIGNodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfYXV0byApIHsKKyAgICAgICAgICAgIC8vIG1hcHBpbmcgYW5kIGRpZmZlcmVudGlhdGlvbjogaW4gdGhlIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCkKKyAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfYXV0bzsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2luaXQ6IGttcF9zY2hfYXV0bzogVCMlJWQgbmV3OiBzY2hlZHVsZTolJWQgY2h1bms6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgY2h1bmsgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvKiBndWlkZWQgYW5hbHl0aWNhbCBub3Qgc2FmZSBmb3IgdG9vIG1hbnkgdGhyZWFkcyAqLworICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCAmJiB0aC0+dGgudGhfdGVhbV9ucHJvYyA+IDE8PDIwICkgeworICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBEaXNwYXRjaE1hbnlUaHJlYWRzICk7CisgICAgICAgIH0KKyAgICAgICAgcHItPnUucC5wYXJtMSA9IGNodW5rOworICAgIH0KKyAgICBLTVBfQVNTRVJUMiggKGttcF9zY2hfbG93ZXIgPCBzY2hlZHVsZSAmJiBzY2hlZHVsZSA8IGttcF9zY2hfdXBwZXIpLAorICAgICAgICAgICAgICAgICJ1bmtub3duIHNjaGVkdWxpbmcgdHlwZSIgKTsKKworICAgIHByLT51LnAuY291bnQgPSAwOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggc3QgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgKKyAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCwKKyAgICAgICAgICAgICAgICAoIHByLT5vcmRlcmVkID8gY3RfcGRvX29yZGVyZWQgOiBjdF9wZG8gKSwgbG9jCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorICAgIC8vIGNvbXB1dGUgdHJpcCBjb3VudAorICAgIGlmICggc3QgPT0gMSApIHsgICAvLyBtb3N0IGNvbW1vbiBjYXNlCisgICAgICAgIGlmICggdWIgPj0gbGIgKSB7CisgICAgICAgICAgICB0YyA9IHViIC0gbGIgKyAxOworICAgICAgICB9IGVsc2UgeyAgIC8vIHViIDwgbGIKKyAgICAgICAgICAgIHRjID0gMDsgICAgICAgICAgICAvLyB6ZXJvLXRyaXAKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIHN0IDwgMCApIHsKKyAgICAgICAgaWYgKCBsYiA+PSB1YiApIHsKKyAgICAgICAgICAgIC8vIEFDOiBjYXN0IHRvIHVuc2lnbmVkIGlzIG5lZWRlZCBmb3IgbG9vcHMgbGlrZSAoaT0yQjsgaT4tMkI7IGktPTFCKSwKKyAgICAgICAgICAgIC8vICAgICB3aGVyZSB0aGUgZGl2aXNpb24gbmVlZHMgdG8gYmUgdW5zaWduZWQgcmVnYXJkbGVzcyBvZiB0aGUgcmVzdWx0IHR5cGUKKyAgICAgICAgICAgIHRjID0gKFVUKShsYiAtIHViKSAvICgtc3QpICsgMTsKKyAgICAgICAgfSBlbHNlIHsgICAvLyBsYiA8IHViCisgICAgICAgICAgICB0YyA9IDA7ICAgICAgICAgICAgLy8gemVyby10cmlwCisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAgICAgICAvLyBzdCA+IDAKKyAgICAgICAgaWYgKCB1YiA+PSBsYiApIHsKKyAgICAgICAgICAgIC8vIEFDOiBjYXN0IHRvIHVuc2lnbmVkIGlzIG5lZWRlZCBmb3IgbG9vcHMgbGlrZSAoaT0tMkI7IGk8MkI7IGkrPTFCKSwKKyAgICAgICAgICAgIC8vICAgICB3aGVyZSB0aGUgZGl2aXNpb24gbmVlZHMgdG8gYmUgdW5zaWduZWQgcmVnYXJkbGVzcyBvZiB0aGUgcmVzdWx0IHR5cGUKKyAgICAgICAgICAgIHRjID0gKFVUKSh1YiAtIGxiKSAvIHN0ICsgMTsKKyAgICAgICAgfSBlbHNlIHsgICAvLyB1YiA8IGxiCisgICAgICAgICAgICB0YyA9IDA7ICAgICAgICAgICAgLy8gemVyby10cmlwCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBbnkgaGFsZi1kZWNlbnQgb3B0aW1pemVyIHdpbGwgcmVtb3ZlIHRoaXMgdGVzdCB3aGVuIHRoZSBibG9ja3MgYXJlIGVtcHR5IHNpbmNlIHRoZSBtYWNyb3MgZXhwYW5kIHRvIG5vdGhpbmcKKyAgICAvLyB3aGVuIHN0YXRpc3RpY3MgYXJlIGRpc2FibGVkLgorICAgIGlmIChzY2hlZHVsZSA9PSBfX2ttcF9zdGF0aWMpCisgICAgeworICAgICAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0ZPUl9zdGF0aWMpOworICAgICAgICBLTVBfQ09VTlRfVkFMVUUoRk9SX3N0YXRpY19pdGVyYXRpb25zLCB0Yyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRk9SX2R5bmFtaWMpOworICAgICAgICBLTVBfQ09VTlRfVkFMVUUoRk9SX2R5bmFtaWNfaXRlcmF0aW9ucywgdGMpOworICAgIH0KKworICAgIHByLT51LnAubGIgPSBsYjsKKyAgICBwci0+dS5wLnViID0gdWI7CisgICAgcHItPnUucC5zdCA9IHN0OworICAgIHByLT51LnAudGMgPSB0YzsKKworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgIHByLT51LnAubGFzdF91cHBlciA9IHViICsgc3Q7CisgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyAgICAvKiBOT1RFOiBvbmx5IHRoZSBhY3RpdmUgcGFyYWxsZWwgcmVnaW9uKHMpIGhhcyBhY3RpdmUgb3JkZXJlZCBzZWN0aW9ucyAqLworCisgICAgaWYgKCBhY3RpdmUgKSB7CisgICAgICAgIGlmICggcHItPm9yZGVyZWQgPT0gMCApIHsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBfX2ttcF9kaXNwYXRjaF9kZW9fZXJyb3I7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZHhvX2Vycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gMTsKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IDA7CisKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBfX2ttcF9kaXNwYXRjaF9kZW88IFVUID47CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZHhvPCBVVCA+OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGVudW0gY29uc190eXBlIHdzID0gcHItPm9yZGVyZWQgPyBjdF9wZG9fb3JkZXJlZCA6IGN0X3BkbzsKKyAgICAgICAgaWYgKCBwdXNoX3dzICkgeworICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGd0aWQsIHdzLCBsb2MgKTsKKyAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSB3czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2NoZWNrX3dvcmtzaGFyZSggZ3RpZCwgd3MsIGxvYyApOworICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IGN0X25vbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKCBzY2hlZHVsZSApIHsKKyAgICAjaWYgICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICkKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGgtPnRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgICAgICBUIG50YywgaW5pdDsKKworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfc3RlYWwgY2FzZVxuIiwgZ3RpZCApICk7CisKKyAgICAgICAgICAgIG50YyA9ICh0YyAlIGNodW5rID8gMSA6IDApICsgdGMgLyBjaHVuazsKKyAgICAgICAgICAgIGlmICggbnByb2MgPiAxICYmIG50YyA+PSBucHJvYyApIHsKKyAgICAgICAgICAgICAgICBUIGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgICAgICAgICBUIHNtYWxsX2NodW5rLCBleHRyYXM7CisKKyAgICAgICAgICAgICAgICBzbWFsbF9jaHVuayA9IG50YyAvIG5wcm9jOworICAgICAgICAgICAgICAgIGV4dHJhcyA9IG50YyAlIG5wcm9jOworCisgICAgICAgICAgICAgICAgaW5pdCA9IGlkICogc21hbGxfY2h1bmsgKyAoIGlkIDwgZXh0cmFzID8gaWQgOiBleHRyYXMgKTsKKyAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ID0gaW5pdDsKKyAgICAgICAgICAgICAgICBwci0+dS5wLnViID0gaW5pdCArIHNtYWxsX2NodW5rICsgKCBpZCA8IGV4dHJhcyA/IDEgOiAwICk7CisKKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0yID0gbGI7CisgICAgICAgICAgICAgICAgLy9wci0+cGZpZWxkcy5wYXJtMyA9IDA7IC8vIGl0J3Mgbm90IHVzZWQgaW4gc3RhdGljX3N0ZWFsCisgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9IChpZCArIDEpICUgbnByb2M7IC8vIHJlbWVtYmVyIG5laWdoYm91ciB0aWQKKyAgICAgICAgICAgICAgICBwci0+dS5wLnN0ID0gc3Q7CisgICAgICAgICAgICAgICAgaWYgKCBfX19rbXBfc2l6ZV90eXBlID4gNCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQUM6IFRPRE86IGNoZWNrIGlmIDE2LWJ5dGUgQ0FTIGF2YWlsYWJsZSBhbmQgdXNlIGl0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGltcHJvdmUgcGVyZm9ybWFuY2UgKHByb2JhYmx5IHdhaXQgZm9yIGV4cGxpY2l0IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHNwZW5kaW5nIHRpbWUgb24gdGhpcykuCisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgdXNlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBwZXItdGhyZWFkIGxvY2ssCisgICAgICAgICAgICAgICAgICAgIC8vIGZyZWUgbWVtb3J5IGluIF9fa21wX2Rpc3BhdGNoX25leHQgd2hlbiBzdGF0dXM9PTAuCisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9zdGVhbF9sb2NrID09IE5VTEwpOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9sb2NrX3QqKV9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfbG9ja190KSk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfbG9jayh0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgZmFsbGluZy10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ7CisgICAgICAgICAgICAgICAgLyogdG9vIGZldyBpdGVyYXRpb25zOiBmYWxsLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKi8KKyAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgIC8qIEZBTEwtVEhST1VHSCB0byBzdGF0aWMgYmFsYW5jZWQgKi8KKyAgICAgICAgfSAvLyBjYXNlCisgICAgI2VuZGlmCisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICAgICAgICAgICAgVCBpbml0LCBsaW1pdDsKKworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgKSB7CisgICAgICAgICAgICAgICAgVCBpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIHRjIDwgbnByb2MgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaWQgPCB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKGlkID09IHRjIC0gMSk7ICAvKiBwYXJtMSBzdG9yZXMgKnBsYXN0aXRlciAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IDE7ICAvKiBtZWFucyBubyBtb3JlIGNodW5rcyB0byBleGVjdXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFQgc21hbGxfY2h1bmsgPSB0YyAvIG5wcm9jOworICAgICAgICAgICAgICAgICAgICBUIGV4dHJhcyA9IHRjICUgbnByb2M7CisgICAgICAgICAgICAgICAgICAgIGluaXQgPSBpZCAqIHNtYWxsX2NodW5rICsgKGlkIDwgZXh0cmFzID8gaWQgOiBleHRyYXMpOworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyBzbWFsbF9jaHVuayAtIChpZCA8IGV4dHJhcyA/IDAgOiAxKTsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IChpZCA9PSBucHJvYyAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCB0YyA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXQgPSAwOworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRjIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IFRSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gemVybyB0cmlwIGNvdW50CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSAxOyAgLyogbWVhbnMgbm8gbW9yZSBjaHVua3MgdG8gZXhlY3V0ZSAqLworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgY2h1bmsgZm9yIG1ldGFkYXRhIHJlcG9ydAorICAgICAgICAgICAgaWYgKCBpdHRfbmVlZF9tZXRhZGF0YV9yZXBvcnRpbmcgKQorICAgICAgICAgICAgICAgIGN1cl9jaHVuayA9IGxpbWl0IC0gaW5pdCArIDE7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICggc3QgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBwci0+dS5wLmxiID0gbGIgKyBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSBsYiArIGxpbWl0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBUIHViX3RtcCA9IGxiICsgbGltaXQgKiBzdDsgICAvLyBjYWxjdWxhdGVkIHVwcGVyIGJvdW5kLCAidWIiIGlzIHVzZXItZGVmaW5lZCB1cHBlciBib3VuZAorICAgICAgICAgICAgICAgIHByLT51LnAubGIgPSBsYiArIGluaXQgKiBzdDsKKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdXBwZXIgYm91bmQgdG8gInViIiBpZiBuZWVkZWQsIHNvIHRoYXQgTVMgbGFzdHByaXZhdGUgd2lsbCBtYXRjaCBpdCBleGFjdGx5CisgICAgICAgICAgICAgICAgaWYgKCBzdCA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSAoIHViX3RtcCArIHN0ID4gdWIgPyB1YiA6IHViX3RtcCApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSAoIHViX3RtcCArIHN0IDwgdWIgPyB1YiA6IHViX3RtcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IC8vIGNhc2UKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkIDoKKyAgICAgICAgeworICAgICAgICAgICAgVCBucHJvYyA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCBjYXNlXG4iLGd0aWQpKTsKKworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoMkwgKiBjaHVuayArIDEgKSAqIG5wcm9jID49IHRjICkgeworICAgICAgICAgICAgICAgICAgICAvKiBjaHVuayBzaXplIHRvbyBsYXJnZSwgc3dpdGNoIHRvIGR5bmFtaWMgKi8KKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHJlbWFpbmluZyBpdGVycyBiZWNvbWUgbGVzcyB0aGFuIHBhcm0yIC0gc3dpdGNoIHRvIGR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IGd1aWRlZF9pbnRfcGFyYW0gKiBucHJvYyAqICggY2h1bmsgKyAxICk7CisgICAgICAgICAgICAgICAgICAgICooZG91YmxlKikmcHItPnUucC5wYXJtMyA9IGd1aWRlZF9mbHRfcGFyYW0gLyBucHJvYzsgICAvLyBtYXkgb2NjdXB5IHBhcm0zIGFuZCBwYXJtNAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBmYWxsaW5nLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfZ3JlZWR5XG4iLGd0aWQpKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsKKyAgICAgICAgICAgICAgICAvKiB0ZWFtLT50LnRfbnByb2MgPT0gMTogZmFsbC10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeSAqLworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfZ3JlZWR5IGNhc2VcbiIsZ3RpZCkpOworICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSB0YzsKKyAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSAvLyBjYXNlCisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGgtPnRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQgY2FzZVxuIiwgZ3RpZCkpOworCisgICAgICAgICAgICBpZiAoIG5wcm9jID4gMSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICgyTCAqIGNodW5rICsgMSApICogbnByb2MgPj0gdGMgKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNodW5rIHNpemUgdG9vIGxhcmdlLCBzd2l0Y2ggdG8gZHluYW1pYyAqLworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfZHluYW1pY19jaHVua2VkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1vbmx5IHVzZWQgdGVybTogKDIgbnByb2MgLSAxKS8oMiBucHJvYykgKi8KKyAgICAgICAgICAgICAgICAgICAgREJMIHg7CisKKyAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAvKiBMaW51eCogT1MgYWxyZWFkeSBoYXMgNjQtYml0IGNvbXB1dGF0aW9uIGJ5IGRlZmF1bHQgZm9yCisJCSAgICAgICBsb25nIGRvdWJsZSwgYW5kIG9uIFdpbmRvd3MqIE9TIG9uIEludGVsKFIpIDY0LAorCQkgICAgICAgL1Fsb25nX2RvdWJsZSBkb2Vzbid0IHdvcmsuICBPbiBXaW5kb3dzKiBPUworCQkgICAgICAgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLCB3ZSBuZWVkIHRvIHNldCBwcmVjaXNpb24gdG8KKwkJICAgICAgIDY0LWJpdCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDUzLWJpdC4gRXZlbiB0aG91Z2ggbG9uZworCQkgICAgICAgZG91YmxlIGRvZXNuJ3Qgd29yayBvbiBXaW5kb3dzKiBPUyBvbiBJbnRlbChSKSA2NCwgdGhlCisJCSAgICAgICByZXN1bHRpbmcgbGFjayBvZiBwcmVjaXNpb24gaXMgbm90IGV4cGVjdGVkIHRvIGltcGFjdAorCQkgICAgICAgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBhbGdvcml0aG0sIGJ1dCB0aGlzIGhhcyBub3QgYmVlbgorCQkgICAgICAgbWF0aGVtYXRpY2FsbHkgcHJvdmVuLgorICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIG9yaWdpbmFsIEZQQ1cgYW5kIHNldCBwcmVjaXNpb24gdG8gNjQtYml0LCBhcworICAgICAgICAgICAgICAgICAgICAvLyBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgZGVmYXVsdHMgdG8gNTMtYml0CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbGRGcGN3ID0gX2NvbnRyb2w4NygwLDApOworICAgICAgICAgICAgICAgICAgICBfY29udHJvbDg3KF9QQ182NCxfTUNXX1BDKTsgLy8gMCwweDMwMDAwCisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvKiB2YWx1ZSB1c2VkIGZvciBjb21wYXJpc29uIGluIHNvbHZlciBmb3IgY3Jvc3Mtb3ZlciBwb2ludCAqLworICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSB0YXJnZXQgPSAoKGxvbmcgZG91YmxlKWNodW5rICogMiArIDEpICogbnByb2MgLyB0YzsKKworICAgICAgICAgICAgICAgICAgICAvKiBjcm9zc292ZXIgcG9pbnQtLWNodW5rIGluZGV4ZXMgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuCisJCSAgICAgICB0aGlzIHBvaW50IHN3aXRjaCB0byBkeW5hbWljLXN0eWxlIHNjaGVkdWxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgVVQgICBjcm9zczsKKworICAgICAgICAgICAgICAgICAgICAvKiBjb21tb25seSB1c2VkIHRlcm06ICgyIG5wcm9jIC0gMSkvKDIgbnByb2MpICovCisgICAgICAgICAgICAgICAgICAgIHggPSAobG9uZyBkb3VibGUpMS4wIC0gKGxvbmcgZG91YmxlKTAuNSAvIG5wcm9jOworCisgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgeyAvLyB0ZXN0IG5hdHVyYWwgYWxpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX3Rlc3RfYSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkwgIGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBuYXR1cmFsX2FsaWdubWVudCA9IChwdHJkaWZmX3QpJnQuYiAtIChwdHJkaWZmX3QpJnQgLSAocHRyZGlmZl90KTE7CisgICAgICAgICAgICAgICAgICAgICAgICAvL19fa21wX3dhcm4oICIgJWxseCAlbGx4ICVsbGQiLCAobG9uZyBsb25nKSZ0LmQsIChsb25nIGxvbmcpJnQsIChsb25nIGxvbmcpbmF0dXJhbF9hbGlnbm1lbnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICggKCAocHRyZGlmZl90KSZwci0+dS5wLnBhcm0zICkgJiAoIG5hdHVyYWxfYWxpZ25tZW50ICkgKSA9PSAwICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9ERUJVRworCisgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgdGhlIHRlcm0gaW4gdGhyZWFkIHByaXZhdGUgZGlzcGF0Y2ggc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgICooREJMKikmcHItPnUucC5wYXJtMyA9IHg7CisKKyAgICAgICAgICAgICAgICAgICAgLyogc29sdmUgZm9yIHRoZSBjcm9zc292ZXIgcG9pbnQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBpIGZvciB3aGljaCBDX2kgPD0gY2h1bmsgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVVQgICAgICAgICAgbGVmdCwgcmlnaHQsIG1pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIHA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVzdGltYXRlIGluaXRpYWwgdXBwZXIgYW5kIGxvd2VyIGJvdW5kICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvZXNuJ3QgbWF0dGVyIHdoYXQgdmFsdWUgcmlnaHQgaXMgYXMgbG9uZyBhcyBpdCBpcyBwb3NpdGl2ZSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBhZmZlY3RzIHBlcmZvcm1hbmNlIG9mIHRoZSBzb2x2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IDIyOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBfX2ttcF9wb3c8IFVUID4oeCxyaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHAgPiB0YXJnZXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG97CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKj0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZShwPnRhcmdldCAmJiByaWdodCA8ICgxPDwyNykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodCA+PiAxOyAvKiBsb3dlciBib3VuZCBpcyBwcmV2aW91cyAoZmFpbGVkKSBlc3RpbWF0ZSBvZiB1cHBlciBib3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogYmlzZWN0aW9uIHJvb3QtZmluZGluZyBtZXRob2QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggbGVmdCArIDEgPCByaWdodCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9wb3c8IFVUID4oeCxtaWQpID4gdGFyZ2V0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbWlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gbWlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gd2hpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzID0gcmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogYXNzZXJ0IHNhbml0eSBvZiBjb21wdXRlZCBjcm9zc292ZXIgcG9pbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVChjcm9zcyAmJiBfX2ttcF9wb3c8IFVUID4oeCwgY3Jvc3MgLSAxKSA+IHRhcmdldCAmJiBfX2ttcF9wb3c8IFVUID4oeCwgY3Jvc3MpIDw9IHRhcmdldCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgY3Jvc3NvdmVyIHBvaW50IGluIHRocmVhZCBwcml2YXRlIGRpc3BhdGNoIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0yID0gY3Jvc3M7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQzc1ODAzCisgICAgICAgICAgICAgICAgICAgICNpZiAoICggS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTICkgJiYgS01QX0FSQ0hfWDg2ICkgJiYgKCAhIGRlZmluZWQoIEtNUF9JOCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgR1VJREVEX0FOQUxZVElDQUxfV09SS0FST1VORCAoKiggREJMICogKSZwci0+dS5wLnBhcm0zKQorICAgICAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgI2RlZmluZSBHVUlERURfQU5BTFlUSUNBTF9XT1JLQVJPVU5EICh4KQorICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYy1zdHlsZSBzY2hlZHVsaW5nIG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ID0gdGMgLSBfX2ttcF9kaXNwYXRjaF9ndWlkZWRfcmVtYWluaW5nKHRjLCBHVUlERURfQU5BTFlUSUNBTF9XT1JLQVJPVU5ELCBjcm9zcykgLSBjcm9zcyAqIGNodW5rOworICAgICAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIEZQQ1cKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcob2xkRnBjdyxfTUNXX1BDKTsKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBmYWxsaW5nLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfZ3JlZWR5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5OworICAgICAgICAgICAgICAgIC8qIHRlYW0tPnQudF9ucHJvYyA9PSAxOiBmYWxsLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICovCisgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IHRjOworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICAgIEtEX1RSQUNFKDEwMCwoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfZ3JlZWR5IGNhc2VcbiIsZ3RpZCkpOworICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9ICggdGgtPnRoLnRoX3RlYW1fbnByb2MgPiAxICkgPworICAgICAgICAgICAgICAgICggdGMgKyB0aC0+dGgudGhfdGVhbV9ucHJvYyAtIDEgKSAvIHRoLT50aC50aF90ZWFtX25wcm9jIDoKKyAgICAgICAgICAgICAgICB0YzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkIDoKKyAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkIDoKKyAgICAgICAgaWYgKCBwci0+dS5wLnBhcm0xIDw9IDAgKSB7CisgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgICAgIH0KKyAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19jaHVua2VkL2ttcF9zY2hfZHluYW1pY19jaHVua2VkIGNhc2VzXG4iLCBndGlkKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbCA6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRTUzogdHJhcGV6b2lkIHNlbGYtc2NoZWR1bGluZywgbWluaW11bSBjaHVua19zaXplID0gcGFybTEgKi8KKworICAgICAgICAgICAgVCBwYXJtMSwgcGFybTIsIHBhcm0zLCBwYXJtNDsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfdHJhcGV6b2lkYWwgY2FzZVxuIiwgZ3RpZCApICk7CisKKyAgICAgICAgICAgIHBhcm0xID0gY2h1bms7CisKKyAgICAgICAgICAgIC8qIEYgOiBzaXplIG9mIHRoZSBmaXJzdCBjeWNsZSAqLworICAgICAgICAgICAgcGFybTIgPSAoIHRjIC8gKDIgKiB0aC0+dGgudGhfdGVhbV9ucHJvYykgKTsKKworICAgICAgICAgICAgaWYgKCBwYXJtMiA8IDEgKSB7CisgICAgICAgICAgICAgICAgcGFybTIgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBMIDogc2l6ZSBvZiB0aGUgbGFzdCBjeWNsZS4gIE1ha2Ugc3VyZSB0aGUgbGFzdCBjeWNsZQorICAgICAgICAgICAgICogICAgIGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgZmlyc3QgY3ljbGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggcGFybTEgPCAxICkgeworICAgICAgICAgICAgICAgIHBhcm0xID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHBhcm0xID4gcGFybTIgKSB7CisgICAgICAgICAgICAgICAgcGFybTEgPSBwYXJtMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTiA6IG51bWJlciBvZiBjeWNsZXMgKi8KKyAgICAgICAgICAgIHBhcm0zID0gKCBwYXJtMiArIHBhcm0xICk7CisgICAgICAgICAgICBwYXJtMyA9ICggMiAqIHRjICsgcGFybTMgLSAxKSAvIHBhcm0zOworCisgICAgICAgICAgICBpZiAoIHBhcm0zIDwgMiApIHsKKyAgICAgICAgICAgICAgICBwYXJtMyA9IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHNpZ21hIDogZGVjcmVhc2luZyBpbmNyIG9mIHRoZSB0cmFwZXpvaWQgKi8KKyAgICAgICAgICAgIHBhcm00ID0gKCBwYXJtMyAtIDEgKTsKKyAgICAgICAgICAgIHBhcm00ID0gKCBwYXJtMiAtIHBhcm0xICkgLyBwYXJtNDsKKworICAgICAgICAgICAgLy8gcG9pbnRsZXNzIGNoZWNrLCBiZWNhdXNlIHBhcm00ID49IDAgYWx3YXlzCisgICAgICAgICAgICAvL2lmICggcGFybTQgPCAwICkgeworICAgICAgICAgICAgLy8gICAgcGFybTQgPSAwOworICAgICAgICAgICAgLy99CisKKyAgICAgICAgICAgIHByLT51LnAucGFybTEgPSBwYXJtMTsKKyAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBwYXJtMjsKKyAgICAgICAgICAgIHByLT51LnAucGFybTMgPSBwYXJtMzsKKyAgICAgICAgICAgIHByLT51LnAucGFybTQgPSBwYXJtNDsKKyAgICAgICAgfSAvLyBjYXNlCisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXZlcml0eQorICAgICAgICAgICAgICAgIEtNUF9NU0coIFVua25vd25TY2hlZFR5cGVEZXRlY3RlZCApLCAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBHZXROZXdlckxpYnJhcnkgKSwgICAgICAgICAgLy8gSGludAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsICAgICAgICAgICAgICAgICAgICAgICAvLyBWYXJpYWRpYyBhcmd1bWVudCBsaXN0IHRlcm1pbmF0b3IKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfSAvLyBzd2l0Y2gKKyAgICBwci0+c2NoZWR1bGUgPSBzY2hlZHVsZTsKKyAgICBpZiAoIGFjdGl2ZSApIHsKKyAgICAgICAgLyogVGhlIG5hbWUgb2YgdGhpcyBidWZmZXIgc2hvdWxkIGJlIG15X2J1ZmZlcl9pbmRleCB3aGVuIGl0J3MgZnJlZSB0byB1c2UgaXQgKi8KKworICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBiZWZvcmUgd2FpdDogbXlfYnVmZmVyX2luZGV4OiVkIHNoLT5idWZmZXJfaW5kZXg6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBteV9idWZmZXJfaW5kZXgsIHNoLT5idWZmZXJfaW5kZXgpICk7CisgICAgICAgIF9fa21wX3dhaXRfeWllbGQ8IGttcF91aW50MzIgPiggJiBzaC0+YnVmZmVyX2luZGV4LCBteV9idWZmZXJfaW5kZXgsIF9fa21wX2VxPCBrbXBfdWludDMyID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyggTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIC8vIE5vdGU6IEtNUF9XQUlUX1lJRUxEKCkgY2Fubm90IGJlIHVzZWQgdGhlcmU6IGJ1ZmZlciBpbmRleCBhbmQgbXlfYnVmZmVyX2luZGV4IGFyZQorICAgICAgICAgICAgLy8gKmFsd2F5cyogMzItYml0IGludGVnZXJzLgorICAgICAgICBLTVBfTUIoKTsgIC8qIGlzIHRoaXMgbmVjZXNzYXJ5PyAqLworICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBhZnRlciB3YWl0OiBteV9idWZmZXJfaW5kZXg6JWQgc2gtPmJ1ZmZlcl9pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIG15X2J1ZmZlcl9pbmRleCwgc2gtPmJ1ZmZlcl9pbmRleCkgKTsKKworICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ID0gKGRpc3BhdGNoX3ByaXZhdGVfaW5mb190KikgcHI7CisgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgPSAoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCopICBzaDsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9pdHRfb3JkZXJlZF9pbml0KCBndGlkICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIC8vIFJlcG9ydCBsb29wIG1ldGFkYXRhCisgICAgICAgIGlmICggaXR0X25lZWRfbWV0YWRhdGFfcmVwb3J0aW5nICkgeworICAgICAgICAgICAgLy8gT25seSByZXBvcnQgbWV0YWRhdGEgYnkgbWFzdGVyIG9mIGFjdGl2ZSB0ZWFtIGF0IGxldmVsIDEKKyAgICAgICAgICAgIGttcF91aW50NjQgc2NoZWR0eXBlID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAoIHNjaGVkdWxlICkgeworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDovLyBDaHVuayBpcyBjYWxjdWxhdGVkIGluIHRoZSBzd2l0Y2ggYWJvdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICAgICAgICAgICAgICAgIGN1cl9jaHVuayA9IHByLT51LnAucGFybTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICAgICAgICAgIHNjaGVkdHlwZSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgc2NoZWR0eXBlID0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisvLyAgICAgICAgICAgIFNob3VsZCB3ZSBwdXQgdGhpcyBjYXNlIHVuZGVyICJzdGF0aWMiPworLy8gICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAgICAgICAgIHNjaGVkdHlwZSA9IDM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9pdHRfbWV0YWRhdGFfbG9vcChsb2MsIHNjaGVkdHlwZSwgdGMsIGN1cl9jaHVuayk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfTsgLy8gaWYKKworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlJWQgcmV0dXJuaW5nOiBzY2hlZHVsZTolJWQgb3JkZXJlZDolJSVzIGxiOiUlJXMgdWI6JSUlcyIgXAorICAgICAgICAgICAgIiBzdDolJSVzIHRjOiUlJXMgY291bnQ6JSUlc1xuXHRvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzIiBcCisgICAgICAgICAgICAiIHBhcm0xOiUlJXMgcGFybTI6JSUlcyBwYXJtMzolJSVzIHBhcm00OiUlJXNcbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsCisgICAgICAgICAgICBndGlkLCBwci0+c2NoZWR1bGUsIHByLT5vcmRlcmVkLCBwci0+dS5wLmxiLCBwci0+dS5wLnViLAorICAgICAgICAgICAgcHItPnUucC5zdCwgcHItPnUucC50YywgcHItPnUucC5jb3VudCwKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyLCBwci0+dS5wLnBhcm0xLAorICAgICAgICAgICAgcHItPnUucC5wYXJtMiwgcHItPnUucC5wYXJtMywgcHItPnUucC5wYXJtNCApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAjaWYgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKQorICAgICAgLy8gSXQgY2Fubm90IGJlIGd1YXJhbnRlZWQgdGhhdCBhZnRlciBleGVjdXRpb24gb2YgYSBsb29wIHdpdGggc29tZSBvdGhlciBzY2hlZHVsZSBraW5kCisgICAgICAvLyBhbGwgdGhlIHBhcm0zIHZhcmlhYmxlcyB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUuCisgICAgICAvLyBFdmVuIGlmIGFsbCBwYXJtMyB3aWxsIGJlIHRoZSBzYW1lLCBpdCBzdGlsbCBleGlzdHMgYSBiYWQgY2FzZSBsaWtlIHVzaW5nIDAgYW5kIDEKKyAgICAgIC8vIHJhdGhlciB0aGFuIHByb2dyYW0gbGlmZS10aW1lIGluY3JlbWVudC4KKyAgICAgIC8vIFNvIHRoZSBkZWRpY2F0ZWQgdmFyaWFibGUgaXMgcmVxdWlyZWQuIFRoZSAnc3RhdGljX3N0ZWFsX2NvdW50ZXInIGlzIHVzZWQuCisgICAgICBpZiggc2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWNfc3RlYWwgKSB7CisgICAgICAgIC8vIE90aGVyIHRocmVhZHMgd2lsbCBpbnNwZWN0IHRoaXMgdmFyaWFibGUgd2hlbiBzZWFyY2hpbmcgZm9yIGEgdmljdGltLgorICAgICAgICAvLyBUaGlzIGlzIGEgZmxhZyBzaG93aW5nIHRoYXQgb3RoZXIgdGhyZWFkcyBtYXkgc3RlYWwgZnJvbSB0aGlzIHRocmVhZCBzaW5jZSB0aGVuLgorICAgICAgICB2b2xhdGlsZSBUICogcCA9ICZwci0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyOworICAgICAgICAqcCA9ICpwICsgMTsKKyAgICAgIH0KKyAgICAjZW5kaWYgLy8gKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSkgeworICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIEZvciBvcmRlcmVkIGxvb3BzLCBlaXRoZXIgX19rbXBfZGlzcGF0Y2hfZmluaXNoKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlcgorICogZXZlcnkgaXRlcmF0aW9uLCBvciBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bmsoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyCisgKiBldmVyeSBjaHVuayBvZiBpdGVyYXRpb25zLiAgSWYgdGhlIG9yZGVyZWQgc2VjdGlvbihzKSB3ZXJlIG5vdCBleGVjdXRlZAorICogZm9yIHRoaXMgaXRlcmF0aW9uIChvciBldmVyeSBpdGVyYXRpb24gaW4gdGhpcyBjaHVuayksIHdlIG5lZWQgdG8gc2V0IHRoZQorICogb3JkZXJlZCBpdGVyYXRpb24gY291bnRlcnMgc28gdGhhdCB0aGUgbmV4dCB0aHJlYWQgY2FuIHByb2NlZWQuCisgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZmluaXNoKCBpbnQgZ3RpZCwgaWRlbnRfdCAqbG9jICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCBTVDsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiAoICEgdGggLT4gdGgudGhfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwciA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+IHZvbGF0aWxlICogc2ggPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID52b2xhdGlsZSogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworICAgICAgICBpZiAoIHByLT5vcmRlcmVkX2J1bXBlZCApIHsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyVkIHJlc2V0dGluZyBvcmRlcmVkX2J1bXBlZCB0byB6ZXJvXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVUIGxvd2VyID0gcHItPnUucC5vcmRlcmVkX2xvd2VyOworCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJSVkIGJlZm9yZSB3YWl0OiBvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGxvd2VyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGQ8IFVUID4oJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCBfX2ttcF9nZTwgVVQgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlJWQgYWZ0ZXIgd2FpdDogb3JkZXJlZF9pdGVyYXRpb246JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICB0ZXN0X3RoZW5faW5jPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uICk7CisgICAgICAgIH0gLy8gaWYKKyAgICB9IC8vIGlmCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXR1cm5lZFxuIiwgZ3RpZCApICk7Cit9CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bmsoIGludCBndGlkLCBpZGVudF90ICpsb2MgKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFVUID46OnNpZ25lZF90IFNUOworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworLy8gICAgICAgIGludCBjaWQ7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiAqIHByID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gdm9sYXRpbGUgKiBzaCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPnZvbGF0aWxlKiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwciApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfZGlzcGF0Y2ggPT0KKyAgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisvLyAgICAgICAgZm9yIChjaWQgPSAwOyBjaWQgPCBLTVBfTUFYX09SREVSRUQ7ICsrY2lkKSB7CisgICAgICAgICAgICBVVCBsb3dlciA9IHByLT51LnAub3JkZXJlZF9sb3dlcjsKKyAgICAgICAgICAgIFVUIHVwcGVyID0gcHItPnUucC5vcmRlcmVkX3VwcGVyOworICAgICAgICAgICAgVVQgaW5jID0gdXBwZXIgLSBsb3dlciArIDE7CisKKyAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWRfYnVtcGVkID09IGluYyApIHsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXNldHRpbmcgb3JkZXJlZF9idW1wZWQgdG8gemVyb1xuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworICAgICAgICAgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluYyAtPSBwci0+b3JkZXJlZF9idW1wZWQ7CisKKyAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlJWQgYmVmb3JlIHdhaXQ6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgbG93ZXI6JSUlcyB1cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCB1cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIF9fa21wX3dhaXRfeWllbGQ8IFVUID4oJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyLCBfX2ttcF9nZTwgVVQgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIGlzIHRoaXMgbmVjZXNzYXJ5PyAqLworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyVkIHJlc2V0dGluZyBvcmRlcmVkX2J1bXBlZCB0byB6ZXJvXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKy8vISEhISEgVE9ETyBjaGVjayBpZiB0aGUgaW5jIHNob3VsZCBiZSB1bnNpZ25lZCwgb3Igc2lnbmVkPz8/CisgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJSVkIGFmdGVyIHdhaXQ6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgaW5jOiUlJXMgbG93ZXI6JSUlcyB1cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBpbmMsIGxvd2VyLCB1cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIHRlc3RfdGhlbl9hZGQ8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGluYyk7CisgICAgICAgICAgICB9CisvLyAgICAgICAgfQorICAgIH0KKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyVkIHJldHVybmVkXG4iLCBndGlkICkgKTsKK30KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvKiBEZWZpbmUgYSBtYWNybyBmb3IgZXhpdGluZyBfX2ttcF9kaXNwYXRjaF9uZXh0KCkuIElmIHN0YXR1cyBpcyAwCisgKiAobm8gbW9yZSB3b3JrKSwgdGhlbiB0ZWxsIE9NUFQgdGhlIGxvb3AgaXMgb3Zlci4gSW4gc29tZSBjYXNlcworICoga21wX2Rpc3BhdGNoX2ZpbmkoKSBpcyBub3QgY2FsbGVkLiAqLworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisjZGVmaW5lIE9NUFRfTE9PUF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzdGF0dXMgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCkpIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOyAgICAgICAgXAorICAgICAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCkoICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPTVBUX0xPT1BfRU5EIC8vIG5vLW9wCisjZW5kaWYKKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIGludAorX19rbXBfZGlzcGF0Y2hfbmV4dCgKKyAgICBpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwgVCAqcF9sYiwgVCAqcF91YiwgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgKnBfc3QKKykgeworCisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6ZmxvYXRpbmdfdCAgREJMOworI2lmICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICkKKyAgICBzdGF0aWMgY29uc3QgaW50IF9fX2ttcF9zaXplX3R5cGUgPSBzaXplb2YoIFVUICk7CisjZW5kaWYKKworICAgIC8vIFRoaXMgaXMgcG90ZW50aWFsbHkgc2xpZ2h0bHkgbWlzbGVhZGluZywgc2NoZWR1bGUocnVudGltZSkgd2lsbCBhcHBlYXIgaGVyZSBldmVuIGlmIHRoZSBhY3R1YWwgcnVudG1lIHNjaGVkdWxlCisgICAgLy8gaXMgc3RhdGljLiAoV2hpY2ggcG9pbnRzIG91dCBhIGRpc2FkYXZhbnRhZ2Ugb2Ygc2NoZWR1bGUocnVudGltZSk6IGV2ZW4gd2hlbiBzdGF0aWMgc2NoZWR1bGluZyBpcyB1c2VkIGl0IGNvc3RzCisgICAgLy8gbW9yZSB0aGFuIGEgY29tcGlsZSB0aW1lIGNob2ljZSB0byB1c2Ugc3RhdGljIHNjaGVkdWxpbmcgd291bGQuKQorICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKEZPUl9keW5hbWljX3NjaGVkdWxpbmcpOworCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gKiBwcjsKKyAgICBrbXBfaW5mb190ICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0ZWFtID0gdGggLT4gdGgudGhfdGVhbTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHBfbGIgJiYgcF91YiAmJiBwX3N0ICk7IC8vIEFDOiB0aGVzZSBjYW5ub3QgYmUgTlVMTAorICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgY2FsbGVkIHBfbGI6JSUlcyBwX3ViOiUlJXMgcF9zdDolJSVzIHBfbGFzdDogJSVwXG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCAqcF9sYiwgKnBfdWIsIHBfc3QgPyAqcF9zdCA6IDAsIHBfbGFzdCApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIGlmICggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgLyogTk9URTogc2VyaWFsaXplIHRoaXMgZGlzcGF0Y2ggYmVjYXNlIHdlIGFyZSBub3QgYXQgdGhlIGFjdGl2ZSBsZXZlbCAqLworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+KiA+CisgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BfYnVmZmVyICk7IC8qIHRvcCBvZiB0aGUgc3RhY2sgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcHIgKTsKKworICAgICAgICBpZiAoIChzdGF0dXMgPSAocHItPnUucC50YyAhPSAwKSkgPT0gMCApIHsKKyAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICpwX3ViID0gMDsKKy8vICAgICAgICAgICAgaWYgKCBwX2xhc3QgIT0gTlVMTCApCisvLyAgICAgICAgICAgICAgICAqcF9sYXN0ID0gMDsKKyAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAqcF9zdCA9IDA7CisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHByLT5wdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IF9fa21wX3BvcF93b3Jrc2hhcmUoIGd0aWQsIHByLT5wdXNoZWRfd3MsIGxvYyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICggcHItPm5vbWVyZ2UgKSB7CisgICAgICAgICAgICBrbXBfaW50MzIgbGFzdDsKKyAgICAgICAgICAgIFQgICAgICAgICBzdGFydDsKKyAgICAgICAgICAgIFVUICAgICAgICBsaW1pdCwgdHJpcCwgaW5pdDsKKyAgICAgICAgICAgIFNUICAgICAgICBpbmNyOworICAgICAgICAgICAgVCAgICAgICAgIGNodW5rID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9keW5hbWljX2NodW5rZWQgY2FzZVxuIiwgZ3RpZCApICk7CisKKyAgICAgICAgICAgIGluaXQgPSBjaHVuayAqIHByLT51LnAuY291bnQrKzsKKyAgICAgICAgICAgIHRyaXAgPSBwci0+dS5wLnRjIC0gMTsKKworICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKGluaXQgPD0gdHJpcCkpID09IDAgKSB7CisgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICpwX3ViID0gMDsKKy8vICAgICAgICAgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgKQorLy8gICAgICAgICAgICAgICAgICAgICpwX2xhc3QgPSAwOworICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSAwOworICAgICAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5wdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBwci0+cHVzaGVkX3dzLCBsb2MgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgIGxpbWl0ID0gY2h1bmsgKyBpbml0IC0gMTsKKyAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmxhc3RfdXBwZXIgPSBwci0+dS5wLnViOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBwX2xhc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpwX2xhc3QgPSBsYXN0OworICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworICAgICAgICAgICAgICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByLT51LnAudGMgPSAwOworICAgICAgICAgICAgKnBfbGIgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgKnBfdWIgPSBwci0+dS5wLnViOworICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBwci0+dS5wLmxhc3RfdXBwZXIgPSAqcF91YjsKKyAgICAgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgICAgICAgICAgaWYgKCBwX2xhc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBfbGFzdCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBfc3QgPSBwci0+dS5wLnN0OworICAgICAgICB9IC8vIGlmCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBzZXJpYWxpemVkIGNhc2U6IHBfbGI6JSUlcyAiIFwKKyAgICAgICAgICAgICAgICAicF91YjolJSVzIHBfc3Q6JSUlcyBwX2xhc3Q6JSVwICUlZCAgcmV0dXJuaW5nOiUlZFxuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAsICggYnVmZiwgZ3RpZCwgKnBfbGIsICpwX3ViLCAqcF9zdCwgcF9sYXN0LCAqcF9sYXN0LCBzdGF0dXMpICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyNpZiBJTkNMVURFX1NTQ19NQVJLUworICAgICAgICBTU0NfTUFSS19ESVNQQVRDSF9ORVhUKCk7CisjZW5kaWYKKyAgICAgICAgT01QVF9MT09QX0VORDsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgeworICAgICAgICBrbXBfaW50MzIgbGFzdCA9IDA7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+ICpzaDsKKyAgICAgICAgVCAgICAgICAgIHN0YXJ0OworICAgICAgICBTVCAgICAgICAgaW5jcjsKKyAgICAgICAgVVQgICAgICAgIGxpbWl0LCB0cmlwLCBpbml0OworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9kaXNwYXRjaCA9PQorICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0gKTsKKworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+KiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwciApOworICAgICAgICBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaCApOworCisgICAgICAgIGlmICggcHItPnUucC50YyA9PSAwICkgeworICAgICAgICAgICAgLy8gemVybyB0cmlwIGNvdW50CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChwci0+c2NoZWR1bGUpIHsKKyAgICAgICAgICAgICNpZiAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCApCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCBjaHVuayA9IHByLT51LnAucGFybTE7CisgICAgICAgICAgICAgICAgICAgIGludCBucHJvYyA9IHRoLT50aC50aF90ZWFtX25wcm9jOworCisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfc3RhdGljX3N0ZWFsIGNhc2VcbiIsIGd0aWQpICk7CisKKyAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICggX19fa21wX3NpemVfdHlwZSA+IDQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgbG9jayBmb3IgOC1ieXRlIGFuZCBDQVMgZm9yIDQtYnl0ZSBpbmR1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhYmxlLiBUT0RPIChvcHRpb25hbCk6IGNoZWNrIGFuZCB1c2UgMTYtYnl0ZSBDQVMKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9sb2NrX3QgKiBsY2sgPSB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwci0+dS5wLmNvdW50IDwgKFVUKXByLT51LnAudWIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKGxjaywgZ3RpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGdldCBvd24gY2h1bmsgb2YgaXRlcmF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgICA9ICggcHItPnUucC5jb3VudCApKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gKCBpbml0IDwgKFVUKXByLT51LnAudWIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2sobGNrLCBndGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsgLy8gbm8gb3duIGNodW5rcworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFzdGF0dXMgKSB7IC8vIHRyeSB0byBzdGVhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgICAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgd2hpbGVfbGltaXQgPSBucHJvYzsgLy8gbnByb2MgYXR0ZW1wdHMgdG8gZmluZCBhIHZpY3RpbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3aGlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWxnb3JpdGhtIG9mIHNlYXJjaGluZyBmb3IgYSB2aWN0aW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgY2xlYW5lZCB1cCBhbmQgbWVhc3VyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoICggIXN0YXR1cyApICYmICggd2hpbGVfbGltaXQgIT0gKyt3aGlsZV9pbmRleCApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIHJlbWFpbmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB2aWN0aW1JZHggICAgPSBwci0+dS5wLnBhcm00OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIG9sZFZpY3RpbUlkeCA9IHZpY3RpbUlkeCA/IHZpY3RpbUlkeCAtIDEgOiBucHJvYyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+ICogdmljdGltID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+KiA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3RoZXJfdGhyZWFkc1t2aWN0aW1JZHhdLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoIHZpY3RpbSA9PSBOVUxMIHx8IHZpY3RpbSA9PSBwciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAqKHZvbGF0aWxlIFQqKSZ2aWN0aW0tPnUucC5zdGF0aWNfc3RlYWxfY291bnRlciAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih2b2xhdGlsZSBUKikmcHItPnUucC5zdGF0aWNfc3RlYWxfY291bnRlciApICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFZpY3RpbUlkeCAhPSB2aWN0aW1JZHggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1JZHggPSAodmljdGltSWR4ICsgMSkgJSBucHJvYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+KiA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyX3RocmVhZHNbdmljdGltSWR4XS0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXZpY3RpbSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAqKHZvbGF0aWxlIFQgKikmdmljdGltLT51LnAuc3RhdGljX3N0ZWFsX2NvdW50ZXIgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodm9sYXRpbGUgVCAqKSZwci0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gdHJ5IG9uY2UgbW9yZSAobnByb2MgYXR0ZW1wdHMgaW4gdG90YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyB2aWN0aW0gaXMgcmVhZHkgeWV0IHRvIHBhcnRpY2lwYXRlIGluIHN0ZWFsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGFsbCB2aWN0aW1zIGFyZSBzdGlsbCBpbiBrbXBfaW5pdF9kaXNwYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2aWN0aW0tPnUucC5jb3VudCArIDIgPiAoVVQpdmljdGltLT51LnAudWIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gKHZpY3RpbUlkeCArIDEpICUgbnByb2M7IC8vIHNoaWZ0IHN0YXJ0IHRpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5vdCBlbm91Z2ggY2h1bmtzIHRvIHN0ZWFsLCBnb3RvIG5leHQgdmljdGltCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2sgPSBvdGhlcl90aHJlYWRzW3ZpY3RpbUlkeF0tPnRoLnRoX2Rpc3BhdGNoLT50aF9zdGVhbF9sb2NrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKGxjaywgZ3RpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdmljdGltLT51LnAudWI7IC8vIGtlZXAgaW5pdGlhbCB1YgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdmljdGltLT51LnAuY291bnQgPj0gbGltaXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1haW5pbmcgPSBsaW1pdCAtIHZpY3RpbS0+dS5wLmNvdW50KSA8IDIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2sobGNrLCBndGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTQgPSAodmljdGltSWR4ICsgMSkgJSBucHJvYzsgLy8gbmV4dCB2aWN0aW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QgZW5vdWdoIGNodW5rcyB0byBzdGVhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZWFsaW5nIHN1Y2NlZGVkLCByZWR1Y2UgdmljdGltJ3MgdWIgYnkgMS80IG9mIHVuZG9uZSBjaHVua3Mgb3IgYnkgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVtYWluaW5nID4gMyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSAoIHZpY3RpbS0+dS5wLnViIC09IChyZW1haW5pbmc+PjIpICk7IC8vIHN0ZWFsIDEvNCBvZiByZW1haW5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSAoIHZpY3RpbS0+dS5wLnViIC09IDEgKTsgLy8gc3RlYWwgMSBjaHVuayBvZiAyIG9yIDMgcmVtYWluaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKGxjaywgZ3RpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChpbml0ICsgMSA8PSBsaW1pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTQgPSB2aWN0aW1JZHg7IC8vIHJlbWVtYmVyIHZpY3RpbSB0byBzdGVhbCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IHVwZGF0ZSBvd24gY291bnQgYW5kIHViIHdpdGggc3RvbGVuIHJhbmdlIGJ1dCBpbml0IGNodW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jayh0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2ssIGd0aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ID0gaW5pdCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKHRoLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jaywgZ3RpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZSAoc2VhcmNoIGZvciB2aWN0aW0pCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmICh0cnkgdG8gZmluZCB2aWN0aW0gYW5kIHN0ZWFsKQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gNC1ieXRlIGluZHVjdGlvbiB2YXJpYWJsZSwgdXNlIDgtYnl0ZSBDQVMgZm9yIHBhaXIgKGNvdW50LCB1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgdW5pb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVUIGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICB1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHVuaW9uX2k0OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIG9wZXJhdGlvbnMgb24gJ2NvdW50JyBvciAndWInIG11c3QgYmUgY29tYmluZWQgYXRvbWljYWxseSB0b2dldGhlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbl9pNCB2b2xkLCB2bmV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGQuYiA9ICooIHZvbGF0aWxlIGttcF9pbnQ2NCAqICkoJnByLT51LnAuY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcgPSB2b2xkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcucC5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHZvbGF0aWxlIGttcF9pbnQ2NCogKSZwci0+dS5wLmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQ2NCAqKSZ2b2xkLmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludDY0ICopJnZuZXcuYiApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGQuYiA9ICooIHZvbGF0aWxlIGttcF9pbnQ2NCAqICkoJnByLT51LnAuY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldy5wLmNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcgPSB2b2xkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgICA9IHZuZXcucC5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAoIGluaXQgPCAoVVQpdm5ldy5wLnViICkgOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICAgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHdoaWxlX2xpbWl0ID0gbnByb2M7IC8vIG5wcm9jIGF0dGVtcHRzIHRvIGZpbmQgYSB2aWN0aW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgd2hpbGVfaW5kZXggPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWxnb3JpdGhtIG9mIHNlYXJjaGluZyBmb3IgYSB2aWN0aW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgY2xlYW5lZCB1cCBhbmQgbWVhc3VyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoICggIXN0YXR1cyApICYmICggd2hpbGVfbGltaXQgIT0gKyt3aGlsZV9pbmRleCApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbl9pNCAgdm9sZCwgdm5ldzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHJlbWFpbmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgIHZpY3RpbUlkeCAgICA9IHByLT51LnAucGFybTQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgb2xkVmljdGltSWR4ID0gdmljdGltSWR4ID8gdmljdGltSWR4IC0gMSA6IG5wcm9jIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gKiB2aWN0aW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4qID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcl90aHJlYWRzW3ZpY3RpbUlkeF0tPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICh2aWN0aW0gPT0gTlVMTCB8fCB2aWN0aW0gPT0gcHIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKHZvbGF0aWxlIFQqKSZ2aWN0aW0tPnUucC5zdGF0aWNfc3RlYWxfY291bnRlciAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih2b2xhdGlsZSBUKikmcHItPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcikpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRWaWN0aW1JZHggIT0gdmljdGltSWR4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmljdGltSWR4ID0gKHZpY3RpbUlkeCArIDEpICUgbnByb2M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW0gPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggb3RoZXJfdGhyZWFkc1t2aWN0aW1JZHhdLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXZpY3RpbSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAqKHZvbGF0aWxlIFQgKikmdmljdGltLT51LnAuc3RhdGljX3N0ZWFsX2NvdW50ZXIgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodm9sYXRpbGUgVCAqKSZwci0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gdHJ5IG9uY2UgbW9yZSAobnByb2MgYXR0ZW1wdHMgaW4gdG90YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyB2aWN0aW0gaXMgcmVhZHkgeWV0IHRvIHBhcnRpY2lwYXRlIGluIHN0ZWFsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGFsbCB2aWN0aW1zIGFyZSBzdGlsbCBpbiBrbXBfaW5pdF9kaXNwYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTQgPSB2aWN0aW1JZHg7IC8vIG5ldyB2aWN0aW0gZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIDEgKSB7IC8vIENBUyBsb29wIGlmIHZpY3RpbSBoYXMgZW5vdWdoIGNodW5rcyB0byBzdGVhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5iID0gKiggdm9sYXRpbGUga21wX2ludDY0ICogKSggJnZpY3RpbS0+dS5wLmNvdW50ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3ID0gdm9sZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHZuZXcucC51YiAtIDEpICogKFVUKWNodW5rIDw9IHRyaXAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdm5ldy5wLmNvdW50ID49IChVVCl2bmV3LnAudWIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtYWluaW5nID0gdm5ldy5wLnViIC0gdm5ldy5wLmNvdW50KSA8IDIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTQgPSAodmljdGltSWR4ICsgMSkgJSBucHJvYzsgLy8gc2hpZnQgc3RhcnQgdmljdGltIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIG5vdCBlbm91Z2ggY2h1bmtzIHRvIHN0ZWFsLCBnb3RvIG5leHQgdmljdGltCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVtYWluaW5nID4gMyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3LnAudWIgLT0gKHJlbWFpbmluZz4+Mik7IC8vIHRyeSB0byBzdGVhbCAxLzQgb2YgcmVtYWluaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcucC51YiAtPSAxOyAvLyBzdGVhbCAxIGNodW5rIG9mIDIgb3IgMyByZW1haW5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKHZuZXcucC51YiAtIDEpICogKFVUKWNodW5rIDw9IHRyaXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdm9sYXRpbGUga21wX2ludDY0ICogKSZ2aWN0aW0tPnUucC5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludDY0ICopJnZvbGQuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludDY0ICopJnZuZXcuYiApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZWFsaW5nIHN1Y2NlZGRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGVfaW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyB1cGRhdGUgb3duIGNvdW50IGFuZCB1YgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB2bmV3LnAudWI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5wLmNvdW50ID0gaW5pdCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9YQ0hHX0ZJWEVENjQoKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCZwci0+dS5wLmNvdW50KSwgdm9sZC5iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooIHZvbGF0aWxlIGttcF9pbnQ2NCAqICkoJnByLT51LnAuY291bnQpID0gdm9sZC5iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZiAoY2hlY2sgQ0FTIHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgLy8gQ0FTIGZhaWxlZCwgcmVwZWF0ZSBhdHRlbXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gd2hpbGUgKHRyeSB0byBzdGVhbCBmcm9tIHBhcnRpY3VsYXIgdmljdGltKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gd2hpbGUgKHNlYXJjaCBmb3IgdmljdGltKQorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZiAodHJ5IHRvIGZpbmQgdmljdGltIGFuZCBzdGVhbCkKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZiAoNC1ieXRlIGluZHVjdGlvbiB2YXJpYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RhdHVzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAucGFybTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ICo9IGNodW5rOworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBjaHVuayArIGluaXQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGluaXQgPD0gdHJpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgI2VuZGlmIC8vICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICkKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCBjYXNlXG4iLCBndGlkKSApOworICAgICAgICAgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAhcHItPnUucC5jb3VudCkgIT0gMCApIHsgIC8qIGNoZWNrIGlmIHRocmVhZCBoYXMgYW55IGl0ZXJhdGlvbiB0byBkbyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHByLT51LnAudWI7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvKiBubyBpdGVyYXRpb25zIHRvIGRvICovCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmxiID0gcHItPnUucC51YiArIHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OiAgLyogb3JpZ2luYWwgY29kZSBmb3Iga21wX3NjaF9zdGF0aWNfZ3JlZWR5IHdhcyBtZXJnZWQgaGVyZSAqLworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCBwYXJtMTsKKworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3N0YXRpY19bYWZmaW5pdHl8Y2h1bmtlZF0gY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgICAgIHBhcm0xID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgICAgICAgICB0cmlwICA9IHByLT51LnAudGMgLSAxOworICAgICAgICAgICAgICAgICAgICBpbml0ICA9IHBhcm0xICogKHByLT51LnAuY291bnQgKyBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoaW5pdCA8PSB0cmlwKSkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gcGFybTEgKyBpbml0IC0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCArPSB0aC0+dGgudGhfdGVhbV9ucHJvYzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCBjaHVuayA9IHByLT51LnAucGFybTE7CisKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9keW5hbWljX2NodW5rZWQgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGNodW5rICogdGVzdF90aGVuX2luY19hY3E8IFNUID4oKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5pdGVyYXRpb24gKTsKKyAgICAgICAgICAgICAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9IChpbml0IDw9IHRyaXApKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGNodW5rICsgaW5pdCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IGluY3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCAgY2h1bmtzcGVjID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgaXRlcmF0aXZlIGNhc2VcbiIsZ3RpZCkpOworICAgICAgICAgICAgICAgICAgICB0cmlwICA9IHByLT51LnAudGM7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGF0b21pYyBwYXJ0IG9mIGNhbGN1bGF0aW9ucworICAgICAgICAgICAgICAgICAgICB3aGlsZSgxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTVCAgcmVtYWluaW5nOyAgICAgICAgICAgICAvLyBzaWduZWQsIGJlY2F1c2UgY2FuIGJlIDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHNoLT51LnMuaXRlcmF0aW9uOyAgLy8gc2hhcmVkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVtYWluaW5nIDw9IDAgKSB7ICAgIC8vIEFDOiBuZWVkIHRvIGNvbXBhcmUgd2l0aCAwIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbywgZG9uJ3QgdHJ5IGF0b21pYyBvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChUKXJlbWFpbmluZyA8IHByLT51LnAucGFybTIgKSB7IC8vIGNvbXBhcmUgd2l0aCBLKm5wcm9jKihjaHVuaysxKSwgSz0yIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZHluYW1pYy1zdHlsZSBzaGNlZHVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0b21pY2FsbHkgaW5yZW1lbnQgaXRlcmF0aW9ucywgZ2V0IG9sZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0ZXN0X3RoZW5fYWRkPFNUPiggKFNUKikmc2gtPnUucy5pdGVyYXRpb24sIChTVCljaHVua3NwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgLy8gYWxsIGl0ZXJhdGlvbnMgZ290IGJ5IG90aGVyIHRocmVhZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnb3Qgc29tZSBpdGVyYXRpb25zIHRvIHdvcmsgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoVClyZW1haW5pbmcgPiBjaHVua3NwZWMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyBjaHVua3NwZWMgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IDE7ICAgLy8gdGhlIGxhc3QgY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIHJlbWFpbmluZyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyAoVVQpKCByZW1haW5pbmcgKiAqKGRvdWJsZSopJnByLT51LnAucGFybTMgKTsgLy8gZGl2aWRlIGJ5IEsqbnByb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY29tcGFyZV9hbmRfc3dhcDxTVD4oIChTVCopJnNoLT51LnMuaXRlcmF0aW9uLCAoU1QpaW5pdCwgKFNUKWxpbWl0ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0FTIHdhcyBzdWNjZXNzZnVsLCBjaHVuayBvYnRhaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1saW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUICAgY2h1bmtzcGVjID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICAgICAgVVQgY2h1bmtJZHg7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAvKiBmb3Igc3RvcmluZyBvcmlnaW5hbCBGUENXIHZhbHVlIGZvciBXaW5kb3dzKiBPUyBvbgorCQkgICAgICAgSUEtMzIgYXJjaGl0ZWN0dXJlIDgtYnl0ZSB2ZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbGRGcGN3OworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZnBjd1NldCA9IDA7CisgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgYW5hbHl0aWNhbCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgICAgICAgICB0cmlwICA9IHByLT51LnAudGM7CisKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfdGVhbV9ucHJvYyA+IDEpOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCgyVUwgKiBjaHVua3NwZWMgKyAxKSAqIChVVCl0aC0+dGgudGhfdGVhbV9ucHJvYyA8IHRyaXApOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKDEpIHsgLyogdGhpcyB3aGlsZSBsb29wIGlzIGEgc2FmZWd1YXJkIGFnYWluc3QgdW5leHBlY3RlZCB6ZXJvIGNodW5rIHNpemVzICovCisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua0lkeCA9IHRlc3RfdGhlbl9pbmNfYWNxPCBTVCA+KCh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMuaXRlcmF0aW9uICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNodW5rSWR4ID49IChVVClwci0+dS5wLnBhcm0yICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgZHluYW1pYy1zdHlsZSBzY2hlZHVsaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGNodW5rSWR4ICogY2h1bmtzcGVjICsgcHItPnUucC5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIHZlcmlmeSBpbml0ID4gMCBpbiBjYXNlIG9mIG92ZXJmbG93IGluIHRoZSBhYm92ZSBjYWxjdWxhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9IChpbml0ID4gMCAmJiBpbml0IDw9IHRyaXApKSAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyBjaHVua3NwZWMgLTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgZXhwb25lbnRpYWwtc3R5bGUgc2NoZWR1bGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY2hlY2sgaXMgdG8gd29ya2Fyb3VuZCB0aGUgbGFjayBvZiBsb25nIGRvdWJsZSBwcmVjaXNpb24gb24gV2luZG93cyogT1MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjaGVjayB3b3JrcyBhcm91bmQgdGhlIHBvc3NpYmxlIGVmZmVjdCB0aGF0IGluaXQgIT0gMCBmb3IgY2h1bmtJZHggPT0gMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28sIHNhdmUgb3JpZ2luYWwKKwkJCSAgICAgICBGUENXIGFuZCBzZXQgcHJlY2lzaW9uIHRvIDY0LWJpdCwgYXMgV2luZG93cyogT1MKKwkJCSAgICAgICBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgZGVmYXVsdHMgdG8gNTMtYml0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhZnBjd1NldCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRnBjdyA9IF9jb250cm9sODcoMCwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2w4NyhfUENfNjQsX01DV19QQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwY3dTZXQgPSAweDMwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNodW5rSWR4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gX19rbXBfZGlzcGF0Y2hfZ3VpZGVkX3JlbWFpbmluZzwgVCA+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXAsICooIERCTCAqICkmcHItPnUucC5wYXJtMywgY2h1bmtJZHggKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChpbml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXAgLSBfX2ttcF9kaXNwYXRjaF9ndWlkZWRfcmVtYWluaW5nPCBUID4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXAsICooIERCTCAqICkmcHItPnUucC5wYXJtMywgY2h1bmtJZHggKyAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVChpbml0IDw9IGxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluaXQgPCBsaW1pdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChsaW1pdCA8PSB0cmlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1saW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlICgxKQorICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBGUENXIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICAgICBBQzogY2hlY2sgZnBjd1NldCBmbGFnIGZpcnN0IGJlY2F1c2Ugb2xkRnBjdyBjYW4gYmUgdW5pbml0aWFsaXplZCBoZXJlCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICggZnBjd1NldCAmJiAoIG9sZEZwY3cgJiBmcGN3U2V0ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2w4NyhvbGRGcGN3LF9NQ1dfUEMpOworICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IHByLT51LnAuc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVVQgICBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgVCAgICBwYXJtMiA9IHByLT51LnAucGFybTI7CisgICAgICAgICAgICAgICAgICAgIFQgICAgcGFybTMgPSBwci0+dS5wLnBhcm0zOworICAgICAgICAgICAgICAgICAgICBUICAgIHBhcm00ID0gcHItPnUucC5wYXJtNDsKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF90cmFwZXpvaWRhbCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHRlc3RfdGhlbl9pbmM8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMuaXRlcmF0aW9uICk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9ICggaW5kZXggKiAoICgyKnBhcm0yKSAtIChpbmRleC0xKSpwYXJtNCApICkgLyAyOworICAgICAgICAgICAgICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKChUKWluZGV4IDwgcGFybTMgJiYgaW5pdCA8PSB0cmlwKSkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkgKnBfc3QgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSAoIChpbmRleCsxKSAqICggMipwYXJtMiAtIGluZGV4KnBhcm00ICkgKSAvIDIgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkgKnBfc3QgPSBpbmNyOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOyAvLyB0byBhdm9pZCBjb21wbGFpbnRzIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgdXNlCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXZlcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggVW5rbm93blNjaGVkVHlwZURldGVjdGVkICksIC8vIFByaW1hcnkgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggR2V0TmV3ZXJMaWJyYXJ5ICksICAgICAgICAgIC8vIEhpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsICAgICAgICAgICAgICAgICAgICAgICAvLyBWYXJpYWRpYyBhcmd1bWVudCBsaXN0IHRlcm1pbmF0b3IKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IC8vIHN3aXRjaAorICAgICAgICB9IC8vIGlmIHRjID09IDA7CisKKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gMCApIHsKKyAgICAgICAgICAgIFVUICAgbnVtX2RvbmU7CisKKyAgICAgICAgICAgIG51bV9kb25lID0gdGVzdF90aGVuX2luYzwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5udW1fZG9uZSApOworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgaW5jcmVtZW50IG51bV9kb25lOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMubnVtX2RvbmUgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIGlmICggKFNUKW51bV9kb25lID09IHRoLT50aC50aF90ZWFtX25wcm9jIC0gMSApIHsKKyAgICAgICAgICAgICAgICAjaWYgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKQorICAgICAgICAgICAgICAgIGlmKCBwci0+c2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWNfc3RlYWwgJiYgX19fa21wX3NpemVfdHlwZSA+IDQgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgICAgICAgICAvLyBsb29wIGNvbXBsZXRlLCBzYWZlIHRvIGRlc3Ryb3kgbG9ja3MgdXNlZCBmb3Igc3RlYWxpbmcKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRoLT50aC50aF90ZWFtX25wcm9jOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbG9ja190ICogbGNrID0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfbG9jayggbGNrICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKCBsY2sgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Rpc3BhdGNoLT50aF9zdGVhbF9sb2NrID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiBOT1RFOiByZWxlYXNlIHRoaXMgYnVmZmVyIHRvIGJlIHJldXNlZCAqLworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgICAgICAgICBzaC0+dS5zLm51bV9kb25lID0gMDsKKyAgICAgICAgICAgICAgICBzaC0+dS5zLml0ZXJhdGlvbiA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBUT0RPIHJlcGxhY2Ugd2l0aCBnZW5lcmFsIHJlbGVhc2UgcHJvY2VkdXJlPyAqLworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgICAgICAgICAgc2ggLT4gYnVmZmVyX2luZGV4ICs9IF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGNoYW5nZSBidWZmZXJfaW5kZXg6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHNoLT5idWZmZXJfaW5kZXgpICk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBwci0+cHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT5wdXNoZWRfd3MgPSBfX2ttcF9wb3Bfd29ya3NoYXJlKCBndGlkLCBwci0+cHVzaGVkX3dzLCBsb2MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rlb19mY24gPSBOVUxMOworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZHhvX2ZjbiA9IE5VTEw7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9zaF9jdXJyZW50ID0gTlVMTDsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSBOVUxMOworICAgICAgICB9IC8vIGlmIChzdGF0dXMgPT0gMCkKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBlbHNlIGlmICggbGFzdCApIHsKKyAgICAgICAgICAgIHByLT51LnAubGFzdF91cHBlciA9IHByLT51LnAudWI7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICYmIHN0YXR1cyAhPSAwICkKKyAgICAgICAgICAgICpwX2xhc3QgPSBsYXN0OworICAgIH0gLy8gaWYKKworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgbm9ybWFsIGNhc2U6ICIgXAorICAgICAgICAgICAgInBfbGI6JSUlcyBwX3ViOiUlJXMgcF9zdDolJSVzIHBfbGFzdDolJXAgIHJldHVybmluZzolJWRcbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCAqcF9sYiwgKnBfdWIsIHBfc3QgPyAqcF9zdCA6IDAsIHBfbGFzdCwgc3RhdHVzICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfRElTUEFUQ0hfTkVYVCgpOworI2VuZGlmCisgICAgT01QVF9MT09QX0VORDsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzdF9nZXRfYm91bmRzKAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2MsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxvd2VyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgIGluY3IKKykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICB0ZWFtX2lkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIG50ZWFtczsKKyAgICByZWdpc3RlciBVVCAgICAgICAgICB0cmlwX2NvdW50OworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqIHRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggcGxhc3RpdGVyICYmIHBsb3dlciAmJiBwdXBwZXIgKTsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Rpc3RfZ2V0X2JvdW5kcyBjYWxsZWQgKCVkKVxuIiwgZ3RpZCkpOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoICJfX2ttcGNfZGlzdF9nZXRfYm91bmRzOiBUIyUlZCBsaXRlcj0lJWQgIlwKKyAgICAgICAgICAgICJpdGVyPSglJSVzLCAlJSVzLCAlJSVzKSBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgZ3RpZCwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgaW5jciApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmKCBpbmNyID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgICAgIGlmKCBpbmNyID4gMCA/ICgqcHVwcGVyIDwgKnBsb3dlcikgOiAoKnBsb3dlciA8ICpwdXBwZXIpICkgeworICAgICAgICAgICAgLy8gVGhlIGxvb3AgaXMgaWxsZWdhbC4KKyAgICAgICAgICAgIC8vIFNvbWUgemVyby10cmlwIGxvb3BzIG1haW50YWluZWQgYnkgY29tcGlsZXIsIGUuZy46CisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDsrK2kpIC8vIGxvd2VyID49IHVwcGVyIC0gcnVuLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPjEwOy0taSkgLy8gbG93ZXIgPD0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7KytpKSAvLyBpbmNyID4gMCAgICAgICAtIGNvbXBpbGUtdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPDA7LS1pKSAvLyBpbmNyIDwgMCAgICAgICAtIGNvbXBpbGUtdGltZSBjaGVjaworICAgICAgICAgICAgLy8gQ29tcGlsZXIgZG9lcyBub3QgY2hlY2sgdGhlIGZvbGxvd2luZyBpbGxlZ2FsIGxvb3BzOgorICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k8MTA7aSs9aW5jcikgLy8gd2hlcmUgaW5jcjwwCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k+MDtpLT1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNySWxsZWdhbCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgICNpZiBPTVBfNDBfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayk7ICAgLy8gd2UgYXJlIGluIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICBudGVhbXMgPSB0aC0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXM7CisgICAgI2VuZGlmCisgICAgdGVhbV9pZCA9IHRlYW0tPnQudF9tYXN0ZXJfdGlkOworICAgIEtNUF9ERUJVR19BU1NFUlQobnRlYW1zID09IHRlYW0tPnQudF9wYXJlbnQtPnQudF9ucHJvYyk7CisKKyAgICAvLyBjb21wdXRlIGdsb2JhbCB0cmlwIGNvdW50CisgICAgaWYoIGluY3IgPT0gMSApIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwdXBwZXIgLSAqcGxvd2VyICsgMTsKKyAgICB9IGVsc2UgaWYoaW5jciA9PSAtMSkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnBsb3dlciAtICpwdXBwZXIgKyAxOworICAgIH0gZWxzZSBpZiAoIGluY3IgPiAwICkgeworICAgICAgICAvLyB1cHBlci1sb3dlciBjYW4gZXhjZWVkIHRoZSBsaW1pdCBvZiBzaWduZWQgdHlwZQorICAgICAgICB0cmlwX2NvdW50ID0gKFVUKSgqcHVwcGVyIC0gKnBsb3dlcikgLyBpbmNyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmlwX2NvdW50ID0gKFVUKSgqcGxvd2VyIC0gKnB1cHBlcikgLyAoIC1pbmNyICkgKyAxOworICAgIH0KKworICAgIGlmKCB0cmlwX2NvdW50IDw9IG50ZWFtcyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgfHwgXAorICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkCisgICAgICAgICk7IC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgLy8gb25seSBzb21lIHRlYW1zIGdldCBzaW5nbGUgaXRlcmF0aW9uLCBvdGhlcnMgZ2V0IG5vdGhpbmcKKyAgICAgICAgaWYoIHRlYW1faWQgPCB0cmlwX2NvdW50ICkgeworICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgPSAqcGxvd2VyICsgdGVhbV9pZCAqIGluY3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcGxvd2VyID0gKnB1cHBlciArIGluY3I7IC8vIHplcm8tdHJpcCBsb29wCisgICAgICAgIH0KKyAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRlYW1faWQgPT0gdHJpcF9jb3VudCAtIDEgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICkgeworICAgICAgICAgICAgcmVnaXN0ZXIgVVQgY2h1bmsgPSB0cmlwX2NvdW50IC8gbnRlYW1zOworICAgICAgICAgICAgcmVnaXN0ZXIgVVQgZXh0cmFzID0gdHJpcF9jb3VudCAlIG50ZWFtczsKKyAgICAgICAgICAgICpwbG93ZXIgKz0gaW5jciAqICggdGVhbV9pZCAqIGNodW5rICsgKCB0ZWFtX2lkIDwgZXh0cmFzID8gdGVhbV9pZCA6IGV4dHJhcyApICk7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGNodW5rICogaW5jciAtICggdGVhbV9pZCA8IGV4dHJhcyA/IDAgOiBpbmNyICk7CisgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRlYW1faWQgPT0gbnRlYW1zIC0gMSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVnaXN0ZXIgVCBjaHVua19pbmNfY291bnQgPQorICAgICAgICAgICAgICAgICggdHJpcF9jb3VudCAvIG50ZWFtcyArICggKCB0cmlwX2NvdW50ICUgbnRlYW1zICkgPyAxIDogMCkgKSAqIGluY3I7CisgICAgICAgICAgICByZWdpc3RlciBUIHVwcGVyID0gKnB1cHBlcjsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKTsKKyAgICAgICAgICAgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAqcGxvd2VyICs9IHRlYW1faWQgKiBjaHVua19pbmNfY291bnQ7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGNodW5rX2luY19jb3VudCAtIGluY3I7CisgICAgICAgICAgICAvLyBDaGVjay9jb3JyZWN0IGJvdW5kcyBpZiBuZWVkZWQKKyAgICAgICAgICAgIGlmKCBpbmNyID4gMCApIHsKKyAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA8ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gaV9tYXhtaW48IFQgPjo6bXg7CisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPD0gdXBwZXIgJiYgKnB1cHBlciA+IHVwcGVyIC0gaW5jcjsKKyAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA+IHVwcGVyICkKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA+ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gaV9tYXhtaW48IFQgPjo6bW47CisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPj0gdXBwZXIgJiYgKnB1cHBlciA8IHVwcGVyIC0gaW5jcjsKKyAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA8IHVwcGVyICkKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEaXNwYXRjaCByb3V0aW5lcworLy8gICAgVHJhbnNmZXIgY2FsbCB0byB0ZW1wbGF0ZTwgdHlwZSBUID4KKy8vICAgIF9fa21wX2Rpc3BhdGNoX2luaXQoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFQgbGIsIFQgdWIsIFNUIHN0LCBTVCBjaHVuayApCitleHRlcm4gIkMiIHsKKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0B7CitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIHNjaGVkdWxlIFNjaGVkdWxlIHR5cGUKK0BwYXJhbSBsYiAgTG93ZXIgYm91bmQKK0BwYXJhbSB1YiAgVXBwZXIgYm91bmQKK0BwYXJhbSBzdCAgU3RlcCAob3IgaW5jcmVtZW50IGlmIHlvdSBwcmVmZXIpCitAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHNpemUgdG8gYmxvY2sgd2l0aAorCitUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBydW50aW1lIHRvIHN0YXJ0IGEgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGZvciBsb29wLCBzYXZpbmcgdGhlIGxvb3AgYXJndW1lbnRzLgorVGhlc2UgZnVuY3Rpb25zIGFyZSBhbGwgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuCisqLworCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9pbml0XzQKKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfaW5pdF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9pbml0XzQKKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgbGIsIGttcF9pbnQ2NCB1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBzdCwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9pbml0XzQKKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9pbml0XzQKKworRGlmZmVyZW5jZSBmcm9tIF9fa21wY19kaXNwYXRjaF9pbml0IHNldCBvZiBmdW5jdGlvbnMgaXMgdGhlc2UgZnVuY3Rpb25zCithcmUgY2FsbGVkIGZvciBjb21wb3NpdGUgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3IgY29uc3RydWN0LiBUaHVzIGJlZm9yZQorcmVndWxhciBpdGVyYXRpb25zIGRpc3BhdGNoaW5nIHdlIG5lZWQgdG8gY2FsYyBwZXItdGVhbSBpdGVyYXRpb24gc3BhY2UuCisKK1RoZXNlIGZ1bmN0aW9ucyBhcmUgYWxsIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLgorKi8KK3ZvaWQKK19fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzdF9nZXRfYm91bmRzPCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBwX2xhc3QsICZsYiwgJnViLCBzdCApOworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQzMiA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCit2b2lkCitfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50MzIgbGIsIGttcF91aW50MzIgdWIsIGttcF9pbnQzMiBzdCwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX2Rpc3RfZ2V0X2JvdW5kczwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0ICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCit2b2lkCitfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX2ludDY0IGxiLCBrbXBfaW50NjQgdWIsIGttcF9pbnQ2NCBzdCwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX2Rpc3RfZ2V0X2JvdW5kczwga21wX2ludDY0ID4oIGxvYywgZ3RpZCwgcF9sYXN0LCAmbGIsICZ1Yiwgc3QgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUgKTsKK30KKwordm9pZAorX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfdWludDY0IGxiLCBrbXBfdWludDY0IHViLCBrbXBfaW50NjQgc3QsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXN0X2dldF9ib3VuZHM8IGttcF91aW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsICZsYiwgJnViLCBzdCApOworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF91aW50NjQgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUgKTsKK30KKworLyohCitAcGFyYW0gbG9jIFNvdXJjZSBjb2RlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gcF9sYXN0IFBvaW50ZXIgdG8gYSBmbGFnIHNldCB0byBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBjaHVuayBvciB6ZXJvIG90aGVyd2lzZQorQHBhcmFtIHBfbGIgICBQb2ludGVyIHRvIHRoZSBsb3dlciBib3VuZCBmb3IgdGhlIG5leHQgY2h1bmsgb2Ygd29yaworQHBhcmFtIHBfdWIgICBQb2ludGVyIHRvIHRoZSB1cHBlciBib3VuZCBmb3IgdGhlIG5leHQgY2h1bmsgb2Ygd29yaworQHBhcmFtIHBfc3QgICBQb2ludGVyIHRvIHRoZSBzdHJpZGUgZm9yIHRoZSBuZXh0IGNodW5rIG9mIHdvcmsKK0ByZXR1cm4gb25lIGlmIHRoZXJlIGlzIHdvcmsgdG8gYmUgZG9uZSwgemVybyBvdGhlcndpc2UKKworR2V0IHRoZSBuZXh0IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBjaHVuayBvZiB3b3JrIGZvciB0aGlzIHRocmVhZC4KK0lmIHRoZXJlIGlzIG5vIG1vcmUgd29yaywgdGhlbiB0aGUgbGIsdWIgYW5kIHN0cmlkZSBuZWVkIG5vdCBiZSBtb2RpZmllZC4KKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwX2xiLCBrbXBfaW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF9pbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKnBfbGIsIGttcF91aW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF91aW50MzIgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisqLworaW50CitfX2ttcGNfZGlzcGF0Y2hfbmV4dF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcF9sYiwga21wX2ludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QgKQoreworICAgIHJldHVybiBfX2ttcF9kaXNwYXRjaF9uZXh0PCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisqLworaW50CitfX2ttcGNfZGlzcGF0Y2hfbmV4dF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpwX2xiLCBrbXBfdWludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QgKQoreworICAgIHJldHVybiBfX2ttcF9kaXNwYXRjaF9uZXh0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0ICk7Cit9CisKKy8qIQorQHBhcmFtIGxvYyBTb3VyY2UgY29kZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBpZAorCitNYXJrIHRoZSBlbmQgb2YgYSBkeW5hbWljIGxvb3AuCisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfZmluaXNoPCBrbXBfdWludDMyID4oIGd0aWQsIGxvYyApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9maW5pXzQKKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfZmluaV84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8IGttcF91aW50NjQgPiggZ3RpZCwgbG9jICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9maW5pXzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9maW5pXzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8IGttcF91aW50NjQgPiggZ3RpZCwgbG9jICk7Cit9CisvKiEgQH0gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy9Ob24tdGVtcGxhdGUgcm91dGluZXMgZnJvbSBrbXBfZGlzcGF0Y2guY3BwIHVzZWQgaW4gb3RoZXIgc291cmNlcworCitrbXBfdWludDMyIF9fa21wX2VxXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA9PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX25lcV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9sdF80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPCBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2dlXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA+PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2xlXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8PSBjaGVja2VyOworfQorCitrbXBfdWludDMyCitfX2ttcF93YWl0X3lpZWxkXzQodm9sYXRpbGUga21wX3VpbnQzMiAqIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAgICAgICAgICAgIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKiBwcmVkKSgga21wX3VpbnQzMiwga21wX3VpbnQzMiApCisgICAgICAgICAgICAgICAgICAgLCB2b2lkICAgICAgICAqIG9iaiAgICAvLyBIaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9iamVjdCwgb3IgTlVMTC4KKyAgICAgICAgICAgICAgICAgICApCit7CisgICAgLy8gbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQKKyAgICByZWdpc3RlciB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgICAgKiBzcGluICAgICAgICAgID0gc3Bpbm5lcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICBjaGVjayAgICAgICAgID0gY2hlY2tlcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgc3BpbnM7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAoKmYpICgga21wX3VpbnQzMiwga21wX3VpbnQzMiApID0gcHJlZDsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICByOworCisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopIHNwaW4gKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICAvLyBtYWluIHdhaXQgc3BpbiBsb29wCisgICAgd2hpbGUoIWYociA9IFRDUl80KCpzcGluKSwgY2hlY2spKSB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIC8qIGlmIHdlIGhhdmUgd2FpdGVkIGEgYml0LCBvciBhcmUgb3ZlcnN1YnNjcmliZWQsIHlpZWxkICovCisgICAgICAgIC8qIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZSAqLworICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3ZvaWQKK19fa21wX3dhaXRfeWllbGRfNF9wdHIodm9pZCAqc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKnByZWQpKCB2b2lkICosIGttcF91aW50MzIgKSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqb2JqICAgIC8vIEhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCBvciBOVUxMLgorICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAvLyBub3RlOiB3ZSBtYXkgbm90IGJlbG9uZyB0byBhIHRlYW0gYXQgdGhpcyBwb2ludAorICAgIHJlZ2lzdGVyIHZvaWQgICAgICAgICAgICAgICAgKnNwaW4gICAgICAgICAgPSBzcGlubmVyOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgICAgICAgIGNoZWNrICAgICAgICAgPSBjaGVja2VyOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgICAgICAgIHNwaW5zOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgKCpmKSAoIHZvaWQgKiwga21wX3VpbnQzMiApID0gcHJlZDsKKworICAgIEtNUF9GU1lOQ19TUElOX0lOSVQoIG9iaiwgc3BpbiApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIC8vIG1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSAoICFmKCBzcGluLCBjaGVjayApICkgeworICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBvYmogKTsKKyAgICAgICAgLyogaWYgd2UgaGF2ZSB3YWl0ZWQgYSBiaXQsIG9yIGFyZSBvdmVyc3Vic2NyaWJlZCwgeWllbGQgKi8KKyAgICAgICAgLyogcGF1c2UgaXMgaW4gdGhlIGZvbGxvd2luZyBjb2RlICovCisgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoIF9fa21wX250aCApID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApOworfQorCit9IC8vIGV4dGVybiAiQyIKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNodW5rLCBpbnQgcHVzaF93cyApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX3dzICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBjaHVuaywgaW50IHB1c2hfd3MgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF91aW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX3dzICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IGxiLCBrbXBfdWludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGNodW5rLCBpbnQgcHVzaF93cyApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rPCBrbXBfdWludDMyID4oIGd0aWQsIGxvYyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50NjQgPiggZ3RpZCwgbG9jICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50NjQgPiggZ3RpZCwgbG9jICk7Cit9CisKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGQ5NWRmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5jcHAKQEAgLTAsMCArMSw1OTUgQEAKKy8qCisgKiBrbXBfZW52aXJvbm1lbnQuY3BwIC0tIEhhbmRsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgT1MtaW5kZXBlbmRlbnRseS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBXZSB1c2UgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSBmb3IgV2luZG93cyogT1MgaW5zdGVhZCBvZiBnZXRlbnYgYmVjYXVzZSB0aGUgYWN0IG9mCisgICAgbG9hZGluZyBhIERMTCBvbiBXaW5kb3dzKiBPUyBtYWtlcyBhbnkgdXNlci1zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpLmUuIHdpdGggcHV0ZW52KCkpCisgICAgdW5hdmFpbGFibGUuICBnZXRlbnYoKSBhcHBhcmVudGx5IGdldHMgYSBjbGVhbiBjb3B5IG9mIHRoZSBlbnYgdmFyaWFibGVzIGFzIHRoZXkgZXhpc3RlZAorICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgcnVuLgorICAgIEpIIDEyLzIzLzIwMDIKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPbiBXaW5kb3dzKiBPUywgdGhlcmUgYXJlIHR3byBlbnZpcm9ubWVudHMgKGF0IGxlYXN0LCBzZWUgYmVsb3cpOgorCisgICAgICAgIDEuIEVudmlyb25tZW50IG1haW50YWluZWQgYnkgV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLgorCSAgIEFjY2Vzc2libGUgdGhyb3VnaCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCksCisgICAgICAgICAgIFNldEVudmlyb25tZW50VmFyaWFibGUoKSwgYW5kIEdldEVudmlyb25tZW50U3RyaW5ncygpLgorCisgICAgICAgIDIuIEVudmlyb25tZW50IG1haW50YWluZWQgYnkgQyBSVEwuIEFjY2Vzc2libGUgdGhyb3VnaCBnZXRlbnYoKSwgcHV0ZW52KCkuCisKKyAgICBwdXRlbnYoKSBmdW5jdGlvbiB1cGRhdGVzIGJvdGggQyBhbmQgV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiBnZXRlbnYoKSBmdW5jdGlvbgorICAgIHNlYXJjaCBmb3IgdmFyaWFibGVzIGluIEMgUlRMIGVudmlyb25tZW50IG9ubHkuIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBmdW5jdGlvbnMgd29yayAqb25seSoKKyAgICB3aXRoIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4KKworICAgIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBtYWludGFpbmVkIGJ5IE9TLCBzbyB0aGVyZSBpcyBhbHdheXMgb25seSBvbmUgV2luZG93cyogT1Mgb24KKyAgICBJQS0zMiBhcmNoaXRlY3R1cmUgcGVyIHByb2Nlc3MuIENoYW5nZXMgaW4gV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFyZSBwcm9jZXNzLXZpc2libGUuCisKKyAgICBDIGVudmlyb25tZW50IG1haW50YWluZWQgYnkgQyBSVEwuIE11bHRpcGxlIGNvcGllcyBvZiBDIFJUTCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgcHJvY2VzcywgYW5kCisgICAgZWFjaCBDIFJUTCBtYWludGFpbnMgaXRzIG93biBlbnZpcm9ubWVudC4gOi0oCisKKyAgICBUaHVzLCBwcm9wZXIgd2F5IHRvIHdvcmsgd2l0aCBlbnZpcm9ubWVudCBvbiBXaW5kb3dzKiBPUyBpczoKKworICAgICAgICAxLiBTZXQgdmFyaWFibGVzIHdpdGggcHV0ZW52KCkgZnVuY3Rpb24gLS0gYm90aCBDIGFuZCBXaW5kb3dzKiBPUyBvbgorCSAgIElBLTMyIGFyY2hpdGVjdHVyZSBhcmUgYmVpbmcgdXBkYXRlZC4gV2luZG93cyogT1Mgb24KKwkgICBJQS0zMiBhcmNoaXRlY3R1cmUgbWF5IGJlIGNvbnNpZGVyZWQgYXMgcHJpbWFyeSB0YXJnZXQsCisJICAgd2hpbGUgdXBkYXRpbmcgQyBSVEwgZW52aXJvbm1lbnQgaXMgYSBmcmVlIGJvbnVzLgorCisgICAgICAgIDIuIEdldCB2YXJpYWJsZXMgd2l0aCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkgLS0gZ2V0ZW52KCkgZG9lcyBub3QKKwkgICBzZWFyY2ggV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLCBhbmQgY2FuIG5vdCBzZWUgdmFyaWFibGVzCisJICAgc2V0IHdpdGggU2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLgorCisgICAgMjAwNy0wNC0wNSAtLSBsZXYKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKworI2luY2x1ZGUgImttcF9vcy5oIiAgICAvLyBLTVBfT1NfKi4KKyNpbmNsdWRlICJrbXAuaCIgICAgICAgLy8KKyNpbmNsdWRlICJrbXBfc3RyLmgiICAgLy8gX19rbXBfc3RyXyooKS4KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjaWYgS01QX09TX1VOSVgKKyAgICAjaW5jbHVkZSA8c3RkbGliLmg+ICAgIC8vIGdldGVudiwgc2V0ZW52LCB1bnNldGVudi4KKyAgICAjaW5jbHVkZSA8c3RyaW5nLmg+ICAgIC8vIHN0cmxlbiwgc3RyY3B5LgorICAgICNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgICNpbmNsdWRlIDxjcnRfZXh0ZXJucy5oPgorICAgICAgICAjZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisgICAgI2Vsc2UKKyAgICAgICAgZXh0ZXJuIGNoYXIgKiAqIGVudmlyb247CisgICAgI2VuZGlmCisjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICNpbmNsdWRlIDx3aW5kb3dzLmg+ICAgLy8gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSwgU2V0RW52aXJvbm1lbnRWYXJpYWJsZSwgR2V0TGFzdEVycm9yLgorI2Vsc2UKKyAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyNlbmRpZgorCisKKy8vIFRPRE86IEVsaW1pbmF0ZSBkaXJlY3QgbWVtb3J5IGFsbG9jYXRpb25zLCB1c2Ugc3RyaW5nIG9wZXJhdGlvbnMgaW5zdGVhZC4KKworc3RhdGljIGlubGluZQordm9pZCAqCithbGxvY2F0ZSgKKyAgICBzaXplX3Qgc2l6ZQorKSB7CisgICAgdm9pZCAqIHB0ciA9IEtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemUgKTsKKyAgICBpZiAoIHB0ciA9PSBOVUxMICkgeworCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBwdHI7Cit9IC8vIGFsbG9jYXRlCisKKworY2hhciAqCitfX2ttcF9lbnZfZ2V0KCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKworICAgIGNoYXIgKiByZXN1bHQgPSBOVUxMOworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IGdldGVudiggbmFtZSApOworICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gS01QX1NUUkxFTiggdmFsdWUgKSArIDE7CisgICAgICAgICAgICByZXN1bHQgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKTsKKyAgICAgICAgICAgIGlmICggcmVzdWx0ID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBLTVBfU1RSTkNQWV9TKCByZXN1bHQsIGxlbiwgdmFsdWUsIGxlbiApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8qCisgICAgICAgICAgICBXZSB1c2UgR2V0RW52aXJvbm1lbnRWYXJpYWJsZSBmb3IgV2luZG93cyogT1MgaW5zdGVhZCBvZiBnZXRlbnYgYmVjYXVzZSB0aGUgYWN0IG9mCisgICAgICAgICAgICBsb2FkaW5nIGEgRExMIG9uIFdpbmRvd3MqIE9TIG1ha2VzIGFueSB1c2VyLXNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGkuZS4gd2l0aCBwdXRlbnYoKSkKKyAgICAgICAgICAgIHVuYXZhaWxhYmxlLiAgZ2V0ZW52KCkgYXBwYXJlbnRseSBnZXRzIGEgY2xlYW4gY29weSBvZiB0aGUgZW52IHZhcmlhYmxlcyBhcyB0aGV5IGV4aXN0ZWQKKyAgICAgICAgICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgcnVuLgorICAgICAgICAgICAgSkggMTIvMjMvMjAwMgorICAgICAgICAqLworICAgICAgICBEV09SRCByYzsKKyAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCBOVUxMLCAwICk7CisgICAgICAgIGlmICggISByYyApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoIGVycm9yICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIC8vIFZhcmlhYmxlIGlzIG5vdCBmb3VuZCwgaXQncyBvaywganVzdCBjb250aW51ZS4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERXT1JEIGxlbiA9IHJjOworICAgICAgICAgICAgcmVzdWx0ID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggbGVuICk7CisgICAgICAgICAgICBpZiAoIHJlc3VsdCA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCByZXN1bHQsIGxlbiApOworICAgICAgICAgICAgaWYgKCAhIHJjICkgeworICAgICAgICAgICAgICAgIC8vIEdldEVudmlyb25tZW50VmFyaWFibGUoKSBtYXkgcmV0dXJuIDAgaWYgdmFyaWFibGUgaXMgZW1wdHkuCisgICAgICAgICAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UgR2V0TGFzdEVycm9yKCkgcmV0dXJucyBFUlJPUl9TVUNDRVNTLgorICAgICAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgaWYgKCBlcnJvciAhPSBFUlJPUl9TVUNDRVNTICkgeworICAgICAgICAgICAgICAgICAgICAvLyBVbmV4cGVjdGVkIGVycm9yLiBUaGUgdmFyaWFibGUgc2hvdWxkIGJlIGluIHRoZSBlbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGJ1ZmZlciBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoLgorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHJlc3VsdCApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorCisgICAgcmV0dXJuIHJlc3VsdDsKKworfSAvLyBmdW5jIF9fa21wX2Vudl9nZXQKKworCisvLyBUT0RPOiBGaW5kIGFuZCByZXBsYWNlIGFsbCByZWd1bGFyIGZyZWUoKSB3aXRoIF9fa21wX2Vudl9mcmVlKCkuCisKK3ZvaWQKK19fa21wX2Vudl9mcmVlKCBjaGFyIGNvbnN0ICogKiB2YWx1ZSApIHsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHZhbHVlICE9IE5VTEwgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgKiB2YWx1ZSApOworICAgICogdmFsdWUgPSBOVUxMOworCit9IC8vIGZ1bmMgX19rbXBfZW52X2ZyZWUKKworCisKK2ludAorX19rbXBfZW52X2V4aXN0cyggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgY2hhciBjb25zdCAqIHZhbHVlID0gZ2V0ZW52KCBuYW1lICk7CisgICAgICAgIHJldHVybiAoICggdmFsdWUgPT0gTlVMTCApID8gKCAwICkgOiAoIDEgKSApOworICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIERXT1JEIHJjOworICAgICAgICByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIE5VTEwsIDAgKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmICggZXJyb3IgIT0gRVJST1JfRU5WVkFSX05PVF9GT1VORCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEdldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorCit9IC8vIGZ1bmMgX19rbXBfZW52X2V4aXN0cworCisKKwordm9pZAorX19rbXBfZW52X3NldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgaW50IG92ZXJ3cml0ZSApIHsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICBpbnQgcmMgPSBzZXRlbnYoIG5hbWUsIHZhbHVlLCBvdmVyd3JpdGUgKTsKKyAgICAgICAgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgLy8gRGVhZCBjb2RlLiBJIHRyaWVkIHRvIHB1dCB0b28gbWFueSB2YXJpYWJsZXMgaW50byBMaW51eCogT1MKKyAgICAgICAgICAgIC8vIGVudmlyb25tZW50IG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gV2hlbiBhcHBsaWNhdGlvbiBjb25zdW1lcworICAgICAgICAgICAgLy8gbW9yZSB0aGFuIH4yLjUgR0Igb2YgbWVtb3J5LCBlbnRpcmUgc3lzdGVtIGZlZWxzIGJhZC4gU29tZXRpbWVzCisgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBpcyBraWxsZWQgKGJ5IE9TPyksIHNvbWV0aW1lcyBzeXN0ZW0gc3RvcHMKKyAgICAgICAgICAgIC8vIHJlc3BvbmRpbmcuLi4gQnV0IHRoaXMgZXJyb3IgbWVzc2FnZSBuZXZlciBhcHBlYXJzLiAtLWxuCisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBOb3RFbm91Z2hNZW1vcnkgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBCT09MIHJjOworICAgICAgICBpZiAoICEgb3ZlcndyaXRlICkgeworICAgICAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCBOVUxMLCAwICk7CisgICAgICAgICAgICBpZiAoIHJjICkgeworICAgICAgICAgICAgICAgIC8vIFZhcmlhYmxlIGV4aXN0cywgZG8gbm90IG92ZXJ3cml0ZS4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmICggZXJyb3IgIT0gRVJST1JfRU5WVkFSX05PVF9GT1VORCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEdldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICAgICByYyA9IFNldEVudmlyb25tZW50VmFyaWFibGUoIG5hbWUsIHZhbHVlICk7CisgICAgICAgIGlmICggISByYyApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorCit9IC8vIGZ1bmMgX19rbXBfZW52X3NldAorCisKKwordm9pZAorX19rbXBfZW52X3Vuc2V0KCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICB1bnNldGVudiggbmFtZSApOworICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIEJPT0wgcmMgPSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCBOVUxMICk7CisgICAgICAgIGlmICggISByYyApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorICAgICNlbmRpZgorCit9IC8vIGZ1bmMgX19rbXBfZW52X3Vuc2V0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgICBJbnRlbCBPcGVuTVAgUlRMIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBlbnZpcm9ubWVudDoganVzdCBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLCB2YXJpYWJsZXMKKyAgICBhcmUgc2VwYXJhdGVkIHdpdGggdmVydGljYWwgYmFycywgZS4gZy46CisKKyAgICAgICAgIktNUF9XQVJOSU5HUz0wfEtNUF9BRkZJTklUWT1jb21wYWN0fCIKKworICAgIEVtcHR5IHZhcmlhYmxlcyBhcmUgYWxsb3dlZCBhbmQgaWdub3JlZDoKKworICAgICAgICAifHxLTVBfV0FSTklOR1M9MXx8IgorCisqLworCitzdGF0aWMKK3ZvaWQKK19fX2ttcF9lbnZfYmxrX3BhcnNlX3N0cmluZygKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAgLy8gTTogRW52IGJsb2NrIHRvIGZpbGwuCisgICAgY2hhciBjb25zdCAqICAgIGVudiAgICAgIC8vIEk6IFN0cmluZyB0byBwYXJzZS4KKykgeworCisgICAgY2hhciBjb25zdCBjaHJfZGVsaW1pdGVyICAgPSAnfCc7CisgICAgY2hhciBjb25zdCBzdHJfZGVsaW1pdGVyW10gPSB7IGNocl9kZWxpbWl0ZXIsIDAgfTsKKworICAgIGNoYXIgKiAgICAgICAgICBidWxrICAgICAgID0gTlVMTDsKKyAgICBrbXBfZW52X3Zhcl90ICogdmFycyAgICAgICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgIGNvdW50ICAgICAgPSAwOyAgLy8gTnVtYmVyIG9mIHVzZWQgZWxlbWVudHMgaW4gdmFycyBhcnJheS4KKyAgICBpbnQgICAgICAgICAgICAgZGVsaW1pdGVycyA9IDA7ICAvLyBOdW1iZXIgb2YgZGVsaW1pdGVycyBpbiBpbnB1dCBzdHJpbmcuCisKKyAgICAvLyBDb3B5IG9yaWdpbmFsIHN0cmluZywgd2Ugd2lsbCBtb2RpZnkgdGhlIGNvcHkuCisgICAgYnVsayA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIGVudiApOworCisgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycyBpbiBlbnZpcm9ubWVudCBibG9jay4gQ291bnQgZGVsaW1pdGVycyAobWF4aW11bSBudW1iZXIgb2YgdmFyaWFibGVzCisgICAgLy8gaXMgbnVtYmVyIG9mIGRlbGltaXRlcnMgcGx1cyBvbmUpLgorICAgIHsKKyAgICAgICAgY2hhciBjb25zdCAqIHB0ciA9IGJ1bGs7CisgICAgICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgICAgIHB0ciA9IHN0cmNociggcHRyLCBjaHJfZGVsaW1pdGVyICk7CisgICAgICAgICAgICBpZiAoIHB0ciA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICsrIGRlbGltaXRlcnM7CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgfTsgLy8gZm9yZXZlcgorICAgIH0KKworICAgIC8vIEFsbG9jYXRlIHZhcnMgYXJyYXkuCisgICAgdmFycyA9IChrbXBfZW52X3Zhcl90ICopIGFsbG9jYXRlKCAoIGRlbGltaXRlcnMgKyAxICkgKiBzaXplb2YoIGttcF9lbnZfdmFyX3QgKSApOworCisgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFyaWFibGVzLgorICAgIHsKKyAgICAgICAgY2hhciAqIHZhcjsgICAgIC8vIFBvaW50ZXIgdG8gdmFyaWFibGUgKGJvdGggbmFtZSBhbmQgdmFsdWUpLgorICAgICAgICBjaGFyICogbmFtZTsgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHZhcmlhYmxlLgorICAgICAgICBjaGFyICogdmFsdWU7ICAgLy8gUG9pbnRlciB0byB2YWx1ZS4KKyAgICAgICAgY2hhciAqIGJ1ZjsgICAgIC8vIEJ1ZmZlciBmb3IgX19rbXBfc3RyX3Rva2VuKCkgZnVuY3Rpb24uCisgICAgICAgIHZhciA9IF9fa21wX3N0cl90b2tlbiggYnVsaywgc3RyX2RlbGltaXRlciwgJiBidWYgKTsgICAgICAvLyBHZXQgdGhlIGZpcnN0IHZhci4KKyAgICAgICAgd2hpbGUgKCB2YXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIFNhdmUgZm91bmQgdmFyaWFibGUgaW4gdmFycyBhcnJheS4KKyAgICAgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdmFyLCAnPScsICYgbmFtZSwgJiB2YWx1ZSApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY291bnQgPCBkZWxpbWl0ZXJzICsgMSApOworICAgICAgICAgICAgdmFyc1sgY291bnQgXS5uYW1lICA9IG5hbWU7CisgICAgICAgICAgICB2YXJzWyBjb3VudCBdLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICArKyBjb3VudDsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCB2YXIuCisgICAgICAgICAgICB2YXIgPSBfX2ttcF9zdHJfdG9rZW4oIE5VTEwsIHN0cl9kZWxpbWl0ZXIsICYgYnVmICk7CisgICAgICAgIH07IC8vIHdoaWxlCisgICAgfQorCisgICAgLy8gRmlsbCBvdXQgcmVzdWx0LgorICAgIGJsb2NrLT5idWxrICA9IGJ1bGs7CisgICAgYmxvY2stPnZhcnMgID0gdmFyczsKKyAgICBibG9jay0+Y291bnQgPSBjb3VudDsKKworfTsgLy8gX19fa21wX2Vudl9ibGtfcGFyc2Vfc3RyaW5nCisKKworCisvKgorICAgIFdpbmRvd3MqIE9TIChhY3R1YWxseSwgRE9TKSBlbnZpcm9ubWVudCBibG9jayBpcyBhIHBpZWNlIG9mIG1lbW9yeSB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlcy4gRWFjaAorICAgIHZhcmlhYmxlIGlzIHRlcm1pbmF0ZWQgd2l0aCB6ZXJvIGJ5dGUsIGVudGlyZSBibG9jayBpcyB0ZXJtaW5hdGVkIHdpdGggb25lIGV4dHJhIHplcm8gYnl0ZSwgc28KKyAgICB3ZSBoYXZlIHR3byB6ZXJvIGJ5dGVzIGF0IHRoZSBlbmQgb2YgZW52aXJvbm1lbnQgYmxvY2ssIGUuIGcuOgorCisgICAgICAgICJIT01FPUM6XFx1c2Vyc1xcbGV2XHgwME9TPVdpbmRvd3NfTlRceDAwXHgwMCIKKworICAgIEl0IGlzIG5vdCBjbGVhciBob3cgZW1wdHkgZW52aXJvbm1lbnQgaXMgcmVwcmVzZW50ZWQuICJceDAwXHgwMCI/CisqLworCisjaWYgS01QX09TX1dJTkRPV1MKK3N0YXRpYwordm9pZAorX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cygKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAgLy8gTTogRW52IGJsb2NrIHRvIGZpbGwuCisgICAgY2hhciBjb25zdCAqICAgIGVudiAgICAgIC8vIEk6IFBvaW50ZXIgdG8gV2luZG93cyogT1MgKERPUykgZW52aXJvbm1lbnQgYmxvY2suCispIHsKKworICAgIGNoYXIgKiAgICAgICAgICBidWxrICA9IE5VTEw7CisgICAga21wX2Vudl92YXJfdCAqIHZhcnMgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOyAgICAgLy8gTnVtYmVyIG9mIHVzZWQgZWxlbWVudHMgaW4gdmFycyBhcnJheS4KKyAgICBpbnQgICAgICAgICAgICAgc2l6ZSAgPSAwOyAgICAgLy8gU2l6ZSBvZiBidWxrLgorCisgICAgY2hhciAqIG5hbWU7ICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiB2YXJpYWJsZS4KKyAgICBjaGFyICogdmFsdWU7ICAgLy8gUG9pbnRlciB0byB2YWx1ZS4KKworICAgIGlmICggZW52ICE9IE5VTEwgKSB7CisKKyAgICAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycyBpbiBlbnZpcm9ubWVudCBibG9jay4gQ291bnQgdmFyaWFibGVzLCBmaW5kIHNpemUgb2YgYmxvY2suCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB2YXIuCisgICAgICAgICAgICBpbnQgICAgICAgICAgbGVuOyAgICAgLy8gTGVuZ3RoIG9mIHZhcmlhYmxlLgorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgdmFyID0gZW52OyAgICAgICAgICAgIC8vIFRoZSBmaXJzdCB2YXJpYWJsZSBzdGFydHMgYW5kIGJlZ2lubmluZyBvZiBlbnZpcm9ubWVudCBibG9jay4KKyAgICAgICAgICAgIGxlbiA9IEtNUF9TVFJMRU4oIHZhciApOworICAgICAgICAgICAgd2hpbGUgKCBsZW4gIT0gMCApIHsKKyAgICAgICAgICAgICAgICArKyBjb3VudDsKKyAgICAgICAgICAgICAgICBzaXplID0gc2l6ZSArIGxlbiArIDE7CisgICAgICAgICAgICAgICAgdmFyID0gdmFyICsgbGVuICsgMTsgLy8gTW92ZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgbGVuID0gS01QX1NUUkxFTiggdmFyICk7CisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICAgICAgc2l6ZSA9IHNpemUgKyAxOyAgICAgICAgIC8vIFRvdGFsIHNpemUgb2YgZW52IGJsb2NrLCBpbmNsdWRpbmcgdGVybWluYXRpbmcgemVybyBieXRlLgorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBvcmlnaW5hbCBibG9jayB0byBidWxrLCB3ZSB3aWxsIG1vZGlmeSBidWxrLCBub3Qgb3JpZ2luYWwgYmxvY2suCisgICAgICAgIGJ1bGsgPSAoY2hhciAqKSBhbGxvY2F0ZSggc2l6ZSApOworICAgICAgICBLTVBfTUVNQ1BZX1MoIGJ1bGssIHNpemUsIGVudiwgc2l6ZSApOworICAgICAgICAvLyBBbGxvY2F0ZSB2YXJzIGFycmF5LgorICAgICAgICB2YXJzID0gKGttcF9lbnZfdmFyX3QgKikgYWxsb2NhdGUoIGNvdW50ICogc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICkgKTsKKworICAgICAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB2YXJzLCBub3cgaW4gYnVsay4KKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqIHZhcjsgICAgIC8vIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHZhci4KKyAgICAgICAgICAgIGludCAgICBsZW47ICAgICAvLyBMZW5ndGggb2YgdmFyaWFibGUuCisgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICB2YXIgPSBidWxrOworICAgICAgICAgICAgbGVuID0gS01QX1NUUkxFTiggdmFyICk7CisgICAgICAgICAgICB3aGlsZSAoIGxlbiAhPSAwICkgeworICAgICAgICAgICAgICAgIC8vIFNhdmUgdmFyaWFibGUgaW4gdmFycyBhcnJheS4KKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHZhciwgJz0nLCAmIG5hbWUsICYgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB2YXJzWyBjb3VudCBdLm5hbWUgID0gbmFtZTsKKyAgICAgICAgICAgICAgICB2YXJzWyBjb3VudCBdLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgKysgY291bnQ7CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHZhci4KKyAgICAgICAgICAgICAgICB2YXIgPSB2YXIgKyBsZW4gKyAxOworICAgICAgICAgICAgICAgIGxlbiA9IEtNUF9TVFJMRU4oIHZhciApOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgfQorCisgICAgfTsgLy8gaWYKKworICAgIC8vIEZpbGwgb3V0IHJlc3VsdC4KKyAgICBibG9jay0+YnVsayAgPSBidWxrOworICAgIGJsb2NrLT52YXJzICA9IHZhcnM7CisgICAgYmxvY2stPmNvdW50ID0gY291bnQ7CisKK307IC8vIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3dpbmRvd3MKKyNlbmRpZgorCisKKy8qCisgICAgVW5peCBlbnZpcm9ubWVudCBibG9jayBpcyBhIGFycmF5IG9mIHBvaW50ZXJzIHRvIHZhcmlhYmxlcywgbGFzdCBwb2ludGVyIGluIGFycmF5IGlzIE5VTEw6CisKKyAgICAgICAgeyAiSE9NRT0vaG9tZS9sZXYiLCAiVEVSTT14dGVybSIsIE5VTEwgfQorKi8KKworc3RhdGljCit2b2lkCitfX19rbXBfZW52X2Jsa19wYXJzZV91bml4KAorICAgIGttcF9lbnZfYmxrX3QgKiBibG9jaywgICAvLyBNOiBFbnYgYmxvY2sgdG8gZmlsbC4KKyAgICBjaGFyICogKiAgICAgICAgZW52ICAgICAgLy8gSTogVW5peCBlbnZpcm9ubWVudCB0byBwYXJzZS4KKykgeworCisgICAgY2hhciAqICAgICAgICAgIGJ1bGsgID0gTlVMTDsKKyAgICBrbXBfZW52X3Zhcl90ICogdmFycyAgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgaW50ICAgICAgICAgICAgIHNpemUgID0gMDsgICAgLy8gU2l6ZSBvZiBidWxrLgorCisgICAgLy8gQ291bnQgbnVtYmVyIG9mIHZhcmlhYmxlcyBhbmQgbGVuZ3RoIG9mIHJlcXVpcmVkIGJ1bGsuCisgICAgeworICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIHNpemUgID0gMDsKKyAgICAgICAgd2hpbGUgKCBlbnZbIGNvdW50IF0gIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHNpemUgKz0gS01QX1NUUkxFTiggZW52WyBjb3VudCBdICkgKyAxOworICAgICAgICAgICAgKysgY291bnQ7CisgICAgICAgIH07IC8vIHdoaWxlCisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgbWVtb3J5LgorICAgIGJ1bGsgPSAoY2hhciAqKSBhbGxvY2F0ZSggc2l6ZSApOworICAgIHZhcnMgPSAoa21wX2Vudl92YXJfdCAqKSBhbGxvY2F0ZSggY291bnQgKiBzaXplb2YoIGttcF9lbnZfdmFyX3QgKSApOworCisgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycy4KKyAgICB7CisgICAgICAgIGNoYXIgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB2YXIuCisgICAgICAgIGNoYXIgKiBuYW1lOyAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2YgdmFyaWFibGUuCisgICAgICAgIGNoYXIgKiB2YWx1ZTsgICAvLyBQb2ludGVyIHRvIHZhbHVlLgorICAgICAgICBpbnQgICAgbGVuOyAgICAgLy8gTGVuZ3RoIG9mIHZhcmlhYmxlLgorICAgICAgICBpbnQgICAgaTsKKyAgICAgICAgdmFyID0gYnVsazsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBjb3VudDsgKysgaSApIHsKKyAgICAgICAgICAgIC8vIENvcHkgdmFyaWFibGUgdG8gYnVsay4KKyAgICAgICAgICAgIGxlbiA9IEtNUF9TVFJMRU4oIGVudlsgaSBdICk7CisgICAgICAgICAgICBLTVBfTUVNQ1BZX1MoIHZhciwgc2l6ZSwgZW52WyBpIF0sIGxlbiArIDEgKTsKKyAgICAgICAgICAgIC8vIFNhdmUgZm91bmQgdmFyaWFibGUgaW4gdmFycyBhcnJheS4KKyAgICAgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdmFyLCAnPScsICYgbmFtZSwgJiB2YWx1ZSApOworICAgICAgICAgICAgdmFyc1sgaSBdLm5hbWUgID0gbmFtZTsKKyAgICAgICAgICAgIHZhcnNbIGkgXS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgLy8gTW92ZSBwb2ludGVyLgorICAgICAgICAgICAgdmFyICs9IGxlbiArIDE7CisgICAgICAgIH07IC8vIGZvcgorICAgIH0KKworICAgIC8vIEZpbGwgb3V0IHJlc3VsdC4KKyAgICBibG9jay0+YnVsayAgPSBidWxrOworICAgIGJsb2NrLT52YXJzICA9IHZhcnM7CisgICAgYmxvY2stPmNvdW50ID0gY291bnQ7CisKK307IC8vIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3VuaXgKKworCisKK3ZvaWQKK19fa21wX2Vudl9ibGtfaW5pdCgKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAvLyBNOiBCbG9jayB0byBpbml0aWFsaXplLgorICAgIGNoYXIgY29uc3QgKiAgICBidWxrICAgIC8vIEk6IEluaXRpYWxpemF0aW9uIHN0cmluZywgb3IgTlVMTC4KKykgeworCisgICAgaWYgKCBidWxrICE9IE5VTEwgKSB7CisgICAgICAgIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3N0cmluZyggYmxvY2ssIGJ1bGsgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgICAgIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3VuaXgoIGJsb2NrLCBlbnZpcm9uICk7CisgICAgICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqIG1lbSA9IEdldEVudmlyb25tZW50U3RyaW5ncygpOworICAgICAgICAgICAgICAgIGlmICggbWVtID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZpcm9ubWVudCApLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV93aW5kb3dzKCBibG9jaywgbWVtICk7CisgICAgICAgICAgICAgICAgRnJlZUVudmlyb25tZW50U3RyaW5ncyggbWVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICNlbHNlCisgICAgICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAgICAgI2VuZGlmCisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9lbnZfYmxrX2luaXQKKworCisKK3N0YXRpYworaW50CitfX19rbXBfZW52X3Zhcl9jbXAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgcXNvcnQoKS4KKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogbGhzLAorICAgIGttcF9lbnZfdmFyX3QgY29uc3QgKiByaHMKKykgeworICAgIHJldHVybiBzdHJjbXAoIGxocy0+bmFtZSwgcmhzLT5uYW1lICk7Cit9CisKK3ZvaWQKK19fa21wX2Vudl9ibGtfc29ydCgKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2sgIC8vIE06IEJsb2NrIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzb3J0LgorKSB7CisKKyAgICBxc29ydCgKKyAgICAgICAgKHZvaWQgKikgYmxvY2stPnZhcnMsCisgICAgICAgIGJsb2NrLT5jb3VudCwKKyAgICAgICAgc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICksCisgICAgICAgICggaW50ICggKiApKCB2b2lkIGNvbnN0ICosIHZvaWQgY29uc3QgKiApICkgJiBfX19rbXBfZW52X3Zhcl9jbXAKKyAgICApOworCit9IC8vIF9fa21wX2Vudl9ibG9ja19zb3J0CisKKworCit2b2lkCitfX2ttcF9lbnZfYmxrX2ZyZWUoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrICAvLyBNOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZnJlZS4KKykgeworCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGJsb2NrLT52YXJzICk7CisgICAgX19rbXBfc3RyX2ZyZWUoJihibG9jay0+YnVsaykpOworCisgICAgYmxvY2stPmNvdW50ID0gMDsKKyAgICBibG9jay0+dmFycyAgPSBOVUxMOworCit9IC8vIF9fa21wX2Vudl9ibGtfZnJlZQorCisKKworY2hhciBjb25zdCAqICAgICAgICAgICAgICAgLy8gUjogVmFsdWUgb2YgdmFyaWFibGUgb3IgTlVMTCBpZiB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdC4KK19fa21wX2Vudl9ibGtfdmFyKAorICAgIGttcF9lbnZfYmxrX3QgKiBibG9jaywgLy8gSTogQmxvY2sgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgIGNoYXIgY29uc3QgKiAgICBuYW1lICAgLy8gSTogTmFtZSBvZiB2YXJpYWJsZSB0byBmaW5kLgorKSB7CisKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGJsb2NrLT5jb3VudDsgKysgaSApIHsKKyAgICAgICAgaWYgKCBzdHJjbXAoIGJsb2NrLT52YXJzWyBpIF0ubmFtZSwgbmFtZSApID09IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gYmxvY2stPnZhcnNbIGkgXS52YWx1ZTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKyAgICByZXR1cm4gTlVMTDsKKworfSAvLyBfX2ttcF9lbnZfYmxvY2tfdmFyCisKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNiNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBrbXBfZW52aXJvbm1lbnQuaCAtLSBIYW5kbGUgZW52aXJvbm1lbnQgdmFyb2lhYmxlcyBPUy1pbmRlcGVuZGVudGx5LgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9FTlZJUk9OTUVOVF9ICisjZGVmaW5lIEtNUF9FTlZJUk9OTUVOVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgTlVMTCBpZiB0aGUgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QuCisvLyAqTm90ZSo6IFJldHVybmVkIHBvaW50ZWQgKm11c3QqIGJlIGZyZWVkIGFmdGVyIHVzZSB3aXRoIF9fa21wX2Vudl9mcmVlKCkuCitjaGFyICogX19rbXBfZW52X2dldCggY2hhciBjb25zdCAqIG5hbWUgKTsKK3ZvaWQgICBfX2ttcF9lbnZfZnJlZSggY2hhciBjb25zdCAqICogdmFsdWUgKTsKKworLy8gUmV0dXJuIDEgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGV4aXN0cyBvciAwIGlmIGRvZXMgbm90IGV4aXN0LgoraW50IF9fa21wX2Vudl9leGlzdHMoIGNoYXIgY29uc3QgKiBuYW1lICk7CisKKy8vIFNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCit2b2lkIF9fa21wX2Vudl9zZXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIGludCBvdmVyd3JpdGUgKTsKKworLy8gVW5zZXQgKHJlbW92ZSkgZW52aXJvbm1lbnQgdmFyaWFibGUuCit2b2lkIF9fa21wX2Vudl91bnNldCggY2hhciBjb25zdCAqIG5hbWUgKTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgV29ya2luZyB3aXRoIGVudmlyb25tZW50IGJsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgICBrbXBfZW52X2Jsa190IGlzIHJlYWQtb25seSBjb2xsZWN0aW9uIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyAob3IgZW52aXJvbm1lbnQtbGlrZSkuIFVzYWdlOgorCisgICAgICAgIGttcF9lbnZfYmxrX3QgYmxvY2s7CisgICAgICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgTlVMTCApOyAvLyBJbml0aWFsaXplIGJsb2NrIGZyb20gcHJvY2VzcyBlbnZpcm9ubWVudC4KKyAgICAgICAgLy8gb3IKKyAgICAgICAgX19rbXBfZW52X2Jsa19pbml0KCAmIGJsb2NrLCAiS01QX1dBUk5JTkc9MXxLTVBfQUZGSU5JVFk9bm9uZSIgKTsgLy8gZnJvbSBzdHJpbmcuCisgICAgICAgIF9fa21wX2Vudl9ibGtfc29ydCggJiBibG9jayApOyAvLyBPcHRpb25hbGx5LCBzb3J0IGxpc3QuCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsrIGkgKSB7CisgICAgICAgICAgICAvLyBQcm9jZXNzIGJsb2NrLnZhcnNbIGkgXS5uYW1lIGFuZCBibG9jay52YXJzWyBpIF0udmFsdWUuLi4KKyAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgX19rbXBfZW52X2Jsb2NrX2ZyZWUoICYgYmxvY2sgKTsKKyovCisKK3N0cnVjdCBfX2ttcF9lbnZfdmFyIHsKKyAgICBjaGFyIGNvbnN0ICogbmFtZTsKKyAgICBjaGFyIGNvbnN0ICogdmFsdWU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfZW52X3ZhciBrbXBfZW52X3Zhcl90OworCitzdHJ1Y3QgX19rbXBfZW52X2JsayB7CisgICAgY2hhciBjb25zdCAqICAgICAgICAgIGJ1bGs7CisgICAga21wX2Vudl92YXJfdCBjb25zdCAqIHZhcnM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGNvdW50OworfTsKK3R5cGVkZWYgc3RydWN0IF9fa21wX2Vudl9ibGsga21wX2Vudl9ibGtfdDsKKwordm9pZCAgICAgICAgIF9fa21wX2Vudl9ibGtfaW5pdCgga21wX2Vudl9ibGtfdCAqIGJsb2NrLCBjaGFyIGNvbnN0ICogYnVsayApOwordm9pZCAgICAgICAgIF9fa21wX2Vudl9ibGtfZnJlZSgga21wX2Vudl9ibGtfdCAqIGJsb2NrICk7Cit2b2lkICAgICAgICAgX19rbXBfZW52X2Jsa19zb3J0KCBrbXBfZW52X2Jsa190ICogYmxvY2sgKTsKK2NoYXIgY29uc3QgKiBfX2ttcF9lbnZfYmxrX3ZhciggIGttcF9lbnZfYmxrX3QgKiBibG9jaywgY2hhciBjb25zdCAqIG5hbWUgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9FTlZJUk9OTUVOVF9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfZXJyb3IuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9lcnJvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4NDA2NgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZXJyb3IuY3BwCkBAIC0wLDAgKzEsNTIzIEBACisvKgorICoga21wX2Vycm9yLmNwcCAtLSBLUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTUlOX1NUQUNLICAgICAgIDEwMAorCisKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc190ZXh0X2NbXSA9IHsKKyAgICAiKG5vbmUpIiwKKyAgICAiXCJwYXJhbGxlbFwiIiwKKyAgICAid29yay1zaGFyaW5nIiwgICAgICAgICAgICAgLyogdGhpcyBpcyBub3QgY2FsbGVkICJmb3IiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwib3JkZXJlZFwiIHdvcmstc2hhcmluZyIsIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAiZm9yIG9yZGVyZWQiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwic2VjdGlvbnNcIiIsCisgICAgIndvcmstc2hhcmluZyIsICAgICAgICAgICAgIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAic2luZ2xlIiBiZWNhdXNlIG9mIGxvd2VyaW5nIG9mICJzZWN0aW9ucyIgcHJhZ21hcyAqLworICAgICJcInRhc2txXCIiLAorICAgICJcInRhc2txXCIiLAorICAgICJcInRhc2txIG9yZGVyZWRcIiIsCisgICAgIlwiY3JpdGljYWxcIiIsCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFBBUkFMTEVMICovCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFBETyAqLworICAgICJcIm9yZGVyZWRcIiIsICAgICAgICAgICAgICAvKiBpbiBUQVNLUSAqLworICAgICJcIm1hc3RlclwiIiwKKyAgICAiXCJyZWR1Y2VcIiIsCisgICAgIlwiYmFycmllclwiIgorfTsKKworI2RlZmluZSBnZXRfc3JjKCBpZGVudCApICAgKCAoaWRlbnQpID09IE5VTEwgPyBOVUxMIDogKGlkZW50KS0+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+IHAtPnBfdG9wKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uICovCisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsCisgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0KKyAgICAgICAgKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2Vycm9yLmggYi9yYzMvcnVudGltZS9zcmMva21wX2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmZTExMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZXJyb3IuaApAQCAtMCwwICsxLDU3IEBACisvKgorICoga21wX2Vycm9yLmggLS0gUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfRVJST1JfSAorI2RlZmluZSBLTVBfRVJST1JfSAorCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIF9fa21wX2Vycm9yX2NvbnN0cnVjdCggIGttcF9pMThuX2lkX3QgaWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfZXJyb3JfY29uc3RydWN0Migga21wX2kxOG5faWRfdCBpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwgc3RydWN0IGNvbnNfZGF0YSBjb25zdCAqIGNvbnMgKTsKKworc3RydWN0IGNvbnNfaGVhZGVyICogX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggaW50IGd0aWQgKTsKK3ZvaWQgICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfY29uc19zdGFjayggdm9pZCAqIHB0ciApOworCit2b2lkIF9fa21wX3B1c2hfcGFyYWxsZWwoIGludCBndGlkLCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgX19rbXBfcHVzaF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIG5hbWUsIGttcF91aW50MzIgKTsKKyNlbHNlCit2b2lkIF9fa21wX3B1c2hfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lICk7CisjZW5kaWYKKwordm9pZCBfX2ttcF9jaGVja193b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgX19rbXBfY2hlY2tfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lLCBrbXBfdWludDMyICk7CisjZWxzZQordm9pZCBfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIG5hbWUgKTsKKyNlbmRpZgorCit2b2lkIF9fa21wX3BvcF9wYXJhbGxlbCggaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOworZW51bSBjb25zX3R5cGUgX19rbXBfcG9wX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfcG9wX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7Cit2b2lkIF9fa21wX2NoZWNrX2JhcnJpZXIoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfRVJST1JfSAorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9jZGVjbC5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9jZGVjbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjMzc3OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZnRuX2NkZWNsLmNwcApAQCAtMCwwICsxLDM2IEBACisvKgorICoga21wX2Z0bl9jZGVjbC5jcHAgLS0gRm9ydHJhbiBfX2NkZWNsIGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2FmZmluaXR5LmgiCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyAgIGlmIGRlZmluZWQgIEtNUF9XSU5fQ0RFQ0wgfHwgICFkZWZpbmVkIEtNUF9EWU5BTUlDX0xJQgorIyAgICAgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTICAgICAgS01QX0ZUTl9VUFBFUgorIyAgIGVuZGlmCisjZWxpZiBLTVBfT1NfVU5JWAorIyAgIGRlZmluZSBLTVBfRlROX0VOVFJJRVMgIEtNUF9GVE5fUExBSU4KKyNlbmRpZgorCisvLyBOb3RlOiBUaGlzIHN0cmluZyBpcyBub3QgcHJpbnRlZCB3aGVuIEtNUF9WRVJTSU9OPTEuCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuY2RlY2xbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiRm9ydHJhbiBfX2NkZWNsIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgS01QX0ZUTl9FTlRSSUVTCisgICAgInllcyI7CisjICAgZGVmaW5lIEZUTl9TVERDQUxMIAkvKiBubyBzdGRjYWxsICovCisjICAgaW5jbHVkZSAia21wX2Z0bl9vcy5oIgorIyAgIGluY2x1ZGUgImttcF9mdG5fZW50cnkuaCIKKyNlbHNlCisgICAgIm5vIjsKKyNlbmRpZiAvKiBLTVBfRlROX0VOVFJJRVMgKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfZnRuX2VudHJ5LmggYi9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9lbnRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNTAxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9lbnRyeS5oCkBAIC0wLDAgKzEsMTQ5MiBAQAorLyoKKyAqIGttcF9mdG5fZW50cnkuaCAtLSBGb3J0cmFuIGVudHJ5IGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEZUTl9TVERDQUxMCisjIGVycm9yIFRoZSBzdXBwb3J0IGZpbGUga21wX2Z0bl9lbnRyeS5oIHNob3VsZCBub3QgYmUgY29tcGlsZWQgYnkgaXRzZWxmLgorI2VuZGlmCisKKyNpZmRlZiBLTVBfU1RVQgorICAgICNpbmNsdWRlICJrbXBfc3R1Yi5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvKgorICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgR251L01TIE9wZW4gTVAgY29kZWdlbiwgb21wX3NldF9udW1fdGhyZWFkcygpLAorICogb21wX3NldF9uZXN0ZWQoKSwgYW5kIG9tcF9zZXRfZHluYW1pYygpIFtpbiBsb3dlcmNhc2Ugb24gTVMsIGFuZCB3L28KKyAqIGEgdHJhaWxpbmcgdW5kZXJzY29yZSBvbiBMaW51eCogT1NdIHRha2UgY2FsbCBieSB2YWx1ZSBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAqICsgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscygpCisgKiArIG9tcF9zZXRfc2NoZWR1bGUoKQorICoKKyAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggOS4xIGFuZCBwcmV2aW91cyBJbnRlbCBjb21waWxlciwgdGhlc2UKKyAqIGVudHJ5IHBvaW50cyB0YWtlIGNhbGwgYnkgcmVmZXJlbmNlIGludGVnZXIgYXJndW1lbnRzLgorICovCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjIGlmIChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9QTEFJTikgfHwgKEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VQUEVSKQorIyAgZGVmaW5lIFBBU1NfQVJHU19CWV9WQUxVRSAxCisjIGVuZGlmCisjZW5kaWYKKyNpZiBLTVBfT1NfV0lORE9XUworIyBpZiAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fUExBSU4pIHx8IChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQpCisjICBkZWZpbmUgUEFTU19BUkdTX0JZX1ZBTFVFIDEKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBUaGlzIG1hY3JvIGhlbHBzIHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uLgorI2lmZGVmIFBBU1NfQVJHU19CWV9WQUxVRQorICAgICNkZWZpbmUgS01QX0RFUkVGCisjZWxzZQorICAgICNkZWZpbmUgS01QX0RFUkVGICoKKyNlbmRpZgorCit2b2lkICBGVE5fU1REQ0FMTAorRlROX1NFVF9TVEFDS1NJWkUoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9zdGFja3NpemUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIChzaXplX3QpIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCAgRlROX1NURENBTEwKK0ZUTl9TRVRfU1RBQ0tTSVpFX1MoIHNpemVfdCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9zdGFja3NpemUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX1NUQUNLU0laRSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiAoaW50KV9fa21wX3N0a3NpemU7CisgICAgI2VuZGlmCit9CisKK3NpemVfdCBGVE5fU1REQ0FMTAorRlROX0dFVF9TVEFDS1NJWkVfUyggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBfX2ttcF9zdGtzaXplOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0JMT0NLVElNRSggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X2Jsb2NrdGltZSggS01QX0RFUkVGIGFyZyApOworICAgICNlbHNlCisJaW50IGd0aWQsIHRpZDsKKwlrbXBfaW5mb190ICp0aHJlYWQ7CisKKwlndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCXRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisJdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBfX2ttcF9hdXhfc2V0X2Jsb2NrdGltZSggS01QX0RFUkVGIGFyZywgdGhyZWFkLCB0aWQgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0JMT0NLVElNRSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X2Jsb2NrdGltZSgpOworICAgICNlbHNlCisJaW50IGd0aWQsIHRpZDsKKwlrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIGttcF90ZWFtX3AgKnRlYW07CisKKwlndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCXRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisJdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF90ZWFtOworCisgICAgICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHNldHRpbmdzIHVzZWQgaW4gX19rbXBfd2FpdF9zbGVlcCgpICovCisgICAgICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisJICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfZ2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZFxuIiwKKwkJCSAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIEtNUF9NQVhfQkxPQ0tUSU1FKSApOworICAgICAgICAgICAgcmV0dXJuIEtNUF9NQVhfQkxPQ0tUSU1FOworICAgICAgICB9CisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX3plcm9fYnQgJiYgIWdldF9fYnRfc2V0KCB0ZWFtLCB0aWQgKSApIHsKKwkgICAgS0ZfVFJBQ0UoMTAsICggImttcF9nZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkXG4iLAorCQkJICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgMCkgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKyAgICAgICAgZWxzZSB7CisJICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfZ2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZFxuIiwKKyAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGdldF9fYmxvY2t0aW1lKCB0ZWFtLCB0aWQgKSApICk7CisgICAgICAgICAgICByZXR1cm4gZ2V0X19ibG9ja3RpbWUoIHRlYW0sIHRpZCApOworICAgICAgICB9OworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0xJQlJBUllfU0VSSUFMKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3NlcmlhbCApOworICAgICNlbHNlCisgICAgICAgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIGxpYnJhcnlfc2VyaWFsICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3R1cm5hcm91bmQgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3R1cm5hcm91bmQgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X2xpYnJhcnkoIGxpYnJhcnlfdGhyb3VnaHB1dCApOworICAgICNlbHNlCisgICAgICAgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIGxpYnJhcnlfdGhyb3VnaHB1dCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0xJQlJBUlkoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgZW51bSBsaWJyYXJ5X3R5cGUgbGliOworICAgICAgICBsaWIgPSAoZW51bSBsaWJyYXJ5X3R5cGUpIEtNUF9ERVJFRiBhcmc7CisgICAgICAgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoIGxpYiApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTElCUkFSWSAodm9pZCkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfbGlicmFyeSgpOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoaW50KSBfX2ttcF9saWJyYXJ5KTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9ESVNQX05VTV9CVUZGRVJTKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIDsgLy8gZW1wdHkgcm91dGluZQorICAgICNlbHNlCisgICAgICAgIC8vIGlnbm9yZSBhZnRlciBpbml0aWFsaXphdGlvbiBiZWNhdXNlIHNvbWUgdGVhbXMgaGF2ZSBhbHJlYWR5CisgICAgICAgIC8vIGFsbG9jYXRlZCBkaXNwYXRjaCBidWZmZXJzCisgICAgICAgIGlmKCBfX2ttcF9pbml0X3NlcmlhbCA9PSAwICYmIChLTVBfREVSRUYgYXJnKSA+IDAgKQorICAgICAgICAgICAgX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMgPSBLTVBfREVSRUYgYXJnOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9TRVRfQUZGSU5JVFkoIHZvaWQgKiptYXNrICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIC0xOworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9hdXhfc2V0X2FmZmluaXR5KCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9BRkZJTklUWSggdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF9nZXRfYWZmaW5pdHkoIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DKCB2b2lkICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgI2Vsc2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgcmVhbGx5IG9ubHkgTkVFRCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gaGVyZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX0NSRUFURV9BRkZJTklUWV9NQVNLKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICptYXNrID0gTlVMTDsKKyAgICAjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBXZSByZWFsbHkgb25seSBORUVEIHNlcmlhbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICAvLworICAgICAgICBrbXBfYWZmaW5fbWFza190KiBtYXNrX2ludGVybmFsczsKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbWFza19pbnRlcm5hbHMgPSBfX2ttcF9hZmZpbml0eV9kaXNwYXRjaC0+YWxsb2NhdGVfbWFzaygpOworICAgICAgICBLTVBfQ1BVX1pFUk8oIG1hc2tfaW50ZXJuYWxzICk7CisgICAgICAgICptYXNrID0gbWFza19pbnRlcm5hbHM7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9ERVNUUk9ZX0FGRklOSVRZX01BU0soIHZvaWQgKiptYXNrICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgLy8gTm90aGluZworICAgICNlbHNlCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIHJlYWxseSBvbmx5IE5FRUQgc2VyaWFsIGluaXRpYWxpemF0aW9uIGhlcmUuCisgICAgICAgIC8vCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIG1hc2tfaW50ZXJuYWxzOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmICggKm1hc2sgPT0gTlVMTCApIHsKKwkgICAgICAgIEtNUF9GQVRBTCggQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9kZXN0cm95X2FmZmluaXR5X21hc2siICk7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICBtYXNrX2ludGVybmFscyA9IChrbXBfYWZmaW5fbWFza190KikoKm1hc2spOworICAgICAgICBfX2ttcF9hZmZpbml0eV9kaXNwYXRjaC0+ZGVhbGxvY2F0ZV9tYXNrKG1hc2tfaW50ZXJuYWxzKTsKKyAgICAgICAgKm1hc2sgPSBOVUxMOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DKCBpbnQgS01QX0RFUkVGIHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIC0xOworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9hdXhfc2V0X2FmZmluaXR5X21hc2tfcHJvYyggS01QX0RFUkVGIHByb2MsIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DKCBpbnQgS01QX0RFUkVGIHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIC0xOworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBLTVBfREVSRUYgcHJvYywgbWFzayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DKCBpbnQgS01QX0RFUkVGIHByb2MsIHZvaWQgKiptYXNrICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIC0xOworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyggS01QX0RFUkVGIHByb2MsIG1hc2sgKTsKKyAgICAjZW5kaWYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogc2V0cyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiB0aHJlYWRzIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24gKi8KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX05VTV9USFJFQURTKSggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAvLyBOb3RoaW5nLgorICAgICNlbHNlCisgICAgICAgIF9fa21wX3NldF9udW1fdGhyZWFkcyggS01QX0RFUkVGIGFyZywgX19rbXBfZW50cnlfZ3RpZCgpICk7CisgICAgI2VuZGlmCit9CisKKworLyogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaW4gY3VycmVudCB0ZWFtICovCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9OVU1fVEhSRUFEUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcGNfYm91bmRfbnVtX3RocmVhZHMgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIHJldHVybiBfX2ttcGNfYm91bmRfbnVtX3RocmVhZHMoTlVMTCk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX01BWF9USFJFQURTKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIGludCAgICAgICAgIGd0aWQ7CisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgZ3RpZCAgID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgIC8vcmV0dXJuIHRocmVhZCAtPiB0aC50aF90ZWFtIC0+IHQudF9jdXJyZW50X3Rhc2tbIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQgXSAtPiBpY3ZzLm5wcm9jOworCXJldHVybiB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ljdnMubnByb2M7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1RIUkVBRF9OVU0pKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDA7CisgICAgI2Vsc2UKKyAgICAgICAgaW50IGd0aWQ7CisKKyAgICAgICAgI2lmIEtNUF9PU19EQVJXSU4gfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorICAgICAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIGlmICghX19rbXBfaW5pdF9wYXJhbGxlbCB8fAorICAgICAgICAgICAgICAgIChndGlkID0gKGludCkoKGttcF9pbnRwdHJfdClUbHNHZXRWYWx1ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEVpdGhlciBsaWJyYXJ5IGlzbid0IGluaXRpYWxpemVkIG9yIHRocmVhZCBpcyBub3QgcmVnaXN0ZXJlZAorICAgICAgICAgICAgICAgIC8vIDAgaXMgdGhlIGNvcnJlY3QgVElEIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1ndGlkOyAvLyBXZSBrZWVwIChndGlkKzEpIGluIFRMUworICAgICAgICAjZWxpZiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICAgICAgaWYgKCBfX2ttcF9ndGlkX21vZGUgPj0gMyApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGd0aWQgPSBfX2ttcF9ndGlkKSA9PSBLTVBfR1RJRF9ETkUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGlmICghX19rbXBfaW5pdF9wYXJhbGxlbCB8fAorICAgICAgICAgICAgICAgICAgICAoZ3RpZCA9IChrbXBfaW50cHRyX3QpKHB0aHJlYWRfZ2V0c3BlY2lmaWMoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC0tZ3RpZDsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICNlbHNlCisgICAgICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUworICAgICAgICAjZW5kaWYKKworICAgICAgICByZXR1cm4gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIC8qIE5PVEU6IHRoaXMgaXMgbm90IHN5bmNyb25pemVkLCBzbyBpdCBjYW4gY2hhbmdlIGF0IGFueSBtb21lbnQgKi8KKyAgICAgICAgLyogTk9URTogdGhpcyBudW1iZXIgYWxzbyBpbmNsdWRlcyB0aHJlYWRzIHByZWFsbG9jYXRlZCBpbiBob3QtdGVhbXMgKi8KKyAgICAgICAgcmV0dXJuIFRDUl80KF9fa21wX250aCk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05VTV9QUk9DUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXZhaWxfcHJvYzsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX05FU1RFRCkoIGludCBLTVBfREVSRUYgZmxhZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbmVzdGVkKCBLTVBfREVSRUYgZmxhZyApOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICAgICAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisgICAgICAgIHNldF9fbmVzdGVkKCB0aHJlYWQsICggKEtNUF9ERVJFRiBmbGFnKSA/IFRSVUUgOiBGQUxTRSApICk7CisgICAgI2VuZGlmCit9CisKKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTkVTVEVEKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X25lc3RlZCgpOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIHJldHVybiBnZXRfX25lc3RlZCggdGhyZWFkICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9EWU5BTUlDKSggaW50IEtNUF9ERVJFRiBmbGFnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9keW5hbWljKCBLTVBfREVSRUYgZmxhZyA/IFRSVUUgOiBGQUxTRSApOworICAgICNlbHNlCisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgLyogRm9yIHRoZSB0aHJlYWQtcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIC8vICEhISBXaGF0IGlmIGZvcmVpZ24gdGhyZWFkIGNhbGxzIGl0PworICAgICAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKyAgICAgICAgc2V0X19keW5hbWljKCB0aHJlYWQsIEtNUF9ERVJFRiBmbGFnID8gVFJVRSA6IEZBTFNFICk7CisgICAgI2VuZGlmCit9CisKKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfRFlOQU1JQykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9keW5hbWljKCk7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgcmV0dXJuIGdldF9fZHluYW1pYyggdGhyZWFkICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fSU5fUEFSQUxMRUwpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDA7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7CisgICAgICAgICAgICAvLyBBQzogcl9pbl9wYXJhbGxlbCBkb2VzIG5vdCB3b3JrIGluc2lkZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIC8vICAgICB3aGVyZSByZWFsIHBhcmFsbGVsIGlzIGluYWN0aXZlLCBidXQgYWxsIHRocmVhZHMgaGF2ZSBzYW1lIHJvb3QsCisgICAgICAgICAgICAvLyAgICAgc28gc2V0dGluZyBpdCBpbiBvbmUgdGVhbSBhZmZlY3RzIG90aGVyIHRlYW1zLgorICAgICAgICAgICAgLy8gICAgIFRoZSBzb2x1dGlvbiBpcyB0byB1c2UgcGVyLXRlYW0gbmVzdGluZyBsZXZlbAorICAgICAgICAgICAgcmV0dXJuICggdGgtPnRoLnRoX3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPyAxIDogMCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgICAgcmV0dXJuICggdGgtPnRoLnRoX3Jvb3QtPnIucl9pbl9wYXJhbGxlbCA/IEZUTl9UUlVFIDogRlROX0ZBTFNFICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9TQ0hFRFVMRSkoIGttcF9zY2hlZF90IEtNUF9ERVJFRiBraW5kLCBpbnQgS01QX0RFUkVGIG1vZGlmaWVyICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9zY2hlZHVsZSggS01QX0RFUkVGIGtpbmQsIEtNUF9ERVJFRiBtb2RpZmllciApOworICAgICNlbHNlCisJLyogIFRPIERPICAqLworICAgICAgICAvKiBGb3IgdGhlIHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgICAgICBfX2ttcF9zZXRfc2NoZWR1bGUoIF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGtpbmQsIEtNUF9ERVJFRiBtb2RpZmllciApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfU0NIRURVTEUpKCBrbXBfc2NoZWRfdCAqIGtpbmQsIGludCAqIG1vZGlmaWVyICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX2dldF9zY2hlZHVsZSgga2luZCwgbW9kaWZpZXIgKTsKKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKwkvKiBGb3IgdGhlIHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgICAgICBfX2ttcF9nZXRfc2NoZWR1bGUoIF9fa21wX2VudHJ5X2d0aWQoKSwga2luZCwgbW9kaWZpZXIgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTKSggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCS8vIE5vdGhpbmcuCisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisgICAgICAgIC8qIFdlIHdhbnQgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcm5hbCBjb250cm9sICovCisgICAgICAgIF9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYgYXJnICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDA7CisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisJLyogV2Ugd2FudCBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVybmFsIGNvbnRyb2wgKi8KKwlyZXR1cm4gX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfQUNUSVZFX0xFVkVMKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDA7IC8vIHJldHVybnMgMCBpZiBpdCBpcyBjYWxsZWQgZnJvbSB0aGUgc2VxdWVudGlhbCBwYXJ0IG9mIHRoZSBwcm9ncmFtCisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisJLyogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgICAgICAgcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX3RlYW0gLT4gdC50X2FjdGl2ZV9sZXZlbDsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTEVWRUwpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gMDsgLy8gcmV0dXJucyAwIGlmIGl0IGlzIGNhbGxlZCBmcm9tIHRoZSBzZXF1ZW50aWFsIHBhcnQgb2YgdGhlIHByb2dyYW0KKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKwkvKiBGb3IgdGhlIHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgICAgICByZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfdGVhbSAtPiB0LnRfbGV2ZWw7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0pKCBpbnQgS01QX0RFUkVGIGxldmVsICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gKCBLTVBfREVSRUYgbGV2ZWwgKSA/ICggLTEgKSA6ICggMCApOworICAgICNlbHNlCisJcmV0dXJuIF9fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBfX2ttcF9lbnRyeV9ndGlkKCksIEtNUF9ERVJFRiBsZXZlbCApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9URUFNX1NJWkUpKCBpbnQgS01QX0RFUkVGIGxldmVsICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuICggS01QX0RFUkVGIGxldmVsICkgPyAoIC0xICkgOiAoIDEgKTsKKyAgICAjZWxzZQorICAgICAgICByZXR1cm4gX19rbXBfZ2V0X3RlYW1fc2l6ZSggX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYgbGV2ZWwgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfVEhSRUFEX0xJTUlUKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJcmV0dXJuIDE7ICAgLy8gVE8gRE86IGNsYXJpZnkgd2hldGhlciBpdCByZXR1cm5zIDEgb3IgMD8KKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICAvKiBnbG9iYWwgSUNWICovCisJcmV0dXJuIF9fa21wX21heF9udGg7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fSU5fRklOQUwpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gMDsgICAvLyBUTyBETzogY2xhcmlmeSB3aGV0aGVyIGl0IHJldHVybnMgMSBvciAwPworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisJcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5maW5hbDsKKyAgICAjZW5kaWYKK30KKworI2lmIE9NUF80MF9FTkFCTEVECisKKwora21wX3Byb2NfYmluZF90IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfUFJPQ19CSU5EKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3Byb2NfYmluZCgpOworICAgICNlbHNlCisgICAgICAgIHJldHVybiBnZXRfX3Byb2NfYmluZCggX19rbXBfZW50cnlfdGhyZWFkKCkgKTsKKyAgICAjZW5kaWYKK30KKworI2lmIE9NUF80NV9FTkFCTEVECitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTlVNX1BMQUNFUyggdm9pZCApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfUExBQ0VfTlVNX1BST0NTKCBpbnQgcGxhY2VfbnVtICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgI2Vsc2UKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCByZXR2YWwgPSAwOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBwbGFjZV9udW0gPCAwIHx8IHBsYWNlX251bSA+PSAoaW50KV9fa21wX2FmZmluaXR5X251bV9tYXNrcyApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIHBsYWNlX251bSk7CisgICAgICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgbWFzaykgeworICAgICAgICAgICAgaWYgKCghIEtNUF9DUFVfSVNTRVQoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB8fAorICAgICAgICAgICAgICAoIUtNUF9DUFVfSVNTRVQoaSwgbWFzaykpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3JldHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fR0VUX1BMQUNFX1BST0NfSURTKCBpbnQgcGxhY2VfbnVtLCBpbnQgKmlkcyApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgLy8gTm90aGluZy4KKyAgICAjZWxzZQorICAgICAgICBpbnQgaSxqOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICggcGxhY2VfbnVtIDwgMCB8fCBwbGFjZV9udW0gPj0gKGludClfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgcGxhY2VfbnVtKTsKKyAgICAgICAgaiA9IDA7CisgICAgICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgbWFzaykgeworICAgICAgICAgICAgaWYgKCghIEtNUF9DUFVfSVNTRVQoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB8fAorICAgICAgICAgICAgICAoIUtNUF9DUFVfSVNTRVQoaSwgbWFzaykpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZHNbaisrXSA9IGk7CisgICAgICAgIH0KKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX1BMQUNFX05VTSggdm9pZCApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpbnQgZ3RpZDsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9jdXJyZW50X3BsYWNlIDwgMCApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfcGxhY2U7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9QQVJUSVRJT05fTlVNX1BMQUNFUyggdm9pZCApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGludCBndGlkLCBudW1fcGxhY2VzLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZTsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgZmlyc3RfcGxhY2UgPSB0aHJlYWQtPnRoLnRoX2ZpcnN0X3BsYWNlOworICAgICAgICBsYXN0X3BsYWNlID0gdGhyZWFkLT50aC50aF9sYXN0X3BsYWNlOworICAgICAgICBpZiAoIGZpcnN0X3BsYWNlIDwgMCB8fCBsYXN0X3BsYWNlIDwgMCApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBmaXJzdF9wbGFjZSA8PSBsYXN0X3BsYWNlICkKKyAgICAgICAgICAgIG51bV9wbGFjZXMgPSBsYXN0X3BsYWNlIC0gZmlyc3RfcGxhY2UgKyAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBudW1fcGxhY2VzID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gZmlyc3RfcGxhY2UgKyBsYXN0X3BsYWNlICsgMTsKKyAgICAgICAgcmV0dXJuIG51bV9wbGFjZXM7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9HRVRfUEFSVElUSU9OX1BMQUNFX05VTVMoIGludCAqcGxhY2VfbnVtcyApIHsKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAvLyBOb3RoaW5nLgorICAgICNlbHNlCisgICAgICAgIGludCBpLCBndGlkLCBwbGFjZV9udW0sIGZpcnN0X3BsYWNlLCBsYXN0X3BsYWNlLCBzdGFydCwgZW5kOworICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgZmlyc3RfcGxhY2UgPSB0aHJlYWQtPnRoLnRoX2ZpcnN0X3BsYWNlOworICAgICAgICBsYXN0X3BsYWNlID0gdGhyZWFkLT50aC50aF9sYXN0X3BsYWNlOworICAgICAgICBpZiAoIGZpcnN0X3BsYWNlIDwgMCB8fCBsYXN0X3BsYWNlIDwgMCApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICggZmlyc3RfcGxhY2UgPD0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICBlbmQgPSBsYXN0X3BsYWNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnQgPSBsYXN0X3BsYWNlOworICAgICAgICAgICAgZW5kID0gZmlyc3RfcGxhY2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMCwgcGxhY2VfbnVtID0gc3RhcnQ7IHBsYWNlX251bSA8PSBlbmQ7ICsrcGxhY2VfbnVtLCArK2kpIHsKKyAgICAgICAgICAgIHBsYWNlX251bXNbaV0gPSBwbGFjZV9udW07CisgICAgICAgIH0KKyAgICAjZW5kaWYKK30KKyNlbmRpZgorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9OVU1fVEVBTVMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIGlmICggdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7CisgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgaW50IHRsZXZlbCA9IHRoci0+dGgudGhfdGVhbXNfbGV2ZWw7CisgICAgICAgICAgICBpbnQgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7ICAgICAgICAgICAgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGludCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisgICAgICAgICAgICBpbnQgbGV2ZWwgPSB0bGV2ZWwgKyAxOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgJiYgKCAhZGQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlpLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBkZCA+IDEgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7ICAvLyB0ZWFtcyByZWdpb24gaXMgc2VyaWFsaXplZCAoIDEgdGVhbSBvZiAxIHRocmVhZCApLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVhbS0+dC50X3BhcmVudC0+dC50X25wcm9jOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfVEVBTV9OVU0pKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDA7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgICAgICAgIGlmICggdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7CisgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgaW50IHRsZXZlbCA9IHRoci0+dGgudGhfdGVhbXNfbGV2ZWw7IC8vIHRoZSBsZXZlbCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICBpbnQgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7CisgICAgICAgICAgICBpbnQgZGQgPSB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgICAgICAgICAgaW50IGxldmVsID0gdGxldmVsICsgMTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGlpID49IHRsZXZlbCApOworICAgICAgICAgICAgd2hpbGUoIGlpID4gbGV2ZWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggZGQgPSB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOyAoIGRkID4gMCApICYmICggaWkgPiBsZXZlbCApOyBkZC0tLCBpaS0tICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCB0ZWFtIC0+IHQudF9zZXJpYWxpemVkICYmICggIWRkICkgKSB7CisgICAgICAgICAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGlpID4gbGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgICAgICAgICBpaS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggZGQgPiAxICkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOyAgLy8gdGVhbXMgcmVnaW9uIGlzIHNlcmlhbGl6ZWQgKCAxIHRlYW0gb2YgMSB0aHJlYWQgKS4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlYW0tPnQudF9tYXN0ZXJfdGlkOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UpKCB2b2lkICkKK3sKKyAgICAjaWYgS01QX01JQyB8fCBLTVBfT1NfREFSV0lOIHx8IGRlZmluZWQoS01QX1NUVUIpCisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5kZWZhdWx0X2RldmljZTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX0RFRkFVTFRfREVWSUNFKSggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgICNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4gfHwgZGVmaW5lZChLTVBfU1RVQikKKyAgICAvLyBOb3RoaW5nLgorICAgICNlbHNlCisgICAgICAgIF9fa21wX2VudHJ5X3RocmVhZCgpIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9pY3ZzLmRlZmF1bHRfZGV2aWNlID0gS01QX0RFUkVGIGFyZzsKKyAgICAjZW5kaWYKK30KKworI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTlVNX0RFVklDRVMoIHZvaWQgKQoreworICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLy8gS01QX01JQyB8fCBLTVBfT1NfREFSV0lOIHx8IGRlZmluZWQoS01QX1NUVUIpCisKKyNpZiAhIEtNUF9PU19MSU5VWAorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lTX0lOSVRJQUxfREVWSUNFKSggdm9pZCApCit7CisgICAgcmV0dXJuIDE7Cit9CisKKyNlbHNlCisKKy8vIFRoaXMgaW50ZXJuYWwgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIHRoZSBlbnRyeSBmcm9tIHRoZSBvZmZsb2FkIGxpYnJhcnkKKy8vIGlzIG5vdCBmb3VuZC4KK2ludCBfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlciggdm9pZCApICBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fSVNfSU5JVElBTF9ERVZJQ0UpKCB2b2lkICkKK3sKKyAgICBpZiggX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIgKSB7CisgICAgICAgIHJldHVybiBfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcigpID09IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworI2VuZGlmIC8vICEgS01QX09TX0xJTlVYCisKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjaWYgT01QXzQ1X0VOQUJMRUQgJiYgZGVmaW5lZChLTVBfU1RVQikKKy8vIE9wZW5NUCA0LjUgZW50cmllcyBmb3Igc3R1YnMgbGlicmFyeQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfSU5JVElBTF9ERVZJQ0Uodm9pZCkKK3sKKyAgIHJldHVybiAtMTsKK30KKworLy8gQXMgYWxsICp0YXJnZXQqIGZ1bmN0aW9ucyBhcmUgQy1vbmx5IHBhcmFtZXRlcnMgYWx3YXlzIHBhc3NlZCBieSB2YWx1ZQordm9pZCAqIEZUTl9TVERDQUxMCitGVE5fVEFSR0VUX0FMTE9DKHNpemVfdCBzaXplLCBpbnQgZGV2aWNlX251bSkKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1RBUkdFVF9GUkVFKHZvaWQgKiBkZXZpY2VfcHRyLCBpbnQgZGV2aWNlX251bSkKK3sKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fVEFSR0VUX0lTX1BSRVNFTlQodm9pZCAqIHB0ciwgaW50IGRldmljZV9udW0pCit7CisgICByZXR1cm4gMDsKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fVEFSR0VUX01FTUNQWSh2b2lkICpkc3QsIHZvaWQgKnNyYywgc2l6ZV90IGxlbmd0aCwgc2l6ZV90ICBkc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY19vZmZzZXQsIGludCBkc3RfZGV2aWNlLCBpbnQgc3JjX2RldmljZSkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1RBUkdFVF9NRU1DUFlfUkVDVCh2b2lkICpkc3QsIHZvaWQgKnNyYywgc2l6ZV90IGVsZW1lbnRfc2l6ZSwgaW50IG51bV9kaW1zLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgKnZvbHVtZSwgY29uc3Qgc2l6ZV90ICpkc3Rfb2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICpzcmNfb2Zmc2V0cywgY29uc3Qgc2l6ZV90ICpkc3RfZGltZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICpzcmNfZGltZW5zaW9ucywgaW50IGRzdF9kZXZpY2UsIGludCBzcmNfZGV2aWNlKQoreworICAgIHJldHVybiAtMTsKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fVEFSR0VUX0FTU09DSUFURV9QVFIodm9pZCAqaG9zdF9wdHIsIHZvaWQgKmRldmljZV9wdHIsIHNpemVfdCAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgIGRldmljZV9vZmZzZXQsIGludCBkZXZpY2VfbnVtKQoreworICAgIHJldHVybiAtMTsKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fVEFSR0VUX0RJU0FTU09DSUFURV9QVFIodm9pZCAqaG9zdF9wdHIsIGludCBkZXZpY2VfbnVtKQoreworICAgIHJldHVybiAtMTsKK30KKyNlbmRpZiAvLyBPTVBfNDVfRU5BQkxFRCAmJiBkZWZpbmVkKEtNUF9TVFVCKQorCisjaWZkZWYgS01QX1NUVUIKK3R5cGVkZWYgZW51bSB7IFVOSU5JVCA9IC0xLCBVTkxPQ0tFRCwgTE9DS0VEIH0ga21wX3N0dWJfbG9ja190OworI2VuZGlmIC8qIEtNUF9TVFVCICovCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSwordm9pZCBGVE5fU1REQ0FMTAorRlROX0lOSVRfTE9DS19XSVRIX0hJTlQoIHZvaWQgKip1c2VyX2xvY2ssIHVpbnRwdHJfdCBLTVBfREVSRUYgaGludCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfaW5pdF9sb2NrX3dpdGhfaGludCggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2ssIEtNUF9ERVJFRiBoaW50ICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9JTklUX05FU1RfTE9DS19XSVRIX0hJTlQoIHZvaWQgKip1c2VyX2xvY2ssIHVpbnRwdHJfdCBLTVBfREVSRUYgaGludCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jaywgS01QX0RFUkVGIGhpbnQgKTsKKyAgICAjZW5kaWYKK30KKyNlbmRpZgorCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JTklUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOTE9DS0VEOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19pbml0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKKy8qIGluaXRpYWxpemUgdGhlIGxvY2sgKi8KK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lOSVRfTkVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfaW5pdF9uZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0RFU1RST1lfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5JTklUOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19kZXN0cm95X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0RFU1RST1lfTkVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTklOSVQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSAhPSBVTkxPQ0tFRCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gTE9DS0VEOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19zZXRfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICgqKChpbnQgKil1c2VyX2xvY2spKSsrOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19zZXRfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9VTlNFVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOTE9DS0VEICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfdW5zZXRfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fVU5TRVRfTkVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOTE9DS0VEICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICgqKChpbnQgKil1c2VyX2xvY2spKS0tOworICAgICNlbHNlCisgICAgICAgIF9fa21wY191bnNldF9uZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fVEVTVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IExPQ0tFRCApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9OyAvLyBpZgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gTE9DS0VEOworICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICByZXR1cm4gX19rbXBjX3Rlc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9URVNUX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHJldHVybiArKygqKChpbnQgKil1c2VyX2xvY2spKTsKKyAgICAjZWxzZQorICAgICAgICByZXR1cm4gX19rbXBjX3Rlc3RfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCitkb3VibGUgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9XVElNRSkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF93dGltZSgpOworICAgICNlbHNlCisgICAgICAgIGRvdWJsZSBkYXRhOworICAgICAgICAjaWYgISBLTVBfT1NfTElOVVgKKyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRvIGdldCB0aGUgdGltZSBvbiBMaW51eCogT1MuCisgICAgICAgIC8vIFRoZSByb3V0aW5lIGNhbiBiZSB1c2VkIHRvIG1lYXN1cmUgbGlicmFyeSBpbml0aWFsaXphdGlvbiB0aW1lIG9uIExpbnV4KiBPUyBub3cuCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9lbGFwc2VkKCAmIGRhdGEgKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgI2VuZGlmCit9CisKK2RvdWJsZSBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1dUSUNLKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X3d0aWNrKCk7CisgICAgI2Vsc2UKKyAgICAgICAgZG91YmxlIGRhdGE7CisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgIF9fa21wX2VsYXBzZWRfdGljayggJiBkYXRhICk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgICNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCAqIEZUTl9TVERDQUxMCitGVE5fTUFMTE9DKCBzaXplX3QgS01QX0RFUkVGIHNpemUgKQoreworICAgIC8vIGttcGNfbWFsbG9jIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIHJldHVybiBrbXBjX21hbGxvYyggS01QX0RFUkVGIHNpemUgKTsKK30KKwordm9pZCAqIEZUTl9TVERDQUxMCitGVE5fQUxJR05FRF9NQUxMT0MoIHNpemVfdCBLTVBfREVSRUYgc2l6ZSwgc2l6ZV90IEtNUF9ERVJFRiBhbGlnbm1lbnQgKQoreworICAgIC8vIGttcGNfYWxpZ25lZF9tYWxsb2MgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgcmV0dXJuIGttcGNfYWxpZ25lZF9tYWxsb2MoIEtNUF9ERVJFRiBzaXplLCBLTVBfREVSRUYgYWxpZ25tZW50ICk7Cit9CisKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX0NBTExPQyggc2l6ZV90IEtNUF9ERVJFRiBuZWxlbSwgc2l6ZV90IEtNUF9ERVJFRiBlbHNpemUgKQoreworICAgIC8vIGttcGNfY2FsbG9jIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIHJldHVybiBrbXBjX2NhbGxvYyggS01QX0RFUkVGIG5lbGVtLCBLTVBfREVSRUYgZWxzaXplICk7Cit9CisKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX1JFQUxMT0MoIHZvaWQgKiBLTVBfREVSRUYgcHRyLCBzaXplX3QgS01QX0RFUkVGIHNpemUgKQoreworICAgIC8vIGttcGNfcmVhbGxvYyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICByZXR1cm4ga21wY19yZWFsbG9jKCBLTVBfREVSRUYgcHRyLCBLTVBfREVSRUYgc2l6ZSApOworfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fRlJFRSggdm9pZCAqIEtNUF9ERVJFRiBwdHIgKQoreworICAgIC8vIGRvZXMgbm90aGluZyBpZiB0aGUgbGlicmFyeSBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICBrbXBjX2ZyZWUoIEtNUF9ERVJFRiBwdHIgKTsKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9XQVJOSU5HU19PTiggdm9pZCApCit7CisgICAgI2lmbmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9IGttcF93YXJuaW5nc19leHBsaWNpdDsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9XQVJOSU5HU19PRkYoIHZvaWQgKQoreworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBGQUxTRTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9ERUZBVUxUUyggY2hhciBjb25zdCAqIHN0cgorICAgICNpZm5kZWYgUEFTU19BUkdTX0JZX1ZBTFVFCisgICAgICAgICwgaW50IGxlbgorICAgICNlbmRpZgorKQoreworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAgICAgI2lmZGVmIFBBU1NfQVJHU19CWV9WQUxVRQorICAgICAgICAgICAgaW50IGxlbiA9IChpbnQpS01QX1NUUkxFTiggc3RyICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKCBzdHIsIGxlbiApOworICAgICNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8qIHJldHVybnMgdGhlIHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gKi8KK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX0NBTkNFTExBVElPTikodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87CisjZWxzZQorICAgIC8vIGluaXRpYWxpemUgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfb21wX2NhbmNlbGxhdGlvbjsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUyhpbnQgY2FuY2VsX2tpbmQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICAgIHJldHVybiAwIC8qIGZhbHNlICovOworI2Vsc2UKKyAgICByZXR1cm4gX19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2VsX2tpbmQpOworI2VuZGlmCit9CisKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjaWYgT01QXzQ1X0VOQUJMRUQKKy8qIHJldHVybnMgdGhlIG1heGltdW0gYWxsb3dlZCB0YXNrIHByaW9yaXR5ICovCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfTUFYX1RBU0tfUFJJT1JJVFkoIHZvaWQgKQoreworI2lmZGVmIEtNUF9TVFVCCisgICAgcmV0dXJuIDA7CisjZWxzZQorICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX21heF90YXNrX3ByaW9yaXR5OworI2VuZGlmCit9CisjZW5kaWYKKworLy8gR0NDIGNvbXBhdGliaWxpdHkgKHZlcnNpb25lZCBzeW1ib2xzKQorI2lmZGVmIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKy8qCisgICAgVGhlc2UgZm9sbG93aW5nIHNlY3Rpb25zIGNyZWF0ZSBmdW5jdGlvbiBhbGlhc2VzIChkdW1teSBzeW1ib2xzKSBmb3IgdGhlIG9tcF8qIHJvdXRpbmVzLgorICAgIFRoZXNlIGFsaWFzZXMgd2lsbCB0aGVuIGJlIHZlcnNpb25lZCBhY2NvcmRpbmcgdG8gaG93IGxpYmdvbXAgYGB2ZXJzaW9ucycnIGl0cworICAgIHN5bWJvbHMgKE9NUF8xLjAsIE9NUF8yLjAsIE9NUF8zLjAsIC4uLikgd2hpbGUgYWxzbyByZXRhaW5pbmcgdGhlCisgICAgZGVmYXVsdCB2ZXJzaW9uIHdoaWNoIGxpYm9tcCB1c2VzOiBWRVJTSU9OIChkZWZpbmVkIGluIGV4cG9ydHNfc28udHh0KQorICAgIElmIHlvdSB3YW50IHRvIHNlZSB0aGUgdmVyc2lvbmVkIHN5bWJvbHMgZm9yIGxpYmdvbXAuc28uMSB0aGVuIGp1c3QgdHlwZToKKworICAgIG9iamR1bXAgLVQgL3BhdGgvdG8vbGliZ29tcC5zby4xIHwgZ3JlcCBvbXBfCisKKyAgICBFeGFtcGxlOgorICAgIFN0ZXAgMSkgIENyZWF0ZSBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkc18xMF9hbGlhcworICAgICAgICAgICAgIHdoaWNoIGlzIGFsaWFzIG9mIF9fa21wX2FwaV9vbXBfc2V0X251bV90aHJlYWRzCisgICAgU3RlcCAyKSAgU2V0IF9fa21wX2FwaV9vbXBfc2V0X251bV90aHJlYWRzXzEwX2FsaWFzIHRvIHZlcnNpb246IG9tcF9zZXRfbnVtX3RocmVhZHNAT01QXzEuMAorICAgIFN0ZXAgMkIpIFNldCBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkcyB0byBkZWZhdWx0IHZlcnNpb24gOiBvbXBfc2V0X251bV90aHJlYWRzQEBWRVJTSU9OCisqLworCisvLyBPTVBfMS4wIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fU0VUX05VTV9USFJFQURTLCAgIDEwKTsKK3hhbGlhc2lmeShGVE5fR0VUX05VTV9USFJFQURTLCAgIDEwKTsKK3hhbGlhc2lmeShGVE5fR0VUX01BWF9USFJFQURTLCAgIDEwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1RIUkVBRF9OVU0sICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fR0VUX05VTV9QUk9DUywgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fSU5fUEFSQUxMRUwsICAgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fU0VUX0RZTkFNSUMsICAgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0RZTkFNSUMsICAgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fU0VUX05FU1RFRCwgICAgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fR0VUX05FU1RFRCwgICAgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fSU5JVF9MT0NLLCAgICAgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fSU5JVF9ORVNUX0xPQ0ssICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fREVTVFJPWV9ORVNUX0xPQ0ssIDEwKTsKK3hhbGlhc2lmeShGVE5fU0VUX0xPQ0ssICAgICAgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fU0VUX05FU1RfTE9DSywgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fVU5TRVRfTE9DSywgICAgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fVU5TRVRfTkVTVF9MT0NLLCAgIDEwKTsKK3hhbGlhc2lmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgIDEwKTsKK3hhbGlhc2lmeShGVE5fVEVTVF9ORVNUX0xPQ0ssICAgIDEwKTsKKworLy8gT01QXzIuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX0dFVF9XVElDSywgMjApOworeGFsaWFzaWZ5KEZUTl9HRVRfV1RJTUUsIDIwKTsKKworLy8gT01QXzMuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX1NFVF9TQ0hFRFVMRSwgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9TQ0hFRFVMRSwgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9USFJFQURfTElNSVQsICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUywgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUywgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9MRVZFTCwgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNLCAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9URUFNX1NJWkUsICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9BQ1RJVkVfTEVWRUwsICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTE9DSywgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9MT0NLLCAgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNUX0xPQ0ssICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX05FU1RfTE9DSywgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTE9DSywgICAgICAgICAgICAgICAzMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAgICAgICAzMCk7CisKKy8vIE9NUF8zLjEgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9JTl9GSU5BTCwgMzEpOworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8vIE9NUF80LjAgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9HRVRfUFJPQ19CSU5ELCA0MCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fVEVBTVMsIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1RFQU1fTlVNLCA0MCk7Cit4YWxpYXNpZnkoRlROX0dFVF9DQU5DRUxMQVRJT04sIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0RFRkFVTFRfREVWSUNFLCA0MCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ERUZBVUxUX0RFVklDRSwgNDApOworeGFsaWFzaWZ5KEZUTl9JU19JTklUSUFMX0RFVklDRSwgNDApOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorLy8gT01QXzQuNSBhbGlhc2VzCisjZW5kaWYKKworI2lmIE9NUF81MF9FTkFCTEVECisvLyBPTVBfNS4wIGFsaWFzZXMKKyNlbmRpZgorCisvLyBPTVBfMS4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fU0VUX05VTV9USFJFQURTLCAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fVEhSRUFEUywgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTUFYX1RIUkVBRFMsICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RIUkVBRF9OVU0sICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fUFJPQ1MsICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTl9QQVJBTExFTCwgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX0RZTkFNSUMsICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9EWU5BTUlDLCAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTkVTVEVELCAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05FU1RFRCwgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX05FU1RfTE9DSywgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAxMCwgIk9NUF8xLjAiKTsKKworLy8gT01QXzIuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX0dFVF9XVElDSywgICAgICAgICAyMCwgIk9NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfV1RJTUUsICAgICAgICAgMjAsICJPTVBfMi4wIik7CisKKy8vIE9NUF8zLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfU0NIRURVTEUsICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1NDSEVEVUxFLCAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9USFJFQURfTElNSVQsICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTLCAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTEVWRUwsICAgICAgICAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RFQU1fU0laRSwgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9BQ1RJVkVfTEVWRUwsICAzMCwgIk9NUF8zLjAiKTsKKworLy8gdGhlIGxvY2sgcm91dGluZXMgaGF2ZSBhIDEuMCBhbmQgMy4wIHZlcnNpb24KK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX0xPQ0ssICAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fSU5JVF9ORVNUX0xPQ0ssICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTE9DSywgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9ERVNUUk9ZX05FU1RfTE9DSywgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX0xPQ0ssICAgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9ORVNUX0xPQ0ssICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9MT0NLLCAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fVU5TRVRfTkVTVF9MT0NLLCAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTE9DSywgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9URVNUX05FU1RfTE9DSywgICAgMzAsICJPTVBfMy4wIik7CisKKy8vIE9NUF8zLjEgdmVyc2lvbmVkIHN5bWJvbAoreHZlcnNpb25pZnkoRlROX0lOX0ZJTkFMLCAgICAgICAgICAzMSwgIk9NUF8zLjEiKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisvLyBPTVBfNC4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fR0VUX1BST0NfQklORCwgICAgICA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTlVNX1RFQU1TLCAgICAgIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9URUFNX05VTSwgICAgICAgNDAsICJPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0NBTkNFTExBVElPTiwgICA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UsIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9ERUZBVUxUX0RFVklDRSwgNDAsICJPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShGVE5fSVNfSU5JVElBTF9ERVZJQ0UsICA0MCwgIk9NUF80LjAiKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjaWYgT01QXzQ1X0VOQUJMRUQKKy8vIE9NUF80LjUgdmVyc2lvbmVkIHN5bWJvbHMKKyNlbmRpZgorCisjaWYgT01QXzUwX0VOQUJMRUQKKy8vIE9NUF81LjAgdmVyc2lvbmVkIHN5bWJvbHMKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvL2V4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fZXh0cmEuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fZXh0cmEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2QzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jcHAKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGttcF9mdG5fZXh0cmEuY3BwIC0tIEZvcnRyYW4gJ2V4dHJhJyBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9hZmZpbml0eS5oIgorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTIEtNUF9GVE5fUExBSU4KKyNlbGlmIEtNUF9PU19VTklYCisjICAgZGVmaW5lIEtNUF9GVE5fRU5UUklFUyBLTVBfRlROX0FQUEVORAorI2VuZGlmCisKKy8vIE5vdGU6IFRoaXMgc3RyaW5nIGlzIG5vdCBwcmludGVkIHdoZW4gS01QX1ZFUlNJT049MS4KK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5leHRyYVtdID0gS01QX1ZFUlNJT05fUFJFRklYICJGb3J0cmFuIFwiZXh0cmFcIiBPTVAgc3VwcG9ydDogIgorI2lmZGVmIEtNUF9GVE5fRU5UUklFUworICAgICJ5ZXMiOworIyAgIGRlZmluZSBGVE5fU1REQ0FMTCAvKiBub3RoaW5nIHRvIGRvICovCisjICAgaW5jbHVkZSAia21wX2Z0bl9vcy5oIgorIyAgIGluY2x1ZGUgImttcF9mdG5fZW50cnkuaCIKKyNlbHNlCisgICAgIm5vIjsKKyNlbmRpZiAvKiBLTVBfRlROX0VOVFJJRVMgKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmggYi9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OThhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9vcy5oCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICoga21wX2Z0bl9vcy5oIC0tIEtQVFMgRm9ydHJhbiBkZWZpbmVzIGhlYWRlciBmaWxlLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9GVE5fT1NfSAorI2RlZmluZSBLTVBfRlROX09TX0gKKworLy8gS01QX0ZOVF9FTlRSSUVTIG1heSBiZSBvbmUgb2Y6IEtNUF9GVE5fUExBSU4sIEtNUF9GVE5fVVBQRVIsIEtNUF9GVE5fQVBQRU5ELCBLTVBfRlROX1VBUFBFTkQuCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXh0ZXJuYWwgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9QTEFJTgorCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX3NldF9zdGFja3NpemUKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBrbXBfc2V0X3N0YWNrc2l6ZV9zCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgI2RlZmluZSBGVE5fU0VUX0JMT0NLVElNRSAgICAgICAgICAgICAgICAgICAga21wX3NldF9ibG9ja3RpbWUKKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1NFUklBTCAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAga21wX3NldF9saWJyYXJ5CisgICAgI2RlZmluZSBGVE5fR0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAga21wX2dldF9saWJyYXJ5CisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAga21wX3NldF9kZWZhdWx0cworICAgICNkZWZpbmUgRlROX1NFVF9ESVNQX05VTV9CVUZGRVJTICAgICAgICAgICAgIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfYWZmaW5pdHkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5CisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICNkZWZpbmUgRlROX0NSRUFURV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworICAgICNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICNkZWZpbmUgRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21hbGxvYworICAgICNkZWZpbmUgRlROX0FMSUdORURfTUFMTE9DICAgICAgICAgICAgICAgICAgIGttcF9hbGlnbmVkX21hbGxvYworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jYWxsb2MKKyAgICAjZGVmaW5lIEZUTl9SRUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbGxvYworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9mcmVlCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBrbXBfZ2V0X251bV9rbm93bl90aHJlYWRzCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfc2V0X251bV90aHJlYWRzCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fdGhyZWFkcworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX05VTSAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV9wcm9jcworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfZHluYW1pYworICAgICNkZWZpbmUgRlROX0dFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfZHluYW1pYworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdGVkCisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9uZXN0ZWQKKyAgICAjZGVmaW5lIEZUTl9JTl9QQVJBTExFTCAgICAgICAgICAgICAgICAgICAgICBvbXBfaW5fcGFyYWxsZWwKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfc2NoZWR1bGUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3NjaGVkdWxlCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUNUSVZFX0xFVkVMICAgICAgICAgICAgICAgICBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbGV2ZWwKKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9TSVpFICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9maW5hbAorLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfcHJvY19iaW5kCisgICAgI2RlZmluZSBGVE5fR0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgb21wX2dldF9wcm9jX2JpbmQKKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBvbXBfY3Vycl9wcm9jX2JpbmQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fTlVNICAgICAgICAgICAgICAgICAgICAgb21wX2dldF90ZWFtX251bQorI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbG9jaworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgb21wX2luaXRfbG9ja193aXRoX2hpbnQKKyAgICAjZGVmaW5lIEZUTl9JTklUX05FU1RfTE9DS19XSVRIX0hJTlQgICAgICAgICBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9sb2NrCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9sb2NrCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X2xvY2sKKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0X2xvY2sKKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBvbXBfdW5zZXRfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fVEVTVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgb21wX3Rlc3RfbmVzdF9sb2NrCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBrbXBfc2V0X3dhcm5pbmdzX29uCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICNkZWZpbmUgRlROX0dFVF9XVElNRSAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfd3RpbWUKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aWNrCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX2RldmljZXMKKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0dFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgb21wX2lzX2luaXRpYWxfZGV2aWNlCisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAjZGVmaW5lIEZUTl9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUyAgICAgICAgICBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyNlbmRpZgorCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RBU0tfUFJJT1JJVFkgICAgICAgICAgICBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5CisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9QTEFDRVMgICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fcGxhY2VzCisgICAgI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTV9QUk9DUyAgICAgICAgICAgICAgb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKyAgICAjZGVmaW5lIEZUTl9HRVRfUExBQ0VfUFJPQ19JRFMgICAgICAgICAgICAgICBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzCisgICAgI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTSAgICAgICAgICAgICAgICAgICAgb21wX2dldF9wbGFjZV9udW0KKyAgICAjZGVmaW5lIEZUTl9HRVRfUEFSVElUSU9OX05VTV9QTEFDRVMgICAgICAgICBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzCisgICAgI2RlZmluZSBGVE5fR0VUX1BBUlRJVElPTl9QTEFDRV9OVU1TICAgICAgICAgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcworIyBpZmRlZiBLTVBfU1RVQgorICAgICNkZWZpbmUgRlROX0dFVF9JTklUSUFMX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfQUxMT0MgICAgICAgICAgICAgICAgICAgICBvbXBfdGFyZ2V0X2FsbG9jCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgb21wX3RhcmdldF9mcmVlCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0lTX1BSRVNFTlQgICAgICAgICAgICAgICAgb21wX3RhcmdldF9pc19wcmVzZW50CisgICAgI2RlZmluZSBGVE5fVEFSR0VUX01FTUNQWSAgICAgICAgICAgICAgICAgICAgb21wX3RhcmdldF9tZW1jcHkKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfTUVNQ1BZX1JFQ1QgICAgICAgICAgICAgICBvbXBfdGFyZ2V0X21lbWNweV9yZWN0CisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0FTU09DSUFURV9QVFIgICAgICAgICAgICAgb21wX3RhcmdldF9hc3NvY2lhdGVfcHRyCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0RJU0FTU09DSUFURV9QVFIgICAgICAgICAgb21wX3RhcmdldF9kaXNhc3NvY2lhdGVfcHRyCisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9GVE5fUExBSU4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplX3NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0XworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2xpYnJhcnlfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAga21wX3NldF9kZWZhdWx0c18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRElTUF9OVU1fQlVGRkVSUyAgICAgICAgICAgICBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnNfCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAga21wX3NldF9hZmZpbml0eV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5XworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVhfUFJPQyAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfCisgICAgI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgICAgICAgICAgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXworICAgICNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgICAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18KKworICAgICNkZWZpbmUgRlROX01BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tYWxsb2NfCisgICAgI2RlZmluZSBGVE5fQUxJR05FRF9NQUxMT0MgICAgICAgICAgICAgICAgICAga21wX2FsaWduZWRfbWFsbG9jXworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jYWxsb2NfCisgICAgI2RlZmluZSBGVE5fUkVBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWxsb2NfCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ZyZWVfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBrbXBfZ2V0X251bV9rbm93bl90aHJlYWRzXworCisgICAgI2RlZmluZSBGVE5fU0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX3NldF9udW1fdGhyZWFkc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90aHJlYWRzXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbWF4X3RocmVhZHNfCisgICAgI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9OVU0gICAgICAgICAgICAgICAgICAgb21wX2dldF90aHJlYWRfbnVtXworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3Byb2NzXworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfZHluYW1pY18KKyAgICAjZGVmaW5lIEZUTl9HRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X2R5bmFtaWNfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0ZWRfCisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9uZXN0ZWRfCisgICAgI2RlZmluZSBGVE5fSU5fUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgb21wX2luX3BhcmFsbGVsXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX2xpbWl0XworICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfc2NoZWR1bGVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9zY2hlZHVsZV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfCisgICAgI2RlZmluZSBGVE5fR0VUX0FDVElWRV9MRVZFTCAgICAgICAgICAgICAgICAgb21wX2dldF9hY3RpdmVfbGV2ZWxfCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9sZXZlbF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fU0laRSAgICAgICAgICAgICAgICAgICAgb21wX2dldF90ZWFtX3NpemVfCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luX2ZpbmFsXworLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfcHJvY19iaW5kXworICAgICNkZWZpbmUgRlROX0dFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfcHJvY19iaW5kXworLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIG9tcF9jdXJyX3Byb2NfYmluZF8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3RlYW1zXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX05VTSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9udW1fCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfaW5pdF9sb2NrXworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgb21wX2luaXRfbG9ja193aXRoX2hpbnRfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UICAgICAgICAgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludF8KKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0RFU1RST1lfTE9DSyAgICAgICAgICAgICAgICAgICAgIG9tcF9kZXN0cm95X2xvY2tfCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9sb2NrXworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIG9tcF91bnNldF9sb2NrXworICAgICNkZWZpbmUgRlROX1RFU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgIG9tcF90ZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbmVzdF9sb2NrXworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIG9tcF9kZXN0cm95X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBvbXBfdW5zZXRfbmVzdF9sb2NrXworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF90ZXN0X25lc3RfbG9ja18KKworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PTiAgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb25fCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAga21wX3NldF93YXJuaW5nc19vZmZfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aW1lXworICAgICNkZWZpbmUgRlROX0dFVF9XVElDSyAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfd3RpY2tfCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX2RldmljZXNfCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlXworICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2VfCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgb21wX2lzX2luaXRpYWxfZGV2aWNlXworI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgb21wX2dldF9jYW5jZWxsYXRpb25fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXworI2VuZGlmCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEFTS19QUklPUklUWSAgICAgICAgICAgIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHlfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9QTEFDRVMgICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fcGxhY2VzXworICAgICNkZWZpbmUgRlROX0dFVF9QTEFDRV9OVU1fUFJPQ1MgICAgICAgICAgICAgIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzXworICAgICNkZWZpbmUgRlROX0dFVF9QTEFDRV9QUk9DX0lEUyAgICAgICAgICAgICAgIG9tcF9nZXRfcGxhY2VfcHJvY19pZHNfCisgICAgI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTSAgICAgICAgICAgICAgICAgICAgb21wX2dldF9wbGFjZV9udW1fCisgICAgI2RlZmluZSBGVE5fR0VUX1BBUlRJVElPTl9OVU1fUExBQ0VTICAgICAgICAgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfUEFSVElUSU9OX1BMQUNFX05VTVMgICAgICAgICBvbXBfZ2V0X3BhcnRpdGlvbl9wbGFjZV9udW1zXworIyBpZmRlZiBLTVBfU1RVQgorICAgICNkZWZpbmUgRlROX0dFVF9JTklUSUFMX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2VfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgb21wX3RhcmdldF9hbGxvY18KKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfRlJFRSAgICAgICAgICAgICAgICAgICAgICBvbXBfdGFyZ2V0X2ZyZWVfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0lTX1BSRVNFTlQgICAgICAgICAgICAgICAgb21wX3RhcmdldF9pc19wcmVzZW50XworICAgICNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFkgICAgICAgICAgICAgICAgICAgIG9tcF90YXJnZXRfbWVtY3B5XworICAgICNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFlfUkVDVCAgICAgICAgICAgICAgIG9tcF90YXJnZXRfbWVtY3B5X3JlY3RfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0FTU09DSUFURV9QVFIgICAgICAgICAgICAgb21wX3RhcmdldF9hc3NvY2lhdGVfcHRyXworICAgICNkZWZpbmUgRlROX1RBUkdFVF9ESVNBU1NPQ0lBVEVfUFRSICAgICAgICAgIG9tcF90YXJnZXRfZGlzYXNzb2NpYXRlX3B0cl8KKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9BUFBFTkQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9VUFBFUgorCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9TVEFDS1NJWkUKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBLTVBfU0VUX1NUQUNLU0laRV9TCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRV9TCisgICAgI2RlZmluZSBGVE5fU0VUX0JMT0NLVElNRSAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9CTE9DS1RJTUUKKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0JMT0NLVElNRQorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1NFUklBTCAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9TRVJJQUwKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EICAgICAgICAgICBLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZCisgICAgI2RlZmluZSBGVE5fR0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9MSUJSQVJZCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9ERUZBVUxUUworICAgICNkZWZpbmUgRlROX1NFVF9ESVNQX05VTV9CVUZGRVJTICAgICAgICAgICAgIEtNUF9TRVRfRElTUF9OVU1fQlVGRkVSUworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQworICAgICNkZWZpbmUgRlROX0NSRUFURV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgIEtNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSworICAgICNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgIEtNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0sKKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQworICAgICNkZWZpbmUgRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgIEtNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01BTExPQworICAgICNkZWZpbmUgRlROX0FMSUdORURfTUFMTE9DICAgICAgICAgICAgICAgICAgIEtNUF9BTElHTkVEX01BTExPQworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DQUxMT0MKKyAgICAjZGVmaW5lIEZUTl9SRUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfUkVBTExPQworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9GUkVFCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBLTVBfR0VUX05VTV9LTk9XTl9USFJFQURTCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfU0VUX05VTV9USFJFQURTCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fVEhSRUFEUworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RIUkVBRFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX05VTSAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9OVU0KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9QUk9DUworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfRFlOQU1JQworICAgICNkZWZpbmUgRlROX0dFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfRFlOQU1JQworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTkVTVEVECisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9ORVNURUQKKyAgICAjZGVmaW5lIEZUTl9JTl9QQVJBTExFTCAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5fUEFSQUxMRUwKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9MSU1JVAorICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfU0NIRURVTEUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1NDSEVEVUxFCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIE9NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUNUSVZFX0xFVkVMICAgICAgICAgICAgICAgICBPTVBfR0VUX0FDVElWRV9MRVZFTAorICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTEVWRUwKKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9TSVpFICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RFQU1fU0laRQorICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9GSU5BTAorLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfUFJPQ19CSU5ECisgICAgI2RlZmluZSBGVE5fR0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9QUk9DX0JJTkQKKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBPTVBfQ1VSUl9QUk9DX0JJTkQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1RFQU1TCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fTlVNICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9URUFNX05VTQorI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTE9DSworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS19XSVRIX0hJTlQKKyAgICAjZGVmaW5lIEZUTl9JTklUX05FU1RfTE9DS19XSVRIX0hJTlQgICAgICAgICBPTVBfSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBPTVBfREVTVFJPWV9MT0NLCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgT01QX1VOU0VUX0xPQ0sKKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfVEVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgT01QX0RFU1RST1lfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNUX0xPQ0sKKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVEVTVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX1RFU1RfTkVTVF9MT0NLCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBLTVBfU0VUX1dBUk5JTkdTX09OCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PRkYKKworICAgICNkZWZpbmUgRlROX0dFVF9XVElNRSAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfV1RJTUUKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSUNLCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX0RFVklDRVMKKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0dFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9HRVRfREVGQVVMVF9ERVZJQ0UKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfU0VUX0RFRkFVTFRfREVWSUNFCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgT01QX0lTX0lOSVRJQUxfREVWSUNFCisjZW5kaWYKKworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfQ0FOQ0VMTEFUSU9OICAgICAgICAgICAgICAgICBPTVBfR0VUX0NBTkNFTExBVElPTgorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTICAgICAgICAgIEtNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUworI2VuZGlmCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEFTS19QUklPUklUWSAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RBU0tfUFJJT1JJVFkKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BMQUNFUyAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9QTEFDRVMKKyAgICAjZGVmaW5lIEZUTl9HRVRfUExBQ0VfTlVNX1BST0NTICAgICAgICAgICAgICBPTVBfR0VUX1BMQUNFX05VTV9QUk9DUworICAgICNkZWZpbmUgRlROX0dFVF9QTEFDRV9QUk9DX0lEUyAgICAgICAgICAgICAgIE9NUF9HRVRfUExBQ0VfUFJPQ19JRFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfUExBQ0VfTlVNICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1BMQUNFX05VTQorICAgICNkZWZpbmUgRlROX0dFVF9QQVJUSVRJT05fTlVNX1BMQUNFUyAgICAgICAgIE9NUF9HRVRfUEFSVElUSU9OX05VTV9QTEFDRVMKKyAgICAjZGVmaW5lIEZUTl9HRVRfUEFSVElUSU9OX1BMQUNFX05VTVMgICAgICAgICBPTVBfR0VUX1BBUlRJVElPTl9QTEFDRV9OVU1TCisjIGlmZGVmIEtNUF9TVFVCCisgICAgI2RlZmluZSBGVE5fR0VUX0lOSVRJQUxfREVWSUNFICAgICAgICAgICAgICAgT01QX0dFVF9JTklUSUFMX0RFVklDRQorICAgICNkZWZpbmUgRlROX1RBUkdFVF9BTExPQyAgICAgICAgICAgICAgICAgICAgIE9NUF9UQVJHRVRfQUxMT0MKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfRlJFRSAgICAgICAgICAgICAgICAgICAgICBPTVBfVEFSR0VUX0ZSRUUKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfSVNfUFJFU0VOVCAgICAgICAgICAgICAgICBPTVBfVEFSR0VUX0lTX1BSRVNFTlQKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfTUVNQ1BZICAgICAgICAgICAgICAgICAgICBPTVBfVEFSR0VUX01FTUNQWQorICAgICNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFlfUkVDVCAgICAgICAgICAgICAgIE9NUF9UQVJHRVRfTUVNQ1BZX1JFQ1QKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfQVNTT0NJQVRFX1BUUiAgICAgICAgICAgICBPTVBfVEFSR0VUX0FTU09DSUFURV9QVFIKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfRElTQVNTT0NJQVRFX1BUUiAgICAgICAgICBPTVBfVEFSR0VUX0RJU0FTU09DSUFURV9QVFIKKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9VUFBFUiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VBUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFX1NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkVfU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0JMT0NLVElNRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0JMT0NLVElNRV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBLTVBfU0VUX0xJQlJBUllfU0VSSUFMXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0xJQlJBUllfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9ERUZBVUxUU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRElTUF9OVU1fQlVGRkVSUyAgICAgICAgICAgICBLTVBfU0VUX0RJU1BfTlVNX0JVRkZFUlNfCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9BRkZJTklUWV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVhfUFJPQyAgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0NfCisgICAgI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgICAgICAgICAgICAgS01QX0NSRUFURV9BRkZJTklUWV9NQVNLXworICAgICNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgIEtNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0tfCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgICAgS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0NfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQ18KKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQ18KKworICAgICNkZWZpbmUgRlROX01BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NQUxMT0NfCisgICAgI2RlZmluZSBGVE5fQUxJR05FRF9NQUxMT0MgICAgICAgICAgICAgICAgICAgS01QX0FMSUdORURfTUFMTE9DXworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DQUxMT0NfCisgICAgI2RlZmluZSBGVE5fUkVBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1JFQUxMT0NfCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0ZSRUVfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBLTVBfR0VUX05VTV9LTk9XTl9USFJFQURTXworCisgICAgI2RlZmluZSBGVE5fU0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX1NFVF9OVU1fVEhSRUFEU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9USFJFQURTXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RIUkVBRFNfCisgICAgI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9OVU0gICAgICAgICAgICAgICAgICAgT01QX0dFVF9USFJFQURfTlVNXworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1BST0NTXworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfRFlOQU1JQ18KKyAgICAjZGVmaW5lIEZUTl9HRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX0RZTkFNSUNfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNURURfCisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9ORVNURURfCisgICAgI2RlZmluZSBGVE5fSU5fUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX1BBUkFMTEVMXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX0xJTUlUXworICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfU0NIRURVTEVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9TQ0hFRFVMRV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIE9NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFNfCisgICAgI2RlZmluZSBGVE5fR0VUX0FDVElWRV9MRVZFTCAgICAgICAgICAgICAgICAgT01QX0dFVF9BQ1RJVkVfTEVWRUxfCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9MRVZFTF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU1fCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fU0laRSAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9URUFNX1NJWkVfCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX0ZJTkFMXworLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfUFJPQ19CSU5EXworICAgICNkZWZpbmUgRlROX0dFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfUFJPQ19CSU5EXworLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIE9NUF9DVVJSX1BST0NfQklORF8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1RFQU1TXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX05VTSAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEVBTV9OVU1fCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5JVF9MT0NLXworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS19XSVRIX0hJTlRfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLX1dJVEhfSElOVF8KKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0RFU1RST1lfTE9DSyAgICAgICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9MT0NLXworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIE9NUF9VTlNFVF9MT0NLXworICAgICNkZWZpbmUgRlROX1RFU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTkVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX05FU1RfTE9DS18KKworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PTiAgICAgICAgICAgICAgICAgIEtNUF9TRVRfV0FSTklOR1NfT05fCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PRkZfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSU1FXworICAgICNkZWZpbmUgRlROX0dFVF9XVElDSyAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfV1RJQ0tfCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX0RFVklDRVNfCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfR0VUX0RFRkFVTFRfREVWSUNFXworICAgICNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9TRVRfREVGQVVMVF9ERVZJQ0VfCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgT01QX0lTX0lOSVRJQUxfREVWSUNFXworI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgT01QX0dFVF9DQU5DRUxMQVRJT05fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAgS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTXworI2VuZGlmCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEFTS19QUklPUklUWSAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RBU0tfUFJJT1JJVFlfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9QTEFDRVMgICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fUExBQ0VTXworICAgICNkZWZpbmUgRlROX0dFVF9QTEFDRV9OVU1fUFJPQ1MgICAgICAgICAgICAgIE9NUF9HRVRfUExBQ0VfTlVNX1BST0NTXworICAgICNkZWZpbmUgRlROX0dFVF9QTEFDRV9QUk9DX0lEUyAgICAgICAgICAgICAgIE9NUF9HRVRfUExBQ0VfUFJPQ19JRFNfCisgICAgI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTSAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9QTEFDRV9OVU1fCisgICAgI2RlZmluZSBGVE5fR0VUX1BBUlRJVElPTl9OVU1fUExBQ0VTICAgICAgICAgT01QX0dFVF9QQVJUSVRJT05fTlVNX1BMQUNFU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfUEFSVElUSU9OX1BMQUNFX05VTVMgICAgICAgICBPTVBfR0VUX1BBUlRJVElPTl9QTEFDRV9OVU1TXworIyBpZmRlZiBLTVBfU1RVQgorICAgICNkZWZpbmUgRlROX0dFVF9JTklUSUFMX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9HRVRfSU5JVElBTF9ERVZJQ0VfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgT01QX1RBUkdFVF9BTExPQ18KKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfRlJFRSAgICAgICAgICAgICAgICAgICAgICBPTVBfVEFSR0VUX0ZSRUVfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0lTX1BSRVNFTlQgICAgICAgICAgICAgICAgT01QX1RBUkdFVF9JU19QUkVTRU5UXworICAgICNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFkgICAgICAgICAgICAgICAgICAgIE9NUF9UQVJHRVRfTUVNQ1BZXworICAgICNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFlfUkVDVCAgICAgICAgICAgICAgIE9NUF9UQVJHRVRfTUVNQ1BZX1JFQ1RfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0FTU09DSUFURV9QVFIgICAgICAgICAgICAgT01QX1RBUkdFVF9BU1NPQ0lBVEVfUFRSXworICAgICNkZWZpbmUgRlROX1RBUkdFVF9ESVNBU1NPQ0lBVEVfUFRSICAgICAgICAgIE9NUF9UQVJHRVRfRElTQVNTT0NJQVRFX1BUUl8KKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9VQVBQRU5EICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR09NUCBBUEkgTkFNRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBBbGwgR09NUF8xLjAgc3ltYm9scworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5EICAgICAgICAgICAgICAgICAgIEdPTVBfYXRvbWljX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQgICAgICAgICAgICAgICAgIEdPTVBfYXRvbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVIgICAgICAgICAgICAgICAgICAgICAgR09NUF9iYXJyaWVyCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCAgICAgICAgICAgICAgICAgR09NUF9jcml0aWNhbF9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9FTkQgICAgICAgICAgICBHT01QX2NyaXRpY2FsX25hbWVfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQgICAgICAgICAgR09NUF9jcml0aWNhbF9uYW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX1NUQVJUICAgICAgICAgICAgICAgR09NUF9jcml0aWNhbF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfTkVYVCAgICAgICAgICAgIEdPTVBfbG9vcF9keW5hbWljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX1NUQVJUICAgICAgICAgICBHT01QX2xvb3BfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCAgICAgICAgICAgICAgICAgICAgIEdPTVBfbG9vcF9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfTk9XQUlUICAgICAgICAgICAgICBHT01QX2xvb3BfZW5kX25vd2FpdAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9ORVhUICAgICAgICAgICAgIEdPTVBfbG9vcF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCAgICAgICAgICAgIEdPTVBfbG9vcF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfTkVYVCAgICBHT01QX2xvb3Bfb3JkZXJlZF9keW5hbWljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQgICBHT01QX2xvb3Bfb3JkZXJlZF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCAgICAgR09NUF9sb29wX29yZGVyZWRfZ3VpZGVkX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9TVEFSVCAgICBHT01QX2xvb3Bfb3JkZXJlZF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfTkVYVCAgICBHT01QX2xvb3Bfb3JkZXJlZF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQgICBHT01QX2xvb3Bfb3JkZXJlZF9ydW50aW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfTkVYVCAgICAgR09NUF9sb29wX29yZGVyZWRfc3RhdGljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19TVEFSVCAgICBHT01QX2xvb3Bfb3JkZXJlZF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX05FWFQgICAgICAgICAgICBHT01QX2xvb3BfcnVudGltZV9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9TVEFSVCAgICAgICAgICAgR09NUF9sb29wX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfTkVYVCAgICAgICAgICAgICBHT01QX2xvb3Bfc3RhdGljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfU1RBUlQgICAgICAgICAgICBHT01QX2xvb3Bfc3RhdGljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfRU5EICAgICAgICAgICAgICAgICAgR09NUF9vcmRlcmVkX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX1NUQVJUICAgICAgICAgICAgICAgIEdPTVBfb3JkZXJlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQgICAgICAgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQ19TVEFSVCAgR09NUF9wYXJhbGxlbF9sb29wX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERURfU1RBUlQgICBHT01QX3BhcmFsbGVsX2xvb3BfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCAgR09NUF9wYXJhbGxlbF9sb29wX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUNfU1RBUlQgICBHT01QX3BhcmFsbGVsX2xvb3Bfc3RhdGljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TX1NUQVJUICAgICAgR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TVEFSVCAgICAgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EICAgICAgICAgICAgICAgICBHT01QX3NlY3Rpb25zX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfTk9XQUlUICAgICAgICAgIEdPTVBfc2VjdGlvbnNfZW5kX25vd2FpdAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19ORVhUICAgICAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19TVEFSVCAgICAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfRU5EICAgICAgICAgICAgICBHT01QX3NpbmdsZV9jb3B5X2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9TVEFSVCAgICAgICAgICAgIEdPTVBfc2luZ2xlX2NvcHlfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX1NUQVJUICAgICAgICAgICAgICAgICBHT01QX3NpbmdsZV9zdGFydAorCisvLyBBbGwgR09NUF8yLjAgc3ltYm9scworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXNrCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlUICAgICAgICAgICAgICAgICAgICAgICBHT01QX3Rhc2t3YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfTkVYVCAgICAgICAgICBHT01QX2xvb3BfdWxsX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX1NUQVJUICAgICAgICAgR09NUF9sb29wX3VsbF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhUICAgICAgICAgICBHT01QX2xvb3BfdWxsX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9TVEFSVCAgICAgICAgICBHT01QX2xvb3BfdWxsX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfTkVYVCAgR09NUF9sb29wX3VsbF9vcmRlcmVkX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQgR09NUF9sb29wX3VsbF9vcmRlcmVkX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfTkVYVCAgIEdPTVBfbG9vcF91bGxfb3JkZXJlZF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9TVEFSVCAgR09NUF9sb29wX3VsbF9vcmRlcmVkX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCAgR09NUF9sb29wX3VsbF9vcmRlcmVkX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQgR09NUF9sb29wX3VsbF9vcmRlcmVkX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfTkVYVCAgIEdPTVBfbG9vcF91bGxfb3JkZXJlZF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCAgR09NUF9sb29wX3VsbF9vcmRlcmVkX3N0YXRpY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX05FWFQgICAgICAgICAgR09NUF9sb29wX3VsbF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9TVEFSVCAgICAgICAgIEdPTVBfbG9vcF91bGxfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCAgICAgICAgICAgR09NUF9sb29wX3VsbF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQgICAgICAgICAgR09NUF9sb29wX3VsbF9zdGF0aWNfc3RhcnQKKworLy8gQWxsIEdPTVBfMy4wIHN5bWJvbHMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS1lJRUxEICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFza3lpZWxkCisKKy8vIEFsbCBHT01QXzQuMCBzeW1ib2xzCisvLyBUT0RPOiBBcyBvZiAyMDEzLTEwLTE0LCBub25lIG9mIHRoZSBHT01QXzQuMCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGluIGxpYm9tcAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSX0NBTkNFTCAgICAgICAgICAgICAgICAgR09NUF9iYXJyaWVyX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF9jYW5jZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5UICAgICAgICAgICAgIEdPTVBfY2FuY2VsbGF0aW9uX3BvaW50CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX0NBTkNFTCAgICAgICAgICAgICAgICBHT01QX2xvb3BfZW5kX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMgICAgICAgICAgR09NUF9wYXJhbGxlbF9sb29wX2R5bmFtaWMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERUQgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ydW50aW1lCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDICAgICAgICAgICBHT01QX3BhcmFsbGVsX2xvb3Bfc3RhdGljCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TICAgICAgICAgICAgICBHT01QX3BhcmFsbGVsX3NlY3Rpb25zCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgICBHT01QX3BhcmFsbGVsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9DQU5DRUwgICAgICAgICAgICBHT01QX3NlY3Rpb25zX2VuZF9jYW5jZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJUICAgICAgICAgICAgICAgIEdPTVBfdGFza2dyb3VwX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQgICAgICAgICAgICAgICAgICBHT01QX3Rhc2tncm91cF9lbmQKKy8qIFRhcmdldCBmdW5jdGlvbnMgc2hvdWxkIGJlIHRha2VuIGNhcmUgb2YgYnkgbGlib2ZmbG9hZCAqLworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVJHRVQgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXJnZXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0RBVEEgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X2RhdGEKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0VORF9EQVRBICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X2VuZF9kYXRhCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUgICAgICAgICAgICAgICAgICBHT01QX3RhcmdldF91cGRhdGUKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEVBTVMgICAgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGVhbXMKKworI2lmZGVmIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisgICAgI2RlZmluZSB4c3RyKHgpIHN0cih4KQorICAgICNkZWZpbmUgc3RyKHgpICN4CisKKyAgICAvLyBJZiBMaW51eCwgeGV4cGFuZCBwcmVwZW5kcyBfX2ttcF9hcGlfIHRvIHRoZSByZWFsIEFQSSBuYW1lCisgICAgI2RlZmluZSB4ZXhwYW5kKGFwaV9uYW1lKSBleHBhbmQoYXBpX25hbWUpCisgICAgI2RlZmluZSBleHBhbmQoYXBpX25hbWUpIF9fa21wX2FwaV8jI2FwaV9uYW1lCisKKyAgICAjZGVmaW5lIHhhbGlhc2lmeShhcGlfbmFtZSx2ZXIpIGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikKKyAgICAjZGVmaW5lIGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikgX190eXBlb2ZfXyhfX2ttcF9hcGlfIyNhcGlfbmFtZSkgX19rbXBfYXBpXyMjYXBpX25hbWUjI18jI3ZlciMjX2FsaWFzIF9fYXR0cmlidXRlX18oKGFsaWFzKHhzdHIoX19rbXBfYXBpXyMjYXBpX25hbWUpKSkpCisKKyAgICAjZGVmaW5lIHh2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIpIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgIlZFUlNJT04iKQorICAgICNkZWZpbmUgdmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyLCBkZWZhdWx0X3ZlcikgXAorICAgIF9fYXNtX18oIi5zeW12ZXIgIiB4c3RyKF9fa21wX2FwaV8jI2FwaV9uYW1lIyNfIyN2ZXJzaW9uX251bSMjX2FsaWFzKSAiLCIgeHN0cihhcGlfbmFtZSkgIkAiIHZlcnNpb25fc3RyICJcblx0Iik7IFwKKyAgICBfX2FzbV9fKCIuc3ltdmVyICIgeHN0cihfX2ttcF9hcGlfIyNhcGlfbmFtZSkgIiwiIHhzdHIoYXBpX25hbWUpICJAQCIgZGVmYXVsdF92ZXIgIlxuXHQiKQorCisjZWxzZSAvLyBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworICAgICNkZWZpbmUgeHN0cih4KSAvKiBOb3RoaW5nICovCisgICAgI2RlZmluZSBzdHIoeCkgIC8qIE5vdGhpbmcgKi8KKworICAgIC8vIGlmIFdpbmRvd3Mgb3IgTWFjLCB4ZXhwYW5kIGRvZXMgbm8gbmFtZSB0cmFuc2Zvcm1hdGlvbgorICAgICNkZWZpbmUgeGV4cGFuZChhcGlfbmFtZSkgZXhwYW5kKGFwaV9uYW1lKQorICAgICNkZWZpbmUgZXhwYW5kKGFwaV9uYW1lKSBhcGlfbmFtZQorCisgICAgI2RlZmluZSB4YWxpYXNpZnkoYXBpX25hbWUsdmVyKSAvKiBOb3RoaW5nICovCisgICAgI2RlZmluZSBhbGlhc2lmeShhcGlfbmFtZSx2ZXIpICAvKiBOb3RoaW5nICovCisKKyAgICAjZGVmaW5lIHh2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIpIC8qIE5vdGhpbmcgKi8KKyAgICAjZGVmaW5lIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgZGVmYXVsdF92ZXIpIC8qIE5vdGhpbmcgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKyNlbmRpZiAvKiBLTVBfRlROX09TX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9zdGRjYWxsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWYwNGRlCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jcHAKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIGttcF9mdG5fc3RkY2FsbC5jcHAgLS0gRm9ydHJhbiBfX3N0ZGNhbGwgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bnN0ZGNhbGxbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiRm9ydHJhbiBfX3N0ZGNhbGwgT01QIHN1cHBvcnQ6ICIKKyNpZmRlZiBVU0VfRlROX1NURENBTEwKKyAgICAieWVzIjsKKyNlbHNlCisgICAgIm5vIjsKKyNlbmRpZgorCisjaWZkZWYgVVNFX0ZUTl9TVERDQUxMCisKKyNkZWZpbmUgRlROX1NURENBTEwgCUtNUF9TVERDQUxMCisjZGVmaW5lIEtNUF9GVE5fRU5UUklFUwlVU0VfRlROX1NURENBTEwKKworI2luY2x1ZGUgImttcF9mdG5fb3MuaCIKKyNpbmNsdWRlICJrbXBfZnRuX2VudHJ5LmgiCisKKyNlbmRpZiAvKiBVU0VfRlROX1NURENBTEwgKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9nbG9iYWwuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9nbG9iYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzNmODcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2dsb2JhbC5jcHAKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBrbXBfZ2xvYmFsLmNwcCAtLSBLUFRTIGdsb2JhbCB2YXJpYWJsZXMgZm9yIHJ1bnRpbWUgc3VwcG9ydCBsaWJyYXJ5CisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYWZmaW5pdHkuaCIKKwora21wX2tleV90IF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXk7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CitrbXBfY3B1aW5mb190ICAgX19rbXBfY3B1aW5mbyA9IHsgMCB9OyAvLyBOb3QgaW5pdGlhbGl6ZWQKKyNlbmRpZgorCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKy8vIGxvY2sgZm9yIG1vZGlmeWluZyB0aGUgZ2xvYmFsIF9fa21wX3N0YXRzX2xpc3QKK2ttcF90YXNfbG9ja190IF9fa21wX3N0YXRzX2xvY2s7CisKKy8vIGdsb2JhbCBsaXN0IG9mIHBlciB0aHJlYWQgc3RhdHMsIHRoZSBoZWFkIGlzIGEgc2VudGluZWwgbm9kZSB3aGljaCBhY2N1bXVsYXRlcyBhbGwgc3RhdHMgcHJvZHVjZWQgYmVmb3JlIF9fa21wX2NyZWF0ZV93b3JrZXIgaXMgY2FsbGVkLgora21wX3N0YXRzX2xpc3QqIF9fa21wX3N0YXRzX2xpc3Q7CisKKy8vIHRocmVhZCBsb2NhbCBwb2ludGVyIHRvIHN0YXRzIG5vZGUgd2l0aGluIGxpc3QKK19fdGhyZWFkIGttcF9zdGF0c19saXN0KiBfX2ttcF9zdGF0c190aHJlYWRfcHRyID0gTlVMTDsKKworLy8gZ2l2ZXMgcmVmZXJlbmNlIHRpY2sgZm9yIGFsbCBldmVudHMgKGNvbnNpZGVyZWQgdGhlIDAgdGljaykKK3RzY190aWNrX2NvdW50IF9fa21wX3N0YXRzX3N0YXJ0X3RpbWU7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIElOSVRJQUxJWkFUSU9OIFZBUklBQkxFUyAqLworLyogdGhleSBhcmUgc3luY3Jvbml6ZWQgdG8gd3JpdGUgZHVyaW5nIGluaXQsIGJ1dCByZWFkIGFueXRpbWUgKi8KK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9zZXJpYWwgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfZ3RpZCAgICAgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X2NvbW1vbiAgICAgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9taWRkbGUgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfcGFyYWxsZWwgICA9IEZBTFNFOworI2lmIEtNUF9VU0VfTU9OSVRPUgordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X21vbml0b3IgICAgPSAwOyAgLyogMSAtIGxhdW5jaGVkLCAyIC0gYWN0dWFsbHkgc3RhcnRlZCAoV2luZG93cyogT1Mgb25seSkgKi8KKyNlbmRpZgordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja3MgPSBGQUxTRTsKKworLyogbGlzdCBvZiBhZGRyZXNzIG9mIGFsbG9jYXRlZCBjYWNoZXMgZm9yIGNvbW1vbnMgKi8KK2ttcF9jYWNoZWRfYWRkcl90ICAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ID0gTlVMTDsKKworaW50ICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2NvdW50ZXIgID0gMDsKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfcm9vdF9jb3VudGVyICA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX3ZlcnNpb24gICAgICAgPSAwOworCit2b2xhdGlsZSBrbXBfdWludDMyIF9fa21wX3RlYW1fY291bnRlciAgPSAwOwordm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90YXNrX2NvdW50ZXIgID0gMDsKKwordW5zaWduZWQgaW50IF9fa21wX2luaXRfd2FpdCA9IEtNUF9ERUZBVUxUX0lOSVRfV0FJVDsgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KK3Vuc2lnbmVkIGludCBfX2ttcF9uZXh0X3dhaXQgPSBLTVBfREVGQVVMVF9ORVhUX1dBSVQ7ICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisKK3NpemVfdCAgICAgIF9fa21wX3N0a3NpemUgICAgICAgICA9IEtNUF9ERUZBVUxUX1NUS1NJWkU7CisjaWYgS01QX1VTRV9NT05JVE9SCitzaXplX3QgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSAwOyAgLy8gYXV0byBhZGp1c3QKKyNlbmRpZgorc2l6ZV90ICAgICAgX19rbXBfc3Rrb2Zmc2V0ICAgICAgID0gS01QX0RFRkFVTFRfU1RLT0ZGU0VUOworaW50ICAgICAgICAgX19rbXBfc3RrcGFkZGluZyAgICAgID0gS01QX01JTl9TVEtQQURESU5HOworCitzaXplX3QgICAgX19rbXBfbWFsbG9jX3Bvb2xfaW5jciAgPSBLTVBfREVGQVVMVF9NQUxMT0NfUE9PTF9JTkNSOworCisvKiBCYXJyaWVyIG1ldGhvZCBkZWZhdWx0cywgc2V0dGluZ3MsIGFuZCBzdHJpbmdzICovCisvKiBicmFuY2ggZmFjdG9yID0gMl5icmFuY2hfYml0cyAob25seSByZWxldmFudCBmb3IgdHJlZSBhbmQgaHlwZXIgYmFycmllciB0eXBlcykgKi8KKyNpZiBLTVBfQVJDSF9YODZfNjQKK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdCAgICAgID0gMjsgIC8qIGJyYW5jaF9mYWN0b3IgPSA0ICovIC8qIGh5cGVyMjogQzc4OTgwICovCitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0ICAgICA9IDI7ICAvKiBicmFuY2hfZmFjdG9yID0gNCAqLyAvKiBoeXBlcjI6IEM3ODk4MCAqLworI2Vsc2UKK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdCAgICAgID0gMjsgIC8qIGJyYW5jaF9mYWN0b3IgPSA0ICovIC8qIGNvbW11bmljYXRpb24gaW4gY29yZSBmb3IgTUlDICovCitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0ICAgICA9IDI7ICAvKiBicmFuY2hfZmFjdG9yID0gNCAqLyAvKiBjb21tdW5pY2F0aW9uIGluIGNvcmUgZm9yIE1JQyAqLworI2VuZGlmIC8vIEtNUF9BUkNIX1g4Nl82NAorI2lmIEtNUF9BUkNIX1g4Nl82NAora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdCAgPSBicF9oeXBlcl9iYXI7ICAvKiBoeXBlcjI6IEM3ODk4MCAqLwora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0X2RmbHQgPSBicF9oeXBlcl9iYXI7ICAvKiBoeXBlcjI6IEM3ODk4MCAqLworI2Vsc2UKK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0X2RmbHQgID0gYnBfbGluZWFyX2JhcjsKK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdF9kZmx0ID0gYnBfbGluZWFyX2JhcjsKKyNlbmRpZgora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyAgWyBic19sYXN0X2JhcnJpZXIgXSA9IHsgMCB9Owora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBic19sYXN0X2JhcnJpZXIgXSA9IHsgMCB9Owora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuICAgWyBic19sYXN0X2JhcnJpZXIgXSA9IHsgYnBfbGluZWFyX2JhciB9Owora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVybiAgWyBic19sYXN0X2JhcnJpZXIgXSA9IHsgYnBfbGluZWFyX2JhciB9OworY2hhciBjb25zdCAqX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lIFsgYnNfbGFzdF9iYXJyaWVyIF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIktNUF9QTEFJTl9CQVJSSUVSIiwgIktNUF9GT1JLSk9JTl9CQVJSSUVSIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIktNUF9SRURVQ1RJT05fQkFSUklFUiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NoYXIgY29uc3QgKl9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZSAgICBbIGJzX2xhc3RfYmFycmllciBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICJLTVBfUExBSU5fQkFSUklFUl9QQVRURVJOIiwgIktNUF9GT1JLSk9JTl9CQVJSSUVSX1BBVFRFUk4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiS01QX1JFRFVDVElPTl9CQVJSSUVSX1BBVFRFUk4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZSAgICAgICAgICAgWyBic19sYXN0X2JhcnJpZXIgXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAicGxhaW4iLCAiZm9ya2pvaW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAicmVkdWN0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY2hhciBjb25zdCAqX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbYnBfbGFzdF9iYXJdID0geyJsaW5lYXIiLCJ0cmVlIiwiaHlwZXIiLCJoaWVyYXJjaGljYWwifTsKKworaW50ICAgICAgIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQgPSAwOworc2l6ZV90ICAgIF9fa21wX2FsaWduX2FsbG9jID0gQ0FDSEVfTElORTsKKworCitpbnQgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0ga21wX3dhcm5pbmdzX2xvdzsKK2ludCAgICAgICAgICBfX2ttcF9yZXNlcnZlX3dhcm4gPSAwOworaW50ICAgICAgICAgICAgICAgICBfX2ttcF94cHJvYyA9IDA7CitpbnQgICAgICAgICAgICBfX2ttcF9hdmFpbF9wcm9jID0gMDsKK3NpemVfdCAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUgPSBLTVBfTUlOX1NUS1NJWkU7CitpbnQgICAgICAgICAgIF9fa21wX3N5c19tYXhfbnRoID0gS01QX01BWF9OVEg7CitpbnQgICAgICAgICAgICAgICBfX2ttcF9tYXhfbnRoID0gMDsKK2ludCAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSAwOworaW50ICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IDA7CitpbnQgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gMDsKK2ludCAgICAgICAgICAgX19rbXBfdHBfY2FwYWNpdHkgPSAwOworaW50ICAgICAgICAgICAgIF9fa21wX3RwX2NhY2hlZCA9IDA7CitpbnQgICAgICAgICAgIF9fa21wX2RmbHRfbmVzdGVkID0gRkFMU0U7CitpbnQgIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzID0gS01QX0RGTFRfRElTUF9OVU1fQlVGRjsKK2ludCBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzID0gS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUOyAvKiBtYXhfYWN0aXZlX2xldmVscyBsaW1pdCAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCitpbnQgX19rbXBfaG90X3RlYW1zX21vZGUgICAgICAgICA9IDA7IC8qIDAgLSBmcmVlIGV4dHJhIHRocmVhZHMgd2hlbiByZWR1Y2VkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgLSBrZWVwIGV4dHJhIHRocmVhZHMgd2hlbiByZWR1Y2VkICovCitpbnQgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCAgICA9IDE7IC8qIG5lc3RpbmcgbGV2ZWwgb2YgaG90IHRlYW1zICovCisjZW5kaWYKK2VudW0gbGlicmFyeV90eXBlIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X25vbmU7CitlbnVtIHNjaGVkX3R5cGUgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9kZWZhdWx0OyAgLyogc2NoZWR1bGluZyBtZXRob2QgZm9yIHJ1bnRpbWUgc2NoZWR1bGluZyAqLworZW51bSBzY2hlZF90eXBlICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsgLyogZGVmYXVsdCBzdGF0aWMgc2NoZWR1bGluZyBtZXRob2QgKi8KK2VudW0gc2NoZWRfdHlwZSAgICBfX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsgLyogZGVmYXVsdCBndWlkZWQgc2NoZWR1bGluZyBtZXRob2QgKi8KK2VudW0gc2NoZWRfdHlwZSAgICAgIF9fa21wX2F1dG8gPSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ7IC8qIGRlZmF1bHQgYXV0byBzY2hlZHVsaW5nIG1ldGhvZCAqLworaW50ICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9ERUZBVUxUX0JMT0NLVElNRTsKKyNpZiBLTVBfVVNFX01PTklUT1IKK2ludCAgICAgICBfX2ttcF9tb25pdG9yX3dha2V1cHMgPSBLTVBfTUlOX01PTklUT1JfV0FLRVVQUzsKK2ludCAgICAgICAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBLTVBfREVGQVVMVF9CTE9DS1RJTUUsIEtNUF9NSU5fTU9OSVRPUl9XQUtFVVBTICk7CisjZW5kaWYKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQoraW50ICAgICAgICAgICAgICAgX19rbXBfemVyb19idCA9IEZBTFNFOworI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisjaWZkZWYgS01QX0RGTFRfTlRIX0NPUkVTCitpbnQgICAgICAgICAgICAgICAgX19rbXBfbmNvcmVzID0gMDsKKyNlbmRpZgoraW50ICAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IDA7CitpbnQgICAgICAgICAgIF9fa21wX2Fib3J0X2RlbGF5ID0gMDsKKyNpZiBLTVBfT1NfTElOVVggJiYgZGVmaW5lZChLTVBfVERBVEFfR1RJRCkKK2ludCAgICAgICAgICAgICBfX2ttcF9ndGlkX21vZGUgPSAzOyAvKiB1c2UgX19kZWNsc3BlYyh0aHJlYWQpIFRMUyB0byBzdG9yZSBndGlkICovCitpbnQgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gRkFMU0U7CisjZWxpZiBLTVBfT1NfV0lORE9XUworaW50ICAgICAgICAgICAgIF9fa21wX2d0aWRfbW9kZSA9IDI7IC8qIHVzZSBUTFMgZnVuY3Rpb25zIHRvIHN0b3JlIGd0aWQgKi8KK2ludCAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBGQUxTRTsKKyNlbHNlCitpbnQgICAgICAgICAgICAgX19rbXBfZ3RpZF9tb2RlID0gMDsgLyogc2VsZWN0IG1ldGhvZCB0byBnZXQgZ3RpZCBiYXNlZCBvbiAjdGhyZWFkcyAqLworaW50ICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IFRSVUU7CisjZW5kaWYgLyogS01QX09TX0xJTlVYICYmIGRlZmluZWQoS01QX1REQVRBX0dUSUQpICovCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyNpZiBLTVBfT1NfV0lORE9XUworX19kZWNsc3BlYyh0aHJlYWQpIGludCBfX2ttcF9ndGlkID0gS01QX0dUSURfRE5FOworI2Vsc2UKK19fdGhyZWFkIGludCBfX2ttcF9ndGlkID0gS01QX0dUSURfRE5FOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTIC0gd29ya2Fyb3VuZCBiZWNhdXNlIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIGNvbXBpbGVyIDIwMTEwMzE2IGRvZXNuJ3QgYWNjZXB0IF9fZGVjbHNwZWMgKi8KKyNlbmRpZiAvKiBLTVBfVERBVEFfR1RJRCAqLworaW50ICAgICAgICAgIF9fa21wX3Rsc19ndGlkX21pbiA9IElOVF9NQVg7CitpbnQgICAgICAgICAgICBfX2ttcF9mb3JlaWduX3RwID0gVFJVRTsKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CitpbnQgICAgX19rbXBfaW5oZXJpdF9mcF9jb250cm9sID0gVFJVRTsKK2ttcF9pbnQxNiAgX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZCA9IDA7CitrbXBfdWludDMyICAgICBfX2ttcF9pbml0X214Y3NyID0gMDsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitkb3VibGUgIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCAgID0gMS4wOworI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKwora21wX25lc3RlZF9udGhyZWFkc190IF9fa21wX25lc3RlZF9udGggID0geyBOVUxMLCAwLCAwIH07CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKK2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtc190IF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zID0geyAxLCAxMDI0IH07IC8vIFRPRE86IHR1bmUgaXQhCisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKK2NoYXIgKiBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUgPSAiLSI7CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworI2lmIE9NUF80MF9FTkFCTEVECitpbnQgX19rbXBfZGlzcGxheV9lbnYgICAgICAgICAgID0gRkFMU0U7CitpbnQgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSAgID0gRkFMU0U7CitpbnQgX19rbXBfb21wX2NhbmNlbGxhdGlvbiAgICAgID0gRkFMU0U7CisjZW5kaWYKKworLyogbWFwIE9NUCAzLjAgc2NoZWR1bGUgdHlwZXMgd2l0aCBvdXIgaW50ZXJuYWwgc2NoZWR1bGUgdHlwZXMgKi8KK2VudW0gc2NoZWRfdHlwZSBfX2ttcF9zY2hfbWFwWyBrbXBfc2NoZWRfdXBwZXIgLSBrbXBfc2NoZWRfbG93ZXJfZXh0ICsga21wX3NjaGVkX3VwcGVyX3N0ZCAtIGttcF9zY2hlZF9sb3dlciAtIDIgXSA9IHsKKyAgICBrbXBfc2NoX3N0YXRpY19jaHVua2VkLCAgICAgLy8gPT0+IGttcF9zY2hlZF9zdGF0aWMgICAgICAgICAgICA9IDEKKyAgICBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCwgICAgLy8gPT0+IGttcF9zY2hlZF9keW5hbWljICAgICAgICAgICA9IDIKKyAgICBrbXBfc2NoX2d1aWRlZF9jaHVua2VkLCAgICAgLy8gPT0+IGttcF9zY2hlZF9ndWlkZWQgICAgICAgICAgICA9IDMKKyAgICBrbXBfc2NoX2F1dG8sICAgICAgICAgICAgICAgLy8gPT0+IGttcF9zY2hlZF9hdXRvICAgICAgICAgICAgICA9IDQKKyAgICBrbXBfc2NoX3RyYXBlem9pZGFsICAgICAgICAgLy8gPT0+IGttcF9zY2hlZF90cmFwZXpvaWRhbCAgICAgICA9IDEwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGxpa2VseSBub3QgdXNlZCwgaW50cm9kdWNlZCBoZXJlIGp1c3QgdG8gZGVidWcgdGhlIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgcHVibGljIGludGVsIGV4dGVuc2lvbiBzY2hlZHVsZXMKK307CisKKyNpZiBLTVBfT1NfTElOVVgKK2VudW0gY2xvY2tfZnVuY3Rpb25fdHlwZSBfX2ttcF9jbG9ja19mdW5jdGlvbjsKK2ludCBfX2ttcF9jbG9ja19mdW5jdGlvbl9wYXJhbTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorZW51bSBtaWNfdHlwZSBfX2ttcF9taWNfdHlwZSA9IG5vbl9taWM7CisjZW5kaWYKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworS01QQWZmaW5pdHkqIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoID0gTlVMTDsKKworIyBpZiBLTVBfVVNFX0hXTE9DCitpbnQgX19rbXBfaHdsb2NfZXJyb3IgPSBGQUxTRTsKK2h3bG9jX3RvcG9sb2d5X3QgX19rbXBfaHdsb2NfdG9wb2xvZ3kgPSBOVUxMOworIyBlbmRpZgorCisjIGlmIEtNUF9PU19XSU5ET1dTCisjICBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKK2ludCBfX2ttcF9udW1fcHJvY19ncm91cHMgPSAxOworIyAgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCitrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IE5VTEw7CitrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSBOVUxMOwora21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gTlVMTDsKK2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisjIGVuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKK3NpemVfdCAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7CitlbnVtIGFmZmluaXR5X3R5cGUgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2RlZmF1bHQ7CitlbnVtIGFmZmluaXR5X2dyYW4gX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZGVmYXVsdDsKK2ludCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyAgPSAtMTsKK2ludCBfX2ttcF9hZmZpbml0eV9kdXBzID0gVFJVRTsKK2VudW0gYWZmaW5pdHlfdG9wX21ldGhvZCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OworaW50ICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCAgICAgID0gMDsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCAgICAgICA9IDA7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV92ZXJib3NlICAgICAgPSBGQUxTRTsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICA9IFRSVUU7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdDsKK2NoYXIgKiAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICAgICA9IE5VTEw7CitrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9tYXNrcyA9IE5VTEw7Cit1bnNpZ25lZCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgICAgPSAwOworCitjaGFyIGNvbnN0ICogIF9fa21wX2NwdWluZm9fZmlsZSAgICAgPSBOVUxMOworCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKK2ttcF9uZXN0ZWRfcHJvY19iaW5kX3QgX19rbXBfbmVzdGVkX3Byb2NfYmluZCA9IHsgTlVMTCwgMCwgMCB9OworaW50IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworI2VuZGlmCisKK2ludCBfX2ttcF9wbGFjZV9udW1fc29ja2V0cyA9IDA7CitpbnQgX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCA9IDA7CitpbnQgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gMDsKK2ludCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IDA7CitpbnQgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSAwOworCisjaWYgT01QXzQwX0VOQUJMRUQKK2ttcF9pbnQzMiBfX2ttcF9kZWZhdWx0X2RldmljZSA9IDA7CisjZW5kaWYKKwora21wX3Rhc2tpbmdfbW9kZV90IF9fa21wX3Rhc2tpbmdfbW9kZSA9IHRza21fdGFza190ZWFtczsKKyNpZiBPTVBfNDVfRU5BQkxFRAora21wX2ludDMyIF9fa21wX21heF90YXNrX3ByaW9yaXR5ID0gMDsKKyNlbmRpZgorCisvKiBUaGlzIGNoZWNrIGVuc3VyZXMgdGhhdCB0aGUgY29tcGlsZXIgaXMgcGFzc2luZyB0aGUgY29ycmVjdCBkYXRhIHR5cGUKKyAqIGZvciB0aGUgZmxhZ3MgZm9ybWFsIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24ga21wY19vbXBfdGFza19hbGxvYygpLgorICogSWYgdGhlIHR5cGUgaXMgbm90IGEgNC1ieXRlIHR5cGUsIHRoZW4gZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIGFib3V0CisgKiBhIG5vbi1wb3NpdGl2ZSBsZW5ndGggYXJyYXkgcG9pbnRpbmcgaGVyZS4gIElmIHRoYXQgaGFwcGVucywgdGhlCisgKiBrbXBfdGFza2luZ19mbGFnc190IHN0cnVjdHVyZSBtdXN0IGJlIHJlZGVmaW5lZCB0byBoYXZlIGV4YWN0bHkgMzIgYml0cy4KKyAqLworS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKGttcF90YXNraW5nX2ZsYWdzX3QpID09IDQgKTsKKwora21wX2ludDMyIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCA9IDE7ICAgLyogQ29uc3RyYWluIHRhc2sgc3RlYWxpbmcgYnkgZGVmYXVsdCAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAoraW50ICAgICAgICAgX19rbXBfc3VzcGVuZF9jb3VudCA9IDA7CisjZW5kaWYKKworaW50ICAgICBfX2ttcF9zZXR0aW5ncyA9IEZBTFNFOworaW50ICAgICBfX2ttcF9kdXBsaWNhdGVfbGlicmFyeV9vayA9IDA7CisjaWYgVVNFX0lUVF9CVUlMRAoraW50ICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXMgPSAxOworaW50ICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9IDM7CisjZW5kaWYKK1BBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQ7CitpbnQgICAgIF9fa21wX2RldGVybV9yZWQgPSBGQUxTRTsKKworI2lmZGVmIEtNUF9ERUJVRworaW50ICAgICBrbXBfYV9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9iX2RlYnVnID0gMDsKK2ludCAgICAga21wX2NfZGVidWcgPSAwOworaW50ICAgICBrbXBfZF9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9lX2RlYnVnID0gMDsKK2ludCAgICAga21wX2ZfZGVidWcgPSAwOworaW50ICAgICBrbXBfZGlhZyAgICA9IDA7CisjZW5kaWYKKworLyogRm9yIGRlYnVnIGluZm9ybWF0aW9uIGxvZ2dpbmcgdXNpbmcgcm90YXRpbmcgYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1ZiA9IEZBTFNFOyAgICAgICAgLyogVFJVRSBtZWFucyB1c2UgYnVmZmVyLCBGQUxTRSBtZWFucyBwcmludCB0byBzdGRlcnIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmX2xpbmVzID0gS01QX0RFQlVHX0JVRl9MSU5FU19JTklUOyAvKiBMaW5lcyBvZiBkZWJ1ZyBzdG9yZWQgaW4gYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9jaGFycyA9IEtNUF9ERUJVR19CVUZfQ0hBUlNfSU5JVDsgLyogQ2hhcmFjdGVycyBhbGxvd2VkIHBlciBsaW5lIGluIGJ1ZmZlciAqLworaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfYXRvbWljID0gRkFMU0U7IC8qIFRSVUUgbWVhbnMgdXNlIGF0b21pYyB1cGRhdGUgb2YgYnVmZmVyIGVudHJ5IHBvaW50ZXIgKi8KKworY2hhciAgICpfX2ttcF9kZWJ1Z19idWZmZXIgPSBOVUxMOyAgICAgIC8qIERlYnVnIGJ1ZmZlciBpdHNlbGYgKi8KK2ludCAgICAgX19rbXBfZGVidWdfY291bnQgPSAwOyAgICAgICAgICAvKiBDb3VudGVyIGZvciBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCBpbiBidWZmZXIgc28gZmFyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzID0gMDsgLyogS2VlcCB0cmFjayBvZiBjaGFyIGluY3JlYXNlIHJlY29tbWVuZGVkIGluIHdhcm5pbmdzICovCisvKiBlbmQgcm90YXRpbmcgZGVidWcgYnVmZmVyICovCisKKyNpZmRlZiBLTVBfREVCVUcKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlOyAgICAgICAgICAgLyogKzEgPT4gb25seSBnbyBwYXIgZm9yIGNvbnN0cnVjdHMgaW4gcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtMSA9PiBvbmx5IGdvIHBhciBmb3IgY29uc3RydWN0cyBvdXRzaWRlIHJhbmdlICovCitjaGFyICAgIF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lW0tNUF9QQVJfUkFOR0VfUk9VVElORV9MRU5dID0geyAnXDAnIH07CitjaGFyICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZVtLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTl0gPSB7ICdcMCcgfTsKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlX2xiID0gMDsKK2ludCAgICAgX19rbXBfcGFyX3JhbmdlX3ViID0gSU5UX01BWDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworLyogRm9yIHByaW50aW5nIG91dCBkeW5hbWljIHN0b3JhZ2UgbWFwIGZvciB0aHJlYWRzIGFuZCB0ZWFtcyAqLworaW50ICAgICBfX2ttcF9zdG9yYWdlX21hcCA9IEZBTFNFOyAgICAgICAgIC8qIFRydWUgbWVhbnMgcHJpbnQgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitpbnQgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBGQUxTRTsgLyogVHJ1ZSBtZWFucyBzdG9yYWdlIG1hcCBpbmNsdWRlcyBwbGFjZW1lbnQgaW5mbyAqLworaW50ICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCA9IEZBTFNFOworLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSBkYXRhIHN0cnVjdHVyZXMgd2hlbiB3ZSBmb3JrIGEgY2hpbGQgcHJvY2VzcywgZGVmYXVsdHMgdG8gVFJVRSAqLworaW50ICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayA9IFRSVUU7IC8qIEF0IGluaXRpYWxpemF0aW9uLCBjYWxsIHB0aHJlYWRfYXRmb3JrIHRvIGluc3RhbGwgZm9yayBoYW5kbGVyICovCitpbnQgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZCA9IFRSVUU7CisKK2ludCAgICAgICAgX19rbXBfZW52X2NodW5rICAgICAgID0gRkFMU0U7ICAvKiBLTVBfQ0hVTksgc3BlY2lmaWVkPyAgICAgKi8KK2ludCAgICAgICAgX19rbXBfZW52X3N0a3NpemUgICAgID0gRkFMU0U7ICAvKiBLTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X29tcF9zdGtzaXplID0gRkFMU0U7ICAvKiBPTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X2FsbF90aHJlYWRzICAgICA9IEZBTFNFOy8qIEtNUF9BTExfVEhSRUFEUyBvciBLTVBfTUFYX1RIUkVBRFMgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfb21wX2FsbF90aHJlYWRzID0gRkFMU0U7LyogT01QX1RIUkVBRF9MSU1JVCBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWUgICA9IEZBTFNFOyAgLyogS01QX0JMT0NLVElNRSBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9jaGVja3MgICAgICA9IEZBTFNFOyAgLyogS01QX0NIRUNLUyBzcGVjaWZpZWQ/ICAgICovCitpbnQgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAgPSBGQUxTRTsgIC8qIEtNUF9DT05TSVNURU5DWV9DSEVDSyBzcGVjaWZpZWQ/ICovCisKK2ttcF91aW50MzIgX19rbXBfeWllbGRfaW5pdCA9IEtNUF9JTklUX1dBSVQ7CitrbXBfdWludDMyIF9fa21wX3lpZWxkX25leHQgPSBLTVBfTkVYVF9XQUlUOworCisjaWYgS01QX1VTRV9NT05JVE9SCitrbXBfdWludDMyIF9fa21wX3lpZWxkaW5nX29uID0gMTsKKyNpZiBLTVBfT1NfQ05LCitrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlID0gMDsKKyNlbHNlCitrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlID0gMTsgICAgIC8qIFlpZWxkLWN5Y2xlIGlzIG9uIGJ5IGRlZmF1bHQgKi8KKyNlbmRpZgora21wX2ludDMyICBfX2ttcF95aWVsZF9vbl9jb3VudCA9IDEwOyAvKiBCeSBkZWZhdWx0LCB5aWVsZGluZyBpcyBvbiBmb3IgMTAgbW9uaXRvciBwZXJpb2RzLiAqLwora21wX2ludDMyICBfX2ttcF95aWVsZF9vZmZfY291bnQgPSAxOyAvKiBCeSBkZWZhdWx0LCB5aWVsZGluZyBpcyBvZmYgZm9yIDEgbW9uaXRvciBwZXJpb2RzLiAqLworI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU1RBVEUgbW9zdGx5IHN5bmNyb25pemVkIHdpdGggZ2xvYmFsIGxvY2sgKi8KKy8qIGRhdGEgd3JpdHRlbiB0byByYXJlbHkgYnkgbWFzdGVycywgcmVhZCBvZnRlbiBieSB3b3JrZXJzICovCisvKgorICogU0hBTEwgV0UgRURJVCBUSEUgQ09NTUVOVCBCRUxPVyBJTiBTT01FIFdBWT8KKyAqIFRPRE86ICBOb25lIG9mIHRoaXMgZ2xvYmFsIHBhZGRpbmcgc3R1ZmYgd29ya3MgY29uc2lzdGVudGx5IGJlY2F1c2UKKyAqIHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbiBpcyBub3QgbmVjZXNzYXJpbHkgY29ycmVsYXRlZCB0byBzdG9yYWdlIG9yZGVyLgorICogVG8gZml4IHRoaXMsIGFsbCB0aGUgaW1wb3J0YW50IGdsb2JhbHMgbXVzdCBiZSBwdXQgaW4gYSBiaWcgc3RydWN0dXJlCisgKiBpbnN0ZWFkLgorICovCitLTVBfQUxJR05fQ0FDSEUKKyAgICAgICAgIGttcF9pbmZvX3QgKipfX2ttcF90aHJlYWRzICAgICA9IE5VTEw7CisgICAgICAgICBrbXBfcm9vdF90ICoqX19rbXBfcm9vdCAgICAgICAgPSBOVUxMOworCisvKiBkYXRhIHJlYWQvd3JpdHRlbiB0byBvZnRlbiBieSBtYXN0ZXJzICovCitLTVBfQUxJR05fQ0FDSEUKK3ZvbGF0aWxlIGludCAgICAgICAgICBfX2ttcF9udGggICAgICAgICAgICAgICAgICAgID0gMDsKK3ZvbGF0aWxlIGludCAgICAgICAgICBfX2ttcF9hbGxfbnRoICAgICAgICAgICAgICAgID0gMDsKK2ludCAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9udGggICAgICAgID0gMDsKK3ZvbGF0aWxlIGttcF9pbmZvX3QgICpfX2ttcF90aHJlYWRfcG9vbCAgICAgICAgICAgID0gTlVMTDsKK3ZvbGF0aWxlIGttcF90ZWFtX3QgICpfX2ttcF90ZWFtX3Bvb2wgICAgICAgICAgICAgID0gTlVMTDsKKworS01QX0FMSUdOX0NBQ0hFCit2b2xhdGlsZSBpbnQgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCA9IDA7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdMT0JBTC9ST09UIFNUQVRFICovCitLTVBfQUxJR05fQ0FDSEUKK2ttcF9nbG9iYWxfdCBfX2ttcF9nbG9iYWwgPSB7eyAwIH19OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogR0xPQkFMIFNZTkNIUk9OSVpBVElPTiBMT0NLUyAqLworLyogVE9ETyB2ZXJpZnkgdGhlIG5lZWQgZm9yIHRoZXNlIGxvY2tzIGFuZCBpZiB0aGV5IG5lZWQgdG8gYmUgZ2xvYmFsICovCisKKyNpZiBLTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQKKy8qIE11bHRpbm9kZSBzeXN0ZW1zIGhhdmUgbGFyZ2VyIGNhY2hlIGxpbmUgZ3JhbnVsYXJpdHkgd2hpY2ggY2FuIGNhdXNlCisgKiBmYWxzZSBzaGFyaW5nIGlmIHRoZSBhbGlnbm1lbnQgaXMgbm90IGxhcmdlIGVub3VnaCBmb3IgdGhlc2UgbG9ja3MgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKKwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfaW5pdHpfbG9jayAgID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9pbml0el9sb2NrICAgKTsgLyogQ29udHJvbCBpbml0aWFsaXphdGlvbnMgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2Zvcmtqb2luX2xvY2s7IC8qIGNvbnRyb2wgZm9yay9qb2luIGFjY2VzcyAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfZXhpdF9sb2NrOyAgIC8qIGV4aXQoKSBpcyBub3QgYWx3YXlzIHRocmVhZC1zYWZlICovCisjaWYgS01QX1VTRV9NT05JVE9SCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9tb25pdG9yX2xvY2s7IC8qIGNvbnRyb2wgbW9uaXRvciB0aHJlYWQgY3JlYXRpb24gKi8KKyNlbmRpZgorS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdHBfY2FjaGVkX2xvY2s7IC8qIHVzZWQgZm9yIHRoZSBoYWNrIHRvIGFsbG93IHRocmVhZHByaXZhdGUgY2FjaGUgYW5kIF9fa21wX3RocmVhZHMgZXhwYW5zaW9uIHRvIGNvLWV4aXN0ICovCisKK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9sb2NrX3QgX19rbXBfZ2xvYmFsX2xvY2s7ICAgICAgICAgICAvKiBDb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9xdWV1aW5nX2xvY2tfdCBfX2ttcF9kaXNwYXRjaF9sb2NrOyAgICAgICAgIC8qIENvbnRyb2wgZGlzcGF0Y2ggYWNjZXNzICAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2xvY2tfdCBfX2ttcF9kZWJ1Z19sb2NrOyAgICAgICAgICAgIC8qIENvbnRyb2wgSS9PIGFjY2VzcyBmb3IgS01QX0RFQlVHICovCisjZWxzZQorS01QX0FMSUdOX0NBQ0hFCisKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2luaXR6X2xvY2sgICA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfaW5pdHpfbG9jayAgICk7IC8qIENvbnRyb2wgaW5pdGlhbGl6YXRpb25zICovCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9mb3Jram9pbl9sb2NrOyAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgICAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLworI2lmIEtNUF9VU0VfTU9OSVRPUgora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfbW9uaXRvcl9sb2NrOyAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCisjZW5kaWYKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3RwX2NhY2hlZF9sb2NrOyAvKiB1c2VkIGZvciB0aGUgaGFjayB0byBhbGxvdyB0aHJlYWRwcml2YXRlIGNhY2hlIGFuZCBfX2ttcF90aHJlYWRzIGV4cGFuc2lvbiB0byBjby1leGlzdCAqLworCitLTVBfQUxJR04oMTI4KQora21wX2xvY2tfdCBfX2ttcF9nbG9iYWxfbG9jazsgICAgICAgICAgIC8qIENvbnRyb2wgT1MvZ2xvYmFsIGFjY2VzcyAqLworS01QX0FMSUdOKDEyOCkKK2ttcF9xdWV1aW5nX2xvY2tfdCBfX2ttcF9kaXNwYXRjaF9sb2NrOyAgICAgICAgIC8qIENvbnRyb2wgZGlzcGF0Y2ggYWNjZXNzICAqLworS01QX0FMSUdOKDEyOCkKK2ttcF9sb2NrX3QgX19rbXBfZGVidWdfbG9jazsgICAgICAgICAgICAvKiBDb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICAvKgorICAgICAgICBTaWduYWwgaGFuZGxpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBpdCBjb25mdXNlcyB1c2VyczogSW4gY2FzZSBvZiBzaWdzZWd2CisgICAgICAgIChvciBvdGhlciB0cm91YmxlKSBpbiB1c2VyIGNvZGUgc2lnbmFsIGhhbmRsZXIgY2F0Y2hlcyB0aGUgc2lnbmFsLCB3aGljaCB0aGVuICJhcHBlYXJzIiBpbgorICAgICAgICB0aGUgbW9uaXRvciB0aHJlYWQgKHdoZW4gdGhlIG1vbml0b3IgZXhlY3V0ZXMgcmFpc2UoKSBmdW5jdGlvbikuIFVzZXJzIHNlZSBzaWduYWwgaW4gdGhlCisgICAgICAgIG1vbml0b3IgdGhyZWFkIGFuZCBibGFtZSBPcGVuTVAgUlRMLgorCisgICAgICAgIEdyYW50IHNhaWQgc2lnbmFsIGhhbmRsaW5nIHJlcXVpcmVkIG9uIHNvbWUgb2xkZXIgT1NlcyAoSXJpeD8pIHN1cHBvcnRlZCBieSBLQUksIGJlY2F1c2UKKyAgICAgICAgYmFkIGFwcGxpY2F0aW9ucyBodW5nIGJ1dCBub3QgYWJvcnRlZC4gQ3VycmVudGx5IGl0IGlzIG5vdCBhIHByb2JsZW0gZm9yIExpbnV4KiBPUywgT1MgWCogYW5kCisgICAgICAgIFdpbmRvd3MqIE9TLgorCisgICAgICAgIEdyYW50OiBGb3VuZCBuZXcgaGFuZ3MgZm9yIEVMNCwgRUw1LCBhbmQgYSBGZWRvcmEgQ29yZSBtYWNoaW5lLiAgU28gSSdtIHB1dHRpbmcKKyAgICAgICAgdGhlIGRlZmF1bHQgYmFjayBmb3Igbm93IHRvIHNlZSBpZiB0aGF0IGZpeGVzIGhhbmdzIG9uIHRob3NlIG1hY2hpbmVzLgorCisgICAgICAgIDIwMTAtMDQwMTMgTGV2OiBJdCB3YXMgYSBidWcgaW4gRm9ydHJhbiBSVEwuIEZvcnRyYW4gUlRMIHByaW50cyBhIGtpbmQgb2Ygc3RhY2sgYmFja3RyYWNlCisgICAgICAgIHdoZW4gcHJvZ3JhbSBpcyBhYm9ydGluZywgYnV0IHRoZSBjb2RlIGlzIG5vdCBzaWduYWwtc2FmZS4gV2hlbiBtdWx0aXBsZSBzaWduYWxzIHJhaXNlZCBhdAorICAgICAgICB0aGUgc2FtZSB0aW1lICh3aGljaCBvY2N1cnMgaW4gZHluYW1pYyBuZWdhdGl2ZSB0ZXN0cyBiZWNhdXNlIGFsbCB0aGUgd29ya2VyIHRocmVhZHMgZGV0ZWN0cworICAgICAgICB0aGUgc2FtZSBlcnJvciksIEZvcnRyYW4gUlRMIG1heSBoYW5nLiBUaGUgYnVnIGZpbmFsbHkgZml4ZWQgaW4gRm9ydHJhbiBSVEwgbGlicmFyeSBwcm92aWRlZAorICAgICAgICBieSBTdGV2ZSBSLiwgYW5kIHdpbGwgYmUgYXZhaWxhYmxlIHNvb24uCisgICAgKi8KKyAgICBpbnQgX19rbXBfaGFuZGxlX3NpZ25hbHMgPSBGQUxTRTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIEJVSUxEX1RWCitrbXBfa2V5X3QgX19rbXBfdHZfa2V5ID0gMDsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAoraW50CitnZXRfc3VzcGVuZF9jb3VudF8oIHZvaWQgKSB7CisgICAgaW50IGNvdW50ID0gX19rbXBfc3VzcGVuZF9jb3VudDsKKyAgICBfX2ttcF9zdXNwZW5kX2NvdW50ID0gMDsKKyAgICByZXR1cm4gY291bnQ7Cit9Cit2b2lkCitzZXRfc3VzcGVuZF9jb3VudF8oIGludCAqIHZhbHVlICkgeworICAgIF9fa21wX3N1c3BlbmRfY291bnQgPSAqdmFsdWU7Cit9CisjZW5kaWYKKworLy8gU3ltYm9scyBmb3IgTVMgbXV0dWFsIGRldGVjdGlvbi4KK2ludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgID0gMTsKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiAoIEtNUF9WRVJTSU9OX01BSk9SID4gNCApCisgICAgaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfTWljcm9zb2Z0X09wZW5NUF9saWJyYXJ5ID0gMTsKKyNlbmRpZgorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9nc3VwcG9ydC5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2dzdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZkMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9nc3VwcG9ydC5jcHAKQEAgLTAsMCArMSwxNjIxIEBACisvKgorICoga21wX2dzdXBwb3J0LmNwcAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2F0b21pYy5oIgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgTUtMT0MobG9jLHJvdXRpbmUpIFwKKyAgICBzdGF0aWMgaWRlbnRfdCAobG9jKSA9IHswLCBLTVBfSURFTlRfS01QQywgMCwgMCwgIjt1bmtub3duO3Vua25vd247MDswOzsiIH07CisKKyNpbmNsdWRlICJrbXBfZnRuX29zLmgiCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUikodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2JhcnJpZXIiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2JhcnJpZXI6IFQjJWRcbiIsIGd0aWQpKTsKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIG9tcHRfZnJhbWVfdCAqIG9tcHRfZnJhbWU7CisgICAgaWYgKG9tcHRfZW5hYmxlZCApIHsKKyAgICAgICAgb21wdF9mcmFtZSA9IF9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbCgwKTsKKyAgICAgICAgb21wdF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgICAgfSAKKyNlbmRpZgorICAgIF9fa21wY19iYXJyaWVyKCZsb2MsIGd0aWQpOworfQorCisKKy8vCisvLyBNdXR1YWwgZXhjbHVzaW9uCisvLworCisvLworLy8gVGhlIHN5bWJvbCB0aGF0IGljYy9pZm9ydCBnZW5lcmF0ZXMgZm9yIHVubmFtZWQgZm9yIHVubmFtZWQgY3JpdGljYWwKKy8vIHNlY3Rpb25zIC0gLmdvbXBfY3JpdGljYWxfdXNlcl8gLSBpcyBkZWZpbmVkIHVzaW5nIC5jb21tIGluIGFueSBvYmplY3RzCisvLyByZWZlcmVuY2UgaXQuICBXZSBjYW4ndCByZWZlcmVuY2UgaXQgZGlyZWN0bHkgaGVyZSBpbiBDIGNvZGUsIGFzIHRoZQorLy8gc3ltYm9sIGNvbnRhaW5zIGEgIi4iLgorLy8KKy8vIFRoZSBSVEwgY29udGFpbnMgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBvZiAuZ29tcF9jcml0aWNhbF91c2VyXworLy8gd2l0aCBhbm90aGVyIHN5bWJvbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIgaW5pdGlhbGl6ZWQgd2l0aCBpdCdzCisvLyBhZGRyZXNzLgorLy8KK2V4dGVybiBrbXBfY3JpdGljYWxfbmFtZSAqX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOworCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfY3JpdGljYWwoJmxvYywgZ3RpZCwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9lbmQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2NyaXRpY2FsX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfY3JpdGljYWwoJmxvYywgZ3RpZCwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQpKHZvaWQgKipwcHRyKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19jcml0aWNhbCgmbG9jLCBndGlkLCAoa21wX2NyaXRpY2FsX25hbWUgKilwcHRyKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5EKSh2b2lkICoqcHB0cikKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9uYW1lX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfbmFtZV9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfZW5kX2NyaXRpY2FsKCZsb2MsIGd0aWQsIChrbXBfY3JpdGljYWxfbmFtZSAqKXBwdHIpOworfQorCisKKy8vCisvLyBUaGUgR251IGNvZGVnZW4gdHJpZXMgdG8gdXNlIGxvY2tlZCBvcGVyYXRpb25zIHRvIHBlcmZvcm0gYXRvbWljIHVwZGF0ZXMKKy8vIGlubGluZS4gIElmIGl0IGNhbid0LCB0aGVuIGl0IGNhbGxzIEdPTVBfYXRvbWljX3N0YXJ0KCkgYmVmb3JlIHBlcmZvcm1pbmcKKy8vIHRoZSB1cGRhdGUgYW5kIEdPTVBfYXRvbWljX2VuZCgpIGFmdGVyd2FyZCwgcmVnYXJkbGVzcyBvZiB0aGUgZGF0YSB0eXBlLgorLy8KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9hdG9taWNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIF9fb21wdF90aHJlYWRfYXNzaWduX3dhaXRfaWQoMCk7CisjZW5kaWYKKworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfYXRvbWljX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisKK2ludAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zaW5nbGVfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NpbmdsZV9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8vCisgICAgLy8gM3JkIHBhcmFtZXRlciA9PSBGQUxTRSBwcmV2ZW50cyBrbXBfZW50ZXJfc2luZ2xlIGZyb20gcHVzaGluZyBhCisgICAgLy8gd29ya3NoYXJlIHdoZW4gVVNFX0NIRUNLUyBpcyBkZWZpbmVkLiAgV2UgbmVlZCB0byBhdm9pZCB0aGUgcHVzaCwKKyAgICAvLyBhcyB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIEdPTVBfc2luZ2xlX2VuZCgpIGNhbGwuCisgICAgLy8KKyAgICByZXR1cm4gX19rbXBfZW50ZXJfc2luZ2xlKGd0aWQsICZsb2MsIEZBTFNFKTsKK30KKworCit2b2lkICoKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfU1RBUlQpKHZvaWQpCit7CisgICAgdm9pZCAqcmV0dmFsOworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfc2luZ2xlX2NvcHlfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NpbmdsZV9jb3B5X3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aHJlYWQgdG8gZW50ZXIsIHJldHVybiBOVUxMLiAgVGhlIGdlbmVyYXRlZAorICAgIC8vIGNvZGUgd2lsbCB0aGVuIGNhbGwgR09NUF9zaW5nbGVfY29weV9lbmQoKSBmb3IgdGhpcyB0aHJlYWQgb25seSwKKyAgICAvLyB3aXRoIHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuCisgICAgLy8KKyAgICBpZiAoX19rbXBfZW50ZXJfc2luZ2xlKGd0aWQsICZsb2MsIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvLworICAgIC8vIFdhaXQgZm9yIHRoZSBmaXJzdCB0aHJlYWQgdG8gc2V0IHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIsCisgICAgLy8gYW5kIGZvciBhbGwgb3RoZXIgdGhyZWFkcyB0byByZWFjaCB0aGlzIHBvaW50LgorICAgIC8vCisgICAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgICAvLworICAgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludCwgYW5kIHdhaXQgZm9yIGFsbAorICAgIC8vIHRocmVhZHMgdG8gZG8gbGlrZXdpc2UsIHRoZW4gcmV0dXJuLgorICAgIC8vCisgICAgcmV0dmFsID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9jb3B5cHJpdl9kYXRhOworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQpKHZvaWQgKmRhdGEpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2luZ2xlX2NvcHlfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAvLworICAgIC8vIFNldCB0aGUgY29weXByaXZhdGUgZGF0YSBwb2ludGVyIGZvIHRoZSB0ZWFtLCB0aGVuIGhpdCB0aGUgYmFycmllcgorICAgIC8vIHNvIHRoYXQgdGhlIG90aGVyIHRocmVhZHMgd2lsbCBjb250aW51ZSBvbiBhbmQgcmVhZCBpdC4gIEhpdCBhbm90aGVyCisgICAgLy8gYmFycmllciBiZWZvcmUgY29udGludWluZywgc28gdGhhdCB0aGUga25vdyB0aGF0IHRoZSBjb3B5cHJpdmF0ZQorICAgIC8vIGRhdGEgcG9pbnRlciBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIGFsbCB0aHJlYWRzIGJlZm9yZSB0cnlpbmcgdG8KKyAgICAvLyByZXVzZSB0aGUgdF9jb3B5cHJpdl9kYXRhIGZpZWxkLgorICAgIC8vCisgICAgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9jb3B5cHJpdl9kYXRhID0gZGF0YTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9vcmRlcmVkX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9vcmRlcmVkX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX29yZGVyZWQoJmxvYywgZ3RpZCk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9vcmRlcmVkX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfb3JkZXJlZF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfb3JkZXJlZCgmbG9jLCBndGlkKTsKK30KKworCisvLworLy8gRGlzcGF0Y2ggbWFjcm8gZGVmcworLy8KKy8vIFRoZXkgY29tZSBpbiB0d28gZmxhdm9yczogNjQtYml0IHVuc2lnbmVkLCBhbmQgZWl0aGVyIDMyLWJpdCBzaWduZWQKKy8vIChJQS0zMiBhcmNoaXRlY3R1cmUpIG9yIDY0LWJpdCBzaWduZWQgKEludGVsKFIpIDY0KS4KKy8vCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX01JUFMKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9JTklUICAgICAgICAgICAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSyAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNAorIyBkZWZpbmUgS01QX0RJU1BBVENIX05FWFQgICAgICAgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyNlbHNlCisjIGRlZmluZSBLTVBfRElTUEFUQ0hfSU5JVCAgICAgICAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOAorIyBkZWZpbmUgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzgKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9ORVhUICAgICAgICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9JTklUX1VMTCAgICAgICAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84dQorIyBkZWZpbmUgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMICAgIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzh1CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfTkVYVF9VTEwgICAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOHUKKworCisvLworLy8gVGhlIHBhcmFsbGVsIGNvbnRydWN0CisvLworCisjaWZuZGVmIEtNUF9ERUJVRworc3RhdGljCisjZW5kaWYgLyogS01QX0RFQlVHICovCit2b2lkCitfX2ttcF9HT01QX21pY3JvdGFza193cmFwcGVyKGludCAqZ3RpZCwgaW50ICpucHIsIHZvaWQgKCp0YXNrKSh2b2lkICopLAorICB2b2lkICpkYXRhKQoreworI2lmIE9NUFRfU1VQUE9SVAorICAgIGttcF9pbmZvX3QgKnRocjsKKyAgICBvbXB0X2ZyYW1lX3QgKm9tcHRfZnJhbWU7CisgICAgb21wdF9zdGF0ZV90IGVuY2xvc2luZ19zdGF0ZTsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLy8gZ2V0IHBvaW50ZXIgdG8gdGhyZWFkIGRhdGEgc3RydWN0dXJlCisgICAgICAgIHRociA9IF9fa21wX3RocmVhZHNbKmd0aWRdOworCisgICAgICAgIC8vIHNhdmUgZW5jbG9zaW5nIHRhc2sgc3RhdGU7IHNldCBjdXJyZW50IHN0YXRlIGZvciB0YXNrCisgICAgICAgIGVuY2xvc2luZ19zdGF0ZSA9IHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZTsKKyAgICAgICAgdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworCisgICAgICAgIC8vIHNldCB0YXNrIGZyYW1lCisgICAgICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICAgIG9tcHRfZnJhbWUtPmV4aXRfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisgICAgdGFzayhkYXRhKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLy8gY2xlYXIgdGFzayBmcmFtZQorICAgICAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgICAgIC8vIHJlc3RvcmUgZW5jbG9zaW5nIHN0YXRlCisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IGVuY2xvc2luZ19zdGF0ZTsKKyAgICB9CisjZW5kaWYKK30KKworCisjaWZuZGVmIEtNUF9ERUJVRworc3RhdGljCisjZW5kaWYgLyogS01QX0RFQlVHICovCit2b2lkCitfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyKGludCAqZ3RpZCwgaW50ICpucHIsCisgIHZvaWQgKCp0YXNrKSh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcywgaWRlbnRfdCAqbG9jLAorICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGxvbmcgc3RhcnQsIGxvbmcgZW5kLCBsb25nIGluY3IsIGxvbmcgY2h1bmtfc2l6ZSkKK3sKKyAgICAvLworICAgIC8vIEludGlhbGl6ZSB0aGUgbG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3QuCisgICAgLy8KKyAgICBLTVBfRElTUEFUQ0hfSU5JVChsb2MsICpndGlkLCBzY2hlZHVsZSwgc3RhcnQsIGVuZCwgaW5jciwgY2h1bmtfc2l6ZSwKKyAgICAgIHNjaGVkdWxlICE9IGttcF9zY2hfc3RhdGljKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGttcF9pbmZvX3QgKnRocjsKKyAgICBvbXB0X2ZyYW1lX3QgKm9tcHRfZnJhbWU7CisgICAgb21wdF9zdGF0ZV90IGVuY2xvc2luZ19zdGF0ZTsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgdGhyID0gX19rbXBfdGhyZWFkc1sqZ3RpZF07CisgICAgICAgIC8vIHNhdmUgZW5jbG9zaW5nIHRhc2sgc3RhdGU7IHNldCBjdXJyZW50IHN0YXRlIGZvciB0YXNrCisgICAgICAgIGVuY2xvc2luZ19zdGF0ZSA9IHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZTsKKyAgICAgICAgdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworCisgICAgICAgIC8vIHNldCB0YXNrIGZyYW1lCisgICAgICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICAgIG9tcHRfZnJhbWUtPmV4aXRfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisgICAgLy8KKyAgICAvLyBOb3cgaW52b2tlIHRoZSBtaWNyb3Rhc2suCisgICAgLy8KKyAgICB0YXNrKGRhdGEpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAvLyBjbGVhciB0YXNrIGZyYW1lCisgICAgICAgIG9tcHRfZnJhbWUtPmV4aXRfcnVudGltZV9mcmFtZSA9IE5VTEw7CisKKyAgICAgICAgLy8gcmVzZXQgZW5jbG9zaW5nIHN0YXRlCisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IGVuY2xvc2luZ19zdGF0ZTsKKyAgICB9CisjZW5kaWYKK30KKworCisjaWZuZGVmIEtNUF9ERUJVRworc3RhdGljCisjZW5kaWYgLyogS01QX0RFQlVHICovCit2b2lkCitfX2ttcF9HT01QX2ZvcmtfY2FsbChpZGVudF90ICpsb2MsIGludCBndGlkLCB2b2lkICgqdW53cmFwcGVkX3Rhc2spKHZvaWQgKiksIG1pY3JvdGFza190IHdyYXBwZXIsIGludCBhcmdjLC4uLikKK3sKKyAgICBpbnQgcmM7CisgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgYXJnYyk7CisKKyAgICByYyA9IF9fa21wX2ZvcmtfY2FsbChsb2MsIGd0aWQsIGZvcmtfY29udGV4dF9nbnUsIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICBWT0xBVElMRV9DQVNUKHZvaWQgKikgdW53cmFwcGVkX3Rhc2ssCisjZW5kaWYKKyAgICAgIHdyYXBwZXIsIF9fa21wX2ludm9rZV90YXNrX2Z1bmMsCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAmYXAKKyNlbHNlCisgICAgICBhcAorI2VuZGlmCisgICAgICApOworCisgICAgdmFfZW5kKGFwKTsKKworICAgIGlmIChyYykgeworICAgICAgICBfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayhndGlkLCB0aWQsIHRociwgdGVhbSk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgb21wdF90ZWFtX2luZm9fdCAqdGVhbV9pbmZvID0gX19vbXB0X2dldF90ZWFtaW5mbygwLCBOVUxMKTsKKyAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKworICAgICAgICAvLyBpbXBsaWNpdCB0YXNrIGNhbGxiYWNrCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKCp0YXNrKSh2b2lkICopKQoreworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkOworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKworICAgICAgICBvbXB0X3BhcmFsbGVsX2lkID0gX19vbXB0X3BhcmFsbGVsX2lkX25ldyhndGlkKTsKKworICAgICAgICAvLyBwYXJhbGxlbCByZWdpb24gY2FsbGJhY2sKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbikpIHsKKyAgICAgICAgICAgIGludCB0ZWFtX3NpemUgPSAxOworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKSgKKyAgICAgICAgICAgICAgICB0YXNrX2luZm8tPnRhc2tfaWQsICZ0YXNrX2luZm8tPmZyYW1lLCBvbXB0X3BhcmFsbGVsX2lkLAorICAgICAgICAgICAgICAgIHRlYW1fc2l6ZSwgKHZvaWQgKikgdGFzaywKKyAgICAgICAgICAgICAgICBPTVBUX0lOVk9LRVIoZm9ya19jb250ZXh0X2dudSkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBfX2ttcF9zZXJpYWxpemVkX3BhcmFsbGVsKGxvYywgZ3RpZCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICAgICAgb21wdF90YXNrX2lkX3QgbXlfb21wdF90YXNrX2lkID0gX19vbXB0X3Rhc2tfaWRfbmV3KGd0aWQpOworCisgICAgICAgIC8vIHNldCB1cCBsaWdodHdlaWdodCB0YXNrCisgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0ID0gKG9tcHRfbHdfdGFza3RlYW1fdCAqKQorICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKG9tcHRfbHdfdGFza3RlYW1fdCkpOworICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdChsd3QsIHRociwgZ3RpZCwgKHZvaWQgKikgdGFzaywgb21wdF9wYXJhbGxlbF9pZCk7CisgICAgICAgIGx3dC0+b21wdF90YXNrX2luZm8udGFza19pZCA9IG15X29tcHRfdGFza19pZDsKKyAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2xpbmsobHd0LCB0aHIpOworCisjaWYgT01QVF9UUkFDRQorICAgICAgICAvLyBpbXBsaWNpdCB0YXNrIGNhbGxiYWNrCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBteV9vbXB0X3Rhc2tfaWQpOworICAgICAgICB9CisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU1RBUlQpKHZvaWQgKCp0YXNrKSh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcykKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X2ZyYW1lLCAqZnJhbWU7CisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHBhcmVudF9mcmFtZSA9IF9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbCgwKTsKKyAgICAgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygxKTsKKyAgICB9CisjZW5kaWYKKworICAgIE1LTE9DKGxvYywgIkdPTVBfcGFyYWxsZWxfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBpZiAoX19rbXBjX29rX3RvX2ZvcmsoJmxvYykgJiYgKG51bV90aHJlYWRzICE9IDEpKSB7CisgICAgICAgIGlmIChudW1fdGhyZWFkcyAhPSAwKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCZsb2MsIGd0aWQsIG51bV90aHJlYWRzKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLCB0YXNrLAorICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX21pY3JvdGFza193cmFwcGVyLCAyLCB0YXNrLCBkYXRhKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX0dPTVBfc2VyaWFsaXplZF9wYXJhbGxlbCgmbG9jLCBndGlkLCB0YXNrKTsKKyAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBmcmFtZS0+ZXhpdF9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgICAgfQorI2VuZGlmCit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIGttcF9pbmZvX3QgKnRocjsKKworICAgIHRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZDsKKyAgICBvbXB0X3Rhc2tfaWRfdCBzZXJpYWxpemVkX3Rhc2tfaWQ7CisgICAgb21wdF9mcmFtZV90ICpvbXB0X2ZyYW1lID0gTlVMTDsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgb21wdF90ZWFtX2luZm9fdCAqdGVhbV9pbmZvID0gX19vbXB0X2dldF90ZWFtaW5mbygwLCBOVUxMKTsKKyAgICAgICAgcGFyYWxsZWxfaWQgPSB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkOworCisgICAgICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgICAgIHNlcmlhbGl6ZWRfdGFza19pZCA9IHRhc2tfaW5mby0+dGFza19pZDsKKworICAgICAgICAvLyB1bmxpbmsgaWYgbmVjZXNzYXJ5LiBuby1vcCBpZiB0aGVyZSBpcyBub3QgYSBsaWdodHdlaWdodCB0YXNrLgorICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IF9fb21wdF9sd190YXNrdGVhbV91bmxpbmsodGhyKTsKKyAgICAgICAgLy8gR09NUCBhbGxvY2F0ZXMvZnJlZXMgbHd0IHNpbmNlIGl0IGNhbid0IGJlIGtlcHQgb24gdGhlIHN0YWNrCisgICAgICAgIGlmIChsd3QpIHsKKyAgICAgICAgICAgX19rbXBfZnJlZShsd3QpOworCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmICghIHRoci0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICAgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayhndGlkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCB0aHIsCisgICAgICAgICAgdGhyLT50aC50aF90ZWFtKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgLy8gSW1wbGljaXQgdGFzayBpcyBmaW5pc2hlZCBoZXJlLCBpbiB0aGUgYmFycmllciB3ZSBtaWdodCBzY2hlZHVsZSBkZWZlcnJlZCB0YXNrcywgCisgICAgICAgICAgLy8gdGhlc2UgZG9uJ3Qgc2VlIHRoZSBpbXBsaWNpdCB0YXNrIG9uIHRoZSBzdGFjaworICAgICAgICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICAgICAgb21wdF9mcmFtZS0+ZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgX19rbXBfam9pbl9jYWxsKCZsb2MsIGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICwgZm9ya19jb250ZXh0X2dudQorI2VuZGlmCisgICAgICAgICk7CisgICAgfQorICAgIGVsc2UgeworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgcGFyYWxsZWxfaWQsIHNlcmlhbGl6ZWRfdGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbCgmbG9jLCBndGlkKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICAvLyBSZWNvcmQgdGhhdCB3ZSByZS1lbnRlcmVkIHRoZSBydW50aW1lIHN5c3RlbSBpbiB0aGUgZnJhbWUgdGhhdAorICAgICAgICAgICAgLy8gY3JlYXRlZCB0aGUgcGFyYWxsZWwgcmVnaW9uLgorICAgICAgICAgICAgb21wdF90YXNrX2luZm9fdCAqcGFyZW50X3Rhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKAorICAgICAgICAgICAgICAgICAgICBwYXJhbGxlbF9pZCwgcGFyZW50X3Rhc2tfaW5mby0+dGFza19pZCwKKyAgICAgICAgICAgICAgICAgICAgT01QVF9JTlZPS0VSKGZvcmtfY29udGV4dF9nbnUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyZW50X3Rhc2tfaW5mby0+ZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworICAgICAgICAgICAgdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0KKyAgICAgICAgICAgICAgICAoKCh0aHItPnRoLnRoX3RlYW0pLT50LnRfc2VyaWFsaXplZCkgPworICAgICAgICAgICAgICAgIG9tcHRfc3RhdGVfd29ya19zZXJpYWwgOiBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CisKKworLy8KKy8vIExvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKworLy8KKy8vIFRoZSBHbnUgY29kZWdlbiBwYXNzZXMgaW4gYW4gZXhjbHVzaXZlIHVwcGVyIGJvdW5kIGZvciB0aGUgb3ZlcmFsbCByYW5nZSwKKy8vIGJ1dCB0aGUgbGliZ3VpZGUgZGlzcGF0Y2ggY29kZSBleHBlY3RzIGFuIGluY2x1c2l2ZSB1cHBlciBib3VuZCwgaGVuY2UgdGhlCisvLyAiZW5kIC0gaW5jciIgNXRoIGFyZ3VtZW50IHRvIEtNUF9ESVNQQVRDSF9JTklUIChhbmQgdGhlICIgdWIgLSBzdHIiIDExdGgKKy8vIGFyZ3VtZW50IHRvIF9fa21wX0dPTVBfZm9ya19jYWxsKS4KKy8vCisvLyBDb252ZXJzZWx5LCBLTVBfRElTUEFUQ0hfTkVYVCByZXR1cm5zIGFuZCBpbmNsdXNpdmUgdXBwZXIgYm91bmQgaW4gKnBfdWIsCisvLyBidXQgdGhlIEdudSBjb2RlZ2VuIGV4cGVjdHMgYW4gZXhjbHVzaWRlIHVwcGVyIGJvdW5kLCBzbyB0aGUgYWRqdXN0bWVudAorLy8gIipwX3ViICs9IHN0cmlkZSIgY29tcGVuc3RhdGVzIGZvciB0aGUgZGlzY3JlcGFuY3kuCisvLworLy8gQ29ycmVjdGlvbjogdGhlIGdudSBjb2RlZ2VuIGFsd2F5cyBhZGp1c3RzIHRoZSB1cHBlciBib3VuZCBieSArLTEsIG5vdCB0aGUKKy8vIHN0cmlkZSB2YWx1ZS4gIFdlIGFkanVzdCB0aGUgZGlzcGF0Y2ggcGFyYW1ldGVycyBhY2NvcmRpbmdseSAoYnkgKy0xKSwgYnV0CisvLyB3ZSBzdGlsbCBhZGp1c3QgcF91YiBieSB0aGUgYWN0dWFsIHN0cmlkZSB2YWx1ZS4KKy8vCisvLyBUaGUgInJ1bnRpbWUiIHZlcnNpb25zIGRvIG5vdCB0YWtlIGEgY2h1bmtfc3ogcGFyYW1ldGVyLgorLy8KKy8vIFRoZSBwcm9maWxlIGxpYiBjYW5ub3Qgc3VwcG9ydCBjb25zdHJ1Y3QgY2hlY2tpbmcgb2YgdW5vcmRlcmVkIGxvb3BzIHRoYXQKKy8vIGFyZSBwcmVkZXRlcm1pbmVkIGJ5IHRoZSBjb21waWxlciB0byBiZSBzdGF0aWNhbGx5IHNjaGVkdWxlZCwgYXMgdGhlIGdjYworLy8gY29kZWdlbiB3aWxsIG5vdCBhbHdheXMgZW1pdCBjYWxscyB0byBHT01QX2xvb3Bfc3RhdGljX25leHQoKSB0byBnZXQgdGhlCisvLyBuZXh0IGl0ZXJhdGlvbi4gIEluc3RlYWQsIGl0IGVtaXRzIGlubGluZSBjb2RlIHRvIGNhbGwgb21wX2dldF90aHJlYWRfbnVtKCkKKy8vIG51bSBhbmQgY2FsY3VsYXRlIHRoZSBpdGVyYXRpb24gc3BhY2UgdXNpbmcgdGhlIHJlc3VsdC4gIEl0IGRvZXNuJ3QgZG8gdGhpcworLy8gd2l0aCBvcmRlcmVkIHN0YXRpYyBsb29wLCBzbyB0aGV5IGNhbiBiZSBjaGVja2VkLgorLy8KKworI2RlZmluZSBMT09QX1NUQVJUKGZ1bmMsc2NoZWR1bGUpIFwKKyAgICBpbnQgZnVuYyAobG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgY2h1bmtfc3osIGxvbmcgKnBfbGIsICAgICAgICAgXAorICAgICAgbG9uZyAqcF91YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogMHglbHhcbiIsICBcCisgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVCgmbG9jLCBndGlkLCBOVUxMLCAoa21wX2ludCAqKXBfbGIsICAgIFwKKyAgICAgICAgICAgICAgKGttcF9pbnQgKilwX3ViLCAoa21wX2ludCAqKSZzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWx4LCAqcF91YiAweCVseCwgcmV0dXJuaW5nICVkXG4iLCBcCisgICAgICAgICAgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdGF0dXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIExPT1BfUlVOVElNRV9TVEFSVChmdW5jLHNjaGVkdWxlKSBcCisgICAgaW50IGZ1bmMgKGxvbmcgbGIsIGxvbmcgdWIsIGxvbmcgc3RyLCBsb25nICpwX2xiLCBsb25nICpwX3ViKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBjaHVua19zeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgbGIgMHglbHgsIHViIDB4JWx4LCBzdHIgMHglbHgsIGNodW5rX3N6ICVkXG4iLCAgXAorICAgICAgICAgIGd0aWQsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3osIFRSVUUpOyAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfaW50ICopcF9sYiwgICAgXAorICAgICAgICAgICAgICAoa21wX2ludCAqKXBfdWIsIChrbXBfaW50ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSBzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9ORVhUKGZ1bmMsZmluaV9jb2RlKSBcCisgICAgaW50IGZ1bmMobG9uZyAqcF9sYiwgbG9uZyAqcF91YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaW5pX2NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfaW50ICopcF9sYiwgICAgICAgIFwKKyAgICAgICAgICAoa21wX2ludCAqKXBfdWIsIChrbXBfaW50ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqcF91YiArPSAoc3RyaWRlID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCBzdHJpZGUgMHglbHgsICIgIFwKKyAgICAgICAgICAicmV0dXJuaW5nICVkXG4iLCBndGlkLCAqcF9sYiwgKnBfdWIsIHN0cmlkZSwgc3RhdHVzKSk7ICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCksIGttcF9zY2hfc3RhdGljKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19TVEFSVCksIGttcF9zY2hfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQpLCB7fSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9ORVhUKSwge30pCitMT09QX1JVTlRJTUVfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQpLCBrbXBfc2NoX3J1bnRpbWUpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCksIHt9KQorCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19TVEFSVCksIGttcF9vcmRfc3RhdGljKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQpLCBrbXBfb3JkX2R5bmFtaWNfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJUKSwga21wX29yZF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9SVU5USU1FX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQpLCBrbXBfb3JkX3J1bnRpbWUpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZDogVCMlZFxuIiwgZ3RpZCkpCisKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfbG9vcF9lbmQgZXhpdDogVCMlZFxuIiwgZ3RpZCkpCit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQpKHZvaWQpCit7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZF9ub3dhaXQ6IFQjJWRcbiIsIF9fa21wX2dldF9ndGlkKCkpKQorfQorCisKKy8vCisvLyBVbnNpZ25lZCBsb25nIGxvbmcgbG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisvLworLy8gVGhlc2UgYXJlIG5ldyB3aXRoIGdjYyA0LjQKKy8vCisKKyNkZWZpbmUgTE9PUF9TVEFSVF9VTEwoZnVuYyxzY2hlZHVsZSkgXAorICAgIGludCBmdW5jIChpbnQgdXAsIHVuc2lnbmVkIGxvbmcgbG9uZyBsYiwgdW5zaWduZWQgbG9uZyBsb25nIHViLCAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyLCB1bnNpZ25lZCBsb25nIGxvbmcgY2h1bmtfc3osICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF9sYiwgdW5zaWduZWQgbG9uZyBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBsb25nIHN0cjIgPSB1cCA/ICgobG9uZyBsb25nKXN0cikgOiAtKChsb25nIGxvbmcpc3RyKTsgICAgICAgICAgXAorICAgICAgICBsb25nIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIHVwICVkLCBsYiAweCVsbHgsIHViIDB4JWxseCwgc3RyIDB4JWxseCwgY2h1bmtfc3ogMHglbGx4XG4iLCBcCisgICAgICAgICAgZ3RpZCwgdXAsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVF9VTEwoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0cjIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0cjIsIGNodW5rX3N6LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVF9VTEwoJmxvYywgZ3RpZCwgTlVMTCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGttcF91aW50NjQgKilwX2xiLCAoa21wX3VpbnQ2NCAqKXBfdWIsIChrbXBfaW50NjQgKikmc3RyaWRlKTsgXAorICAgICAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gc3RyMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWxseCwgKnBfdWIgMHglbGx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9SVU5USU1FX1NUQVJUX1VMTChmdW5jLHNjaGVkdWxlKSBcCisgICAgaW50IGZ1bmMgKGludCB1cCwgdW5zaWduZWQgbG9uZyBsb25nIGxiLCB1bnNpZ25lZCBsb25nIGxvbmcgdWIsICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF9sYiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIGxvbmcgc3RyMiA9IHVwID8gKChsb25nIGxvbmcpc3RyKSA6IC0oKGxvbmcgbG9uZylzdHIpOyAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGNodW5rX3N6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCB1cCAlZCwgbGIgMHglbGx4LCB1YiAweCVsbHgsIHN0ciAweCVsbHgsIGNodW5rX3N6IDB4JWxseFxuIiwgXAorICAgICAgICAgIGd0aWQsIHVwLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RJU1BBVENIX0lOSVRfVUxMKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIyLCBjaHVua19zeiwgVFJVRSk7ICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUX1VMTCgmbG9jLCBndGlkLCBOVUxMLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoa21wX3VpbnQ2NCAqKXBfbGIsIChrbXBfdWludDY0ICopcF91YiwgKGttcF9pbnQ2NCAqKSZzdHJpZGUpOyBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChsb25nIGxvbmcpc3RyaWRlID09IHN0cjIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbGx4LCAqcF91YiAweCVsbHgsIHJldHVybmluZyAlZFxuIiwgXAorICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBMT09QX05FWFRfVUxMKGZ1bmMsZmluaV9jb2RlKSBcCisgICAgaW50IGZ1bmModW5zaWduZWQgbG9uZyBsb25nICpwX2xiLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBfdWIpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaW5pX2NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUX1VMTCgmbG9jLCBndGlkLCBOVUxMLCAoa21wX3VpbnQ2NCAqKXBfbGIsIFwKKyAgICAgICAgICAoa21wX3VpbnQ2NCAqKXBfdWIsIChrbXBfaW50NjQgKikmc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqcF91YiArPSAoc3RyaWRlID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbGx4LCAqcF91YiAweCVsbHgsIHN0cmlkZSAweCVsbHgsICIgXAorICAgICAgICAgICJyZXR1cm5pbmcgJWRcbiIsIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RyaWRlLCBzdGF0dXMpKTsgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQpLCBrbXBfc2NoX3N0YXRpYykKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX1NUQVJUKSwga21wX3NjaF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhUKSwge30pCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9TVEFSVCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQpLCB7fSkKK0xPT1BfUlVOVElNRV9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJUKSwga21wX3NjaF9ydW50aW1lKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCksIHt9KQorCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJUKSwga21wX29yZF9zdGF0aWMpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX1NUQVJUKSwga21wX29yZF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJUKSwga21wX29yZF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9SVU5USU1FX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCksIGttcF9vcmRfcnVudGltZSkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKKworCisvLworLy8gQ29tYmluZWQgcGFyYWxsZWwgLyBsb29wIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKy8vCisvLyBUaGVyZSBhcmUgbm8gdWxsIHZlcnNpb25zICh5ZXQpLgorLy8KKworI2RlZmluZSBQQVJBTExFTF9MT09QX1NUQVJUKGZ1bmMsIHNjaGVkdWxlLCBvbXB0X3ByZSwgb21wdF9wb3N0KSBcCisgICAgdm9pZCBmdW5jICh2b2lkICgqdGFzaykgKHZvaWQgKiksIHZvaWQgKmRhdGEsIHVuc2lnbmVkIG51bV90aHJlYWRzLCAgICAgIFwKKyAgICAgIGxvbmcgbGIsIGxvbmcgdWIsIGxvbmcgc3RyLCBsb25nIGNodW5rX3N6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogMHglbHhcbiIsICAgICAgICBcCisgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbXB0X3ByZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgdGFzaywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyLCA5LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgdGFzaywgZGF0YSwgbnVtX3RocmVhZHMsICZsb2MsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6KTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOyAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9tcHRfcG9zdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKworI2lmIE9NUFRfU1VQUE9SVAorCisjZGVmaW5lIE9NUFRfTE9PUF9QUkUoKSBcCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfZnJhbWU7IFwKKyAgICBpZiAob21wdF9lbmFibGVkKSB7IFwKKyAgICAgICAgcGFyZW50X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOyBcCisgICAgICAgIHBhcmVudF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7IFwKKyAgICB9CisKKworI2RlZmluZSBPTVBUX0xPT1BfUE9TVCgpIFwKKyAgICBpZiAob21wdF9lbmFibGVkKSB7IFwKKyAgICAgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOyBcCisgICAgfQorCisjZWxzZQorCisjZGVmaW5lIE9NUFRfTE9PUF9QUkUoKQorCisjZGVmaW5lIE9NUFRfTE9PUF9QT1NUKCkKKworI2VuZGlmCisKKworUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJUKSwKKyAgICAgICAgICAgICAgICAgICAga21wX3NjaF9zdGF0aWMsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQ19TVEFSVCksCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfZHluYW1pY19jaHVua2VkLCBPTVBUX0xPT1BfUFJFLCBPTVBUX0xPT1BfUE9TVCkKK1BBUkFMTEVMX0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCksCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCksCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfcnVudGltZSwgT01QVF9MT09QX1BSRSwgT01QVF9MT09QX1BPU1QpCisKKworLy8KKy8vIFRhc2tpbmcgY29uc3RydWN0cworLy8KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVNLKSh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqZGF0YSwgdm9pZCAoKmNvcHlfZnVuYykodm9pZCAqLCB2b2lkICopLAorICBsb25nIGFyZ19zaXplLCBsb25nIGFyZ19hbGlnbiwgYm9vbCBpZl9jb25kLCB1bnNpZ25lZCBnb21wX2ZsYWdzKQoreworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFzayIpOworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGttcF9pbnQzMiBmbGFncyA9IDA7CisgICAga21wX3Rhc2tpbmdfZmxhZ3NfdCAqaW5wdXRfZmxhZ3MgPSAoa21wX3Rhc2tpbmdfZmxhZ3NfdCAqKSAmIGZsYWdzOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAvLyBUaGUgbG93LW9yZGVyIGJpdCBpcyB0aGUgInRpZWQiIGZsYWcKKyAgICBpZiAoZ29tcF9mbGFncyAmIDEpIHsKKyAgICAgICAgaW5wdXRfZmxhZ3MtPnRpZWRuZXNzID0gMTsKKyAgICB9CisgICAgLy8gVGhlIHNlY29uZCBsb3ctb3JkZXIgYml0IGlzIHRoZSAiZmluYWwiIGZsYWcKKyAgICBpZiAoZ29tcF9mbGFncyAmIDIpIHsKKyAgICAgICAgaW5wdXRfZmxhZ3MtPmZpbmFsID0gMTsKKyAgICB9CisgICAgaW5wdXRfZmxhZ3MtPm5hdGl2ZSA9IDE7CisgICAgLy8gX19rbXBfdGFza19hbGxvYygpIHNldHMgdXAgYWxsIG90aGVyIGZsYWdzCisKKyAgICBpZiAoISBpZl9jb25kKSB7CisgICAgICAgIGFyZ19zaXplID0gMDsKKyAgICB9CisKKyAgICBrbXBfdGFza190ICp0YXNrID0gX19rbXBfdGFza19hbGxvYygmbG9jLCBndGlkLCBpbnB1dF9mbGFncywKKyAgICAgIHNpemVvZihrbXBfdGFza190KSwgYXJnX3NpemUgPyBhcmdfc2l6ZSArIGFyZ19hbGlnbiAtIDEgOiAwLAorICAgICAgKGttcF9yb3V0aW5lX2VudHJ5X3QpZnVuYyk7CisKKyAgICBpZiAoYXJnX3NpemUgPiAwKSB7CisgICAgICAgIGlmIChhcmdfYWxpZ24gPiAwKSB7CisgICAgICAgICAgICB0YXNrLT5zaGFyZWRzID0gKHZvaWQgKikoKCgoc2l6ZV90KXRhc2stPnNoYXJlZHMpCisgICAgICAgICAgICAgICsgYXJnX2FsaWduIC0gMSkgLyBhcmdfYWxpZ24gKiBhcmdfYWxpZ24pOworICAgICAgICB9CisgICAgICAgIC8vZWxzZSBlcnJvcj8/CisKKyAgICAgICAgaWYgKGNvcHlfZnVuYykgeworICAgICAgICAgICAgKCpjb3B5X2Z1bmMpKHRhc2stPnNoYXJlZHMsIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX01FTUNQWSh0YXNrLT5zaGFyZWRzLCBkYXRhLCBhcmdfc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaWZfY29uZCkgeworICAgICAgICBfX2ttcGNfb21wX3Rhc2soJmxvYywgZ3RpZCwgdGFzayk7CisgICAgfQorICAgIGVsc2UgeworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBvbXB0X3RocmVhZF9pbmZvX3Qgb2xkSW5mbzsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGE7CisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIFN0b3JlIHRoZSB0aHJlYWRzIHN0YXRlcyBhbmQgcmVzdG9yZSB0aGVtIGFmdGVyIHRoZSB0YXNrCisgICAgICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgICAgICB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgICAgICAgICAgb2xkSW5mbyA9IHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbzsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPQorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKCZsb2MsIGd0aWQsIHRhc2spOworICAgICAgICBmdW5jKGRhdGEpOworICAgICAgICBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCZsb2MsIGd0aWQsIHRhc2spOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbyA9IG9sZEluZm87CisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlUKSh2b2lkKQoreworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFza3dhaXQiKTsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza3dhaXQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIF9fa21wY19vbXBfdGFza3dhaXQoJmxvYywgZ3RpZCk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2t3YWl0IGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCisvLworLy8gU2VjdGlvbnMgd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKworLy8KKy8vIEZvciB0aGUgc2VjdGlvbnMgY29uc3RydWN0LCB3ZSBpbml0aWFsaXplIGEgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AKKy8vIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCB3aXRoIGxiIDEgYW5kIHN0cmlkZSAxLCBhbmQgdXNlIHRoZSBpdGVyYXRpb24gIydzCisvLyB0aGF0IGl0cyByZXR1cm5zIGFzIHNlY3Rpb25zIGlkcy4KKy8vCisvLyBUaGVyZSBhcmUgbm8gc3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIG9yZGVyZWQgc2VjdGlvbnMsIHNvIHdlIGFsd2F5cyB1c2UKKy8vIHRoZSBkeW5hbWljYWxseSBzY2hlZHVsZWQgd29ya3NoYXJlLCBldmVuIGlmIHRoZSBzZWN0aW9ucyBhcmVuJ3Qgb3JkZXJlZC4KKy8vCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUKSh1bnNpZ25lZCBjb3VudCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF9pbnQgbGIsIHViLCBzdHJpZGU7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zZWN0aW9uc19zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQgZXhpdDogVCMlZCByZXR1cm5pbmcgJXVcbiIsIGd0aWQsCisgICAgICAodW5zaWduZWQpbGIpKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKWxiOworfQorCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQpKHZvaWQpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfaW50IGxiLCB1Yiwgc3RyaWRlOworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NlY3Rpb25zX25leHQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX25leHQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfbmV4dCBleGl0OiBUIyVkIHJldHVybmluZyAldVxuIiwgZ3RpZCwKKyAgICAgICh1bnNpZ25lZClsYikpOworICAgIHJldHVybiAodW5zaWduZWQpbGI7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCkodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLAorICB1bnNpZ25lZCBudW1fdGhyZWFkcywgdW5zaWduZWQgY291bnQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF9mcmFtZTsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpOworICAgIH0KKyNlbmRpZgorCisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksIHRhc2ssIGRhdGEsCisgICAgICAgICAgbnVtX3RocmVhZHMsICZsb2MsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIChrbXBfaW50KTEsCisgICAgICAgICAgKGttcF9pbnQpY291bnQsIChrbXBfaW50KTEsIChrbXBfaW50KTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwga21wX25tX2R5bmFtaWNfY2h1bmtlZCwgMSwgY291bnQsIDEsIDEsIFRSVUUpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydCBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kOiBUIyVkXG4iLCBndGlkKSkKKworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmQgZXhpdDogVCMlZFxuIiwgZ3RpZCkpCit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfTk9XQUlUKSh2b2lkKQoreworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kX25vd2FpdDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCit9CisKKy8vIGxpYmdvbXAgaGFzIGFuIGVtcHR5IGZ1bmN0aW9uIGZvciBHT01QX3Rhc2t5aWVsZCBhcyBvZiAyMDEzLTEwLTEwCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tZSUVMRCkodm9pZCkKK3sKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2t5aWVsZDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCisgICAgcmV0dXJuOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQgLy8gdGhlc2UgYXJlIG5ldyBHT01QXzQuMCBlbnRyeSBwb2ludHMKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTCkodm9pZCAoKnRhc2spKHZvaWQgKiksIHZvaWQgKmRhdGEsIHVuc2lnbmVkIG51bV90aHJlYWRzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGFza19pbmZvX3QgKnBhcmVudF90YXNrX2luZm8sICp0YXNrX2luZm87CisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBwYXJlbnRfdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgICAgICAgcGFyZW50X3Rhc2tfaW5mby0+ZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgICAgfQorI2VuZGlmCisgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeworICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeworICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYoZmxhZ3MgIT0gMCkgeworICAgICAgICAgICAgX19rbXBfcHVzaF9wcm9jX2JpbmQoJmxvYywgZ3RpZCwgKGttcF9wcm9jX2JpbmRfdClmbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgdGFzaywKKyAgICAgICAgICAobWljcm90YXNrX3QpX19rbXBfR09NUF9taWNyb3Rhc2tfd3JhcHBlciwgMiwgdGFzaywgZGF0YSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9HT01QX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCwgdGFzayk7CisgICAgfQorI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgICAgICAgdGFza19pbmZvLT5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKyAgICB0YXNrKGRhdGEpOworICAgIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSgpOworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgdGFza19pbmZvLT5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgICAgICBwYXJlbnRfdGFza19pbmZvLT5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TKSh2b2lkICgqdGFzaykgKHZvaWQgKiksIHZvaWQgKmRhdGEsCisgIHVuc2lnbmVkIG51bV90aHJlYWRzLCB1bnNpZ25lZCBjb3VudCwgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zZWN0aW9ucyIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnM6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIGlmKGZsYWdzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCZsb2MsIGd0aWQsIChrbXBfcHJvY19iaW5kX3QpZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksIHRhc2ssIGRhdGEsCisgICAgICAgICAgbnVtX3RocmVhZHMsICZsb2MsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIChrbXBfaW50KTEsCisgICAgICAgICAgKGttcF9pbnQpY291bnQsIChrbXBfaW50KTEsIChrbXBfaW50KTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIHRhc2soZGF0YSk7CisgICAgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9ucyBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKyNkZWZpbmUgUEFSQUxMRUxfTE9PUChmdW5jLCBzY2hlZHVsZSwgb21wdF9wcmUsIG9tcHRfcG9zdCkgXAorICAgIHZvaWQgZnVuYyAodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcywgICAgICBcCisgICAgICBsb25nIGxiLCBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeiwgdW5zaWduZWQgZmxhZ3MpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgbGIgMHglbHgsIHViIDB4JWx4LCBzdHIgMHglbHgsIGNodW5rX3N6IDB4JWx4XG4iLCAgICAgICAgXAorICAgICAgICAgIGd0aWQsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb21wdF9wcmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX19rbXBjX29rX3RvX2ZvcmsoJmxvYykgJiYgKG51bV90aHJlYWRzICE9IDEpKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCZsb2MsIGd0aWQsIG51bV90aHJlYWRzKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoZmxhZ3MgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2ttcF9wdXNoX3Byb2NfYmluZCgmbG9jLCBndGlkLCAoa21wX3Byb2NfYmluZF90KWZsYWdzKTsgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLCB0YXNrLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksICAgICAgICAgXAorICAgICAgICAgICAgICB0YXNrLCBkYXRhLCBudW1fdGhyZWFkcywgJmxvYywgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3opOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2ttcF9HT01QX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCwgdGFzayk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6LCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRhc2soZGF0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbXB0X3Bvc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZFxuIiwgZ3RpZCkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQyksIGttcF9zY2hfc3RhdGljLCAKKyAgICAgICAgICAgICAgICBPTVBUX0xPT1BfUFJFLCBPTVBUX0xPT1BfUE9TVCkKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMpLCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCwgCisgICAgICAgICAgICAgICAgT01QVF9MT09QX1BSRSwgT01QVF9MT09QX1BPU1QpCitQQVJBTExFTF9MT09QKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERUQpLCBrbXBfc2NoX2d1aWRlZF9jaHVua2VkLCAKKyAgICAgICAgICAgICAgICBPTVBUX0xPT1BfUFJFLCBPTVBUX0xPT1BfUE9TVCkKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUUpLCBrbXBfc2NoX3J1bnRpbWUsIAorICAgICAgICAgICAgICAgIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJUKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFza2dyb3VwX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrZ3JvdXBfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIF9fa21wY190YXNrZ3JvdXAoJmxvYywgZ3RpZCk7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF90YXNrZ3JvdXBfZW5kIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrZ3JvdXBfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBfX2ttcGNfZW5kX3Rhc2tncm91cCgmbG9jLCBndGlkKTsKKworICAgIHJldHVybjsKK30KKworI2lmbmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLwora21wX2ludDMyIF9fa21wX2dvbXBfdG9fb21wX2NhbmNlbGxhdGlvbl9raW5kKGludCBnb21wX2tpbmQpIHsKKyAgICBrbXBfaW50MzIgY25jbF9raW5kID0gMDsKKyAgICBzd2l0Y2goZ29tcF9raW5kKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIGNuY2xfa2luZCA9IGNhbmNlbF9wYXJhbGxlbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGNuY2xfa2luZCA9IGNhbmNlbF9sb29wOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgY25jbF9raW5kID0gY2FuY2VsX3NlY3Rpb25zOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgY25jbF9raW5kID0gY2FuY2VsX3Rhc2tncm91cDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBjbmNsX2tpbmQ7Cit9CisKK2Jvb2wKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5UKShpbnQgd2hpY2gpCit7CisgICAgaWYoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBLTVBfRkFUQUwoTm9Hb21wQ2FuY2VsbGF0aW9uKTsKKyAgICB9CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY2FuY2VsbGF0aW9uX3BvaW50Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jYW5jZWxsYXRpb25fcG9pbnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGttcF9pbnQzMiBjbmNsX2tpbmQgPSBfX2ttcF9nb21wX3RvX29tcF9jYW5jZWxsYXRpb25fa2luZCh3aGljaCk7CisKKyAgICByZXR1cm4gX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50KCZsb2MsIGd0aWQsIGNuY2xfa2luZCk7Cit9CisKK2Jvb2wKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUl9DQU5DRUwpKHZvaWQpCit7CisgICAgaWYoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBLTVBfRkFUQUwoTm9Hb21wQ2FuY2VsbGF0aW9uKTsKKyAgICB9CisgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfYmFycmllcl9jYW5jZWwiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2JhcnJpZXJfY2FuY2VsOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICByZXR1cm4gX19rbXBjX2NhbmNlbF9iYXJyaWVyKCZsb2MsIGd0aWQpOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTCkoaW50IHdoaWNoLCBib29sIGRvX2NhbmNlbCkKK3sKKyAgICBpZihfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jYW5jZWwiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2NhbmNlbDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAga21wX2ludDMyIGNuY2xfa2luZCA9IF9fa21wX2dvbXBfdG9fb21wX2NhbmNlbGxhdGlvbl9raW5kKHdoaWNoKTsKKworICAgIGlmKGRvX2NhbmNlbCA9PSBGQUxTRSkgeworICAgICAgICByZXR1cm4geGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9DQU5DRUxMQVRJT05fUE9JTlQpKHdoaWNoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gX19rbXBjX2NhbmNlbCgmbG9jLCBndGlkLCBjbmNsX2tpbmQpOworICAgIH0KK30KKworYm9vbAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfQ0FOQ0VMKSh2b2lkKQoreworICAgIGlmKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgICAgfQorICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NlY3Rpb25zX2VuZF9jYW5jZWwiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX2VuZF9jYW5jZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIHJldHVybiBfX2ttcGNfY2FuY2VsX2JhcnJpZXIoJmxvYywgZ3RpZCk7Cit9CisKK2Jvb2wKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfQ0FOQ0VMKSh2b2lkKQoreworICAgIGlmKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgICAgfQorICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2xvb3BfZW5kX2NhbmNlbCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfbG9vcF9lbmRfY2FuY2VsOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICByZXR1cm4gX19rbXBjX2NhbmNlbF9iYXJyaWVyKCZsb2MsIGd0aWQpOworfQorCisvLyBBbGwgdGFyZ2V0IGZ1bmN0aW9ucyBhcmUgZW1wdHkgYXMgb2YgMjAxNC0wNS0yOQordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVJHRVQpKGludCBkZXZpY2UsIHZvaWQgKCpmbikgKHZvaWQgKiksIGNvbnN0IHZvaWQgKm9wZW5tcF90YXJnZXQsCisgICAgICAgICAgICAgc2l6ZV90IG1hcG51bSwgdm9pZCAqKmhvc3RhZGRycywgc2l6ZV90ICpzaXplcywgdW5zaWduZWQgY2hhciAqa2luZHMpCit7CisgICAgcmV0dXJuOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9EQVRBKShpbnQgZGV2aWNlLCBjb25zdCB2b2lkICpvcGVubXBfdGFyZ2V0LCBzaXplX3QgbWFwbnVtLAorICAgICAgICAgICAgICAgICAgdm9pZCAqKmhvc3RhZGRycywgc2l6ZV90ICpzaXplcywgdW5zaWduZWQgY2hhciAqa2luZHMpCit7CisgICAgcmV0dXJuOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9FTkRfREFUQSkodm9pZCkKK3sKKyAgICByZXR1cm47Cit9CisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX1VQREFURSkoaW50IGRldmljZSwgY29uc3Qgdm9pZCAqb3Blbm1wX3RhcmdldCwgc2l6ZV90IG1hcG51bSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmhvc3RhZGRycywgc2l6ZV90ICpzaXplcywgdW5zaWduZWQgY2hhciAqa2luZHMpCit7CisgICAgcmV0dXJuOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RFQU1TKSh1bnNpZ25lZCBpbnQgbnVtX3RlYW1zLCB1bnNpZ25lZCBpbnQgdGhyZWFkX2xpbWl0KQoreworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisKKy8qCisgICAgVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBvZiBjb2RlIGNyZWF0ZSBhbGlhc2VzIGZvciB0aGUgR09NUF8qIGZ1bmN0aW9ucywKKyAgICB0aGVuIGNyZWF0ZSB2ZXJzaW9uZWQgc3ltYm9scyB1c2luZyB0aGUgYXNzZW1ibGVyIGRpcmVjdGl2ZSAuc3ltdmVyLgorICAgIFRoaXMgaXMgb25seSBwZXJ0aW5lbnQgZm9yIEVMRiAuc28gbGlicmFyeQorICAgIHhhbGlhc2lmeSBhbmQgeHZlcnNpb25pZnkgYXJlIGRlZmluZWQgaW4ga21wX2Z0bl9vcy5oCisqLworCisjaWZkZWYgS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworLy8gR09NUF8xLjAgYWxpYXNlcworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSLCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfTk9XQUlULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVEX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX05PV0FJVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX1NUQVJULCAxMCk7CisKKy8vIEdPTVBfMi4wIGFsaWFzZXMKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLLCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX1NUQVJULCAyMCk7CisKKy8vIEdPTVBfMy4wIGFsaWFzZXMKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQsIDMwKTsKKworLy8gR09NUF80LjAgYWxpYXNlcworLy8gVGhlIEdPTVBfcGFyYWxsZWwqIGVudHJ5IHBvaW50cyBiZWxvdyBhcmVuJ3QgT3Blbk1QIDQuMCByZWxhdGVkLgorI2lmIE9NUF80MF9FTkFCTEVECit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUwsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OUywgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQywgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVELCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUMsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfU1RBUlQsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfRU5ELCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUl9DQU5DRUwsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9DQU5DRUxMQVRJT05fUE9JTlQsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9DQU5DRUwsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VULCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0RBVEEsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfRU5EX0RBVEEsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfVVBEQVRFLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEVBTVMsIDQwKTsKKyNlbmRpZgorCisvLyBHT01QXzEuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSLCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX05PV0FJVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworCisvLyBHT01QXzIuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTSywgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKKworLy8gR09NUF8zLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tZSUVMRCwgMzAsICJHT01QXzMuMCIpOworCisvLyBHT01QXzQuMCB2ZXJzaW9uZWQgc3ltYm9scworI2lmIE9NUF80MF9FTkFCTEVECit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlMsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQywgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERUQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRSwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUMsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9TVEFSVCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX0VORCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUl9DQU5DRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5ULCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9DQU5DRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9DQU5DRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0RBVEEsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9FTkRfREFUQSwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX1VQREFURSwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEVBTVMsIDQwLCAiR09NUF80LjAiKTsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvL2V4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfaTE4bi5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2kxOG4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNGYzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2kxOG4uY3BwCkBAIC0wLDAgKzEsOTk1IEBACisvKgorICoga21wX2kxOG4uY3BwCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKworI2luY2x1ZGUgImttcF9pMThuLmgiCisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9pby5oIiAgICAgICAgICAvLyBfX2ttcF9wcmludGYuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJrbXBfaTE4bl9kZWZhdWx0LmluYyIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisKKyN1bmRlZiBLTVBfSTE4Tl9PSworCisjZGVmaW5lIGdldF9zZWN0aW9uKCBpZCApICAoIChpZCkgPj4gMTYgKQorI2RlZmluZSBnZXRfbnVtYmVyKCBpZCApICAgKCAoaWQpICYgMHhGRkZGICkKKwora21wX21zZ190ICAgICAgICAgICBfX2ttcF9tc2dfZW1wdHkgPSB7IGttcF9tdF9kdW1teSwgMCwgIiIsIDAgIH07CitrbXBfbXNnX3QgICAgICAgICAgIF9fa21wX21zZ19udWxsICA9IHsga21wX210X2R1bW15LCAwLCBOVUxMLCAwIH07CitzdGF0aWMgY2hhciBjb25zdCAqIG5vX21lc3NhZ2VfYXZhaWxhYmxlID0gIihObyBtZXNzYWdlIGF2YWlsYWJsZSkiOworCitlbnVtIGttcF9pMThuX2NhdF9zdGF0dXMgeworICAgIEtNUF9JMThOX0NMT1NFRCwgICAgLy8gTm90IHlldCBvcGVuZWQgb3IgY2xvc2VkLgorICAgIEtNUF9JMThOX09QRU5FRCwgICAgLy8gT3BlbmVkIHN1Y2Nlc3NmdWxseSwgcmVhZHkgdG8gdXNlLgorICAgIEtNUF9JMThOX0FCU0VOVCAgICAgLy8gT3BlbmluZyBmYWlsZWQsIG1lc3NhZ2UgY2F0YWxvZyBzaG91bGQgbm90IGJlIHVzZWQuCit9OyAvLyBlbnVtIGttcF9pMThuX2NhdF9zdGF0dXMKK3R5cGVkZWYgZW51bSBrbXBfaTE4bl9jYXRfc3RhdHVzICBrbXBfaTE4bl9jYXRfc3RhdHVzX3Q7CitzdGF0aWMgdm9sYXRpbGUga21wX2kxOG5fY2F0X3N0YXR1c190ICBzdGF0dXMgPSBLTVBfSTE4Tl9DTE9TRUQ7CisKKy8qCisgICAgTWVzc2FnZSBjYXRhbG9nIGlzIG9wZW5lZCBhdCBmaXJzdCB1c2FnZSwgc28gd2UgaGF2ZSB0byBzeW5jaHJvbml6ZSBvcGVuaW5nIHRvIGF2b2lkIHJhY2UgYW5kCisgICAgbXVsdGlwbGUgb3BlbmluZ3MuCisKKyAgICBDbG9zaW5nIGRvZXMgbm90IHJlcXVpcmUgc3luY2hyb25pemF0aW9uLCBiZWNhdXNlIGNhdGFsb2cgaXMgY2xvc2VkIHZlcnkgbGF0ZSBhdCBsaWJyYXJ5CisgICAgc2h1dHRpbmcgZG93biwgd2hlbiBubyBvdGhlciB0aHJlYWRzIGFyZSBhbGl2ZS4KKyovCisKK3N0YXRpYyB2b2lkIF9fa21wX2kxOG5fZG9fY2F0b3BlbigpOworc3RhdGljIGttcF9ib290c3RyYXBfbG9ja190ICBsb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICk7CisgICAgLy8gYGxvY2snIHZhcmlhYmxlIG1heSBiZSBwbGFjZWQgaW50byBfX2ttcF9pMThuX2NhdG9wZW4gZnVuY3Rpb24gYmVjYXVzZSBpdCBpcyB1c2VkIG9ubHkgYnkKKyAgICAvLyB0aGF0IGZ1bmN0aW9uLiBCdXQgd2UgYWZyYWlkIGEgKGJ1Z2d5KSBjb21waWxlciBtYXkgdHJlYXQgaXQgd3JvbmdseS4gU28gd2UgcHV0IGl0IG91dHNpZGUgb2YKKyAgICAvLyBmdW5jdGlvbiBqdXN0IGluIGNhc2UuCisKK3ZvaWQKK19fa21wX2kxOG5fY2F0b3BlbigKKykgeworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBsb2NrICk7CisgICAgICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApIHsKKyAgICAgICAgICAgIF9fa21wX2kxOG5fZG9fY2F0b3BlbigpOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0b3BlbgorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgTGludXgqIE9TIGFuZCBPUyBYKiBwYXJ0LgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmIEtNUF9PU19VTklYCisjZGVmaW5lIEtNUF9JMThOX09LCisKKyNpbmNsdWRlIDxubF90eXBlcy5oPgorCisjZGVmaW5lIEtNUF9JMThOX05VTExDQVQgKChubF9jYXRkKSggLTEgKSkKK3N0YXRpYyBubF9jYXRkICAgICAgIGNhdCAgPSBLTVBfSTE4Tl9OVUxMQ0FUOyAgICAvLyAhISEgU2hhbGwgaXQgYmUgdm9sYXRpbGU/CitzdGF0aWMgY2hhciBjb25zdCAqICBuYW1lID0gKCBLTVBfVkVSU0lPTl9NQUpPUiA9PSA0ID8gImxpYmd1aWRlLmNhdCIgOiAibGlib21wLmNhdCIgKTsKKworLyoKKyAgICBVc2VmdWwgbGlua3M6CisgICAgICAgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwMDA5NTM5OS9iYXNlZGVmcy94YmRfY2hhcDA4Lmh0bWwjdGFnXzA4XzAyCisgICAgICAgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwMDA5NTM5OS9mdW5jdGlvbnMvY2F0b3Blbi5odG1sCisgICAgICAgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwMDA5NTM5OS9mdW5jdGlvbnMvc2V0bG9jYWxlLmh0bWwKKyovCisKK3ZvaWQKK19fa21wX2kxOG5fZG9fY2F0b3BlbigKKykgeworICAgIGludCAgICBlbmdsaXNoID0gMDsKKyAgICBjaGFyICogbGFuZyAgICA9IF9fa21wX2Vudl9nZXQoICJMQU5HIiApOworICAgIC8vIFRPRE86IFdoYXQgYWJvdXQgTENfQUxMIG9yIExDX01FU1NBR0VTPworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNhdCAgICA9PSBLTVBfSTE4Tl9OVUxMQ0FUICk7CisKKyAgICBlbmdsaXNoID0KKyAgICAgICAgbGFuZyA9PSBOVUxMICAgICAgICAgICAgICAgICAgICAgICB8fCAgLy8gSW4gYWxsIHRoZXNlIGNhc2VzIEVuZ2xpc2ggbGFuZ3VhZ2UgaXMgdXNlZC4KKyAgICAgICAgc3RyY21wKCBsYW5nLCAiIiApICAgICAgICAgICAgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIGxhbmcsICIgIiApICAgICAgICAgICA9PSAwIHx8CisgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIEZvcnRyYW4gUlRMIGJ1ZyBEUEQyMDAxMzc4NzMgIkZvcnRyYW4gcnVudGltZSByZXNldHMgTEFORyBlbnYgdmFyCisgICAgICAgIC8vIHRvIHNwYWNlIGlmIGl0IGlzIG5vdCBzZXQiLgorICAgICAgICBzdHJjbXAoIGxhbmcsICJDIiApICAgICAgICAgICA9PSAwIHx8CisgICAgICAgIHN0cmNtcCggbGFuZywgIlBPU0lYIiApICAgICAgID09IDA7CisKKyAgICBpZiAoICEgZW5nbGlzaCApIHsgIC8vIEVuZ2xpc2ggbGFuZ3VhZ2UgaXMgbm90IHlldCBkZXRlY3RlZCwgbGV0IHVzIGNvbnRpbnVlLgorICAgICAgICAvLyBGb3JtYXQgb2YgTEFORyBpczogW2xhbmd1YWdlW190ZXJyaXRvcnldWy5jb2Rlc2V0XVtAbW9kaWZpZXJdXQorICAgICAgICAvLyBTdHJpcCBhbGwgcGFydHMgZXhjZXB0IGxhbmd1YWdlLgorICAgICAgICBjaGFyICogdGFpbCA9IE5VTEw7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggbGFuZywgJ0AnLCAmIGxhbmcsICYgdGFpbCApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIGxhbmcsICcuJywgJiBsYW5nLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBsYW5nLCAnXycsICYgbGFuZywgJiB0YWlsICk7CisgICAgICAgIGVuZ2xpc2ggPSAoIHN0cmNtcCggbGFuZywgImVuIiApID09IDAgKTsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGxhbmcgKTsKKworICAgIC8vIERvIG5vdCB0cnkgdG8gb3BlbiBFbmdsaXNoIGNhdGFsb2cgYmVjYXVzZSBpbnRlcm5hbCBtZXNzYWdlcyBhcmUKKyAgICAvLyBleGFjdCBjb3B5IG9mIG1lc3NhZ2VzIGluIEVuZ2xpc2ggY2F0YWxvZy4KKyAgICBpZiAoIGVuZ2xpc2ggKSB7CisgICAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIG1hcmsgY2F0YWxvZyBhcyBhYnNlbnQgc28gaXQgd2lsbCBub3QgYmUgcmUtb3BlbmVkLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2F0ID0gY2F0b3BlbiggbmFtZSwgMCApOworICAgIC8vIFRPRE86IFdoeSBkbyB3ZSBwYXNzIDAgaW4gZmxhZ3M/CisgICAgc3RhdHVzID0gKCBjYXQgPT0gS01QX0kxOE5fTlVMTENBVCA/IEtNUF9JMThOX0FCU0VOVCA6IEtNUF9JMThOX09QRU5FRCApOworCisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQUJTRU5UICkgeworICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7IC8vIEFDOiBvbmx5IGlzc3VlIHdhcm5pbmcgaW4gY2FzZSBleHBsaWNpdGx5IGFza2VkIHRvCisgICAgICAgICAgICBpbnQgICAgZXJyb3IgICA9IGVycm5vOyAvLyBTYXZlIGVycm5vIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgY2hhciAqIG5sc3BhdGggPSBfX2ttcF9lbnZfZ2V0KCAiTkxTUEFUSCIgKTsKKyAgICAgICAgICAgIGNoYXIgKiBsYW5nICAgID0gX19rbXBfZW52X2dldCggIkxBTkciICk7CisKKyAgICAgICAgICAgIC8vIEluZmluaXRlIHJlY3Vyc2lvbiB3aWxsIG5vdCBvY2N1ciAtLSBzdGF0dXMgaXMgS01QX0kxOE5fQUJTRU5UIG5vdywgc28KKyAgICAgICAgICAgIC8vIF9fa21wX2kxOG5fY2F0Z2V0cygpIHdpbGwgbm90IHRyeSB0byBvcGVuIGNhdGFsb2csIGJ1dCB3aWxsIHJldHVybiBkZWZhdWx0IG1lc3NhZ2UuCisgICAgICAgICAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfRVJSKCBlcnJvciApOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKSwKKyAgICAgICAgICAgICAgICBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBDaGVja0VudlZhciwgIk5MU1BBVEgiLCBubHNwYXRoICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggQ2hlY2tFbnZWYXIsICJMQU5HIiwgbGFuZyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG5sc3BhdGggKTsKKyAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBsYW5nICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVECisKKyAgICAgICAgaW50IHNlY3Rpb24gPSBnZXRfc2VjdGlvbigga21wX2kxOG5fcHJwX1ZlcnNpb24gKTsKKyAgICAgICAgaW50IG51bWJlciAgPSBnZXRfbnVtYmVyKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBjaGFyIGNvbnN0ICogZXhwZWN0ZWQgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cuCisgICAgICAgIGttcF9zdHJfYnVmX3QgdmVyc2lvbjsgICAvLyBBY3R1YWwgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHZlcnNpb24gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiB2ZXJzaW9uLCAiJXMiLCBjYXRnZXRzKCBjYXQsIHNlY3Rpb24sIG51bWJlciwgTlVMTCApICk7CisKKyAgICAgICAgLy8gU3RyaW5nIHJldHVybmVkIGJ5IGNhdGdldHMgaXMgaW52YWxpZCBhZnRlciBjbG9zaW5nIHRoZSBjYXRhbG9nLCBzbyBjb3B5IGl0LgorICAgICAgICBpZiAoIHN0cmNtcCggdmVyc2lvbi5zdHIsIGV4cGVjdGVkICkgIT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsgICAgIC8vIENsb3NlIGJhZCBjYXRhbG9nLgorICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAgLy8gQW5kIG1hcmsgaXQgYXMgYWJzZW50LgorICAgICAgICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID4ga21wX3dhcm5pbmdzX2xvdykgeyAvLyBBQzogb25seSBpc3N1ZSB3YXJuaW5nIGluIGNhc2UgZXhwbGljaXRseSBhc2tlZCB0bworICAgICAgICAgICAgICAgIC8vIEFuZCBub3cgcHJpbnQgYSB3YXJuaW5nIHVzaW5nIGRlZmF1bHQgbWVzc2FnZXMuCisgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIG5hbWUgICAgPSAiTkxTUEFUSCI7CisgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIG5sc3BhdGggPSBfX2ttcF9lbnZfZ2V0KCBuYW1lICk7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggV3JvbmdNZXNzYWdlQ2F0YWxvZywgbmFtZSwgdmVyc2lvbi5zdHIsIGV4cGVjdGVkICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIENoZWNrRW52VmFyLCBuYW1lLCBubHNwYXRoICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIG5sc3BhdGggKTsKKyAgICAgICAgICAgIH0gLy8gX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHZlcnNpb24gKTsKKworICAgIH07IC8vIGlmCisKK30gLy8gZnVuYyBfX2ttcF9pMThuX2RvX2NhdG9wZW4KKworCit2b2lkCitfX2ttcF9pMThuX2NhdGNsb3NlKAorKSB7CisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVEICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjYXQgIT0gS01QX0kxOE5fTlVMTENBVCApOworICAgICAgICBjYXRjbG9zZSggY2F0ICk7CisgICAgICAgIGNhdCA9IEtNUF9JMThOX05VTExDQVQ7CisgICAgfTsgLy8gaWYKKyAgICBzdGF0dXMgPSBLTVBfSTE4Tl9DTE9TRUQ7Cit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRjbG9zZQorCisKK2NoYXIgY29uc3QgKgorX19rbXBfaTE4bl9jYXRnZXRzKAorICAgIGttcF9pMThuX2lkX3QgIGlkCispIHsKKworICAgIGludCBzZWN0aW9uID0gZ2V0X3NlY3Rpb24oIGlkICk7CisgICAgaW50IG51bWJlciAgPSBnZXRfbnVtYmVyKCBpZCApOworICAgIGNoYXIgY29uc3QgKiBtZXNzYWdlID0gTlVMTDsKKworICAgIGlmICggMSA8PSBzZWN0aW9uICYmIHNlY3Rpb24gPD0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNpemUgKSB7CisgICAgICAgIGlmICggMSA8PSBudW1iZXIgJiYgbnVtYmVyIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZSApIHsKKyAgICAgICAgICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdG9wZW4oKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQgKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgIGNhdGdldHMoCisgICAgICAgICAgICAgICAgICAgICAgICBjYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIG1lc3NhZ2UgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICBtZXNzYWdlID0gbm9fbWVzc2FnZV9hdmFpbGFibGU7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gbWVzc2FnZTsKKworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Z2V0cworCisKKyNlbmRpZiAvLyBLTVBfT1NfVU5JWAorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFdpbmRvd3MqIE9TIHBhcnQuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyNkZWZpbmUgS01QX0kxOE5fT0sKKworI2luY2x1ZGUgImttcF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2RlZmluZSBLTVBfSTE4Tl9OVUxMQ0FUICBOVUxMCitzdGF0aWMgSE1PRFVMRSAgICAgICBjYXQgID0gS01QX0kxOE5fTlVMTENBVDsgICAgLy8gISEhIFNoYWxsIGl0IGJlIHZvbGF0aWxlPworc3RhdGljIGNoYXIgY29uc3QgKiAgbmFtZSA9ICggS01QX1ZFUlNJT05fTUFKT1IgPT0gNCA/ICJsaWJndWlkZTQwdWkuZGxsIiA6ICJsaWJvbXB1aS5kbGwiICk7CisKK3N0YXRpYyBrbXBfaTE4bl90YWJsZV90ICB0YWJsZSAgICAgICAgICAgICA9IHsgMCwgTlVMTCB9OworICAgIC8vIE1lc3NhZ2VzIGZvcm1hdHRlZCBieSBGb3JtYXRNZXNzYWdlKCkgc2hvdWxkIGJlIGZyZWVkLCBidXQgY2F0Z2V0cygpIGludGVyZmFjZSBhc3N1bWVzCisgICAgLy8gdXNlciB3aWxsIG5vdCBmcmVlIG1lc3NhZ2VzLiBTbyB3ZSBjYWNoZSBhbGwgdGhlIHJldHJpZXZlZCBtZXNzYWdlcyBpbiB0aGUgdGFibGUsIHdoaWNoCisgICAgLy8gYXJlIGZyZWVkIGF0IGNhdGNsb3NlKCkuCitzdGF0aWMgVUlOVCBjb25zdCAgICAgICAgZGVmYXVsdF9jb2RlX3BhZ2UgPSBDUF9PRU1DUDsKK3N0YXRpYyBVSU5UICAgICAgICAgICAgICBjb2RlX3BhZ2UgICAgICAgICA9IGRlZmF1bHRfY29kZV9wYWdlOworCitzdGF0aWMgY2hhciBjb25zdCAqIF9fX2NhdGdldHMoIGttcF9pMThuX2lkX3QgIGlkICk7CitzdGF0aWMgVUlOVCAgICAgICAgIGdldF9jb2RlX3BhZ2UoKTsKK3N0YXRpYyB2b2lkICAgICAgICAga21wX2kxOG5fdGFibGVfZnJlZSgga21wX2kxOG5fdGFibGVfdCAqIHRhYmxlICk7CisKKworc3RhdGljIFVJTlQKK2dldF9jb2RlX3BhZ2UoCispIHsKKworICAgIFVJTlQgY3AgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBfX2ttcF9lbnZfZ2V0KCAiS01QX0NPREVQQUdFIiApOworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgaWYgKCBfc3RyaWNtcCggdmFsdWUsICJBTlNJIiApID09IDAgKSB7CisgICAgICAgICAgICBjcCA9IENQX0FDUDsKKyAgICAgICAgfSBlbHNlIGlmICggX3N0cmljbXAoIHZhbHVlLCAiT0VNIiApID09IDAgKSB7CisgICAgICAgICAgICBjcCA9IENQX09FTUNQOworICAgICAgICB9IGVsc2UgaWYgKCBfc3RyaWNtcCggdmFsdWUsICJVVEYtOCIgKSA9PSAwIHx8IF9zdHJpY21wKCB2YWx1ZSwgIlVURjgiICkgPT0gMCApIHsKKyAgICAgICAgICAgIGNwID0gQ1BfVVRGODsKKyAgICAgICAgfSBlbHNlIGlmICggX3N0cmljbXAoIHZhbHVlLCAiVVRGLTciICkgPT0gMCB8fCBfc3RyaWNtcCggdmFsdWUsICJVVEY3IiApID09IDAgKSB7CisgICAgICAgICAgICBjcCA9IENQX1VURjc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyAhISEgVE9ETzogSXNzdWUgYSB3YXJuaW5nPworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHZhbHVlICk7CisgICAgcmV0dXJuIGNwOworCit9IC8vIGZ1bmMgZ2V0X2NvZGVfcGFnZQorCisKK3N0YXRpYyB2b2lkCitrbXBfaTE4bl90YWJsZV9mcmVlKAorICAgIGttcF9pMThuX3RhYmxlX3QgKiB0YWJsZQorKSB7CisgICAgaW50IHM7CisgICAgaW50IG07CisgICAgZm9yICggcyA9IDA7IHMgPCB0YWJsZS0+c2l6ZTsgKysgcyApIHsKKyAgICAgICAgZm9yICggbSA9IDA7IG0gPCB0YWJsZS0+c2VjdFsgcyBdLnNpemU7ICsrIG0gKSB7CisgICAgICAgICAgICAvLyBGcmVlIG1lc3NhZ2UuCisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgdGFibGUtPnNlY3RbIHMgXS5zdHJbIG0gXSApOworICAgICAgICAgICAgdGFibGUtPnNlY3RbIHMgXS5zdHJbIG0gXSA9IE5VTEw7CisgICAgICAgIH07IC8vIGZvciBtCisgICAgICAgIHRhYmxlLT5zZWN0WyBzIF0uc2l6ZSA9IDA7CisgICAgICAgIC8vIEZyZWUgc2VjdGlvbiBpdHNlbGYuCisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFICggKHZvaWQgKikgdGFibGUtPnNlY3RbIHMgXS5zdHIgKTsKKyAgICAgICAgdGFibGUtPnNlY3RbIHMgXS5zdHIgPSBOVUxMOworICAgIH07IC8vIGZvciBzCisgICAgdGFibGUtPnNpemUgPSAwOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSB0YWJsZS0+c2VjdCApOworICAgIHRhYmxlLT5zZWN0ID0gTlVMTDsKK30gLy8ga21wX2kxOG5fdGFibGVfZnJlZQorCisKK3ZvaWQKK19fa21wX2kxOG5fZG9fY2F0b3BlbigKKykgeworCisgICAgTENJRCAgICAgICAgICBsb2NhbGVfaWQgPSBHZXRUaHJlYWRMb2NhbGUoKTsKKyAgICBXT1JEICAgICAgICAgIGxhbmdfaWQgPSBMQU5HSURGUk9NTENJRCggbG9jYWxlX2lkICk7CisgICAgV09SRCAgICAgICAgICBwcmltYXJ5X2xhbmdfaWQgPSBQUklNQVJZTEFOR0lEKCBsYW5nX2lkICk7CisgICAga21wX3N0cl9idWZfdCBwYXRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNhdCAgICA9PSBLTVBfSTE4Tl9OVUxMQ0FUICk7CisKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgcGF0aCApOworCisgICAgLy8gRG8gbm90IHRyeSB0byBvcGVuIEVuZ2xpc2ggY2F0YWxvZyBiZWNhdXNlIGludGVybmFsIG1lc3NhZ2VzIGFyZQorICAgIC8vIGV4YWN0IGNvcHkgb2YgbWVzc2FnZXMgaW4gRW5nbGlzaCBjYXRhbG9nLgorICAgIGlmICggcHJpbWFyeV9sYW5nX2lkID09IExBTkdfRU5HTElTSCApIHsKKyAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAgLy8gbWFyayBjYXRhbG9nIGFzIGFic2VudCBzbyBpdCB3aWxsIG5vdCBiZSByZS1vcGVuZWQuCisgICAgICAgIGdvdG8gZW5kOworICAgIH07IC8vIGlmCisKKyAgICAvLyBDb25zdHJ1Y3QgcmVzb3VyY2UgRExMIG5hbWUuCisgICAgLyoKKyAgICAgICAgU2ltcGxlCisgICAgICAgICAgICBMb2FkTGlicmFyeSggbmFtZSApCisgICAgICAgIGlzIG5vdCBzdWl0YWJsZSBkdWUgdG8gc2VjdXJpdHkgaXNzdWUgKHNlZQorICAgICAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdGVjaG5ldC9zZWN1cml0eS9hZHZpc29yeS8yMjY5NjM3Lm1zcHgpLiBXZSBoYXZlIHRvIHNwZWNpZnkgZnVsbAorICAgICAgICBwYXRoIHRvIHRoZSBtZXNzYWdlIGNhdGFsb2cuCisgICAgKi8KKyAgICB7CisKKyAgICAgICAgLy8gR2V0IGhhbmRsZSBvZiBvdXIgRExMIGZpcnN0LgorICAgICAgICBITU9EVUxFIGhhbmRsZTsKKyAgICAgICAgQk9PTCBicmMgPQorICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlRXgoCisgICAgICAgICAgICAgICAgR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19GUk9NX0FERFJFU1MgfCBHRVRfTU9EVUxFX0hBTkRMRV9FWF9GTEFHX1VOQ0hBTkdFRF9SRUZDT1VOVCwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBMUENTVFIgPiggJiBfX2ttcF9pMThuX2RvX2NhdG9wZW4gKSwKKyAgICAgICAgICAgICAgICAmIGhhbmRsZQorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCAhIGJyYyApIHsgICAgLy8gRXJyb3Igb2NjdXJyZWQuCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBtYXJrIGNhdGFsb2cgYXMgYWJzZW50IHNvIGl0IHdpbGwgbm90IGJlIHJlLW9wZW5lZC4KKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIG11bHRpcGxlIG1lc3NhZ2VzIChLTVBfTVNHKSB0byBiZSBwYXNzZWQgdG8gX19rbXBfbXNnOyBhbmQgcHJpbnQKKyAgICAgICAgICAgIC8vIGEgcHJvcGVyIHdhcm5pbmcuCisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gTm93IGdldCBwYXRoIHRvIHRoZSBvdXIgRExMLgorICAgICAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgICAgICBEV09SRCBkcmMgPSBHZXRNb2R1bGVGaWxlTmFtZSggaGFuZGxlLCBwYXRoLnN0ciwgcGF0aC5zaXplICk7CisgICAgICAgICAgICBpZiAoIGRyYyA9PSAwICkgeyAgICAvLyBFcnJvciBvY2N1cnJlZC4KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBkcmMgPCBwYXRoLnNpemUgKSB7CisgICAgICAgICAgICAgICAgcGF0aC51c2VkID0gZHJjOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSggJiBwYXRoLCBwYXRoLnNpemUgKiAyICk7CisgICAgICAgIH07IC8vIGZvcmV2ZXIKKworICAgICAgICAvLyBOb3cgY29uc3RydWN0IHRoZSBuYW1lIG9mIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAgICAga21wX3N0cl9mbmFtZSBmbmFtZTsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2luaXQoICYgZm5hbWUsIHBhdGguc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfY2xlYXIoICYgcGF0aCApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHBhdGgsICIlcyVsdS8lcyIsIGZuYW1lLmRpciwgKHVuc2lnbmVkIGxvbmcpKCBsb2NhbGVfaWQgKSwgbmFtZSApOworICAgICAgICBfX2ttcF9zdHJfZm5hbWVfZnJlZSggJiBmbmFtZSApOworCisgICAgfQorCisgICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHVzZSBMb2FkTGlicmFyeUV4KCkgYW5kIGxvYWQgbWVzc2FnZSBjYXRhbG9nIGFzIGEgZGF0YSBmaWxlLgorICAgIGNhdCA9IExvYWRMaWJyYXJ5RXgoIHBhdGguc3RyLCBOVUxMLCBMT0FEX0xJQlJBUllfQVNfREFUQUZJTEUgKTsKKyAgICBzdGF0dXMgPSAoIGNhdCA9PSBLTVBfSTE4Tl9OVUxMQ0FUID8gS01QX0kxOE5fQUJTRU5UIDogS01QX0kxOE5fT1BFTkVEICk7CisKKyAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9BQlNFTlQgKSB7CisgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7IC8vIEFDOiBvbmx5IGlzc3VlIHdhcm5pbmcgaW4gY2FzZSBleHBsaWNpdGx5IGFza2VkIHRvCisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIC8vIEluZmluaXRlIHJlY3Vyc2lvbiB3aWxsIG5vdCBvY2N1ciAtLSBzdGF0dXMgaXMgS01QX0kxOE5fQUJTRU5UIG5vdywgc28KKyAgICAgICAgLy8gX19rbXBfaTE4bl9jYXRnZXRzKCkgd2lsbCBub3QgdHJ5IHRvIG9wZW4gY2F0YWxvZyBidXQgd2lsbCByZXR1cm4gZGVmYXVsdCBtZXNzYWdlLgorICAgICAgICAvKgorICAgICAgICAgIElmIG1lc3NhZ2UgY2F0YWxvZyBmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUgZm91bmQgKGUuZy4gT3Blbk1QIFJUTAorICAgICAgICAgIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgb3BlbnMgbGlib21wdWkuZGxsIGZvciBJbnRlbChSKSA2NCkKKyAgICAgICAgICBXaW5kb3dzKiBPUyByZXR1cm5zIGVycm9yIDE5MyAoRVJST1JfQkFEX0VYRV9GT1JNQVQpLiBIb3dldmVyLAorICAgICAgICAgIEZvcm1hdE1lc3NhZ2UgZmFpbHMgdG8gcmV0dXJuIGEgbWVzc2FnZSBmb3IgdGhpcyBlcnJvciwgc28gdXNlcgorICAgICAgICAgIHdpbGwgc2VlOgorCisgICAgICAgICAgT01QOiBXYXJuaW5nICMyOiBDYW5ub3Qgb3BlbiBtZXNzYWdlIGNhdGFsb2cgIjEwNDFcbGlib21wdWkuZGxsIjoKKyAgICAgICAgICBPTVA6IFN5c3RlbSBlcnJvciAjMTkzOiAoTm8gc3lzdGVtIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlKQorICAgICAgICAgIE9NUDogSW5mbyAjMzogRGVmYXVsdCBtZXNzYWdlcyB3aWxsIGJlIHVzZWQuCisKKyAgICAgICAgICBJc3N1ZSBhIGhpbnQgaW4gdGhpcyBjYXNlIHRvIGxldCBjYXVzZSBvZiB0cm91YmxlIG1vcmUgdW5kZXJzdGFuZGFibGUuCisgICAgICAgICovCisgICAgICAgIGttcF9tc2dfdCBlcnJfY29kZSA9IEtNUF9TWVNFUlJDT0RFKGVycm9yKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50T3Blbk1lc3NhZ2VDYXRhbG9nLCBwYXRoLnN0ciApLAorICAgICAgICAgICAgZXJyX2NvZGUsCisgICAgICAgICAgICAoIGVycm9yID09IEVSUk9SX0JBRF9FWEVfRk9STUFUID8gS01QX0hOVCggQmFkRXhlRm9ybWF0LCBwYXRoLnN0ciwgS01QX0FSQ0hfU1RSICkgOiBfX2ttcF9tc2dfbnVsbCApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgICAgICB9CisKKyAgICAgICAgS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQKKworICAgICAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBpbnQgbnVtYmVyICA9IGdldF9udW1iZXIoIGttcF9pMThuX3BycF9WZXJzaW9uICk7CisgICAgICAgIGNoYXIgY29uc3QgKiBleHBlY3RlZCA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAga21wX3N0cl9idWZfdCB2ZXJzaW9uOyAgIC8vIEFjdHVhbCB2ZXJzaW9uIG9mIHRoZSBjYXRhbG9nLgorICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgdmVyc2lvbiApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHZlcnNpb24sICIlcyIsIF9fX2NhdGdldHMoIGttcF9pMThuX3BycF9WZXJzaW9uICkgKTsKKyAgICAgICAgICAgIC8vIFN0cmluZyByZXR1cm5lZCBieSBjYXRnZXRzIGlzIGludmFsaWQgYWZ0ZXIgY2xvc2luZyB0aGUgY2F0YWxvZywgc28gY29weSBpdC4KKyAgICAgICAgaWYgKCBzdHJjbXAoIHZlcnNpb24uc3RyLCBleHBlY3RlZCApICE9IDAgKSB7CisgICAgICAgICAgICAvLyBDbG9zZSBiYWQgY2F0YWxvZy4KKyAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIEFuZCBtYXJrIGl0IGFzIGFic2VudC4KKyAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA+IGttcF93YXJuaW5nc19sb3cpIHsKKyAgICAgICAgICAgICAgICAvLyBBbmQgbm93IHByaW50IGEgd2FybmluZyB1c2luZyBkZWZhdWx0IG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFdyb25nTWVzc2FnZUNhdGFsb2csIHBhdGguc3RyLCB2ZXJzaW9uLnN0ciwgZXhwZWN0ZWQgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMgKTsKKyAgICAgICAgICAgIH0gLy8gX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHZlcnNpb24gKTsKKworICAgIH07IC8vIGlmCisgICAgY29kZV9wYWdlID0gZ2V0X2NvZGVfcGFnZSgpOworCisgICAgZW5kOgorICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgcGF0aCApOworICAgICAgICByZXR1cm47CisKK30gLy8gZnVuYyBfX2ttcF9pMThuX2RvX2NhdG9wZW4KKworCit2b2lkCitfX2ttcF9pMThuX2NhdGNsb3NlKAorKSB7CisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVEICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjYXQgIT0gS01QX0kxOE5fTlVMTENBVCApOworICAgICAgICBrbXBfaTE4bl90YWJsZV9mcmVlKCAmIHRhYmxlICk7CisgICAgICAgIEZyZWVMaWJyYXJ5KCBjYXQgKTsKKyAgICAgICAgY2F0ID0gS01QX0kxOE5fTlVMTENBVDsKKyAgICB9OyAvLyBpZgorICAgIGNvZGVfcGFnZSA9IGRlZmF1bHRfY29kZV9wYWdlOworICAgIHN0YXR1cyA9IEtNUF9JMThOX0NMT1NFRDsKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdGNsb3NlCisKKy8qCisgICAgV2UgdXNlIEZvcm1hdE1lc3NhZ2UoKSB0byBnZXQgc3RyaW5ncyBmcm9tIGNhdGFsb2csIGdldCBzeXN0ZW0gZXJyb3IgbWVzc2FnZXMsIGV0Yy4KKyAgICBGb3JtYXRNZXNzYWdlKCkgdGVuZHMgdG8gcmV0dXJuIFdpbmRvd3MqIE9TLXN0eWxlIGVuZC1vZi1saW5lcywgIlxyXG4iLiBXaGVuIHN0cmluZyBpcyBwcmludGVkLAorICAgIHByaW50ZigpIGFsc28gcmVwbGFjZXMgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiAiXG4iIHdpdGggIlxyXG4iIChhZ2FpbiEpLCBzbyBzZXF1ZW5jZXMgbGlrZQorICAgICJcclxyXHJcbiIgYXBwZWFyIGluIG91dHB1dC4gSXQgaXMgbm90IHRvbyBnb29kLgorCisgICAgQWRkaXRpb25hbCBtZXNzIGNvbWVzIGZyb20gbWVzc2FnZSBjYXRhbG9nOiBPdXIgY2F0YWxvZyBzb3VyY2UgZW5fVVMubWMgZmlsZSAoZ2VuZXJhdGVkIGJ5CisgICAgbWVzc2FnZS1jb252ZXJ0ZXIucGwpIGNvbnRhaW5zIG9ubHkgIlxuIiBjaGFyYWN0ZXJzLCBidXQgZW5fVVNfbXNnXzEwMzMuYmluIGZpbGUgKHByb2R1Y2VkIGJ5CisgICAgbWMuZXhlKSBtYXkgY29udGFpbiAiXHJcbiIgb3IganVzdCAiXG4iLiBUaGlzIG1lc3MgZ29lcyBmcm9tIGVuX1VTX21zZ18xMDMzLmJpbiBmaWxlIHRvCisgICAgbWVzc2FnZSBjYXRhbG9nLCBsaWJvbXB1aS5kbGwuIEZvciBleGFtcGxlLCBtZXNzYWdlCisKKyAgICAgICAgRXJyb3IKKworICAgICh0aGVyZSBpcyAiXG4iIGF0IHRoZSBlbmQpIGlzIGNvbXBpbGVkIGJ5IG1jLmV4ZSB0byAiRXJyb3JcclxuIiwgd2hpbGUKKworICAgICAgICBPTVA6IEVycm9yICUxIWQhOiAlMiFzIVxuCisKKyAgICAodGhlcmUgaXMgIlxuIiBhdCB0aGUgZW5kIGFzIHdlbGwpIGlzIGNvbXBpbGVkIHRvICJPTVA6IEVycm9yICUxIWQhOiAlMiFzIVxyXG5cbiIuCisKKyAgICBUaHVzLCBzdHJpcHBpbmcgYWxsICJcciIgbm9ybWFsaXplcyBzdHJpbmcgYW5kIHJldHVybnMgaXQgdG8gY2Fub25pY2FsIGZvcm0sIHNvIHByaW50ZigpIHdpbGwKKyAgICBwcm9kdWNlIGNvcnJlY3QgZW5kLW9mLWxpbmUgc2VxdWVuY2VzLgorCisgICAgX19fc3RyaXBfY3JzKCkgc2VydmVzIGZvciB0aGlzIHB1cnBvc2U6IGl0IHJlbW92ZXMgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiAiXHIiIGluLXBsYWNlIGFuZAorICAgIHJldHVybnMgbmV3IGxlbmd0aCBvZiBzdHJpbmcuCisqLworc3RhdGljCitpbnQKK19fX3N0cmlwX2NycygKKyAgICBjaGFyICogc3RyCispIHsKKyAgICBpbnQgaW4gID0gMDsgIC8vIElucHV0IGNoYXJhY3RlciBpbmRleC4KKyAgICBpbnQgb3V0ID0gMDsgIC8vIE91dHB1dCBjaGFyYWN0ZXIgaW5kZXguCisgICAgZm9yICggOyA7ICkgeworICAgICAgICBpZiAoIHN0clsgaW4gXSAhPSAnXHInICkgeworICAgICAgICAgICAgc3RyWyBvdXQgXSA9IHN0clsgaW4gXTsKKyAgICAgICAgICAgICsrIG91dDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBzdHJbIGluIF0gPT0gMCApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBpZgorICAgICAgICArKyBpbjsKKyAgICB9OyAvLyBmb3JldmVyCisgICAgcmV0dXJuIG91dCAtIDE7Cit9IC8vIGZ1bmMgX19zdHJpcF9jcnMKKworCitzdGF0aWMKK2NoYXIgY29uc3QgKgorX19fY2F0Z2V0cygKKyAgICBrbXBfaTE4bl9pZF90ICBpZAorKSB7CisKKyAgICBjaGFyICogICAgcmVzdWx0ID0gTlVMTDsKKyAgICBQVk9JRCAgICAgYWRkciAgID0gTlVMTDsKKyAgICB3Y2hhcl90ICogd21zZyAgID0gTlVMTDsKKyAgICBEV09SRCAgICAgd2xlbiAgID0gMDsKKyAgICBjaGFyICogICAgbXNnICAgID0gTlVMTDsKKyAgICBpbnQgICAgICAgbGVuICAgID0gMDsKKyAgICBpbnQgICAgICAgcmM7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBjYXQgIT0gS01QX0kxOE5fTlVMTENBVCApOworICAgIHdsZW4gPSAgICAvLyB3bGVuIGRvZXMgKm5vdCogaW5jbHVkZSB0ZXJtaW5hdGluZyBudWxsLgorICAgICAgICBGb3JtYXRNZXNzYWdlVygKKyAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fSE1PRFVMRSB8CisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCisgICAgICAgICAgICBjYXQsCisgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgIC8vIExhbmdJZAorICAgICAgICAgICAgKExQV1NUUikgJiBhZGRyLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgLy8gU2l6ZSBpbiBlbGVtZW50cywgbm90IGluIGJ5dGVzLgorICAgICAgICAgICAgTlVMTAorICAgICAgICApOworICAgIGlmICggd2xlbiA8PSAwICkgeworICAgICAgICBnb3RvIGVuZDsKKyAgICB9OyAvLyBpZgorICAgIHdtc2cgPSAod2NoYXJfdCAqKSBhZGRyOyAgLy8gV2FybmluZzogd21zZyBtYXkgYmUgbm90IG51bC10ZXJtaW5hdGVkIQorCisgICAgLy8gQ2FsY3VsYXRlIGxlbmd0aCBvZiBtdWx0aWJ5dGUgbWVzc2FnZS4KKyAgICBsZW4gPSAgICAgLy8gU2luY2Ugd2xlbiBkb2VzIG5vdCBpbmNsdWRlIHRlcm1pbmF0aW5nIG51bGwsIGxlbiBkb2VzIG5vdCBpbmNsdWRlIGl0IGFsc28uCisgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoCisgICAgICAgICAgICBjb2RlX3BhZ2UsCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBGbGFncy4KKyAgICAgICAgICAgIHdtc2csIHdsZW4sICAgICAgIC8vIFdpZGUgYnVmZmVyIGFuZCBzaXplLgorICAgICAgICAgICAgTlVMTCwgMCwgICAgICAgICAgLy8gQnVmZmVyIGFuZCBzaXplLgorICAgICAgICAgICAgTlVMTCwgTlVMTCAgICAgICAgLy8gRGVmYXVsdCBjaGFyIGFuZCB1c2VkIGRlZmF1bHQgY2hhci4KKyAgICAgICAgKTsKKyAgICBpZiAoIGxlbiA8PSAwICkgeworICAgICAgICBnb3RvIGVuZDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gQWxsb2NhdGUgbWVtb3J5LgorICAgIG1zZyA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGxlbiArIDEgKTsKKworICAgIC8vIENvbnZlcnQgd2lkZSBtZXNzYWdlIHRvIG11bHRpYnl0ZSBvbmUuCisgICAgcmMgPQorICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKAorICAgICAgICAgICAgY29kZV9wYWdlLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gRmxhZ3MuCisgICAgICAgICAgICB3bXNnLCB3bGVuLCAgICAgICAvLyBXaWRlIGJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIG1zZywgbGVuLCAgICAgICAgIC8vIEJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIE5VTEwsIE5VTEwgICAgICAgIC8vIERlZmF1bHQgY2hhciBhbmQgdXNlZCBkZWZhdWx0IGNoYXIuCisgICAgICAgICk7CisgICAgaWYgKCByYyA8PSAwIHx8IHJjID4gbGVuICkgeworICAgICAgICBnb3RvIGVuZDsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHJjID09IGxlbiApOworICAgIGxlbiA9IHJjOworICAgIG1zZ1sgbGVuIF0gPSAwOyAgICAgICAgICAgLy8gUHV0IHRlcm1pbmF0aW5nIG51bGwgdG8gdGhlIGVuZC4KKworICAgIC8vIFN0cmlwcGluZyBhbGwgIlxyIiBiZWZvcmUgc3RyaXBwaW5nIGxhc3QgZW5kLW9mLWxpbmUgc2ltcGxpZmllcyB0aGUgdGFzay4KKyAgICBsZW4gPSBfX19zdHJpcF9jcnMoIG1zZyApOworCisgICAgLy8gRXZlcnkgbWVzc2FnZSBpbiBjYXRhbG9nIGlzIHRlcm1pbmF0ZWQgd2l0aCAiXG4iLiBTdHJpcCBpdC4KKyAgICBpZiAoIGxlbiA+PSAxICYmIG1zZ1sgbGVuIC0gMSBdID09ICdcbicgKSB7CisgICAgICAgIC0tIGxlbjsKKyAgICAgICAgbXNnWyBsZW4gXSA9IDA7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEV2ZXJ5dGhpbmcgbG9va3Mgb2suCisgICAgcmVzdWx0ID0gbXNnOworICAgIG1zZyAgICA9IE5VTEw7CisKKyAgICBlbmQ6CisKKyAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbXNnICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHdtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgTG9jYWxGcmVlKCB3bXNnICk7CisgICAgfTsgLy8gaWYKKworICAgIHJldHVybiByZXN1bHQ7CisKK30gLy8gX19fY2F0Z2V0cworCisKK2NoYXIgY29uc3QgKgorX19rbXBfaTE4bl9jYXRnZXRzKAorICAgIGttcF9pMThuX2lkX3QgIGlkCispIHsKKworICAgIGludCBzZWN0aW9uID0gZ2V0X3NlY3Rpb24oIGlkICk7CisgICAgaW50IG51bWJlciAgPSBnZXRfbnVtYmVyKCBpZCApOworICAgIGNoYXIgY29uc3QgKiBtZXNzYWdlID0gTlVMTDsKKworICAgIGlmICggMSA8PSBzZWN0aW9uICYmIHNlY3Rpb24gPD0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNpemUgKSB7CisgICAgICAgIGlmICggMSA8PSBudW1iZXIgJiYgbnVtYmVyIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZSApIHsKKyAgICAgICAgICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdG9wZW4oKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIGNhdCAhPSBLTVBfSTE4Tl9OVUxMQ0FUICkgeworICAgICAgICAgICAgICAgIGlmICggdGFibGUuc2l6ZSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZWN0ID0gKGttcF9pMThuX3NlY3Rpb25fdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0NBTExPQygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICsgMiApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigga21wX2kxOG5fc2VjdGlvbl90ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNpemUgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2l6ZTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIGlmICggdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0ciA9IChjb25zdCBjaGFyICoqKQorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0NBTExPQygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggY2hhciBjb25zdCAqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgaWYgKCB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXSA9IF9fX2NhdGdldHMoIGlkICk7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gQ2F0YWxvZyBpcyBub3Qgb3BlbmVkIG9yIG1lc3NhZ2UgaXMgbm90IGZvdW5kLCByZXR1cm4gZGVmYXVsdCBtZXNzYWdlLgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgIG1lc3NhZ2UgPSBub19tZXNzYWdlX2F2YWlsYWJsZTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBtZXNzYWdlOworCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRnZXRzCisKKworI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBLTVBfSTE4Tl9PSworICAgICNlcnJvciBJMThuIHN1cHBvcnQgaXMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIE9TLgorI2VuZGlmIC8vIEtNUF9JMThOX09LCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaTE4bl9kdW1wX2NhdGFsb2coCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZmZlcgorKSB7CisKKyAgICBzdHJ1Y3Qga21wX2kxOG5faWRfcmFuZ2VfdCB7CisgICAgICAgIGttcF9pMThuX2lkX3QgIGZpcnN0OworICAgICAgICBrbXBfaTE4bl9pZF90ICBsYXN0OworICAgIH07IC8vIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90CisKKyAgICBzdGF0aWMgc3RydWN0IGttcF9pMThuX2lkX3JhbmdlX3QgcmFuZ2VzW10gPSB7CisgICAgICAgIHsga21wX2kxOG5fcHJwX2ZpcnN0LCBrbXBfaTE4bl9wcnBfbGFzdCB9LAorICAgICAgICB7IGttcF9pMThuX3N0cl9maXJzdCwga21wX2kxOG5fc3RyX2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9mbXRfZmlyc3QsIGttcF9pMThuX2ZtdF9sYXN0IH0sCisgICAgICAgIHsga21wX2kxOG5fbXNnX2ZpcnN0LCBrbXBfaTE4bl9tc2dfbGFzdCB9LAorICAgICAgICB7IGttcF9pMThuX2hudF9maXJzdCwga21wX2kxOG5faG50X2xhc3QgfQorICAgIH07IC8vIHJhbmdlcworCisgICAgaW50ICAgICAgICAgICBudW1fb2ZfcmFuZ2VzID0gc2l6ZW9mKCByYW5nZXMgKSAvIHNpemVvZiggc3RydWN0IGttcF9pMThuX2lkX3JhbmdlX3QgKTsKKyAgICBpbnQgICAgICAgICAgIHJhbmdlOworICAgIGttcF9pMThuX2lkX3QgaWQ7CisKKyAgICBmb3IgKCByYW5nZSA9IDA7IHJhbmdlIDwgbnVtX29mX3JhbmdlczsgKysgcmFuZ2UgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIioqKiBTZXQgIyVkICoqKlxuIiwgcmFuZ2UgKyAxICk7CisgICAgICAgIGZvciAoIGlkID0gKGttcF9pMThuX2lkX3QpKCByYW5nZXNbIHJhbmdlIF0uZmlyc3QgKyAxICk7CisgICAgICAgICAgICAgIGlkIDwgcmFuZ2VzWyByYW5nZSBdLmxhc3Q7CisgICAgICAgICAgICAgIGlkID0gKGttcF9pMThuX2lkX3QpKCBpZCArIDEgKSApIHsKKyAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlZDogPDwlcz4+XG4iLCBpZCwgX19rbXBfaTE4bl9jYXRnZXRzKCBpZCApICk7CisgICAgICAgIH07IC8vIGZvciBpZAorICAgIH07IC8vIGZvciByYW5nZQorCisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXItPnN0ciApOworCit9IC8vIF9fa21wX2kxOG5fZHVtcF9jYXRhbG9nCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZm9ybWF0KAorICAgIHVuc2lnbmVkIGlkX2FyZywKKyAgICAuLi4KKykgeworCisgICAga21wX21zZ190ICAgICAgbXNnOworICAgIHZhX2xpc3QgICAgICAgIGFyZ3M7CisgICAga21wX3N0cl9idWZfdCAgYnVmZmVyOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIHZhX3N0YXJ0KCBhcmdzLCBpZF9hcmcgKTsKKworICAgIC8vIFdlIHVzZSB1bnNpZ25lZCBmb3IgdGhlIElEIGFyZ3VtZW50IGFuZCBleHBsaWNpdGx5IGNhc3QgaXQgaGVyZSB0byB0aGUKKyAgICAvLyByaWdodCBlbnVtZXJhdG9yIGJlY2F1c2UgdmFyaWFkaWMgZnVuY3Rpb25zIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoCisgICAgLy8gZGVmYXVsdCBwcm9tb3Rpb25zLgorICAgIGttcF9pMThuX2lkX3QgaWQgPSAoa21wX2kxOG5faWRfdClpZF9hcmc7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgLy8gT24gTGludXgqIE9TIGFuZCBPUyBYKiwgcHJpbnRmKCkgZmFtaWx5IGZ1bmN0aW9ucyBwcm9jZXNzIHBhcmFtZXRlciBudW1iZXJzLCBmb3IgZXhhbXBsZToKKyAgICAgICAgLy8gIiUyJHMgJTEkcyIuCisgICAgICAgIF9fa21wX3N0cl9idWZfdnByaW50KCAmIGJ1ZmZlciwgX19rbXBfaTE4bl9jYXRnZXRzKCBpZCApLCBhcmdzICk7CisgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLy8gT24gV2lub2R3cywgcHJpbnRmKCkgZmFtaWx5IGZ1bmN0aW9ucyBkb2VzIG5vdCByZWNvZ25pemUgR05VIHN0eWxlIHBhcmFtZXRlciBudW1iZXJzLAorICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHVzZSBGb3JtYXRNZXNzYWdlKCkgaW5zdGVhZC4gSXQgcmVjb2duaXplcyBwYXJhbWV0ZXIgbnVtYmVycywgZS4gZy46CisgICAgICAgIC8vICIlMiFzISAiJTEhcyEiLgorICAgICAgICB7CisgICAgICAgICAgICBMUFRTVFIgc3RyID0gTlVMTDsKKyAgICAgICAgICAgIGludCAgICBsZW47CisgICAgICAgICAgICBGb3JtYXRNZXNzYWdlKAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HIHwgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSLAorICAgICAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0Z2V0cyggaWQgKSwKKyAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgIChMUFRTVFIpKCAmIHN0ciApLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgJiBhcmdzCisgICAgICAgICAgICApOworICAgICAgICAgICAgbGVuID0gX19fc3RyaXBfY3JzKCBzdHIgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIGJ1ZmZlciwgc3RyLCBsZW4gKTsKKyAgICAgICAgICAgIExvY2FsRnJlZSggc3RyICk7CisgICAgICAgIH0KKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IKKyAgICAjZW5kaWYKKyAgICB2YV9lbmQoIGFyZ3MgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2RldGFjaCggJiBidWZmZXIgKTsKKworICAgIG1zZy50eXBlID0gKGttcF9tc2dfdHlwZV90KSggaWQgPj4gMTYgKTsKKyAgICBtc2cubnVtICA9IGlkICYgMHhGRkZGOworICAgIG1zZy5zdHIgID0gYnVmZmVyLnN0cjsKKyAgICBtc2cubGVuICA9IGJ1ZmZlci51c2VkOworCisgICAgcmV0dXJuIG1zZzsKKworfSAvLyBfX2ttcF9tc2dfZm9ybWF0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljCitjaGFyICoKK3N5c19lcnJvcigKKyAgICBpbnQgZXJyCispIHsKKworICAgIGNoYXIgKiBtZXNzYWdlID0gTlVMTDsKKworICAgICNpZiBLTVBfT1NfV0lORE9XUworCisgICAgICAgIExQVk9JRCAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgaW50ICAgICBsZW47CisgICAgICAgIERXT1JEICAgcmM7CisgICAgICAgIHJjID0KKyAgICAgICAgICAgIEZvcm1hdE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICBlcnIsCisgICAgICAgICAgICAgICAgTUFLRUxBTkdJRCggTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQgKSwgLy8gRGVmYXVsdCBsYW5ndWFnZS4KKyAgICAgICAgICAgICAgICAoTFBUU1RSKSAmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICggcmMgPiAwICkgeworICAgICAgICAgICAgLy8gTWVzc2FnZSBmb3JtYXR0ZWQuIENvcHkgaXQgKHNvIHdlIGNhbiBmcmVlIGl0IGxhdGVyIHdpdGggbm9ybWFsIGZyZWUoKS4KKyAgICAgICAgICAgIG1lc3NhZ2UgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCAoY2hhciAqKSBidWZmZXIgKTsKKyAgICAgICAgICAgIGxlbiA9IF9fX3N0cmlwX2NycyggbWVzc2FnZSApOyAvLyBEZWxldGUgY2FycmlhZ2UgcmV0dXJucyBpZiBhbnkuCisgICAgICAgICAgICAvLyBTdHJpcCB0cmFpbGluZyBuZXdsaW5lcy4KKyAgICAgICAgICAgIHdoaWxlICggbGVuID4gMCAmJiBtZXNzYWdlWyBsZW4gLSAxIF0gPT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAtLSBsZW47CisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICAgICAgbWVzc2FnZVsgbGVuIF0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRm9ybWF0TWVzc2FnZSgpIGZhaWxlZCB0byBmb3JtYXQgc3lzdGVtIGVycm9yIG1lc3NhZ2UuIEdldExhc3RFcnJvcigpIHdvdWxkIGdpdmUgdXMKKyAgICAgICAgICAgIC8vIGVycm9yIGNvZGUsIHdoaWNoIHdlIHdvdWxkIGNvbnZlcnQgdG8gbWVzc2FnZS4uLiB0aGlzIGl0IGRhbmdlcm91cyByZWN1cnNpb24sIHdoaWNoCisgICAgICAgICAgICAvLyBjYW5ub3QgY2xhcmlmeSBvcmlnaW5hbCBlcnJvciwgc28gd2Ugd2lsbCBub3QgZXZlbiBzdGFydCBpdC4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBidWZmZXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIExvY2FsRnJlZSggYnVmZmVyICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAjZWxzZSAvLyBOb24tV2luZG93cyogT1M6IExpbnV4KiBPUyBvciBPUyBYKgorCisgICAgICAgIC8qCisgICAgICAgICAgICBUaGVyZSBhcmUgMiBpbmNvbXBhdGlibGUgdmVyc2lvbnMgb2Ygc3RyZXJyb3JfcjoKKworICAgICAgICAgICAgICAgIGNoYXIgKiBzdHJlcnJvcl9yKCBpbnQsIGNoYXIgKiwgc2l6ZV90ICk7ICAvLyBHTlUgdmVyc2lvbgorICAgICAgICAgICAgICAgIGludCAgICBzdHJlcnJvcl9yKCBpbnQsIGNoYXIgKiwgc2l6ZV90ICk7ICAvLyBYU0kgdmVyc2lvbgorICAgICAgICAqLworCisgICAgICAgICNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgZGVmaW5lZChfR05VX1NPVVJDRSkKKworICAgICAgICAgICAgLy8gR05VIHZlcnNpb24gb2Ygc3RyZXJyb3Jfci4KKworICAgICAgICAgICAgY2hhciAgIGJ1ZmZlclsgMjA0OCBdOworICAgICAgICAgICAgY2hhciAqIGNvbnN0IGVycl9tc2cgPSBzdHJlcnJvcl9yKCBlcnIsIGJ1ZmZlciwgc2l6ZW9mKCBidWZmZXIgKSApOworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBlbGltaW5hdGUgdGhpcyBhc3NpZ25tZW50IHRvIHRlbXBvcmFyeSB2YXJpYWJsZSwgb3RoZXJ3aXNlIGNvbXBpbGVyIHdvdWxkCisgICAgICAgICAgICAgICAgLy8gbm90IGlzc3VlIHdhcm5pbmcgaWYgc3RyZXJyb3JfcigpIHJldHVybnMgYGludCcgaW5zdGVhZCBvZiBleHBlY3RlZCBgY2hhciAqJy4KKyAgICAgICAgICAgIG1lc3NhZ2UgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBlcnJfbXNnICk7CisKKyAgICAgICAgI2Vsc2UgLy8gT1MgWCosIEZyZWVCU0QqIGV0Yy4KKworICAgICAgICAgICAgLy8gWFNJIHZlcnNpb24gb2Ygc3RyZXJyb3Jfci4KKworICAgICAgICAgICAgaW50ICAgIHNpemUgICA9IDIwNDg7CisgICAgICAgICAgICBjaGFyICogYnVmZmVyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZSApOworICAgICAgICAgICAgaW50ICAgIHJjOworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKE1lbW9yeUFsbG9jRmFpbGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJjID0gc3RyZXJyb3JfciggZXJyLCBidWZmZXIsIHNpemUgKTsKKyAgICAgICAgICAgIGlmICggcmMgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgcmMgPSBlcnJubzsgICAgICAgICAgICAvLyBYU0kgdmVyc2lvbiBzZXRzIGVycm5vLgorICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHdoaWxlICggcmMgPT0gRVJBTkdFICkgeyAgIC8vIEVSQU5HRSBtZWFucyB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggYnVmZmVyICk7CisgICAgICAgICAgICAgICAgc2l6ZSAqPSAyOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemUgKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0ZBVEFMKE1lbW9yeUFsbG9jRmFpbGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmMgPSBzdHJlcnJvcl9yKCBlcnIsIGJ1ZmZlciwgc2l6ZSApOworICAgICAgICAgICAgICAgIGlmICggcmMgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAvLyBYU0kgdmVyc2lvbiBzZXRzIGVycm5vLgorICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBidWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBpcyB1bnVzZWQuIEZyZWUgaXQuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjZW5kaWYKKworICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgIC8vIFRPRE86IEkxOG4gdGhpcyBtZXNzYWdlLgorICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgIihObyBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUpIiApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gc3lzX2Vycm9yCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfY29kZSgKKyAgICBpbnQgIGNvZGUKKykgeworCisgICAga21wX21zZ190ICAgICAgbXNnOworICAgIG1zZy50eXBlID0ga21wX210X3N5c2VycjsKKyAgICBtc2cubnVtICA9IGNvZGU7CisgICAgbXNnLnN0ciAgPSBzeXNfZXJyb3IoIGNvZGUgKTsKKyAgICBtc2cubGVuICA9IEtNUF9TVFJMRU4oIG1zZy5zdHIgKTsKKyAgICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19lcnJvcl9jb2RlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfbWVzZygKKyAgICBjaGFyIGNvbnN0ICogbWVzZworKSB7CisKKyAgICBrbXBfbXNnX3QgICAgICBtc2c7CisgICAgbXNnLnR5cGUgPSBrbXBfbXRfc3lzZXJyOworICAgIG1zZy5udW0gID0gMDsKKyAgICBtc2cuc3RyICA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIG1lc2cgKTsKKyAgICBtc2cubGVuICA9IEtNUF9TVFJMRU4oIG1zZy5zdHIgKTsKKyAgICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19lcnJvcl9tZXNnCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfbXNnKAorICAgIGttcF9tc2dfc2V2ZXJpdHlfdCAgc2V2ZXJpdHksCisgICAga21wX21zZ190ICAgICAgICAgICBtZXNzYWdlLAorICAgIC4uLgorKSB7CisKKyAgICB2YV9saXN0ICAgICAgICBhcmdzOworICAgIGttcF9pMThuX2lkX3QgIGZvcm1hdDsgICAgICAvLyBmb3JtYXQgaWRlbnRpZmllcgorICAgIGttcF9tc2dfdCAgICAgIGZtc2c7ICAgICAgICAvLyBmb3JtYXR0ZWQgbWVzc2FnZQorICAgIGttcF9zdHJfYnVmX3QgIGJ1ZmZlcjsKKworICAgIGlmICggc2V2ZXJpdHkgIT0ga21wX21zX2ZhdGFsICYmIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYgKQorICAgICAgICByZXR1cm47IC8vIG5vIHJlYXNvbiB0byBmb3JtIGEgc3RyaW5nIGluIG9yZGVyIHRvIG5vdCBwcmludCBpdAorCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgLy8gRm9ybWF0IHRoZSBwcmltYXJ5IG1lc3NhZ2UuCisgICAgc3dpdGNoICggc2V2ZXJpdHkgKSB7CisgICAgICAgIGNhc2Uga21wX21zX2luZm9ybSA6IHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9JbmZvOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGttcF9tc193YXJuaW5nIDogeworICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X1dhcm5pbmc7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2Uga21wX21zX2ZhdGFsIDogeworICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X0ZhdGFsOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICB9OworICAgIH07IC8vIHN3aXRjaAorICAgIGZtc2cgPSBfX2ttcF9tc2dfZm9ybWF0KCBmb3JtYXQsIG1lc3NhZ2UubnVtLCBtZXNzYWdlLnN0ciApOworICAgIF9fa21wX3N0cl9mcmVlKCZtZXNzYWdlLnN0cik7CisgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgYnVmZmVyLCBmbXNnLnN0ciwgZm1zZy5sZW4gKTsKKyAgICBfX2ttcF9zdHJfZnJlZSgmZm1zZy5zdHIpOworCisgICAgLy8gRm9ybWF0IG90aGVyIG1lc3NhZ2VzLgorICAgIHZhX3N0YXJ0KCBhcmdzLCBtZXNzYWdlICk7CisgICAgZm9yICggOyA7ICkgeworICAgICAgICBtZXNzYWdlID0gdmFfYXJnKCBhcmdzLCBrbXBfbXNnX3QgKTsKKyAgICAgICAgaWYgKCBtZXNzYWdlLnR5cGUgPT0ga21wX210X2R1bW15ICYmIG1lc3NhZ2Uuc3RyID09IE5VTEwgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBtZXNzYWdlLnR5cGUgPT0ga21wX210X2R1bW15ICYmIG1lc3NhZ2Uuc3RyID09IF9fa21wX21zZ19lbXB0eS5zdHIgKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3dpdGNoICggbWVzc2FnZS50eXBlICkgeworICAgICAgICAgICAgY2FzZSBrbXBfbXRfaGludCA6IHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfSGludDsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9tdF9zeXNlcnIgOiB7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X1N5c0VycjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07IC8vIHN3aXRjaAorICAgICAgICBmbXNnID0gX19rbXBfbXNnX2Zvcm1hdCggZm9ybWF0LCBtZXNzYWdlLm51bSwgbWVzc2FnZS5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoJm1lc3NhZ2Uuc3RyKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgYnVmZmVyLCBmbXNnLnN0ciwgZm1zZy5sZW4gKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmZtc2cuc3RyKTsKKyAgICB9OyAvLyBmb3JldmVyCisgICAgdmFfZW5kKCBhcmdzICk7CisKKyAgICAvLyBQcmludCBmb3JtYXR0ZWQgbWVzc2FnZXMuCisgICAgLy8gVGhpcyBsb2NrIHByZXZlbnRzIG11bHRpcGxlIGZhdGFsIGVycm9ycyBvbiB0aGUgc2FtZSBwcm9ibGVtLgorICAgIC8vIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgbG9jayApOyAgICAvLyBHRUggLSBUaGlzIGxvY2sgY2F1c2luZyB0ZXN0cyB0byBoYW5nIG9uIE9TIFgqLgorICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKworICAgIGlmICggc2V2ZXJpdHkgPT0ga21wX21zX2ZhdGFsICkgeworICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgX19rbXBfdGhyZWFkX3NsZWVwKCA1MDAgKTsgICAvKiBEZWxheSB0byBnaXZlIG1lc3NhZ2UgYSBjaGFuY2UgdG8gYXBwZWFyIGJlZm9yZSByZWFwaW5nICovCisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9hYm9ydF9wcm9jZXNzKCk7CisgICAgfTsgLy8gaWYKKworICAgIC8vIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbG9jayApOyAgLy8gR0VIIC0gdGhpcyBsb2NrIGNhdXNpbmcgdGVzdHMgdG8gaGFuZyBvbiBPUyBYKi4KKworfSAvLyBfX2ttcF9tc2cKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9pMThuLmggYi9yYzMvcnVudGltZS9zcmMva21wX2kxOG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDI4ZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pMThuLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBrbXBfaTE4bi5oCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0kxOE5fSAorI2RlZmluZSBLTVBfSTE4Tl9ICisKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8qCisgICAga21wX2kxOG5faWQuaW5jIGRlZmluZXMga21wX2kxOG5faWRfdCB0eXBlLiBJdCBpcyBhbiBlbnVtZXJhdGlvbiB3aXRoIGlkZW50aWZpZXJzIG9mIGFsbCB0aGUKKyAgICBtZXNzYWdlcyBpbiB0aGUgY2F0YWxvZy4gVGhlcmUgaXMgb25lIHNwZWNpYWwgaWRlbnRpZmllcjoga21wX2kxOG5fbnVsbCwgd2hpY2ggZGVub3RlcyBhYnNlbmNlCisgICAgb2YgbWVzc2FnZS4KKyovCisjaW5jbHVkZSAia21wX2kxOG5faWQuaW5jIiAvLyBHZW5lcmF0ZWQgZmlsZS4gRG8gbm90IGVkaXQgaXQgbWFudWFsbHkuCisKKy8qCisgICAgTG93LWxldmVsIGZ1bmN0aW9ucyBoYW5kbGluZyBtZXNzYWdlIGNhdGFsb2cuIF9fa21wX2kxOG5fb3BlbigpIG9wZW5zIG1lc3NhZ2UgY2F0YWxvZywKKyAgICBfX2ttcF9pMThuX2Nsb3NlcygpIGl0LiBFeHBsaWNpdCBvcGVuaW5nIGlzIG5vdCByZXF1aXJlZDogaWYgbWVzc2FnZSBjYXRhbG9nIGlzIG5vdCB5ZXQgb3BlbiwKKyAgICBfX2ttcF9pMThuX2NhdGdldHMoKSB3aWxsIG9wZW4gaXQgaW1wbGljaXRseS4gSG93ZXZlciwgY2F0YWxvZyBzaG91bGQgYmUgZXhwbGljaXRseSBjbG9zZWQsCisgICAgb3RoZXJ3aXNlIHJlc291cmNlcyAobWFtb3J5LCBoYW5kbGVzKSBtYXkgbGVhay4KKworICAgIF9fa21wX2kxOG5fY2F0Z2V0cygpIHJldHVybnMgcmVhZC1vbmx5IHN0cmluZy4gSXQgc2hvdWxkIG5vdCBiZSBmcmVlZC4KKworICAgIEtNUF9JMThOX1NUUiBtYWNybyBzaW1wbGlmaWVzIGFjY2VzIHRvIHN0cmluZ3MgaW4gbWVzc2FnZSBjYXRhbG9nIGEgYml0LiBGb2xsb3dpbmcgdHdvIGxpbmVzIGFyZQorICAgIGVxdWl2YWxlbnQ6CisKKyAgICAgICAgX19rbXBfaTE4bl9jYXRnZXRzKCBrbXBfaTE4bl9zdHJfV2FybmluZyApCisgICAgICAgIEtNUF9JMThOX1NUUiggV2FybmluZyApCisqLworCit2b2lkICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7Cit2b2lkICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRjbG9zZSgpOworY2hhciBjb25zdCAqICAgIF9fa21wX2kxOG5fY2F0Z2V0cygga21wX2kxOG5faWRfdCBpZCApOworCisjZGVmaW5lIEtNUF9JMThOX1NUUiggaWQgKSAgICBfX2ttcF9pMThuX2NhdGdldHMoIGttcF9pMThuX3N0cl8gIyMgaWQgKQorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBIaWdoLWxldmVsIGludGVyZmFjZSBmb3IgcHJpbnRpbmcgc3RyaW5ncyB0YXJnZXRlZCB0byB0aGUgdXNlci4KKworICAgIEFsbCB0aGUgc3RyaW5ncyBhcmUgZGl2aWRlZCBpbnRvIDMgdHlwZXM6CisKKyAgICAgICAgKiBtZXNzYWdlcywKKyAgICAgICAgKiBoaW50cywKKyAgICAgICAgKiBzeXN0ZW0gZXJyb3JzLgorCisgICAgVGhlcmUgYXJlIDMga2luZCBvZiBtZXNzYWdlIHNldmVyaXRpZXM6CisKKyAgICAgICAgKiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLAorICAgICAgICAqIHdhcm5pbmdzIChub24tZmF0YWwgZXJyb3JzKSwKKyAgICAgICAgKiBmYXRhbCBlcnJvcnMuCisKKyAgICBGb3IgZXhhbXBsZToKKworICAgICAgICBPTVA6IFdhcm5pbmcgIzI6IENhbm5vdCBvcGVuIG1lc3NhZ2UgY2F0YWxvZyAibGliZ3VpZGUuY2F0IjogICAoMSkKKyAgICAgICAgT01QOiBTeXN0ZW0gZXJyb3IgIzI6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgICAgICAgICAgICAgICAgKDIpCisgICAgICAgIE9NUDogSGludDogUGxlYXNlIGNoZWNrIE5MU1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuICAgICAgICAgICgzKQorICAgICAgICBPTVA6IEluZm8gIzM6IERlZmF1bHQgbWVzc2FnZXMgd2lsbCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAoNCkKKworICAgIHdoZXJlCisKKyAgICAgICAgKDEpIGlzIGEgbWVzc2FnZSBvZiB3YXJuaW5nIHNldmVyaXR5LAorICAgICAgICAoMikgaXMgYSBzeXN0ZW0gZXJyb3IgY2F1c2VkIHRoZSBwcmV2aW91cyB3YXJuaW5nLAorICAgICAgICAoMykgaXMgYSBoaW50IGZvciB0aGUgdXNlciBob3cgdG8gZml4IHRoZSBwcm9ibGVtLAorICAgICAgICAoNCkgaXMgYSBtZXNzYWdlIG9mIGluZm9ybWF0aW9uYWwgc2V2ZXJpdHkuCisKKyAgIFVzYWdlIGluIGNvbXBsZXggY2FzZXMgKG1lc3NhZ2UgaXMgYWNjb21wYW5pZWQgd2l0aCBoaW50cyBhbmQgc3lzdGVtIGVycm9ycyk6CisKKyAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsgICAvLyBXZSBuZWVkIHNhdmUgZXJybm8gaW1tZWRpYXRlbHksIGJlY2F1c2UgaXQgbWF5IGJlIGNoYW5nZWQuCisgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICBrbXBfbXNfd2FybmluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V2ZXJpdHkKKyAgICAgICAgICAgS01QX01TRyggQ2FudE9wZW5NZXNzYWdlQ2F0YWxvZywgbmFtZSApLCAgIC8vIFByaW1hcnkgbWVzc2FnZQorICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtIGVycm9yCisgICAgICAgICAgIEtNUF9ITlQoIENoZWNrTkxTUEFUSCApLCAgICAgICAgICAgICAgICAgICAvLyBIaW50CisgICAgICAgICAgIF9fa21wX21zZ19udWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWYXJpYWRpYyBhcmd1bWVudCBsaXN0IGZpbmlzaGVyCisgICAgICAgKTsKKworICAgIFVzYWdlIGluIHNpbXBsZSBjYXNlcyAoanVzdCBhIG1lc3NhZ2UsIG5vIHN5c3RlbSBlcnJvcnMgb3IgaGludHMpOgorCisgICAgICAgIEtNUF9JTkZPUk0oIFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMgKTsKKyAgICAgICAgS01QX1dBUk5JTkcoIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKTsKKyAgICAgICAgS01QX0ZBVEFMKCBTdGFja092ZXJsYXAgKTsKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY3JlYXRlIiwgc3RhdHVzICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK2VudW0ga21wX21zZ190eXBlIHsKKyAgICBrbXBfbXRfZHVtbXkgID0gIDAsIC8vIFNwZWNpYWwgdHlwZSBmb3IgaW50ZXJuYWwgcHVycG9zZXMuCisgICAga21wX210X21lc2cgICA9ICA0LCAvLyBQcmltYXJ5IE9wZW5NUCBtZXNzYWdlLCBjb3VsZCBiZSBpbmZvcm1hdGlvbiwgd2FybmluZywgb3IgZmF0YWwuCisgICAga21wX210X2hpbnQgICA9ICA1LCAvLyBIaW50IHRvIHRoZSB1c2VyLgorICAgIGttcF9tdF9zeXNlcnIgPSAtMSAgLy8gU3lzdGVtIGVycm9yIG1lc3NhZ2UuCit9OyAvLyBlbnVtIGttcF9tc2dfdHlwZQordHlwZWRlZiBlbnVtIGttcF9tc2dfdHlwZSAga21wX21zZ190eXBlX3Q7CisKK3N0cnVjdCBrbXBfbXNnIHsKKyAgICBrbXBfbXNnX3R5cGVfdCAgdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgbnVtOworICAgIGNoYXIgY29uc3QgKiAgICBzdHI7CisgICAgaW50ICAgICAgICAgICAgIGxlbjsKK307IC8vIHN0cnVjdCBrbXBfbWVzc2FnZQordHlwZWRlZiBzdHJ1Y3Qga21wX21zZyAga21wX21zZ190OworCisvLyBUd28gc3BlY2lhbCBtZXNzYWdlcy4KK2V4dGVybiBrbXBfbXNnX3QgX19rbXBfbXNnX2VtcHR5OyAgLy8gQ2FuIGJlIHVzZWQgaW4gcGxhY2Ugd2hlcmUgbWVzc2FnZSBpcyByZXF1aXJlZCBzeW50YWN0aWNhbGx5LgorZXh0ZXJuIGttcF9tc2dfdCBfX2ttcF9tc2dfbnVsbDsgICAvLyBEZW5vdGVzIHRoZSBlbmQgb2YgdmFyaWFkaWMgbGlzdCBvZiBhcmd1bWVudHMuCisKKy8vIEhlbHBlciBmdW5jdGlvbnMuIENyZWF0ZXMgbWVzc2FnZXMgZWl0aGVyIGZyb20gbWVzc2FnZSBjYXRhbG9nIG9yIGZyb20gc3lzdGVtLiBOb3RlOiB0aGVzZQorLy8gZnVuY3Rpb25zIGFsbG9jYXRlIG1lbW9yeS4gWW91IHNob3VsZCBwYXNzIGNyZWF0ZWQgbWVzc2FnZXMgdG8gX19rbXBfbXNnKCkgZnVuY3Rpb24sIGl0IHdpbGwKKy8vIHByaW50IG1lc3NhZ2VzIGFuZCBkZXN0cm95IHRoZW0uCitrbXBfbXNnX3QgIF9fa21wX21zZ19mb3JtYXQoIHVuc2lnbmVkIGlkX2FyZywgLi4uICk7CitrbXBfbXNnX3QgIF9fa21wX21zZ19lcnJvcl9jb2RlKCBpbnQgY29kZSApOwora21wX21zZ190ICBfX2ttcF9tc2dfZXJyb3JfbWVzZyggY2hhciBjb25zdCAqIG1lc2cgKTsKKworLy8gSGVscGVyIG1hY3JvcyB0byBtYWtlIGNhbGxzIHNob3J0ZXIuCisjZGVmaW5lIEtNUF9NU0coIC4uLiAgKSAgIF9fa21wX21zZ19mb3JtYXQoIGttcF9pMThuX21zZ18gIyMgX19WQV9BUkdTX18gKQorI2RlZmluZSBLTVBfSE5UKCAuLi4gICkgICBfX2ttcF9tc2dfZm9ybWF0KCBrbXBfaTE4bl9obnRfICMjIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgS01QX1NZU0VSUkNPREUoIGNvZGUgKSAgX19rbXBfbXNnX2Vycm9yX2NvZGUoIGNvZGUgKQorI2RlZmluZSBLTVBfU1lTRVJSTUVTRyggbWVzZyApICBfX2ttcF9tc2dfZXJyb3JfbWVzZyggbWVzZyApCisjZGVmaW5lIEtNUF9FUlIgS01QX1NZU0VSUkNPREUKKworLy8gTWVzc2FnZSBzZXZlcml0eS4KK2VudW0ga21wX21zZ19zZXZlcml0eSB7CisgICAga21wX21zX2luZm9ybSwgICAgICAvLyBKdXN0IGluZm9ybWF0aW9uIGZvciB0aGUgdXNlci4KKyAgICBrbXBfbXNfd2FybmluZywgICAgIC8vIE5vbi1mYXRhbCBlcnJvciwgZXhlY3V0aW9uIGNvbnRpbnVlcy4KKyAgICBrbXBfbXNfZmF0YWwgICAgICAgIC8vIEZhdGFsIGVycm9yLCBwcm9ncmFtIGFib3J0cy4KK307IC8vIGVudW0ga21wX21zZ19zZXZlcml0eQordHlwZWRlZiBlbnVtIGttcF9tc2dfc2V2ZXJpdHkgIGttcF9tc2dfc2V2ZXJpdHlfdDsKKworLy8gUHJpbWFyeSBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgbWVzc2FnZXMgZm9yIHRoZSB1c2VyLiBUaGUgZmlyc3QgbWVzc2FnZSBpcyBtYW5kYXRvcnkuIEFueSBudW1iZXIKKy8vIG9mIHN5c3RlbSBlcnJvcnMgYW5kIGhpbnRzIG1heSBiZSBzcGVjaWZpZWQuIEFyZ3VtZW50IGxpc3QgbXVzdCBiZSBmaW5pc2hlZCB3aXRoIF9fa21wX21zZ19udWxsLgordm9pZCAgICBfX2ttcF9tc2coIGttcF9tc2dfc2V2ZXJpdHlfdCBzZXZlcml0eSwga21wX21zZ190IG1lc3NhZ2UsIC4uLiApOworCisvLyBIZWxwZXIgbWFjcm9zIHRvIG1ha2UgY2FsbHMgc2hvcnRlciBpbiBzaW1wbGUgY2FzZXMuCisjZGVmaW5lIEtNUF9JTkZPUk0oIC4uLiAgKSBfX2ttcF9tc2coIGttcF9tc19pbmZvcm0sICBLTVBfTVNHKCBfX1ZBX0FSR1NfXyApLCBfX2ttcF9tc2dfbnVsbCApCisjZGVmaW5lIEtNUF9XQVJOSU5HKCAuLi4gKSBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBfX1ZBX0FSR1NfXyApLCBfX2ttcF9tc2dfbnVsbCApCisjZGVmaW5lIEtNUF9GQVRBTCggICAuLi4gKSBfX2ttcF9tc2coIGttcF9tc19mYXRhbCwgICBLTVBfTVNHKCBfX1ZBX0FSR1NfXyApLCBfX2ttcF9tc2dfbnVsbCApCisjZGVmaW5lIEtNUF9TWVNGQUlMKCBmdW5jLCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfbXNnKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9tc19mYXRhbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsIGZ1bmMgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9TWVNFUlJDT0RFKCBlcnJvciApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fa21wX21zZ19udWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKQorCisvLyBDaGVjayBlcnJvciwgaWYgbm90IHplcm8sIGdlbmVyYXRlIGZhdGFsIGVycm9yIG1lc3NhZ2UuCisjZGVmaW5lIEtNUF9DSEVDS19TWVNGQUlMKCBmdW5jLCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggZXJyb3IgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfU1lTRkFJTCggZnVuYywgZXJyb3IgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyBDaGVjayBzdGF0dXMsIGlmIG5vdCB6ZXJvLCBnZW5lcmF0ZSBmYXRhbCBlcnJvciBtZXNzYWdlIHVzaW5nIGVycm5vLgorI2RlZmluZSBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggZnVuYywgc3RhdHVzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgIHZvaWQgX19rbXBfaTE4bl9kdW1wX2NhdGFsb2coIGttcF9zdHJfYnVmX3QgKiBidWZmZXIgKTsKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfTsgLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvLyBLTVBfSTE4Tl9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2ltcG9ydC5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2ltcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0YmRhZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfaW1wb3J0LmNwcApAQCAtMCwwICsxLDQyIEBACisvKgorICoga21wX2ltcG9ydC5jcHAKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPYmplY3QgZ2VuZXJhdGVkIGZyb20gdGhpcyBzb3VyY2UgZmlsZSBpcyBsaW5rZWQgdG8gV2luZG93cyogT1MgRExMIGltcG9ydCBsaWJyYXJ5IChsaWJvbXBtZC5saWIpCisgICAgb25seSEgSXQgaXMgbm90IGEgcGFydCBvZiByZWd1bGFyIHN0YXRpYyBvciBkeW5hbWljIE9wZW5NUCBSVEwuIEFueSBjb2RlIHRoYXQganVzdCBuZWVkcyB0byBnbworICAgIGluIHRoZSBsaWJvbXBtZC5saWIgKGJ1dCBub3QgaW4gbGlib21wbXQubGliIGFuZCBsaWJvbXBtZC5kbGwpIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcworICAgIGZpbGUuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgICAgVGhlc2Ugc3ltYm9scyBhcmUgcmVxdWlyZWQgZm9yIG11dHVhbCBleGNsdXNpb24gd2l0aCBNaWNyb3NvZnQgT3Blbk1QIFJUTCAoYW5kIGNvbXBhdGliaWxpdHkKKyAgICB3aXRoIE1TIENvbXBpbGVyKS4KKyovCisKK2ludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSA9IDE7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2lvLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfaW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YTJjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2lvLmNwcApAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIGttcF9pby5jcHAgLS0gUlRMIElPCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmbmRlZiBfX0FCU09GVF9XSU4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcC5oIiAvLyBLTVBfR1RJRF9ETkUsIF9fa21wX2RlYnVnX2J1ZiwgZXRjCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBwcmFnbWEgd2FybmluZyggcHVzaCApCisjIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiAyNzEgMzEwICkKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9zdGRpb19sb2NrICAgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIF9fa21wX3N0ZGlvX2xvY2sgICApOyAvKiBDb250cm9sIHN0ZGlvIGZ1bmN0aW9ucyAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfY29uc29sZV9sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9jb25zb2xlX2xvY2sgKTsgLyogQ29udHJvbCBjb25zb2xlIGluaXRpYWxpemF0aW9uICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworCisgICAgIyBpZmRlZiBLTVBfREVCVUcKKyAgICAvKiBfX2ttcF9zdGRvdXQgaXMgdXNlZCBvbmx5IGZvciBkZXYgYnVpbGQgKi8KKyAgICBzdGF0aWMgSEFORExFICAgIF9fa21wX3N0ZG91dCA9IE5VTEw7CisgICAgIyBlbmRpZgorICAgIHN0YXRpYyBIQU5ETEUgICAgICAgIF9fa21wX3N0ZGVyciA9IE5VTEw7CisgICAgc3RhdGljIGludCAgICAgICAgICAgX19rbXBfY29uc29sZV9leGlzdHMgPSBGQUxTRTsKKyAgICBzdGF0aWMga21wX3N0cl9idWZfdCBfX2ttcF9jb25zb2xlX2J1ZjsKKworICAgIHN0YXRpYyBpbnQKKyAgICBpc19jb25zb2xlKCB2b2lkICkKKyAgICB7CisgICAgICAgIGNoYXIgYnVmZmVyWyAxMjggXTsKKyAgICAgICAgRFdPUkQgcmMgID0gMDsKKyAgICAgICAgRFdPUkQgZXJyID0gMDsKKyAgICAgICAgLy8gVHJ5IHRvIGdldCBjb25zb2xlIHRpdGxlLgorICAgICAgICBTZXRMYXN0RXJyb3IoIDAgKTsKKyAgICAgICAgICAgIC8vIEdldENvbnNvbGVUaXRsZSBkb2VzIG5vdCByZXNldCBsYXN0IGVycm9yIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBzaG9ydCBidWZmZXIsCisgICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGNsZWFyIGl0IGV4cGxpY2l0bHkuCisgICAgICAgIHJjID0gR2V0Q29uc29sZVRpdGxlKCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgLy8gcmMgPT0gMCBtZWFucyBnZXR0aW5nIGNvbnNvbGUgdGl0bGUgZmFpbGVkLiBMZXQgdXMgZmluZCBvdXQgd2h5LgorICAgICAgICAgICAgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAvLyBlcnIgPT0gMCBtZWFucyBidWZmZXIgdG9vIHNob3J0ICh3ZSBzdXBwb3NlIGNvbnNvbGUgZXhpc3RzKS4KKyAgICAgICAgICAgIC8vIEluIFdpbmRvdyBhcHBsaWNhdGlvbnMgd2UgdXN1YWxseSBoYXZlIGVyciA9PSA2IChpbnZhbGlkIGhhbmRsZSkuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHJldHVybiByYyA+IDAgfHwgZXJyID09IDA7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fa21wX2Nsb3NlX2NvbnNvbGUoIHZvaWQgKQorICAgIHsKKyAgICAgICAgLyogd2FpdCB1bnRpbCB1c2VyIHByZXNzZXMgcmV0dXJuIGJlZm9yZSBjbG9zaW5nIHdpbmRvdyAqLworICAgICAgICAvKiBUT0RPIG9ubHkgY2xvc2UgaWYgYSB3aW5kb3cgd2FzIG9wZW5lZCAqLworICAgICAgICBpZiggX19rbXBfY29uc29sZV9leGlzdHMgKSB7CisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAvKiBzdGFuZGFyZCBvdXQgaXMgdXNlZCBvbmx5IGluIGRldiBidWlsZCAqLworICAgICAgICAgICAgX19rbXBfc3Rkb3V0ID0gTlVMTDsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJl9fa21wX2NvbnNvbGVfYnVmICk7CisgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRm9yIHdpbmRvd3MsIGNhbGwgdGhpcyBiZWZvcmUgc3Rkb3V0LCBzdGRlcnIsIG9yIHN0ZGluIGFyZSB1c2VkLgorICAgICAqIEl0IG9wZW5zIGEgY29uc29sZSB3aW5kb3cgYW5kIHN0YXJ0cyBwcm9jZXNzaW5nICovCisgICAgc3RhdGljIHZvaWQKKyAgICBfX2ttcF9yZWRpcmVjdF9vdXRwdXQoIHZvaWQgKQorICAgIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworCisgICAgICAgIGlmKCAhIF9fa21wX2NvbnNvbGVfZXhpc3RzICkgeworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgLyogc3RhbmRhcmQgb3V0IGlzIHVzZWQgb25seSBpbiBkZXYgYnVpbGQgKi8KKyAgICAgICAgICAgIEhBTkRMRSBobzsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgSEFORExFIGhlOworCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICZfX2ttcF9jb25zb2xlX2J1ZiApOworCisgICAgICAgICAgICBBbGxvY0NvbnNvbGUoKTsKKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBjaGVjayB0aGUgcmVzdWx0IG9mIEFsbG9jQ29uc29sZSBiZWNhdXNlCisgICAgICAgICAgICAvLyAgMS4gdGhlIGNhbGwgaXMgaGFybWxlc3MKKyAgICAgICAgICAgIC8vICAyLiBpdCBpcyBub3QgY2xlYXIgaG93IHRvIGNvbW11bmljYXRlIGZhaWx1ZQorICAgICAgICAgICAgLy8gIDMuIHdlIHdpbGwgZGV0ZWN0IGZhaWx1cmUgbGF0ZXIgd2hlbiB3ZSBnZXQgaGFuZGxlKHMpCisKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICBobyA9IEdldFN0ZEhhbmRsZSggU1REX09VVFBVVF9IQU5ETEUgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGhvID09IElOVkFMSURfSEFORExFX1ZBTFVFIHx8IGhvID09IE5VTEwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdXRwdXQgZXJyb3Igc29tZWhvdyAobWF5YmUgbWVzc2FnZSBib3gpCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0ZG91dCA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0ZG91dCA9IGhvOyAvLyB0ZW1wb3JhcnkgY29kZSwgbmVlZCBuZXcgZ2xvYmFsIGZvciBobworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBoZSA9IEdldFN0ZEhhbmRsZSggU1REX0VSUk9SX0hBTkRMRSApOworICAgICAgICAgICAgaWYgKCBoZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fCBoZSA9PSBOVUxMICkgeworCisgICAgICAgICAgICAgICAgRFdPUkQgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IG91dHB1dCBlcnJvciBzb21laG93IChtYXliZSBtZXNzYWdlIGJveCkKKyAgICAgICAgICAgICAgICBfX2ttcF9zdGRlcnIgPSBOVUxMOworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gaGU7IC8vIHRlbXBvcmFyeSBjb2RlLCBuZWVkIG5ldyBnbG9iYWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2NvbnNvbGVfZXhpc3RzID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfY29uc29sZV9sb2NrICk7CisgICAgfQorCisjZWxzZQorICAgICNkZWZpbmUgICAgICAgX19rbXBfc3RkZXJyICAgICAoc3RkZXJyKQorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKK3ZvaWQKK19fa21wX3ZwcmludGYoIGVudW0ga21wX2lvIF9fa21wX2lvLCBjaGFyIGNvbnN0ICogZm9ybWF0LCB2YV9saXN0IGFwICkKK3sKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgaWYoICFfX2ttcF9jb25zb2xlX2V4aXN0cyApIHsKKyAgICAgICAgICAgIF9fa21wX3JlZGlyZWN0X291dHB1dCgpOworICAgICAgICB9CisgICAgICAgICAgICBpZiggISBfX2ttcF9zdGRlcnIgJiYgX19rbXBfaW8gPT0ga21wX2VyciApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBpZiggISBfX2ttcF9zdGRvdXQgJiYgX19rbXBfaW8gPT0ga21wX291dCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgJiYgX19rbXBfZGVidWdfYnVmZmVyICE9IE5VTEwgKSB7CisKKyAgICAgICAgaW50IGRjID0gKCBfX2ttcF9kZWJ1Z19idWZfYXRvbWljID8KKyAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX2RlYnVnX2NvdW50KSA6IF9fa21wX2RlYnVnX2NvdW50KysgKQorICAgICAgICAgICAgICAgICAgICUgX19rbXBfZGVidWdfYnVmX2xpbmVzOworICAgICAgICBjaGFyICpkYiA9ICYgX19rbXBfZGVidWdfYnVmZmVyWyBkYyAqIF9fa21wX2RlYnVnX2J1Zl9jaGFycyBdOworICAgICAgICBpbnQgY2hhcnMgPSAwOworCisgICAgICAgICNpZmRlZiBLTVBfREVCVUdfUElEUworICAgICAgICAgICAgY2hhcnMgPSBLTVBfU05QUklOVEYoIGRiLCBfX2ttcF9kZWJ1Z19idWZfY2hhcnMsICJwaWQ9JWQ6ICIsIChrbXBfaW50MzIpZ2V0cGlkKCkgKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGNoYXJzICs9IEtNUF9WU05QUklOVEYoIGRiLCBfX2ttcF9kZWJ1Z19idWZfY2hhcnMsIGZvcm1hdCwgYXAgKTsKKworICAgICAgICBpZiAoIGNoYXJzICsgMSA+IF9fa21wX2RlYnVnX2J1Zl9jaGFycyApIHsKKyAgICAgICAgICAgIGlmICggY2hhcnMgKyAxID4gX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnMgKSB7CisgICAgICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgICAgIERXT1JEIGNvdW50OworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmX19rbXBfY29uc29sZV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAiT01QIHdhcm5pbmc6IERlYnVnZ2luZyBidWZmZXIgb3ZlcmZsb3c7IGluY3JlYXNlIEtNUF9ERUJVR19CVUZfQ0hBUlMgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFycyArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVGaWxlKCBfX2ttcF9zdGRlcnIsIF9fa21wX2NvbnNvbGVfYnVmLnN0ciwgX19rbXBfY29uc29sZV9idWYudXNlZCwgJmNvdW50LCBOVUxMICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2xlYXIoICZfX2ttcF9jb25zb2xlX2J1ZiApOworICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIF9fa21wX3N0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiT01QIHdhcm5pbmc6IERlYnVnZ2luZyBidWZmZXIgb3ZlcmZsb3c7IGluY3JlYXNlIEtNUF9ERUJVR19CVUZfQ0hBUlMgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMgKyAxICk7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaCggX19rbXBfc3RkZXJyICk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnMgPSBjaGFycyArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiB0ZXJtaW5hdGUgc3RyaW5nIGlmIG92ZXJmbG93IG9jY3VycmVkICovCisgICAgICAgICAgICBkYlsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMiBdID0gJ1xuJzsKKyAgICAgICAgICAgIGRiWyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxIF0gPSAnXDAnOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBEV09SRCBjb3VudDsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUdfUElEUworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZfX2ttcF9jb25zb2xlX2J1ZiwgInBpZD0lZDogIiwKKyAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIpZ2V0cGlkKCkgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl92cHJpbnQoICZfX2ttcF9jb25zb2xlX2J1ZiwgZm9ybWF0LCBhcCApOworICAgICAgICAgICAgV3JpdGVGaWxlKAorICAgICAgICAgICAgICAgIF9fa21wX3N0ZGVyciwKKyAgICAgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2J1Zi5zdHIsCisgICAgICAgICAgICAgICAgX19rbXBfY29uc29sZV9idWYudXNlZCwKKyAgICAgICAgICAgICAgICAmY291bnQsCisgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2xlYXIoICZfX2ttcF9jb25zb2xlX2J1ZiApOworICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVR19QSURTCisgICAgICAgICAgICAgICAgZnByaW50ZiggX19rbXBfc3RkZXJyLCAicGlkPSVkOiAiLCAoa21wX2ludDMyKWdldHBpZCgpICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIHZmcHJpbnRmKCBfX2ttcF9zdGRlcnIsIGZvcm1hdCwgYXAgKTsKKyAgICAgICAgICAgIGZmbHVzaCggX19rbXBfc3RkZXJyICk7CisgICAgICAgICNlbmRpZgorICAgIH0KK30KKwordm9pZAorX19rbXBfcHJpbnRmKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGZvcm1hdCwgYXAgKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKwordm9pZAorX19rbXBfcHJpbnRmX25vX2xvY2soIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgX19rbXBfdnByaW50Zigga21wX2VyciwgZm9ybWF0LCBhcCApOworCisgICAgdmFfZW5kKCBhcCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9pby5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwY2FhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2lvLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIGttcF9pby5oIC0tIFJUTCBJTyBoZWFkZXIgZmlsZS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfSU9fSAorI2RlZmluZSBLTVBfSU9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0ga21wX2lvIHsKKyAgICBrbXBfb3V0ID0gMCwKKyAgICBrbXBfZXJyCit9OworCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfc3RkaW9fbG9jazsgICAgIC8qIENvbnRyb2wgc3RkaW8gZnVuY3Rpb25zICovCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfY29uc29sZV9sb2NrOyAgIC8qIENvbnRyb2wgY29uc29sZSBpbml0aWFsaXphdGlvbiAqLworCitleHRlcm4gdm9pZCBfX2ttcF92cHJpbnRmKCBlbnVtIGttcF9pbyBfX2ttcF9pbywgY2hhciBjb25zdCAqIGZvcm1hdCwgdmFfbGlzdCBhcCApOworZXh0ZXJuIHZvaWQgX19rbXBfcHJpbnRmKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50Zl9ub19sb2NrKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK2V4dGVybiB2b2lkIF9fa21wX2Nsb3NlX2NvbnNvbGUoIHZvaWQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9JT19IICovCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfaXR0LmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfaXR0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmQ3ZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pdHQuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCisjaWYgVVNFX0lUVF9CVUlMRAorLyoKKyAqIGttcF9pdHQuY3BwIC0tIElUVCBOb3RpZnkgaW50ZXJmYWNlLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wX2l0dC5oIgorCisjaWYgS01QX0RFQlVHCisgICAgI2luY2x1ZGUgImttcF9pdHQuaW5sIgorI2VuZGlmCisKKworI2lmIFVTRV9JVFRfTk9USUZZCisKKyAgICBrbXBfaW50MzIgX19rbXBfYmFycmllcl9kb21haW5fY291bnQ7CisgICAga21wX2ludDMyIF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQ7CisgICAgX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfYmFycmllcl9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9pbWJhbGFuY2VfZG9tYWluc1tLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworICAgIGttcF9pbnQzMiBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworICAgIF9faXR0X2RvbWFpbiAqIG1ldGFkYXRhX2RvbWFpbiA9IE5VTEw7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqIHN0cmluZ19oYW5kbGVfaW1ibCA9IE5VTEw7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqIHN0cmluZ19oYW5kbGVfbG9vcCA9IE5VTEw7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqIHN0cmluZ19oYW5kbGVfc25nbCA9IE5VTEw7CisKKyAgICAjaW5jbHVkZSAia21wX3ZlcnNpb24uaCIKKyAgICAjaW5jbHVkZSAia21wX2kxOG4uaCIKKyAgICAjaW5jbHVkZSAia21wX3N0ci5oIgorCisgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBrbXBfaXR0X21hcmtfdCApID09IHNpemVvZiggX19pdHRfbWFya190eXBlICkgKTsKKworICAgIC8qCisgICAgICAgIFByZXZpb3VzbHkgdXNlZCB3YXJuaW5nczoKKworICAgICAgICBLTVBfV0FSTklORyggSXR0QWxsTm90aWZEaXNhYmxlZCApOworICAgICAgICBLTVBfV0FSTklORyggSXR0T2JqTm90aWZEaXNhYmxlZCApOworICAgICAgICBLTVBfV0FSTklORyggSXR0TWFya05vdGlmRGlzYWJsZWQgKTsKKyAgICAgICAgS01QX1dBUk5JTkcoIEl0dFVubG9hZExpYkZhaWxlZCwgbGliaXR0bm90aWZ5ICk7CisgICAgKi8KKworCisgICAga21wX2ludDMyIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ID0gMDsKKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pdHRfZGVidWdfbG9jayA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfaXR0X2RlYnVnX2xvY2sgKTsKKworI2VuZGlmIC8vIFVTRV9JVFRfTk9USUZZCisKK3ZvaWQgX19rbXBfaXR0X2luaXRpYWxpemUoKSB7CisKKyAgICAvLyBJVFROb3RpZnkgbGlicmFyeSBpcyBsb2FkZWQgYW5kIGluaXRpYWxpemVkIGF0IGZpcnN0IGNhbGwgdG8gYW55IGl0dG5vdGlmeSBmdW5jdGlvbiwKKyAgICAvLyBzbyB3ZSBkbyBub3QgbmVlZCB0byBleHBsaWNpdGx5IGxvYWQgaXQgYW55IG1vcmUuCisgICAgLy8gSnVzciByZXBvcnQgT01QIFJUTCB2ZXJzaW9uIHRvIElUVE5vdGlmeS4KKworICAgICNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICAvLyBSZXBvcnQgT3Blbk1QIFJUTCB2ZXJzaW9uLgorICAgICAgICBrbXBfc3RyX2J1Zl90ICAgICAgIGJ1ZjsKKyAgICAgICAgX19pdHRfbWFya190eXBlICAgICB2ZXJzaW9uOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICAgICAmIGJ1ZiwKKyAgICAgICAgICAgICJPTVAgUlRMIFZlcnNpb24gJWQuJWQuJWQiLAorICAgICAgICAgICAgX19rbXBfdmVyc2lvbl9tYWpvciwKKyAgICAgICAgICAgIF9fa21wX3ZlcnNpb25fbWlub3IsCisgICAgICAgICAgICBfX2ttcF92ZXJzaW9uX2J1aWxkCisgICAgICAgICk7CisgICAgICAgIGlmICggX19pdHRfYXBpX3ZlcnNpb25fcHRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZiwgIjolcyIsIF9faXR0X2FwaV92ZXJzaW9uKCkgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgdmVyc2lvbiA9IF9faXR0X21hcmtfY3JlYXRlKCBidWYuc3RyICk7CisgICAgICAgIF9faXR0X21hcmsoIHZlcnNpb24sIE5VTEwgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZiApOworICAgICNlbmRpZgorCit9IC8vIF9fa21wX2l0dF9pbml0aWFsaXplCisKKwordm9pZCBfX2ttcF9pdHRfZGVzdHJveSgpIHsKKyAgICAjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgX19rbXBfaXR0X2ZpbmlfaXR0bGliKCk7CisgICAgI2VuZGlmCit9IC8vIF9fa21wX2l0dF9kZXN0cm95CisKKworZXh0ZXJuICJDIgordm9pZAorX19pdHRfZXJyb3JfaGFuZGxlcigKKyAgICBfX2l0dF9lcnJvcl9jb2RlIGVyciwKKyAgICB2YV9saXN0IGFyZ3MKKykgeworCisgICAgc3dpdGNoICggZXJyICkgeworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX25vX21vZHVsZSA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBsaWJyYXJ5ID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgaW50IHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAga21wX21zZ190IGVycl9jb2RlID0gS01QX1NZU0VSUkNPREUoIHN5c19lcnIgKTsKKyAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgZXJyX2NvZGUsIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZikgeworICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBjaGFyIGNvbnN0ICogc3lzX2VyciA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfU1lTRVJSTUVTRyggc3lzX2VyciApOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggSXR0TG9hZExpYkZhaWxlZCwgbGlicmFyeSApLCBlcnJfY29kZSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgX19pdHRfZXJyb3Jfbm9fc3ltYm9sIDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGxpYnJhcnkgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgY2hhciBjb25zdCAqIHN5bWJvbCAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEl0dExvb2t1cEZhaWxlZCwgc3ltYm9sLCBsaWJyYXJ5ICk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgX19pdHRfZXJyb3JfdW5rbm93bl9ncm91cCA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiB2YXIgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogZ3JvdXAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEl0dFVua25vd25Hcm91cCwgdmFyLCBncm91cCApOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX2Vudl90b29fbG9uZyA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiB2YXIgICAgID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIHNpemVfdCAgICAgICBhY3RfbGVuID0gdmFfYXJnKCBhcmdzLCBzaXplX3QgKTsKKyAgICAgICAgICAgIHNpemVfdCAgICAgICBtYXhfbGVuID0gdmFfYXJnKCBhcmdzLCBzaXplX3QgKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRFbnZWYXJUb29Mb25nLCB2YXIsICh1bnNpZ25lZCBsb25nKSBhY3RfbGVuLCAodW5zaWduZWQgbG9uZykgbWF4X2xlbiApOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX2NhbnRfcmVhZF9lbnYgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgc3lzX2VyciA9IHZhX2FyZyggYXJncywgaW50ICk7CisgICAgICAgICAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfRVJSKCBzeXNfZXJyICk7CisgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCB2YXIgKSwgZXJyX2NvZGUsIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZikgeworICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9zeXN0ZW0gOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogZnVuYyAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgc3lzX2VyciA9IHZhX2FyZyggYXJncywgaW50ICk7CisgICAgICAgICAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfU1lTRVJSQ09ERSggc3lzX2VyciApOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggSXR0RnVuY3Rpb25FcnJvciwgZnVuYyApLCBlcnJfY29kZSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEl0dFVua25vd25FcnJvciwgZXJyICk7CisgICAgICAgIH07CisgICAgfTsgLy8gc3dpdGNoCisKK30gLy8gX19pdHRfZXJyb3JfaGFuZGxlcgorCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9pdHQuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfaXR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2MDIzZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfaXR0LmgKQEAgLTAsMCArMSwzMTIgQEAKKyNpZiBVU0VfSVRUX0JVSUxECisvKgorICoga21wX2l0dC5oIC0tIElUVCBOb3RpZnkgaW50ZXJmYWNlLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9JVFRfSAorI2RlZmluZSBLTVBfSVRUX0gKKworI2luY2x1ZGUgImttcF9sb2NrLmgiCisKKyNkZWZpbmUgSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFCisjaW5jbHVkZSAiaXR0bm90aWZ5LmgiCisjaW5jbHVkZSAibGVnYWN5L2l0dG5vdGlmeS5oIgorCisjaWYgS01QX0RFQlVHCisgICAgI2RlZmluZSBfX2ttcF9pbmxpbmUgICAgICAgICAgIC8vIFR1cm4gb2ZmIGlubGluaW5nIGluIGRlYnVnIG1vZGUuCisjZWxzZQorICAgICNkZWZpbmUgX19rbXBfaW5saW5lIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBleHRlcm4ga21wX2ludDMyICBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheTsKKyMgaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHZvaWQgX19rbXBfaXR0X2ZpbmlfaXR0bGliKHZvaWQpOworIyBlbHNlCisgICAgZXh0ZXJuIHZvaWQgX19rbXBfaXR0X2ZpbmlfaXR0bGliKHZvaWQpOworIyBlbmRpZgorI2VuZGlmCisKKy8vIFNpbXBsaWZ5IHRoZSBoYW5kbGluZyBvZiBhbiBhcmd1bWVudCB0aGF0IGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBVU0VfSVRUX0JVSUxEIGlzIGVuYWJsZWQuCisjZGVmaW5lIFVTRV9JVFRfQlVJTERfQVJHKHgpICx4CisKK3ZvaWQgX19rbXBfaXR0X2luaXRpYWxpemUoKTsKK3ZvaWQgX19rbXBfaXR0X2Rlc3Ryb3koKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmV3IHN0dWZmIGZvciByZXBvcnRpbmcgaGlnaC1sZXZlbCBjb25zdHJ1Y3RzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBOb3RlIHRoZSBuYW1pbmcgY29udmVudGlvbjoKKy8vICAgICBfX2ttcF9pdHRfeHh4aW5nKCkgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYWN0aW9uLCB3aGlsZQorLy8gICAgIF9fa21wX2l0dF94eHhlZCgpICBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGFjdGlvbi4KKworLy8gLS0tIFBhcmFsbGVsIHJlZ2lvbiByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcoICBpbnQgZ3RpZCwgaW50IHRlYW1fc2l6ZSwgaW50IGJhcnJpZXJzICk7IC8vIE1hc3RlciBvbmx5LCBiZWZvcmUgZm9ya2luZyB0aHJlYWRzLgorX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoICAgaW50IGd0aWQgKTsgLy8gTWFzdGVyIG9ubHksIGFmdGVyIGpvaW5pbmcgdGhyZWFkcy4KKyAgICAvLyAoKikgTm90ZTogQSB0aHJlYWQgbWF5IGV4ZWN1dGUgdGFza3MgYWZ0ZXIgdGhpcyBwb2ludCwgdGhvdWdoLgorCisvLyAtLS0gRnJhbWUgcmVwb3J0aW5nIC0tLQorLy8gcmVnaW9uID0gMCAtIG5vIHJlZ2lvbnMsIHJlZ2lvbiA9IDEgLSBwYXJhbGxlbCwgcmVnaW9uID0gMiAtIHNlcmlhbGl6ZWQgcGFyYWxsZWwKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGludCBndGlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQsIGludCBpbWJhbGFuY2UsIGlkZW50X3QgKmxvYywgaW50IHRlYW1fc2l6ZSwgaW50IHJlZ2lvbiA9IDAgKTsKKworLy8gLS0tIE1ldGFkYXRhIHJlcG9ydGluZyAtLS0KKy8vIGJlZ2luL2VuZCAtIGJlZ2luL2VuZCB0aW1lc3RhbXBzIG9mIGEgYmFycmllciBmcmFtZSwgaW1iYWxhbmNlIC0gYWdncmVnYXRlZCB3YWl0IHRpbWUgdmFsdWUsIHJlZHVjdGlvbiAtaWYgdGhpcyBpcyBhIHJlZHVjdGlvbiBiYXJyaWVyCitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfbWV0YWRhdGFfaW1iYWxhbmNlKCBpbnQgZ3RpZCwga21wX3VpbnQ2NCBiZWdpbiwga21wX3VpbnQ2NCBlbmQsIGttcF91aW50NjQgaW1iYWxhbmNlLCBrbXBfdWludDY0IHJlZHVjdGlvbiApOworLy8gc2NoZWRfdHlwZTogMCAtIHN0YXRpYywgMSAtIGR5bmFtaWMsIDIgLSBndWlkZWQsIDMgLSBjdXN0b20gKGFsbCBvdGhlcnMpOyBpdGVyYXRpb25zIC0gbG9vcCB0cmlwIGNvdW50LCBjaHVuayAtIGNodW5rIHNpemUKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKCBpZGVudF90ICogbG9jLCBrbXBfdWludDY0IHNjaGVkX3R5cGUsIGttcF91aW50NjQgaXRlcmF0aW9ucywga21wX3VpbnQ2NCBjaHVuayApOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X21ldGFkYXRhX3NpbmdsZSggaWRlbnRfdCAqIGxvYyApOworCisvLyAtLS0gQmFycmllciByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAqIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggaW50IGd0aWQsIGludCBidCwgaW50IHNldF9uYW1lID0gMCwgaW50IGRlbHRhID0gMCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCAgIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworCisvLyAtLS0gVGFza3dhaXQgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgKiBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCggICBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworCisvLyAtLS0gVGFzayByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKCB2b2lkICogb2JqZWN0ICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKCB2b2lkICogb2JqZWN0ICk7CisKKy8vIC0tLSBMb2NrIHJlcG9ydGluZyAtLS0KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyggIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjb25zdCBpZGVudF90ICogKTsKKyNlbHNlCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKyNlbmRpZgorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKworLy8gLS0tIENyaXRpY2FsIHJlcG9ydGluZyAtLS0KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoICBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY29uc3QgaWRlbnRfdCAqICk7CisjZWxzZQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoICBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworI2VuZGlmCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJlZCggIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CisKKy8vIC0tLSBTaW5nbGUgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfc2luZ2xlX3N0YXJ0KCBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfc2luZ2xlX2VuZCggICBpbnQgZ3RpZCApOworCisvLyAtLS0gT3JkZXJlZCByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9vcmRlcmVkX2luaXQoICBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKCAgaW50IGd0aWQgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X29yZGVyZWRfc3RhcnQoIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9vcmRlcmVkX2VuZCggICBpbnQgZ3RpZCApOworCisvLyAtLS0gVGhyZWFkcyByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsKK19fa21wX2lubGluZSB2b2lkICBfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGludCBndGlkICk7CisKKy8vIC0tLSBTeXN0ZW0gb2JqZWN0cyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggdm9pZCAqIG9iamVjdCwgY2hhciBjb25zdCAqIG5hbWUgKTsKKworLy8gLS0tIFN0YWNrIHN0aXRjaGluZyAtLS0KK19fa21wX2lubGluZSBfX2l0dF9jYWxsZXIgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUodm9pZCk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koX19pdHRfY2FsbGVyKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoX19pdHRfY2FsbGVyKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoX19pdHRfY2FsbGVyKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT2xkIHN0dWZmIGZvciByZXBvcnRpbmcgbG93LWxldmVsIGludGVybmFsIHN5bmNocm9uaXphdGlvbi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIFVTRV9JVFRfTk9USUZZCisKKyAgICAvKgorICAgICAqIFN1cHBvcnQgZm9yIFNTQyBtYXJrcywgd2hpY2ggYXJlIHVzZWQgYnkgU0RFCisgICAgICogaHR0cDovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9pbnRlbC1zb2Z0d2FyZS1kZXZlbG9wbWVudC1lbXVsYXRvcgorICAgICAqIHRvIG1hcmsgcG9pbnRzIGluIGluc3RydWN0aW9uIHRyYWNlcyB0aGF0IHJlcHJlc2VudCBzcGluLWxvb3BzIGFuZCBhcmUKKyAgICAgKiB0aGVyZWZvcmUgdW5pbnRlcmVzdGluZyB3aGVuIGNvbGxlY3RpbmcgdHJhY2VzIGZvciBhcmNoaXRlY3R1cmUgc2ltdWxhdGlvbi4KKyAgICAgKi8KKyAgICAjaWZuZGVmIElOQ0xVREVfU1NDX01BUktTCisgICAgIyBkZWZpbmUgSU5DTFVERV9TU0NfTUFSS1MgKEtNUF9PU19MSU5VWCAmJiBLTVBfQVJDSF9YODZfNjQpCisgICAgI2VuZGlmCisKKyAgICAvKiBMaW51eCA2NCBvbmx5IGZvciBub3cgKi8KKyAgICAjaWYgKElOQ0xVREVfU1NDX01BUktTICYmIEtNUF9PU19MSU5VWCAmJiBLTVBfQVJDSF9YODZfNjQpCisgICAgLy8gUG9ydGFibGUgKGF0IGxlYXN0IGZvciBnY2MgYW5kIGljYykgY29kZSB0byBpbnNlcnQgdGhlIG5lY2Vzc2FyeSBpbnN0cnVjdGlvbnMKKyAgICAvLyB0byBzZXQgJWVieCBhbmQgZXhlY3V0ZSB0aGUgdW5saWtlbHkgbm8tb3AuCisgICAgICAjaWYgZGVmaW5lZCggX19JTlRFTF9DT01QSUxFUiApCisgICAgICAjIGRlZmluZSBJTlNFUlRfU1NDX01BUksodGFnKSBfX1NTQ19NQVJLKHRhZykKKyAgICAgICNlbHNlCisgICAgICAjIGRlZmluZSBJTlNFUlRfU1NDX01BUksodGFnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92bCAlMCwgJSVlYng7IC5ieXRlIDB4NjQsIDB4NjcsIDB4OTAgIiA6OiJpIih0YWcpOiIlZWJ4IikKKyAgICAgICNlbmRpZgorICAgICNlbHNlCisgICAgIyBkZWZpbmUgSU5TRVJUX1NTQ19NQVJLKHRhZykgKCh2b2lkKTApCisgICAgI2VuZGlmCisKKyAgICAvKiBNYXJrZXJzIGZvciB0aGUgc3RhcnQgYW5kIGVuZCBvZiByZWdpb25zIHRoYXQgcmVwcmVzZW50IHBvbGxpbmcgYW5kCisgICAgICogYXJlIHRoZXJlZm9yZSB1bmludGVyZXN0aW5nIHRvIGFyY2hpdGVjdHVyYWwgc2ltdWxhdGlvbnMgMHg0Mzc2IGFuZAorICAgICAqIDB4NDM3NyBhcmUgYXJiaXRyYXJ5IG51bWJlcnMgdGhhdCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzcGFjZSBvZgorICAgICAqIFNTQyB0YWdzLCBidXQgdGhlcmUgaXMgbm8gY2VudHJhbCBpc3N1aW5nIGF1dGhvcml0eSByYXRoZXIKKyAgICAgKiByYW5kb21uZXNzIGlzIGV4cGVjdGVkIHRvIHdvcmsuCisgICAgICovCisgICAgI2RlZmluZSBTU0NfTUFSS19TUElOX1NUQVJUKCkgSU5TRVJUX1NTQ19NQVJLKDB4NDM3NikKKyAgICAjZGVmaW5lIFNTQ19NQVJLX1NQSU5fRU5EKCkgICBJTlNFUlRfU1NDX01BUksoMHg0Mzc3KQorCisgICAgLy8gTWFya2VycyBmb3IgYXJjaGl0ZWN0dXJlIHNpbXVsYXRpb24uCisgICAgLy8gRk9SS0lORyAgICAgIDogQmVmb3JlIHRoZSBtYXN0ZXIgdGhyZWFkIGZvcmtzLgorICAgIC8vIEpPSU5JTkcgICAgICA6IEF0IHRoZSBzdGFydCBvZiB0aGUgam9pbi4KKyAgICAvLyBJTlZPS0lORyAgICAgOiBCZWZvcmUgdGhlIHRocmVhZHMgaW52b2tlIG1pY3JvdGFza3MuCisgICAgLy8gRElTUEFUQ0hfSU5JVDogQXQgdGhlIHN0YXJ0IG9mIGR5bmFtaWNhbGx5IHNjaGVkdWxlZCBsb29wLgorICAgIC8vIERJU1BBVENIX05FWFQ6IEFmdGVyIGNsYW1pbmcgbmV4dCBpdGVyYXRpb24gb2YgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AuCisgICAgI2RlZmluZSBTU0NfTUFSS19GT1JLSU5HKCkgICAgICAgICAgSU5TRVJUX1NTQ19NQVJLKDB4ZDY5MykKKyAgICAjZGVmaW5lIFNTQ19NQVJLX0pPSU5JTkcoKSAgICAgICAgICBJTlNFUlRfU1NDX01BUksoMHhkNjk0KQorICAgICNkZWZpbmUgU1NDX01BUktfSU5WT0tJTkcoKSAgICAgICAgIElOU0VSVF9TU0NfTUFSSygweGQ2OTUpCisgICAgI2RlZmluZSBTU0NfTUFSS19ESVNQQVRDSF9JTklUKCkgICAgSU5TRVJUX1NTQ19NQVJLKDB4ZDY5NikKKyAgICAjZGVmaW5lIFNTQ19NQVJLX0RJU1BBVENIX05FWFQoKSAgICBJTlNFUlRfU1NDX01BUksoMHhkNjk3KQorCisgICAgLy8gVGhlIG9iamVjdCBpcyBhbiBhZGRyZXNzIHRoYXQgYXNzb2NpYXRlcyBhIHNwZWNpZmljIHNldCBvZiB0aGUgcHJlcGFyZSwgYWNxdWlyZSwgcmVsZWFzZSwKKyAgICAvLyBhbmQgY2FuY2VsIG9wZXJhdGlvbnMuCisKKyAgICAvKiBTeW5jIHByZXBhcmUgaW5kaWNhdGVzIGEgdGhyZWFkIGlzIGdvaW5nIHRvIHN0YXJ0IHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkCisgICAgICAgdG8gc2VuZCBhIHJlbGVhc2UgZXZlbnQuICBUaGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgZG9uZSBqdXN0IGJlZm9yZSB0aGUgdGhyZWFkCisgICAgICAgYmVnaW5zIGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSByZWxlYXNlIGV2ZW50ICovCisKKyAgICAvKiBTeW5jIGNhbmNlbCBpbmRpY2F0ZXMgYSB0aHJlYWQgaXMgY2FuY2VsbGluZyBhIHdhaXQgb24gYW5vdGhlciB0aHJlYWQgYW5jCisgICAgICAgY29udGludWluZyBleGVjdXRpb24gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIHJlbGVhc2UgaXQgKi8KKworICAgIC8qIFN5bmMgYWNxdWlyZWQgaW5kaWNhdGVzIGEgdGhyZWFkIGhhcyByZWNlaXZlZCBhIHJlbGVhc2UgZXZlbnQgZnJvbSBhbm90aGVyCisgICAgICAgdGhyZWFkIGFuZCBoYXMgc3RvcHBlZCB3YWl0aW5nLiAgVGhpcyBvcGVyYXRpb24gbXVzdCBvY2N1ciBvbmx5IGFmdGVyIHRoZSByZWxlYXNlCisgICAgICAgZXZlbnQgaXMgcmVjZWl2ZWQuICovCisKKyAgICAvKiBTeW5jIHJlbGVhc2UgaW5kaWNhdGVzIGEgdGhyZWFkIGlzIGdvaW5nIHRvIHNlbmQgYSByZWxlYXNlIGV2ZW50IHRvIGFub3RoZXIgdGhyZWFkCisgICAgICAgc28gaXQgd2lsbCBzdG9wIHdhaXRpbmcgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbi4gVGhpcyBvcGVyYXRpb24gbXVzdCBqdXN0IGhhcHBlbiBiZWZvcmUKKyAgICAgICB0aGUgcmVsZWFzZSBldmVudC4gKi8KKworICAgICNkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgIF9faXR0X2ZzeW5jX3ByZXBhcmUoICAgKHZvaWQgKikoIG9iaiApICkKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19DQU5DRUwoICAgIG9iaiApICBfX2l0dF9mc3luY19jYW5jZWwoICAgICh2b2lkICopKCBvYmogKSApCisgICAgI2RlZmluZSBLTVBfRlNZTkNfQUNRVUlSRUQoICBvYmogKSAgX19pdHRfZnN5bmNfYWNxdWlyZWQoICAodm9pZCAqKSggb2JqICkgKQorICAgICNkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgIF9faXR0X2ZzeW5jX3JlbGVhc2luZyggKHZvaWQgKikoIG9iaiApICkKKworICAgIC8qCisgICAgICAgIEluIGNhc2Ugb2Ygd2FpdGluZyBpbiBhIHNwaW4gbG9vcCwgSVRUIHdhbnRzIEtNUF9GU1lOQ19QUkVQQVJFKCkgdG8gYmUgY2FsbGVkIHdpdGggYSBkZWxheQorICAgICAgICAoYW5kIG5vdCBjYWxsZWQgYXQgYWxsIGlmIHdhaXRpbmcgdGltZSBpcyBzbWFsbCkuIFNvLCBpbiBzcGluIGxvb3BzLCBkbyBub3QgdXNlCisgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCksIGJ1dCB1c2UgS01QX0ZTWU5DX1NQSU5fSU5JVCgpIChiZWZvcmUgc3BpbiBsb29wKSwKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSgpICh3aGl0aGluIHRoZSBzcGluIGxvb3ApLCBhbmQgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoKS4KKyAgICAgICAgU2VlIEtNUF9XQUlUX1lJRUxEKCkgZm9yIGV4YW1wbGUuCisgICAgKi8KKworICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fSU5JVAorICAgICNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCBzcGluICkgICAgXAorICAgICAgICBpbnQgc3luY19pdGVycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyICkgeyAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBvYmogPT0gTlVMTCApIHsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9iaiA9IHNwaW47ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTU0NfTUFSS19TUElOX1NUQVJUKCkKKworICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRQorICAgICNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyICYmIHN5bmNfaXRlcnMgPCBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApIHsgXAorICAgICAgICAgICAgKysgc3luY19pdGVyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBzeW5jX2l0ZXJzID49IF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ICkgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCAodm9pZCopIG9iaiApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9IHdoaWxlICgwKQorICAgICN1bmRlZiAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKSBkbyB7ICAgICAgICAgXAorICAgICAgICBTU0NfTUFSS19TUElOX0VORCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggc3luY19pdGVycyA+PSBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApIHsgIFwKKyAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggKHZvaWQqKSBvYmogKTsgICAgICAgICAgXAorICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gd2hpbGUgKDApCisKKyAgICAvKiBJVFQgd2lsbCBub3QgcmVwb3J0IG9iamVjdHMgY3JlYXRlZCB3aXRoaW4gS01QX0lUVF9JR05PUkUoKSwgZS4gZy46CisgICAgICAgICAgIEtNUF9JVFRfSUdOT1JFKAorICAgICAgICAgICAgICAgcHRyID0gbWFsbG9jKCBzaXplICk7CisgICAgICAgICAgICk7CisgICAgKi8KKyAgICAjZGVmaW5lIEtNUF9JVFRfSUdOT1JFKCBzdGF0ZW1lbnQgKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9faXR0X3N0YXRlX3QgX19pdHRfc3RhdGVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggX19pdHRfc3RhdGVfZ2V0X3B0ciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9zdGF0ZV8gPSBfX2l0dF9zdGF0ZV9nZXQoKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9vYmpfbW9kZV9zZXQoIF9faXR0X29ial9wcm9wX2lnbm9yZSwgX19pdHRfb2JqX3N0YXRlX3NldCApOyBcCisgICAgICAgICAgICB9ICAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7IHN0YXRlbWVudCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIF9faXR0X3N0YXRlX2dldF9wdHIgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19pdHRfc3RhdGVfc2V0KCBfX2l0dF9zdGF0ZV8gKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIGNvbnN0IGludCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMgPSA1MTI7IC8vIE1heGltdW0gbnVtYmVyIG9mIGZyYW1lIGRvbWFpbnMgdG8gdXNlIChtYXBzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IE9wZW5NUCByZWdpb25zIGluIHRoZSB1c2VyIHNvdXJjZSBjb2RlKS4KKyAgICBleHRlcm4ga21wX2ludDMyIF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50OworICAgIGV4dGVybiBrbXBfaW50MzIgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudDsKKyAgICBleHRlcm4gX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfYmFycmllcl9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworICAgIGV4dGVybiBfX2l0dF9kb21haW4gKiBtZXRhZGF0YV9kb21haW47CisgICAgZXh0ZXJuIF9faXR0X3N0cmluZ19oYW5kbGUgKiBzdHJpbmdfaGFuZGxlX2ltYmw7CisgICAgZXh0ZXJuIF9faXR0X3N0cmluZ19oYW5kbGUgKiBzdHJpbmdfaGFuZGxlX2xvb3A7CisgICAgZXh0ZXJuIF9faXR0X3N0cmluZ19oYW5kbGUgKiBzdHJpbmdfaGFuZGxlX3NuZ2w7CisKKyNlbHNlCisKKy8vIE51bGwgZGVmaW5pdGlvbnMgb2YgdGhlIHN5bmNocm9uaXphdGlvbiB0cmFjaW5nIGZ1bmN0aW9ucy4KKyMgZGVmaW5lIEtNUF9GU1lOQ19QUkVQQVJFKCAgIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19DQU5DRUwoICAgIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19BQ1FVSVJFRCggIG9iaiApICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19SRUxFQVNJTkcoIG9iaiApICAgICAgICAoKHZvaWQpMCkKKworIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCBzcGluICkgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggIG9iaiApICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfSVRUX0lHTk9SRShzdG10ICkgZG8geyBzdG10IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvLyBVU0VfSVRUX05PVElGWQorCisjaWYgISBLTVBfREVCVUcKKyAgICAvLyBJbiByZWxlYXNlIG1vZGUgaW5jbHVkZSBkZWZpbml0aW9ucyBvZiBpbmxpbmUgZnVuY3Rpb25zLgorICAgICNpbmNsdWRlICJrbXBfaXR0LmlubCIKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0lUVF9ICisKKyNlbHNlICAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIE51bGwgZGVmaW5pdGlvbnMgb2YgdGhlIHN5bmNocm9uaXphdGlvbiB0cmFjaW5nIGZ1bmN0aW9ucy4KKy8vIElmIFVTRV9JVFRfQlVMSUQgaXMgbm90IGVuYWJsZWQsIFVTRV9JVFRfTk9USUZZIGNhbm5vdCBiZSBlaXRoZXIuCisvLyBCeSBkZWZpbmluZyB0aGVzZSB3ZSBhdm9pZCB1bnBsZWFzYW50IGlmZGVmIHRlc3RzIGluIG1hbnkgcGxhY2VzLgorIyBkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0NBTkNFTCggICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0FDUVVJUkVEKCAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgICAgICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosIHNwaW4gKSAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCAgb2JqICkgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICkgICAgKCh2b2lkKTApCisKKyMgZGVmaW5lIEtNUF9JVFRfSUdOT1JFKHN0bXQgKSBkbyB7IHN0bXQgfSB3aGlsZSAoMCkKKworIyBkZWZpbmUgVVNFX0lUVF9CVUlMRF9BUkcoeCkKKworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfaXR0LmlubCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfaXR0LmlubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmY4NDkwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sCkBAIC0wLDAgKzEsMTE0OCBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmlubCAtLSBJbmxpbmUgZnVuY3Rpb25zIG9mIElUVCBOb3RpZnkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIElubGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4gVGhpcyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBpbnRvIGttcF9pdHQuaCBmaWxlIGZvciBwcm9kaWN0aW9uCisvLyBidWlsZCAodG8gbGV0IGNvbXBsaWxlciBpbmxpbmUgZnVuY3Rpb25zKSBvciBpbnRvIGttcF9pdHQuYyBmaWxlIGZvciBkZWJ1ZyBidWlsZCAodG8gcmVkdWNlCisvLyB0aGUgbnVtYmVyIG9mIGZpbGVzIHRvIHJlY29tcGlsZSBhbmQgc2F2ZSBidWlsZCB0aW1lKS4KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaWYgS01QX0lUVF9ERUJVRworICAgIGV4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pdHRfZGVidWdfbG9jazsKKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfTE9DSygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9pdHRfZGVidWdfbG9jayApOyAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBLTVBfSVRUX0RFQlVHX1BSSU5UKCAuLi4gKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiMlMDJkOiAiLCBfX2ttcF9nZXRfZ3RpZCgpICk7ICAgICAgICAgICAgICBcCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgX19WQV9BUkdTX18gKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZmbHVzaCggc3RkZXJyICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfaXR0X2RlYnVnX2xvY2sgKTsgICAgICBcCisgICAgfQorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfTE9DSygpCisgICAgI2RlZmluZSBLTVBfSVRUX0RFQlVHX1BSSU5UKCAuLi4gKQorI2VuZGlmIC8vIEtNUF9JVFRfREVCVUcKKworLy8gRW5zdXJlIHRoYXQgdGhlIGZ1bmN0aW9ucyBhcmUgc3RhdGljIGlmIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUKKy8vIGJlaW5nIGlubGluZWQuIE90aGVyd2lzZSB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIG1vcmUgdGhhbiBvbmUgZmlsZSwKKy8vIHNpbmNlIHRoZXJlIHdpbGwgYmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMuCisjaWYgS01QX0RFQlVHCisjIGRlZmluZSBMSU5LQUdFCisjZWxzZQorIyBkZWZpbmUgTElOS0FHRSBzdGF0aWMgaW5saW5lCisjZW5kaWYKKworLy8gWkNBIGludGVyZmFjZSB1c2VkIGJ5IEludGVsKFIpIEluc3BlY3Rvci4gSW50ZWwoUikgUGFyYWxsZWwgQW1wbGlmaWVyIHVzZXMgdGhpcworLy8gQVBJIHRvIHN1cHBvcnQgdXNlci1kZWZpbmVkIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLCBidXQgZG9lcyBub3QgdXNlIFpDQTsKKy8vIGl0IHdvdWxkIGJlIHNhZmUgdG8gdHVybiB0aGlzIG9mZiB1bnRpbCB3aWRlciBzdXBwb3J0IGJlY29tZXMgYXZhaWxhYmxlLgorI2lmIFVTRV9JVFRfWkNBCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorIyAgIGlmIF9fSU5URUxfQ09NUElMRVIgPj0gMTIwMAorIyAgICAgICB1bmRlZiBfX2l0dF9zeW5jX2FjcXVpcmVkCisjICAgICAgIHVuZGVmIF9faXR0X3N5bmNfcmVsZWFzaW5nCisjICAgICAgIGRlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkKGFkZHIpICAgIF9fbm90aWZ5X3pjX2ludHJpbnNpYygoY2hhciAqKSJzeW5jX2FjcXVpcmVkIiwgYWRkcikKKyMgICAgICAgZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nKGFkZHIpICAgX19ub3RpZnlfaW50cmluc2ljKChjaGFyICopInN5bmNfcmVsZWFzaW5nIiwgYWRkcikKKyMgICBlbmRpZgorI2VuZGlmCisjZW5kaWYKKworc3RhdGljIGttcF9ib290c3RyYXBfbG9ja190ICBtZXRhZGF0YV9sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBtZXRhZGF0YV9sb2NrICk7CisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGFyYWxsZWwgcmVnaW9uIHJlcG9ydGluZy4KKworICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyBzaG91bGQgYmUgY2FsbGVkIGJ5IG1hc3RlciB0aHJlYWQgb2YgYSB0ZWFtLiBFeGFjdCBtb21lbnQgb2YKKyAgICAgICAgICBjYWxsIGRvZXMgbm90IG1hdHRlciwgYnV0IGl0IHNob3VsZCBiZSBjb21wbGV0ZWQgYmVmb3JlIGFueSB0aHJlYWQgb2YgdGhpcyB0ZWFtIGNhbGxzCisgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZy4KKyAgICAgICAgKiBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nIHNob3VsZCBiZSBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgb2YgYSB0ZWFtIGp1c3QgYmVmb3JlIGVudGVyaW5nCisgICAgICAgICAgcGFyYWxsZWwgcmVnaW9uIGJvZHkuCisgICAgICAgICogX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkIG9mIGEgdGVhbSByaWdodCBhZnRlciByZXR1cm5pbmcKKyAgICAgICAgICBmcm9tIHBhcmFsbGVsIHJlZ2lvbiBib2R5LgorICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fam9pbmVkIHNob3VsZCBiZSBjYWxsZWQgYnkgbWFzdGVyIHRocmVhZCBvZiBhIHRlYW0sIGFmdGVyIGFsbCB0aHJlYWRzCisgICAgICAgICAgY2FsbGVkIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQuCisKKyAgICBOb3RlOiBUaHJlYWQgd2FpdGluZyBhdCBqb2luIGJhcnJpZXIgKGFmdGVyIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQpIGNhbiBleGVjdXRlIHNvbWUgbW9yZQorICAgIHVzZXIgY29kZSAtLSBzdWNoIGEgdGhyZWFkIGNhbiBleGVjdXRlIHRhc2tzLgorCisgICAgTm90ZTogVGhlIG92ZXJoZWFkIG9mIGxvZ2dpbmcgcmVnaW9uX3N0YXJ0aW5nIGFuZCByZWdpb25fZmluaXNoZWQgaW4gZWFjaCB0aHJlYWQgaXMgdG9vIGxhcmdlLAorICAgIHNvIHRoZXNlIGNhbGxzIGFyZSBub3QgdXNlZC4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fZm9ya2luZyggaW50IGd0aWQsIGludCB0ZWFtX3NpemUsIGludCBiYXJyaWVycyApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGttcF90ZWFtX3QgKiAgICAgIHRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGlmICh0ZWFtLT50LnRfYWN0aXZlX2xldmVsID4gMSkKKyAgICB7CisgICAgICAgIC8vIFRoZSBmcmFtZSBub3RpZmljYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIG91dGVybW9zdCB0ZWFtcy4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZGVudF90ICogICAgICAgICBsb2MgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLT50aC50aF9pZGVudDsKKyAgICBpZiAobG9jKSB7CisgICAgICAgIC8vIFVzZSB0aGUgcmVzZXJ2ZWRfMiBmaWVsZCB0byBzdG9yZSB0aGUgaW5kZXggdG8gdGhlIHJlZ2lvbiBkb21haW4uCisgICAgICAgIC8vIEFzc3VtZSB0aGF0IHJlc2VydmVkXzIgY29udGFpbnMgemVybyBpbml0aWFsbHkuICBTaW5jZSB6ZXJvIGlzIHNwZWNpYWwKKyAgICAgICAgLy8gdmFsdWUgaGVyZSwgc3RvcmUgdGhlIGluZGV4IGludG8gZG9tYWluIGFycmF5IGluY3JlYXNlZCBieSAxLgorICAgICAgICBpZiAobG9jLT5yZXNlcnZlZF8yID09IDApIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgaW50IGZybSA9IEtNUF9URVNUX1RIRU5fSU5DMzIoICYgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCApOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiAoZnJtID49IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAmIF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQgKTsgICAgICAgLy8gcmV2ZXJ0IHRoZSBjb3VudAorICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBpcyBzdGlsbCAwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vaWYgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICZsb2MtPnJlc2VydmVkXzIsIDAsIGZybSArIDEgKSkgeworICAgICAgICAgICAgICAgIC8vICAgIGZybSA9IGxvYy0+cmVzZXJ2ZWRfMiAtIDE7ICAgLy8gZ2V0IHZhbHVlIHNhdmVkIGJ5IG90aGVyIHRocmVhZCBmb3Igc2FtZSBsb2MKKyAgICAgICAgICAgICAgICAvL30gLy8gQUM6IHRoaXMgYmxvY2sgaXMgdG8gcmVwbGFjZSBuZXh0IHVuc3luY2hyb25pemVkIGxpbmUKKworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2F2ZSBpbmRleGVzIGZvciBib3RoIHJlZ2lvbiBhbmQgYmFycmllciBmcmFtZXMuIFdlJ2xsIHVzZSBsb2MtPnJlc2VydmVkXzIKKyAgICAgICAgICAgICAgICAvLyBmaWVsZCBidXQgcHV0IHJlZ2lvbiBpbmRleCB0byB0aGUgbG93IHR3byBieXRlcyBhbmQgYmFycmllciBpbmRleGVzIHRvIHRoZSBoaWdoCisgICAgICAgICAgICAgICAgLy8gdHdvIGJ5dGVzLiBJdCBpcyBPSyBiZWNhdXNlIEtNUF9NQVhfRlJBTUVfRE9NQUlOUyA9IDUxMi4KKyAgICAgICAgICAgICAgICBsb2MtPnJlc2VydmVkXzIgfD0gKGZybSArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgIm5ldyIgdmFsdWUKKworICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBjb21waWxlci1nZW5lcmF0ZWQgcmVnaW9uIGxvY2F0aW9uIGludG8gdGhlIGZvcm1hdAorICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHRvb2xzIG1vcmUgb3IgbGVzcyBzdGFuZGFyZGl6ZWQgb246CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxmdW5jPiRvbXAkcGFyYWxsZWxAW2ZpbGU6XTxsaW5lPls6PGNvbD5dIgorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkcGFyYWxsZWw6JWRAJXM6JWQ6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5saW5lLCBzdHJfbG9jLmNvbCk7CisKKyAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICBpZiggYmFycmllcnMgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCA8IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZybSA9IEtNUF9URVNUX1RIRU5fSU5DMzIoICYgX19rbXBfYmFycmllcl9kb21haW5fY291bnQgKTsgLy8gZ2V0ICJvbGQiIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJtID49IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoICYgX19rbXBfYmFycmllcl9kb21haW5fY291bnQgKTsgICAgICAgLy8gcmV2ZXJ0IHRoZSBjb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jLT5yZXNlcnZlZF8yIGlzIHN0aWxsIDAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkYmFycmllckAlczolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHN0cl9sb2MuZmlsZSwgc3RyX2xvYy5jb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbIGZybSBdID0gX19pdHRfZG9tYWluX2NyZWF0ZSggYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGJhcnJpZXIgZnJhbWUgaW5kZXggdG8gdGhlIGhpZ2ggdHdvIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgbG9jLT5yZXNlcnZlZF8yIHw9IChmcm0gKyAxKSA8PCAxNjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfYmVnaW5fdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIFJlZ2lvbiBkb21haW4gZXhpc3RzIGZvciB0aGlzIGxvY2F0aW9uCisgICAgICAgICAgICAvLyBDaGVjayBpZiB0ZWFtIHNpemUgd2FzIGNoYW5nZWQuIFRoZW4gY3JlYXRlIG5ldyByZWdpb24gZG9tYWluIGZvciB0aGlzIGxvY2F0aW9uCisgICAgICAgICAgICBpbnQgZnJtID0gKGxvYy0+cmVzZXJ2ZWRfMiAmIDB4MDAwMEZGRkYpIC0gMTsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtmcm1dICE9IHRlYW1fc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJHBhcmFsbGVsOiVkQCVzOiVkOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MubGluZSwgc3RyX2xvYy5jb2wpOworCisgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdID0gX19pdHRfZG9tYWluX2NyZWF0ZSggYnVmZiApOworICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gPSB0ZWFtX3NpemU7CisgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfYmVnaW5fdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zW2ZybV0sIE5VTEwpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gVGVhbSBzaXplIHdhcyBub3QgY2hhbmdlZC4gVXNlIGV4aXN0aW5nIGRvbWFpbi4KKyAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9iZWdpbl92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbZnJtXSwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbZnJtIGJlZ10gZ3RpZD0lZCwgaWR4PSV4LCBsb2M6JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jLT5yZXNlcnZlZF8yLCBsb2MgKTsKKyAgICB9CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBpbnQgZ3RpZCwgX19pdHRfdGltZXN0YW1wIGJlZ2luLCBfX2l0dF90aW1lc3RhbXAgZW5kLCBpbnQgaW1iYWxhbmNlLCBpZGVudF90ICogbG9jLCBpbnQgdGVhbV9zaXplLCBpbnQgcmVnaW9uICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYoIHJlZ2lvbiApIHsKKyAgICAgICAga21wX3RlYW1fdCAqICAgICAgdGVhbSA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGludCBzZXJpYWxpemVkID0gKCByZWdpb24gPT0gMiA/IDEgOiAwICk7CisgICAgICAgIGlmICh0ZWFtLT50LnRfYWN0aXZlX2xldmVsICsgc2VyaWFsaXplZCA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBmcmFtZSBub3RpZmljYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIG91dGVybW9zdCB0ZWFtcy4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAgLy9DaGVjayByZWdpb24gZG9tYWluIGhhcyBub3QgYmVlbiBjcmVhdGVkIGJlZm9yZS4gSXQncyBpbmRleCBpcyBzYXZlZCBpbiB0aGUgbG93IHR3byBieXRlcy4KKyAgICAgICAgIGlmICgobG9jLT5yZXNlcnZlZF8yICYgMHgwMDAwRkZGRikgPT0gMCkgeworICAgICAgICAgICAgIGlmIChfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgIGludCBmcm0gPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQgKTsgLy8gZ2V0ICJvbGQiIHZhbHVlCisgICAgICAgICAgICAgICAgIGlmIChmcm0gPj0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAmIF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQgKTsgICAgICAgLy8gcmV2ZXJ0IHRoZSBjb3VudAorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAvLyBsb2MtPnJlc2VydmVkXzIgaXMgc3RpbGwgMAorICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzYXZlIGluZGV4ZXMgZm9yIGJvdGggcmVnaW9uIGFuZCBiYXJyaWVyIGZyYW1lcy4gV2UnbGwgdXNlIGxvYy0+cmVzZXJ2ZWRfMgorICAgICAgICAgICAgICAgICAvLyBmaWVsZCBidXQgcHV0IHJlZ2lvbiBpbmRleCB0byB0aGUgbG93IHR3byBieXRlcyBhbmQgYmFycmllciBpbmRleGVzIHRvIHRoZSBoaWdoCisgICAgICAgICAgICAgICAgIC8vIHR3byBieXRlcy4gSXQgaXMgT0sgYmVjYXVzZSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMgPSA1MTIuCisgICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSAibmV3IiB2YWx1ZQorCisgICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBjb21waWxlci1nZW5lcmF0ZWQgcmVnaW9uIGxvY2F0aW9uIGludG8gdGhlIGZvcm1hdAorICAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSB0b29scyBtb3JlIG9yIGxlc3Mgc3RhbmRhcmRpemVkIG9uOgorICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGZ1bmM+JG9tcCRwYXJhbGxlbDp0ZWFtX3NpemVAW2ZpbGU6XTxsaW5lPls6PGNvbD5dIgorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkcGFyYWxsZWw6JWRAJXM6JWQ6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmxpbmUsIHN0cl9sb2MuY29sKTsKKworICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdID0gX19pdHRfZG9tYWluX2NyZWF0ZSggYnVmZiApOworICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKworICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtmcm1dID0gdGVhbV9zaXplOworICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSwgTlVMTCwgYmVnaW4sIGVuZCApOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSB7IC8vIFJlZ2lvbiBkb21haW4gZXhpc3RzIGZvciB0aGlzIGxvY2F0aW9uCisgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGVhbSBzaXplIHdhcyBjaGFuZ2VkLiBUaGVuIGNyZWF0ZSBuZXcgcmVnaW9uIGRvbWFpbiBmb3IgdGhpcyBsb2NhdGlvbgorICAgICAgICAgICAgIGludCBmcm0gPSAobG9jLT5yZXNlcnZlZF8yICYgMHgwMDAwRkZGRikgLSAxOworICAgICAgICAgICAgIGlmKCBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtmcm1dICE9IHRlYW1fc2l6ZSApIHsKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJHBhcmFsbGVsOiVkQCVzOiVkOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCB0ZWFtX3NpemUsIHN0cl9sb2MuZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5saW5lLCBzdHJfbG9jLmNvbCk7CisKKyAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisKKyAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKyAgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl90ZWFtX3NpemVbZnJtXSA9IHRlYW1fc2l6ZTsKKyAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgICB9IGVsc2UgeyAvLyBUZWFtIHNpemUgd2FzIG5vdCBjaGFuZ2VkLiBVc2UgZXhpc3RpbmcgZG9tYWluLgorICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSwgTlVMTCwgYmVnaW4sIGVuZCApOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltyZWcgc3ViXSBndGlkPSVkLCBpZHg9JXgsIHJlZ2lvbjolZCwgbG9jOiVwLCBiZWc6JWxsdSwgZW5kOiVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGxvYy0+cmVzZXJ2ZWRfMiwgcmVnaW9uLCBsb2MsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeyAvLyBjYWxsZWQgZm9yIGJhcnJpZXIgcmVwb3J0aW5nCisgICAgICAgIGlmIChsb2MpIHsKKyAgICAgICAgICAgIGlmICgobG9jLT5yZXNlcnZlZF8yICYgMHhGRkZGMDAwMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCA8IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZnJtID0gS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCApOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZybSA+PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoICYgX19rbXBfYmFycmllcl9kb21haW5fY291bnQgKTsgICAgICAgLy8gcmV2ZXJ0IHRoZSBjb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAvLyBsb2MtPnJlc2VydmVkXzIgaXMgc3RpbGwgMAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGJhcnJpZXIgZnJhbWUgaW5kZXggdG8gdGhlIGhpZ2ggdHdvIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICBsb2MtPnJlc2VydmVkXzIgfD0gKGZybSArIDEpIDw8IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSAibmV3IiB2YWx1ZQorCisgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBjb21waWxlci1nZW5lcmF0ZWQgcmVnaW9uIGxvY2F0aW9uIGludG8gdGhlIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSB0b29scyBtb3JlIG9yIGxlc3Mgc3RhbmRhcmRpemVkIG9uOgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGZ1bmM+JG9tcCRmcmFtZUBbZmlsZTpdPGxpbmU+Wzo8Y29sPl0iCisgICAgICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpbWJhbGFuY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZl9pbWIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZl9pbWIgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkYmFycmllci1pbWJhbGFuY2U6JWRAJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCB0ZWFtX3NpemUsIHN0cl9sb2MuZmlsZSwgc3RyX2xvYy5jb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9pbWJhbGFuY2VfZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmX2ltYiApOworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zWyBmcm0gXSwgTlVMTCwgYmVnaW4sIGVuZCApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmX2ltYiApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRiYXJyaWVyQCVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmNvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfYmFycmllcl9kb21haW5zWyBmcm0gXSwgTlVMTCwgYmVnaW4sIGVuZCApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIGlmIGl0IGlzIG5vdCAwIHRoZW4gaXQgc2hvdWxkIGJlIDw9IEtNUF9NQVhfRlJBTUVfRE9NQUlOUworICAgICAgICAgICAgICAgIGlmKCBpbWJhbGFuY2UgKSB7CisgICAgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfaW1iYWxhbmNlX2RvbWFpbnNbIChsb2MtPnJlc2VydmVkXzIgPj4gMTYpIC0gMSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbKGxvYy0+cmVzZXJ2ZWRfMiA+PiAxNikgLSAxXSwgTlVMTCwgYmVnaW4sIGVuZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltmcm0gc3ViXSBndGlkPSVkLCBpZHg9JXgsIGxvYzolcCwgYmVnOiVsbHUsIGVuZDolbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBsb2MtPnJlc2VydmVkXzIsIGxvYywgYmVnaW4sIGVuZCApOworICAgICAgICB9CisgICAgfQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9tZXRhZGF0YV9pbWJhbGFuY2UoIGludCBndGlkLCBrbXBfdWludDY0IGJlZ2luLCBrbXBfdWludDY0IGVuZCwga21wX3VpbnQ2NCBpbWJhbGFuY2UsIGttcF91aW50NjQgcmVkdWN0aW9uICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgICAgICBpZiggbWV0YWRhdGFfZG9tYWluID09IE5VTEwpIHsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICBtZXRhZGF0YV9kb21haW4gPSBfX2l0dF9kb21haW5fY3JlYXRlKCAiT01QIE1ldGFkYXRhIiApOworICAgICAgICAgICAgc3RyaW5nX2hhbmRsZV9pbWJsID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoICJvbXBfbWV0YWRhdGFfaW1iYWxhbmNlIik7CisgICAgICAgICAgICBzdHJpbmdfaGFuZGxlX2xvb3AgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9sb29wIik7CisgICAgICAgICAgICBzdHJpbmdfaGFuZGxlX3NuZ2wgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9zaW5nbGUiKTsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgIH0KKworICAgIGttcF91aW50NjQgaW1iYWxhbmNlX2RhdGFbIDQgXTsKKyAgICBpbWJhbGFuY2VfZGF0YVsgMCBdID0gYmVnaW47CisgICAgaW1iYWxhbmNlX2RhdGFbIDEgXSA9IGVuZDsKKyAgICBpbWJhbGFuY2VfZGF0YVsgMiBdID0gaW1iYWxhbmNlOworICAgIGltYmFsYW5jZV9kYXRhWyAzIF0gPSByZWR1Y3Rpb247CisKKyAgICBfX2l0dF9tZXRhZGF0YV9hZGQobWV0YWRhdGFfZG9tYWluLCBfX2l0dF9udWxsLCBzdHJpbmdfaGFuZGxlX2ltYmwsIF9faXR0X21ldGFkYXRhX3U2NCwgNCwgaW1iYWxhbmNlX2RhdGEpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9tZXRhZGF0YV9pbWJhbGFuY2UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9tZXRhZGF0YV9sb29wKCBpZGVudF90ICogbG9jLCBrbXBfdWludDY0IHNjaGVkX3R5cGUsIGttcF91aW50NjQgaXRlcmF0aW9ucywga21wX3VpbnQ2NCBjaHVuayApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmKCBtZXRhZGF0YV9kb21haW4gPT0gTlVMTCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIG1ldGFkYXRhX2xvY2sgKTsKKyAgICAgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgbWV0YWRhdGFfZG9tYWluID0gX19pdHRfZG9tYWluX2NyZWF0ZSggIk9NUCBNZXRhZGF0YSIgKTsKKyAgICAgICAgICAgIHN0cmluZ19oYW5kbGVfaW1ibCA9IF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKCAib21wX21ldGFkYXRhX2ltYmFsYW5jZSIpOworICAgICAgICAgICAgc3RyaW5nX2hhbmRsZV9sb29wID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoICJvbXBfbWV0YWRhdGFfbG9vcCIpOworICAgICAgICAgICAgc3RyaW5nX2hhbmRsZV9zbmdsID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoICJvbXBfbWV0YWRhdGFfc2luZ2xlIik7CisgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIG1ldGFkYXRhX2xvY2sgKTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSBsaW5lIGFuZCBjb2x1bW4gZnJvbSBwc291cmNlIHN0cmluZzogIjtmaWxlO2Z1bmM7bGluZTtjb2w7OyIKKyAgICBjaGFyICogc19saW5lOworICAgIGNoYXIgKiBzX2NvbDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGxvYy0+cHNvdXJjZSk7CisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBzX2xpbmUgPSBzdHJjaHIoKGNoYXIqKWxvYy0+cHNvdXJjZSwgJzsnKTsKKyNlbHNlCisgICAgc19saW5lID0gc3RyY2hyKGxvYy0+cHNvdXJjZSwgJzsnKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoc19saW5lKTsKKyAgICBzX2xpbmUgPSBzdHJjaHIoc19saW5lICsgMSwgJzsnKTsgICAvLyAyLW5kIHNlbWljb2xvbgorICAgIEtNUF9ERUJVR19BU1NFUlQoc19saW5lKTsKKyAgICBzX2xpbmUgPSBzdHJjaHIoc19saW5lICsgMSwgJzsnKTsgICAvLyAzLXJkIHNlbWljb2xvbgorICAgIEtNUF9ERUJVR19BU1NFUlQoc19saW5lKTsKKyAgICBzX2NvbCA9IHN0cmNocihzX2xpbmUgKyAxLCAnOycpOyAgICAvLyA0LXRoIHNlbWljb2xvbgorICAgIEtNUF9ERUJVR19BU1NFUlQoc19jb2wpOworCisgICAga21wX3VpbnQ2NCBsb29wX2RhdGFbIDUgXTsKKyAgICBsb29wX2RhdGFbIDAgXSA9IGF0b2koc19saW5lICsgMSk7IC8vIHJlYWQgbGluZQorICAgIGxvb3BfZGF0YVsgMSBdID0gYXRvaShzX2NvbCArIDEpOyAgLy8gcmVhZCBjb2x1bW4KKyAgICBsb29wX2RhdGFbIDIgXSA9IHNjaGVkX3R5cGU7CisgICAgbG9vcF9kYXRhWyAzIF0gPSBpdGVyYXRpb25zOworICAgIGxvb3BfZGF0YVsgNCBdID0gY2h1bms7CisKKyAgICBfX2l0dF9tZXRhZGF0YV9hZGQobWV0YWRhdGFfZG9tYWluLCBfX2l0dF9udWxsLCBzdHJpbmdfaGFuZGxlX2xvb3AsIF9faXR0X21ldGFkYXRhX3U2NCwgNSwgbG9vcF9kYXRhKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbWV0YWRhdGFfbG9vcAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X21ldGFkYXRhX3NpbmdsZSggaWRlbnRfdCAqIGxvYyApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmKCBtZXRhZGF0YV9kb21haW4gPT0gTlVMTCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIG1ldGFkYXRhX2xvY2sgKTsKKyAgICAgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgbWV0YWRhdGFfZG9tYWluID0gX19pdHRfZG9tYWluX2NyZWF0ZSggIk9NUCBNZXRhZGF0YSIgKTsKKyAgICAgICAgICAgIHN0cmluZ19oYW5kbGVfaW1ibCA9IF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKCAib21wX21ldGFkYXRhX2ltYmFsYW5jZSIpOworICAgICAgICAgICAgc3RyaW5nX2hhbmRsZV9sb29wID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoICJvbXBfbWV0YWRhdGFfbG9vcCIpOworICAgICAgICAgICAgc3RyaW5nX2hhbmRsZV9zbmdsID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoICJvbXBfbWV0YWRhdGFfc2luZ2xlIik7CisgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIG1ldGFkYXRhX2xvY2sgKTsKKyAgICB9CisKKyAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgIGttcF91aW50NjQgc2luZ2xlX2RhdGFbIDIgXTsKKyAgICBzaW5nbGVfZGF0YVsgMCBdID0gc3RyX2xvYy5saW5lOworICAgIHNpbmdsZV9kYXRhWyAxIF0gPSBzdHJfbG9jLmNvbDsKKworICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKworICAgIF9faXR0X21ldGFkYXRhX2FkZChtZXRhZGF0YV9kb21haW4sIF9faXR0X251bGwsIHN0cmluZ19oYW5kbGVfc25nbCwgX19pdHRfbWV0YWRhdGFfdTY0LCAyLCBzaW5nbGVfZGF0YSk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X21ldGFkYXRhX3NpbmdsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZyggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfcmVnaW9uX2ZpbmlzaGVkKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fZmluaXNoZWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fam9pbmVkKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGttcF90ZWFtX3QgKiAgICAgIHRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGlmICh0ZWFtLT50LnRfYWN0aXZlX2xldmVsID4gMSkKKyAgICB7CisgICAgICAgIC8vIFRoZSBmcmFtZSBub3RpZmljYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIG91dGVybW9zdCB0ZWFtcy4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZGVudF90ICogICAgICAgICBsb2MgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLT50aC50aF9pZGVudDsKKyAgICBpZiAobG9jICYmIGxvYy0+cmVzZXJ2ZWRfMikKKyAgICB7CisgICAgICAgIGludCBmcm0gPSAobG9jLT5yZXNlcnZlZF8yICYgMHgwMDAwRkZGRikgLSAxOworICAgICAgICBpZihmcm0gPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICAgICAgX19pdHRfZnJhbWVfZW5kX3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dLCBOVUxMKTsKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbZnJtIGVuZF0gZ3RpZD0lZCwgaWR4PSV4LCBsb2M6JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jLT5yZXNlcnZlZF8yLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEJhcnJpZXJzIHJlcG9ydGluZy4KKworICAgIEEgYmFycmllciBjb25zaXN0cyBvZiB0d28gcGhhc2VzOgorCisgICAgICAgIDEuIEdhdGhlciAtLSBtYXN0ZXIgd2FpdHMgZm9yIGFycml2aW5nIG9mIGFsbCB0aGUgd29ya2VyIHRocmVhZHM7IGVhY2ggd29ya2VyIHRocmVhZAorICAgICAgICAgICByZWdpc3RlcnMgYXJyaXZhbCBhbmQgZ29lcyBmdXJ0aGVyLgorICAgICAgICAyLiBSZWxlYXNlIC0tIGVhY2ggd29ya2VyIHRocmVhZHMgd2FpdHMgdW50aWwgbWFzdGVyIGxldHMgaXQgZ287IG1hc3RlciBsZXRzIHdvcmtlciB0aHJlYWRzCisgICAgICAgICAgIGdvLgorCisgICAgRnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSBlYWNoIHRocmVhZDoKKworICAgICAgICAqIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCkgLS0gYmVmb3JlIGFycml2aW5nIHRvIHRoZSBnYXRoZXIgcGhhc2UuCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCkgICAtLSBiZXR3ZWVuIGdhdGhlciBhbmQgcmVsZWFzZSBwaGFzZXMuCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoKSAtLSBhZnRlciByZWxlYXNlIHBoYXNlLgorCisgICAgTm90ZTogQ2FsbCBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoKSBiZWZvcmUgY2FsbCB0byBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZygpIGFuZCBzYXZlCisgICAgcmVzdWx0IGluIGxvY2FsIHZhcmlhYmxlLiBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoKSwgYmVpbmcgY2FsbGVkIHRvbyBsYXRlIChlLiBnLiBhZnRlciBnYXRoZXIKKyAgICBwaGFzZSkgd291bGQgcmV0dXJuIGl0dCBzeW5jIG9iamVjdCBmb3IgdGhlIG5leHQgYmFycmllciEKKworICAgIElUVCBuZWVkIGFuIGFkZHJlc3MgKHZvaWQgKikgdG8gYmUgc3BlY2lmaWVkIGFzIGEgc3luYyBvYmplY3QuIE9wZW5NUCBSVEwgZG9lcyBub3QgaGF2ZQorICAgIGJhcnJpZXIgb2JqZWN0IG9yIGJhcnJpZXIgZGF0YSBzdHJ1Y3R1cmUuIEJhcnJpZXIgaXMganVzdCBhIGNvdW50ZXIgaW4gdGVhbSBhbmQgdGhyZWFkCisgICAgc3RydWN0dXJlcy4gV2UgY291bGQgdXNlIGFuIGFkZHJlc3Mgb2YgdGVhbSBzdHJ1Y3R1cmUgYXMgYW4gYmFycmllciBzeW5jIG9iamVjdCwgYnV0IElUVCB3YW50cworICAgIGRpZmZlcmVudCBvYmplY3RzIGZvciBkaWZmZXJlbnQgYmFycmllcnMgKGV2ZW4gd2hpdGhpbiB0aGUgc2FtZSB0ZWFtKS4gU28gbGV0IHVzIHVzZQorICAgIHRlYW0gYWRkcmVzcyBhcyBiYXJyaWVyIHN5bmMgb2JqZWN0IGZvciB0aGUgZmlyc3QgYmFycmllciwgdGhlbiBpbmNyZWFzZSBpdCBieSBvbmUgZm9yIHRoZSBuZXh0CisgICAgYmFycmllciwgYW5kIHNvIG9uIChidXQgd3JhcCBpdCBub3QgdG8gdXNlIGFkZHJlc3NlcyBvdXRzaWRlIG9mIHRlYW0gc3RydWN0dXJlKS4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZCAqCitfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoCisgICAgaW50ICBndGlkLAorICAgIGludCAgYnQsCisgICAgaW50ICBzZXRfbmFtZSwKKyAgICBpbnQgIGRlbHRhICAgIC8vIDAgKGN1cnJlbnQgYmFycmllcikgaXMgZGVmYXVsdCB2YWx1ZTsgc3BlY2lmeSAtMSB0byBnZXQgcHJldmlvdXMgYmFycmllci4KKykgeworICAgIHZvaWQgKiBvYmplY3QgPSBOVUxMOworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX2luZm9fdCAqICAgIHRociAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3RlYW1fdCAqICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisKKyAgICAvLyBOT1RFOgorICAgIC8vIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBfX2ttcF9mb3JrX2JhcnJpZXIsIHRlYW0gcG9pbnRlciBjYW4gYmUgTlVMTC4gVGhpcyAiaWYiCisgICAgLy8gaGVscHMgdG8gYXZvaWQgY3Jhc2guIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGNvbXBsZXRlIHNvbHV0aW9uLCBhbmQgcmVwb3J0aW5nIGZvcmsvam9pbgorICAgIC8vIGJhcnJpZXJzIHRvIElUVCBzaG91bGQgYmUgcmV2aXNpdGVkLgorCisgICAgaWYgKCB0ZWFtICE9IE5VTEwgKSB7CisKKyAgICAgICAgLy8gTWFzdGVyIHRocmVhZCBpbmNyZWFzZXMgYl9hcnJpdmVkIGJ5IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgZWFjaCB0aW1lLiBEaXZpZGUgYl9hcnJpdmVkCisgICAgICAgIC8vIGJ5IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgdG8gZ2V0IHBsYWluIGJhcnJpZXIgY291bnRlci4KKyAgICAgICAga21wX3VpbnQ2NCBjb3VudGVyID0gdGVhbS0+dC50X2JhclsgYnQgXS5iX2Fycml2ZWQgLyBLTVBfQkFSUklFUl9TVEFURV9CVU1QICsgZGVsdGE7CisgICAgICAgIC8vIE5vdyBmb3JtIHRoZSBiYXJyaWVyIGlkLiBFbmNvZGUgYmFycmllciB0eXBlIChidCkgaW4gYmFycmllciBpZCB0b28sIHNvIGJhcnJpZXJzIG9mCisgICAgICAgIC8vIGRpZmZlcmVudCB0eXBlcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBpZHMuCisgICAgICAgIEtNUF9CVUlMRF9BU1NFUlQoIHNpemVvZigga21wX3RlYW1fdCApID49IGJzX2xhc3RfYmFycmllciApOworICAgICAgICAgICAgLy8gVGhpcyBjb25kaXRvbiBpcyBhIG11c3QgKHdlIHdvdWxkIGhhdmUgemVybyBkaXZpZGUgb3RoZXJ3aXNlKS4KKyAgICAgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBrbXBfdGVhbV90ICkgPj0gMiAqIGJzX2xhc3RfYmFycmllciApOworICAgICAgICAgICAgLy8gTW9yZSBzdHJvbmcgY29uZGl0aW9uOiBtYWtlIHN1cmUgd2UgaGF2ZSByb29tIGF0IGxlYXN0IGZvciBmb3IgdHdvIGRpZmZlcnRlbnQgaWRzCisgICAgICAgICAgICAvLyAoZm9yIGVhY2ggYmFycmllciB0eXBlKS4KKyAgICAgICAgb2JqZWN0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IHZvaWQgKiA+KAorICAgICAgICAgICAgICAgIGttcF91aW50cHRyX3QoIHRlYW0gKQorICAgICAgICAgICAgICAgICAgICArIGNvdW50ZXIgJSAoIHNpemVvZigga21wX3RlYW1fdCApIC8gYnNfbGFzdF9iYXJyaWVyICkgKiBic19sYXN0X2JhcnJpZXIKKyAgICAgICAgICAgICAgICAgICAgKyBidAorICAgICAgICAgICAgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG9ial0gdHlwZT0lZCwgY291bnRlcj0lbGxkLCBvYmplY3Q9JXBcbiIsIGJ0LCBjb3VudGVyLCBvYmplY3QgKTsKKworICAgICAgICBpZiAoIHNldF9uYW1lICkgeworICAgICAgICAgICAgaWRlbnRfdCBjb25zdCAqIGxvYyAgPSBOVUxMOworICAgICAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyAgPSBOVUxMOworICAgICAgICAgICAgY2hhciBjb25zdCAqICAgIHR5cGUgPSAiT01QIEJhcnJpZXIiOworICAgICAgICAgICAgc3dpdGNoICggYnQgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBic19wbGFpbl9iYXJyaWVyIDogeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgcGxhaW4gYmFycmllciBjb21waWxlciBjYWxscyBfX2ttcGNfYmFycmllcigpIGZ1bmN0aW9uLCB3aGljaCBzYXZlcworICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbiBpbiB0aHItPnRoLnRoX2lkZW50LgorICAgICAgICAgICAgICAgICAgICBsb2MgPSB0aHItPnRoLnRoX2lkZW50OworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGJhcnJpZXIgdHlwZSBmcm9tIGZsYWdzIHByb3ZpZGVkIGJ5IGNvbXBpbGVyLgorICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgICBleHBsID0gMDsKKyAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAgaW1wbCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICggbG9jICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmMgID0gbG9jLT5wc291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwbCA9ICggbG9jLT5mbGFncyAmIEtNUF9JREVOVF9CQVJSSUVSX0VYUEwgKSAhPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW1wbCA9ICggbG9jLT5mbGFncyAmIEtNUF9JREVOVF9CQVJSSUVSX0lNUEwgKSAhPSAwOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICBpZiAoIGltcGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBsb2MtPmZsYWdzICYgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9NQVNLICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9GT1IgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIEZvciBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TRUNUSU9OUyA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgU2VjdGlvbnMgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0lOR0xFIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBTaW5nbGUgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfV09SS1NIQVJFIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBXb3Jrc2hhcmUgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBJbXBsaWNpdCBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICB9OyAvKiBzd2l0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggZXhwbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIEV4cGxpY2l0IEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICB9OyAvKiBpZiAqLworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBic19mb3Jram9pbl9iYXJyaWVyIDogeworICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGZvcmsvam9pbiBiYXJyaWVyIHdlIGNhbiByZWFkIHRoci0+dGgudGhfaWRlbnQsIGJlY2F1c2UgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbnMgbG9jYXRpb24gb2YgbGFzdCBwYXNzZWQgY29uc3RydWN0ICh3aGlsZSBqb2luIGJhcnJpZXIgaXMgbm90CisgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2ggb25lKS4gVXNlIHRoX2lkZW50IG9mIG1hc3RlciB0aHJlYWQgaW5zdGVhZCAtLSBfX2ttcF9qb2luX2NhbGwoKQorICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgc2F2ZXMgbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIEFDOiBjYW5ub3QgcmVhZCBmcm9tIG1hc3RlciBiZWNhdXNlIF9fa21wX2pvaW5fY2FsbCBtYXkgYmUgbm90IGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAvLyAgICB5ZXQsIHNvIHdlIHJlYWQgdGhlIGxvY2F0aW9uIGZyb20gdGVhbS4gVGhpcyBpcyB0aGUgc2FtZSBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgQW5kIHRlYW0gaXMgdmFsaWQgYXQgdGhlIGVudGVyIHRvIGpvaW4gYmFycmllciB3aGVyZSB0aGlzIGhhcHBlbnMuCisgICAgICAgICAgICAgICAgICAgIGxvYyAgPSB0ZWFtLT50LnRfaWRlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggbG9jICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmMgID0gbG9jLT5wc291cmNlOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBKb2luIEJhcnJpZXIiOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICAgICAgX19pdHRfc3luY19jcmVhdGUoIG9iamVjdCwgdHlwZSwgc3JjLCBfX2l0dF9hdHRyX2JhcnJpZXIgKTsKKyAgICAgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIHN0YV0gc2NyZSggJXAsIFwiJXNcIiwgXCIlc1wiLCBfX2l0dF9hdHRyX2JhcnJpZXIgKVxuIiwgb2JqZWN0LCB0eXBlLCBzcmMgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGlmCisjZW5kaWYKKyAgICByZXR1cm4gb2JqZWN0OworfSAvLyBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoICFLTVBfTUFTVEVSX0dUSUQoIGd0aWQgKSApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgc3RhXSBzcmVsKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfcHJlcGFyZSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgc3RhXSBzcHJlKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2l0dF9iYXJyaWVyX21pZGRsZSggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIEtNUF9NQVNURVJfR1RJRCggZ3RpZCApICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19hY3F1aXJlZCggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG1pZF0gc2FjcSggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIG1pZF0gc3JlbCggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgfSBlbHNlIHsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggS01QX01BU1RFUl9HVElEKCBndGlkICkgKSB7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBlbmRdIHNhY3EoICVwIClcbiIsIG9iamVjdCApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUYXNrd2FpdCByZXBvcnRpbmcuCisKKyAgICBJVFQgbmVlZCBhbiBhZGRyZXNzICh2b2lkICopIHRvIGJlIHNwZWNpZmllZCBhcyBhIHN5bmMgb2JqZWN0LiBPcGVuTVAgUlRMIGRvZXMgbm90IGhhdmUgdGFza3dhaXQKKyAgICBzdHJ1Y3R1cmUsIHNvIHdlIG5lZWQgdG8gY29uc3RydWN0IHNvbWV0aGluZy4KKworKi8KKwordm9pZCAqCitfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBpbnQgZ3RpZCApIHsKKyAgICB2b2lkICogb2JqZWN0ID0gTlVMTDsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfaW5mb190ICogICAgIHRocmVhZCAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgb2JqZWN0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IHZvaWQgKiA+KAorICAgICAgICAgICAgICAgIGttcF91aW50cHRyX3QoIHRhc2tkYXRhICkgKyB0YXNrZGF0YS0+dGRfdGFza3dhaXRfY291bnRlciAlIHNpemVvZigga21wX3Rhc2tkYXRhX3QgKQorICAgICAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCisgICAgcmV0dXJuIG9iamVjdDsKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdAorCit2b2lkCitfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoCisgICAgaW50ICAgICBndGlkLAorICAgIHZvaWQgKiAgb2JqZWN0CispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGttcF9pbmZvX3QgKiAgICAgdGhyZWFkICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgaWRlbnRfdCBjb25zdCAqICBsb2MgICAgICA9IHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudDsKKyAgICBjaGFyIGNvbnN0ICogICAgIHNyYyAgICAgID0gKCBsb2MgPT0gTlVMTD8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfY3JlYXRlKCBvYmplY3QsICJPTVAgVGFza3dhaXQiLCBzcmMsIDAgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3R3YSBzdGFdIHNjcmUoICVwLCBcIk9NUCBUYXNrd2FpdFwiLCBcIiVzXCIsIDAgKVxuIiwgb2JqZWN0LCBzcmMgKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIHN0YV0gc3ByZSggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nCisKK3ZvaWQKK19fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCgKKyAgICBpbnQgICAgIGd0aWQsCisgICAgdm9pZCAqICBvYmplY3QKKykgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19hY3F1aXJlZCggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0d2EgZW5kXSBzYWNxKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2Rlc3Ryb3koIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIGVuZF0gc2RlcyggJXAgKVxuIiwgb2JqZWN0ICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGFzayByZXBvcnRpbmcuCisKKyAgICBPbmx5IHRob3NlIHRhc2tzIGFyZSByZXBvcnRlZCB3aGljaCBhcmUgZXhlY3V0ZWQgYnkgYSB0aHJlYWQgc3Bpbm5pbmcgYXQgYmFycmllciAob3IgdGFza3dhaXQpLgorICAgIFN5bmNoIG9iamVjdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIG11c3QgYmUgYmFycmllciBvZiB0YXNrd2FpdCB0aGUgdGhyZWFkcyB3YWl0aW5nIGF0LgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoCisgICAgdm9pZCAqIG9iamVjdCAgICAgLy8gSVRUIHN5bmMgb2JqZWN0OiBiYXJyaWVyIG9yIHRhc2t3YWl0LgorKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIG9iamVjdCAhPSBOVUxMICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19jYW5jZWwoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3RzayBzdGFdIHNjYW4oICVwIClcbiIsIG9iamVjdCApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX2ttcF9pdHRfdGFza19maW5pc2hlZCgKKyAgICB2b2lkICogb2JqZWN0ICAgICAvLyBJVFQgc3luYyBvYmplY3Q6IGJhcnJpZXIgb3IgdGFza3dhaXQuCispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfcHJlcGFyZSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0c2sgZW5kXSBzcHJlKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza19maW5pc2hlZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTG9jayByZXBvcnRpbmcuCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyggbG9jayApIHNob3VsZCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlIGZpcnN0IGxvY2sgb3BlcmF0aW9uCisgICAgICAgICAgKHNldC91bnNldCkuIEl0IGlzIG5vdCBhIHJlYWwgZXZlbnQgc2hvd24gdG8gdGhlIHVzZXIgYnV0IGp1c3Qgc2V0dGluZyBhIG5hbWUgZm9yCisgICAgICAgICAgc3luY2hyb25pemF0aW9uIG9iamVjdC4gYGxvY2snIGlzIGFuIGFkZHJlc3Mgb2Ygc3luYyBvYmplY3QsIHRoZSBzYW1lIGFkZHJlc3Mgc2hvdWxkIGJlCisgICAgICAgICAgdXNlZCBpbiBhbGwgc3Vic2VxdWVudCBjYWxscy4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHNldHRpbmcgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc2V0dGluZyB0aGUgbG9jay4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX3JlYWxlYXNpbmcoKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB1bnNldHRpbmcgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRocmVhZCBjYW5jZWxsZWQgd2FpdGluZyBmb3IgdGhlIGxvY2suCisKKyAgICAgICAgKiBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoIGxvY2sgKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IGxvY2sgb3BlcmF0aW9uLiBBZnRlcgorICAgICAgICAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgpIGFsbCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBhZGRyZXNzIHdpbGwgYmUgY29uc2lkZXJlZAorICAgICAgICAgIGFzIGFub3RoZXIgc3luYyBvYmplY3QsIG5vdCByZWxhdGVkIHdpdGggdGhlIG9yaWdpbmFsIG9uZS4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisvLyBUYWtlcyBsb2NhdGlvbiBpbmZvcm1hdGlvbiBkaXJlY3RseQorX19rbXBfaW5saW5lCit2b2lkCitfX19rbXBfaXR0X2xvY2tfaW5pdCgga21wX3VzZXJfbG9ja19wIGxvY2ssIGNoYXIgY29uc3QgKnR5cGUsIGNvbnN0IGlkZW50X3QgKmxvYyApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBjaGFyIGNvbnN0ICogICAgc3JjID0gKCBsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfY3JlYXRlKCBsb2NrLCB0eXBlLCBzcmMsIDAgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltsY2sgaW5pXSBzY3JlKCAlcCwgXCIlc1wiLCBcIiVzXCIsIDAgKVxuIiwgbG9jaywgdHlwZSwgc3JjICk7CisgICAgfQorI2VuZGlmCit9CisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworLy8gSW50ZXJuYWwgZ3V0cyAtLSBjb21tb24gY29kZSBmb3IgbG9ja3MgYW5kIGNyaXRpY2FsIHNlY3Rpb25zLCBkbyBub3QgY2FsbCBkaXJlY3RseS4KK19fa21wX2lubGluZQordm9pZAorX19fa21wX2l0dF9sb2NrX2luaXQoIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjaGFyIGNvbnN0ICogdHlwZSApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBpZGVudF90IGNvbnN0ICogbG9jID0gTlVMTDsKKyAgICAgICAgaWYgKCBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyAhPSBOVUxMICkKKyAgICAgICAgICAgIGxvYyA9IF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fKCAobG9jaykgKTsKKyAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyA9ICggbG9jID09IE5VTEwgPyBOVUxMIDogbG9jLT5wc291cmNlICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX2NyZWF0ZSggbG9jaywgdHlwZSwgc3JjLCAwICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbbGNrIGluaV0gc2NyZSggJXAsIFwiJXNcIiwgXCIlc1wiLCAwIClcbiIsIGxvY2ssIHR5cGUsIHNyYyApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19fa21wX2l0dF9sb2NrX2luaXQKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLyBJbnRlcm5hbCBndXRzIC0tIGNvbW1vbiBjb2RlIGZvciBsb2NrcyBhbmQgY3JpdGljYWwgc2VjdGlvbnMsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LgorX19rbXBfaW5saW5lCit2b2lkCitfX19rbXBfaXR0X2xvY2tfZmluaSgga21wX3VzZXJfbG9ja19wIGxvY2ssIGNoYXIgY29uc3QgKiB0eXBlICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19kZXN0cm95KCBsb2NrICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltsY2sgZHN0XSBzZGVzKCAlcCApXG4iLCBsb2NrICk7CisjZW5kaWYKK30gLy8gX19fa21wX2l0dF9sb2NrX2ZpbmkKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSwordm9pZAorX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjb25zdCBpZGVudF90ICpsb2MgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2luaXQoIGxvY2ssICJPTVAgTG9jayIsIGxvYyApOworfQorI2Vsc2UKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX19rbXBfaXR0X2xvY2tfaW5pdCggbG9jaywgIk9NUCBMb2NrIiApOworfSAvLyBfX2ttcF9pdHRfbG9ja19jcmVhdGluZworI2VuZGlmCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAvLyBwb3N0cG9uZSBsb2NrIG9iamVjdCBhY2Nlc3MKKyAgICBpZiAoIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgKSB7CisgICAgICAgIGlmICggS01QX0VYVFJBQ1RfRF9UQUcobG9jaykgPT0gMCApIHsKKyAgICAgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgICAgICAgX19pdHRfc3luY19wcmVwYXJlKCBpbGstPmxvY2sgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcHJlcGFyZSggbG9jayApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIGxvY2sgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcKKwordm9pZAorX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gcG9zdHBvbmUgbG9jayBvYmplY3QgYWNjZXNzCisgICAgaWYgKCBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciApIHsKKyAgICAgICAgaWYgKCBLTVBfRVhUUkFDVF9EX1RBRyhsb2NrKSA9PSAwICkgeworICAgICAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBpbGstPmxvY2sgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIGxvY2sgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgX19pdHRfc3luY19hY3F1aXJlZCggbG9jayApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX3JlbGVhc2luZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfcmVsZWFzaW5nX3B0ciApIHsKKyAgICAgICAgaWYgKCBLTVBfRVhUUkFDVF9EX1RBRyhsb2NrKSA9PSAwICkgeworICAgICAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggaWxrLT5sb2NrICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggbG9jayApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBfX2l0dF9zeW5jX3JlbGVhc2luZyggbG9jayApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZworCit2b2lkCitfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgKSB7CisgICAgICAgIGlmICggS01QX0VYVFJBQ1RfRF9UQUcobG9jaykgPT0gMCApIHsKKyAgICAgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgICAgICAgX19pdHRfc3luY19jYW5jZWwoIGlsay0+bG9jayApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19pdHRfc3luY19jYW5jZWwoIGxvY2sgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgX19pdHRfc3luY19jYW5jZWwoIGxvY2sgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQKKwordm9pZAorX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX19rbXBfaXR0X2xvY2tfZmluaSggbG9jaywgIk9NUCBMb2NrIiApOworfSAvLyBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDcml0aWNhbCByZXBvcnRpbmcuCisKKyAgICBDcml0aWNhbCBzZWN0aW9ucyBhcmUgdHJlYXRlZCBleGFjdGx5IGFzIGxvY2tzIChidXQgaGF2ZSBkaWZmZXJlbnQgb2JqZWN0IHR5cGUpLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY29uc3QgaWRlbnRfdCAqbG9jICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIENyaXRpY2FsIiwgbG9jKTsKK30KKyNlbHNlCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIENyaXRpY2FsIiApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcKKyNlbmRpZgorCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZworCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkCisKK3ZvaWQKK19fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBsb2NrICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcKKwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2ZpbmkoIGxvY2ssICJPTVAgQ3JpdGljYWwiICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTaW5nbGUgcmVwb3J0aW5nLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X3NpbmdsZV9zdGFydCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X21hcmtfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICBrbXBfaW5mb190ICogICB0aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCAoZ3RpZCkgKTsKKyAgICAgICAgaWRlbnRfdCAqICAgICAgbG9jID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgY2hhciBjb25zdCAqICAgc3JjID0gKCBsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICAgICAga21wX3N0cl9idWZfdCAgbmFtZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBuYW1lLCAiT01QIFNpbmdsZS0lcyIsIHNyYyApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgPSBfX2l0dF9tYXJrX2NyZWF0ZSggbmFtZS5zdHIgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzaW4gc3RhXSBtY3JlKCBcIiVzXCIpIC0+ICVkXG4iLCBuYW1lLnN0ciwgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIG5hbWUgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X21hcmsoIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlLCBOVUxMICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc2luIHN0YV0gbWFyayggJWQsIE5VTEwgKVxuIiwgdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9zaW5nbGVfc3RhcnQKKwordm9pZAorX19rbXBfaXR0X3NpbmdsZV9lbmQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19pdHRfbWFya190eXBlICBtYXJrID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLT50aC50aF9pdHRfbWFya19zaW5nbGU7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfbWFya19vZmYoIG1hcmsgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3NpbiBlbmRdIG1vZmYoICVkIClcbiIsIG1hcmsgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc2luZ2xlX2VuZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE9yZGVyZWQgcmVwb3J0aW5nLgorCisgICAgX19rbXBfaXR0X29yZGVyZWRfaW5pdCBpcyBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgKmJlZm9yZSogZmlyc3QgdXNpbmcgc3luYworICAgIG9iamVjdC4gSVRUIHRlYW0gd291bGQgbGlrZSBpdCB0byBiZSBjYWxsZWQgb25jZSwgYnV0IGl0IHJlcXVpcmVzIGV4dHJhIHN5bmNocm9uaXphdGlvbi4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAgaXMgY2FsbGVkIHdoZW4gdGhyZWFkIGlzIGdvaW5nIHRvIGVudGVyIG9yZGVyZWQgc2VjdGlvbgorICAgIChiZWZvcmUgc3luY2hyb25pemF0aW9uKS4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0IGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBlbnRlcmluZyB1c2VyIGNvZGUgKGFmdGVyCisgICAgc3luY2hyb25pemF0aW9uKS4KKworICAgIF9fa21wX2l0dF9vcmRlcmVkX2VuZCBpcyBjYWxsZWQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdXNlciBjb2RlLgorCisgICAgU3luYyBvYmplY3QgaXMgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50LgorCisgICAgRXZlbnRzIGFyZSBub3QgZ2VuZXJhdGVkIGluIGNhc2Ugb2Ygc2VyaWFsaXplZCB0ZWFtLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfaW5pdCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciApIHsKKyAgICAgICAga21wX2luZm9fdCAqICAgdGhyICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlkZW50X3QgY29uc3QgKiBsb2MgID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgY2hhciBjb25zdCAqICAgIHNyYyAgPSAoIGxvYyA9PSBOVUxMID8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgICAgICBfX2l0dF9zeW5jX2NyZWF0ZSgKKyAgICAgICAgICAgIHRoci0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQsICJPTVAgT3JkZXJlZCIsIHNyYywgMAorICAgICAgICApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfaW5pdAorCit2b2lkCitfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcHJlcGFyZSggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwCisKK3ZvaWQKK19fa21wX2l0dF9vcmRlcmVkX3N0YXJ0KCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfc3RhcnQKKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfZW5kKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfdGVhbV90ICogdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGlmICggISB0LT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9vcmRlcmVkX2VuZAorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGhyZWFkcyByZXBvcnRpbmcuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpIHsKKyAgICBfX2l0dF90aHJfaWdub3JlKCk7Cit9IC8vIF9fa21wX2l0dF90aHJlYWRfaWdub3JlCisKK3ZvaWQKK19fa21wX2l0dF90aHJlYWRfbmFtZSggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgKSB7CisgICAgICAgIGttcF9zdHJfYnVmX3QgbmFtZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIG5hbWUgKTsKKyAgICAgICAgaWYoIEtNUF9NQVNURVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgbmFtZSwgIk9NUCBNYXN0ZXIgVGhyZWFkICMlZCIsIGd0aWQgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgbmFtZSwgIk9NUCBXb3JrZXIgVGhyZWFkICMlZCIsIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfdGhyX25hbWVfc2V0KCBuYW1lLnN0ciwgbmFtZS51c2VkICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdGhyIG5hbV0gbmFtZSggXCIlc1wiKVxuIiwgbmFtZS5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIG5hbWUgKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF90aHJlYWRfbmFtZQorCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTeXN0ZW0gb2JqZWN0IHJlcG9ydGluZy4KKworICAgIElUVCBjYXRjaGVzIG9wZXJhdGlvbnMgd2l0aCBzeXN0ZW0gc3luYyBvYmplY3RzIChsaWtlIFdpbmRvd3MqIE9TIG9uIElBLTMyCisgICAgYXJjaGl0ZWN0dXJlIEFQSSBjcml0aWNhbCBzZWN0aW9ucyBhbmQgZXZlbnRzKS4gV2Ugb25seSBuZWVkIHRvIHNwZWNpZnkKKyAgICBuYW1lICgiT01QIFNjaGVkdWxlciIpIGZvciB0aGUgb2JqZWN0IHRvIGxldCBJVFQga25vdyBpdCBpcyBhbiBvYmplY3QgdXNlZAorICAgIGJ5IE9wZW5NUCBSVEwgZm9yIGludGVybmFsIHB1cnBvc2VzLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCB2b2lkICogb2JqZWN0LCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfY3JlYXRlKCBvYmplY3QsICJPTVAgU2NoZWR1bGVyIiwgbmFtZSwgMCApOworICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzeXMgb2JqXSBzY3JlKCAlcCwgXCJPTVAgU2NoZWR1bGVyXCIsIFwiJXNcIiwgMCApXG4iLCBvYmplY3QsIG5hbWUgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTdGFjayBzdGl0Y2hpbmcgYXBpLgorCisgICAgTWFzdGVyIGNhbGxzICJjcmVhdGUiIGFuZCBwdXQgdGhlIHN0aXRjaGluZyBpZCBpbnRvIHRlYW0gc3RydWN0dXJlLgorICAgIFdvcmtlcnMgcmVhZCB0aGUgc3RpdGNoaW5nIGlkIGFuZCBjYWxsICJlbnRlciIgLyAibGVhdmUiIGFwaS4KKyAgICBNYXN0ZXIgY2FsbHMgImRlc3Ryb3kiIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK19faXR0X2NhbGxlcgorX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKQoreworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCAhX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9jYWxsZXIgaWQgPSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgY3JlXSAlcFxuIiwgaWQgKTsKKyAgICByZXR1cm4gaWQ7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KCBfX2l0dF9jYWxsZXIgaWQgKQoreworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveV9wdHIgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveSggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgZGVzXSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9lbnRlciggX19pdHRfY2FsbGVyIGlkICkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlciggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgZW50XSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSggX19pdHRfY2FsbGVyIGlkICkKK3sKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlX3B0ciApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZSggaWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzdGsgbGVhXSAlcFxuIiwgaWQgKTsKKyAgICB9CisjZW5kaWYKK30KKworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfbG9jay5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX2xvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTdkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2xvY2suY3BwCkBAIC0wLDAgKzEsNDI5MyBAQAorLyoKKyAqIGttcF9sb2NrLmNwcCAtLSBsb2NrLXJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisjaW5jbHVkZSAidHNhbl9hbm5vdGF0aW9ucy5oIgorCisjaWYgS01QX1VTRV9GVVRFWAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKy8vIFdlIHNob3VsZCByZWFsbHkgaW5jbHVkZSA8ZnV0ZXguaD4sIGJ1dCB0aGF0IGNhdXNlcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIG9uIGRpZmZlcmVudAorLy8gTGludXgqIE9TIGRpc3RyaWJ1dGlvbnMgdGhhdCBlaXRoZXIgcmVxdWlyZSB0aGF0IHlvdSBpbmNsdWRlIChvciBicmVhayB3aGVuIHlvdSB0cnkgdG8gaW5jbHVkZSkKKy8vIDxwY2kvdHlwZXMuaD4uCisvLyBTaW5jZSBhbGwgd2UgbmVlZCBpcyB0aGUgdHdvIG1hY3JvcyBiZWxvdyAod2hpY2ggYXJlIHBhcnQgb2YgdGhlIGtlcm5lbCBBQkksIHNvIGNhbid0IGNoYW5nZSkKKy8vIHdlIGp1c3QgZGVmaW5lIHRoZSBjb25zdGFudHMgaGVyZSBhbmQgZG9uJ3QgaW5jbHVkZSA8ZnV0ZXguaD4KKyMgaWZuZGVmIEZVVEVYX1dBSVQKKyMgIGRlZmluZSBGVVRFWF9XQUlUICAgIDAKKyMgZW5kaWYKKyMgaWZuZGVmIEZVVEVYX1dBS0UKKyMgIGRlZmluZSBGVVRFWF9XQUtFICAgIDEKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBJbXBsZW1lbnQgc3BpbiBsb2NrcyBmb3IgaW50ZXJuYWwgbGlicmFyeSB1c2UuICAgICAgICAgICAgICovCisvKiBUaGUgYWxnb3JpdGhtIGltcGxlbWVudGVkIGlzIExhbXBvcnQncyBiYWtlcnkgbG9jayBbMTk3NF0uICovCisKK3ZvaWQKK19fa21wX3ZhbGlkYXRlX2xvY2tzKCB2b2lkICkKK3sKKyAgICBpbnQgaTsKKyAgICBrbXBfdWludDMyICB4LCB5OworCisgICAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHVuc2lnbmVkIGFyaXRobWV0aWMgZG9lcyB3cmFwcyBwcm9wZXJseSAqLworICAgIHggPSB+KChrbXBfdWludDMyKSAwKSAtIDI7CisgICAgeSA9IHggLSAyOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSwgKyt4LCArK3kpIHsKKyAgICAgICAga21wX3VpbnQzMiB6ID0gKHggLSB5KTsKKyAgICAgICAgS01QX0FTU0VSVCggeiA9PSAyICk7CisgICAgfQorCisgICAgS01QX0FTU0VSVCggb2Zmc2V0b2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9jaywgdGFpbF9pZCApICUgOCA9PSAwICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0ZXN0IGFuZCBzZXQgbG9ja3MgKi8KKworLy8KKy8vIEZvciB0aGUgbm9uLW5lc3RlZCBsb2Nrcywgd2UgY2FuIG9ubHkgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IDQgYnl0ZXMgd2VyZQorLy8gYWxsb2NhdGVkLCBzaW5jZSBnY2Mgb25seSBhbGxvY2F0ZXMgNCBieXRlcyBmb3Igb21wX2xvY2tfdCwgYW5kIHRoZSBJbnRlbAorLy8gY29tcGlsZXIgb25seSBhbGxvY2F0ZXMgYSA0IGJ5dGUgcG9pbnRlciBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuICBPbgorLy8gV2luZG93cyogT1Mgb24gSW50ZWwoUikgNjQsIHdlIGNhbiBhc3N1bWUgdGhhdCBhbGwgOCBieXRlcyB3ZXJlIGFsbG9jYXRlZC4KKy8vCisvLyBnY2MgcmVzZXJ2ZXMgPj0gOCBieXRlcyBmb3IgbmVzdGVkIGxvY2tzLCBzbyB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlCisvLyBlbnRpcmUgOCBieXRlcyB3ZXJlIGFsbG9jYXRlZCBmb3IgbmVzdGVkIGxvY2tzIG9uIGFsbCA2NC1iaXQgcGxhdGZvcm1zLgorLy8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gS01QX0xPQ0tfU1RSSVAoVENSXzQoIGxjay0+bGsucG9sbCApKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworX19mb3JjZWlubGluZSBzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX01CKCk7CisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgICAga21wX3VpbnQzMiBjdXJyID0gS01QX0xPQ0tfU1RSSVAoIFRDUl80KCBsY2stPmxrLnBvbGwgKSApOworICAgIGlmICggKCBjdXJyICE9IDAgKSAmJiAoIGN1cnIgIT0gZ3RpZCArIDEgKSApCisgICAgICAgIF9fa21wX3ByaW50ZiggIkxPQ0sgQ09OVEVOVElPTjogJXBcbiIsIGxjayApOworICAgIC8qIGVsc2UgX19rbXBfcHJpbnRmKCAiLiIgKTsqLworI2VuZGlmIC8qIFVTRV9MT0NLX1BST0ZJTEUgKi8KKworICAgIGlmICggKCBsY2stPmxrLnBvbGwgPT0gS01QX0xPQ0tfRlJFRSh0YXMpICkKKyAgICAgICYmIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJiAoIGxjay0+bGsucG9sbCApLCBLTVBfTE9DS19GUkVFKHRhcyksIEtNUF9MT0NLX0JVU1koZ3RpZCsxLCB0YXMpICkgKSB7CisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgICAgfQorCisgICAga21wX3VpbnQzMiBzcGluczsKKyAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7CisgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7CisgICAgaWYgKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoIF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDoKKyAgICAgIF9fa21wX3hwcm9jICkgKSB7CisgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7CisgICAgfQorCisgICAga21wX2JhY2tvZmZfdCBiYWNrb2ZmID0gX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtczsKKyAgICB3aGlsZSAoICggbGNrLT5say5wb2xsICE9IEtNUF9MT0NLX0ZSRUUodGFzKSApIHx8CisgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmICggbGNrLT5say5wb2xsICksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykgKSApICkgeworCisgICAgICAgIF9fa21wX3NwaW5fYmFja29mZigmYmFja29mZik7CisgICAgICAgIGlmICggVENSXzQoIF9fa21wX250aCApID4gKCBfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6CisgICAgICAgICAgX19rbXBfeHByb2MgKSApIHsKKyAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfYWNxdWlyZV90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICBpbnQgcmV0dmFsID0gX19rbXBfYWNxdWlyZV90YXNfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgIEFOTk9UQVRFX1RBU19BQ1FVSVJFRChsY2spOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgJiYgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoICggbGNrLT5say5wb2xsID09IEtNUF9MT0NLX0ZSRUUodGFzKSApCisgICAgICAmJiBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgdGFzKSApICkgeworICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgICBBTk5PVEFURV9UQVNfUkVMRUFTRUQobGNrKTsKKyAgICBLTVBfU1RfUkVMMzIoICYobGNrLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLTVBfWUlFTEQoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIFRDV180KCBsY2stPmxrLnBvbGwsIEtNUF9MT0NLX0ZSRUUodGFzKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGFzX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLnBvbGwgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfdGFzX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgdGVzdCBhbmQgc2V0IGxvY2tzCisvLworCitpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgQU5OT1RBVEVfVEFTX0FDUVVJUkVEKGxjayk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfdGFzX2xvY2soIGxjaywgZ3RpZCApICkgeworICAgICAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgIGlmICggISBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfdGFzX2xvY2soIGxjaywgZ3RpZCApOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7CisgICAgfQorICAgIHJldHVybiBLTVBfTE9DS19TVElMTF9IRUxEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCAhIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfbmVzdGVkX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3Rhc19sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfdGFzX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgIGlmICggISBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jayggbGNrICk7Cit9CisKKworI2lmIEtNUF9VU0VfRlVURVgKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBmdXRleCBsb2NrcyAqLworCisvLyBmdXRleCBsb2NrcyBhcmUgcmVhbGx5IGp1c3QgdGVzdCBhbmQgc2V0IGxvY2tzLCB3aXRoIGEgZGlmZmVyZW50IG1ldGhvZAorLy8gb2YgaGFuZGxpbmcgY29udGVudGlvbi4gIFRoZXkgdGFrZSB0aGUgc2FtZSBhbW91bnQgb2Ygc3BhY2UgYXMgdGVzdCBhbmQKKy8vIHNldCBsb2NrcywgYW5kIGFyZSBhbGxvY2F0ZWQgdGhlIHNhbWUgd2F5IChpLmUuIHVzZSB0aGUgYXJlYSBhbGxvY2F0ZWQgYnkKKy8vIHRoZSBjb21waWxlciBmb3Igbm9uLW5lc3RlZCBsb2NrcyAvIGFsbG9jYXRlIG5lc3RlZCBsb2NrcyBvbiB0aGUgaGVhcCkuCisKK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBLTVBfTE9DS19TVFJJUCgoIFRDUl80KCBsY2stPmxrLnBvbGwgKSA+PiAxICkpIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworX19mb3JjZWlubGluZSBzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF9pbnQzMiBndGlkX2NvZGUgPSAoIGd0aWQgKyAxICkgPDwgMTsKKworICAgIEtNUF9NQigpOworCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICAgIGttcF91aW50MzIgY3VyciA9IEtNUF9MT0NLX1NUUklQKCBUQ1JfNCggbGNrLT5say5wb2xsICkgKTsKKyAgICBpZiAoICggY3VyciAhPSAwICkgJiYgKCBjdXJyICE9IGd0aWRfY29kZSApICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrICk7CisgICAgLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgICAgS01QX0ZTWU5DX1BSRVBBUkUoIGxjayApOworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGVudGVyaW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworCisgICAga21wX2ludDMyIHBvbGxfdmFsOworCisgICAgd2hpbGUgKCAoIHBvbGxfdmFsID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCAmICggbGNrLT5say5wb2xsICksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpLAorICAgICAgICAgICAgIEtNUF9MT0NLX0JVU1koZ3RpZF9jb2RlLCBmdXRleCkgKSApICE9IEtNUF9MT0NLX0ZSRUUoZnV0ZXgpICkgeworCisgICAgICAgIGttcF9pbnQzMiBjb25kID0gS01QX0xPQ0tfU1RSSVAocG9sbF92YWwpICYgMTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgcG9sbF92YWwgPSAweCV4IGNvbmQgPSAweCV4XG4iLAorICAgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsLCBjb25kICkgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBOT1RFOiBpZiB5b3UgdHJ5IHRvIHVzZSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBmb3IgdGhpcyBicmFuY2gKKyAgICAgICAgLy8KKyAgICAgICAgLy8gaWYgKCBwb2xsX3ZhbCAmIDEgPT0gMCApCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZW4gdGhlIDEyLjAgY29tcGlsZXIgaGFzIGEgYnVnIHdoZXJlIHRoZSBmb2xsb3dpbmcgYmxvY2sgd2lsbAorICAgICAgICAvLyBhbHdheXMgYmUgc2tpcHBlZCwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIExTQiBvZiBwb2xsX3ZhbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIGNvbmQgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVHJ5IHRvIHNldCB0aGUgbHNiIGluIHRoZSBwb2xsIHRvIGluZGljYXRlIHRvIHRoZSBvd25lcgorICAgICAgICAgICAgLy8gdGhyZWFkIHRoYXQgdGhleSBuZWVkIHRvIHdha2UgdGhpcyB0aHJlYWQgdXAuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiggJiAoIGxjay0+bGsucG9sbCApLCBwb2xsX3ZhbCwgcG9sbF92YWwgfCBLTVBfTE9DS19CVVNZKDEsIGZ1dGV4KSApICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGNhbid0IHNldCBiaXQgMFxuIiwKKyAgICAgICAgICAgICAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvbGxfdmFsIHw9IEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpOworCisgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBiaXQgMCBzZXRcbiIsCisgICAgICAgICAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGJlZm9yZSBmdXRleF93YWl0KDB4JXgpXG4iLAorICAgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsICkgKTsKKworICAgICAgICBrbXBfaW50MzIgcmM7CisgICAgICAgIGlmICggKCByYyA9IHN5c2NhbGwoIF9fTlJfZnV0ZXgsICYgKCBsY2stPmxrLnBvbGwgKSwgRlVURVhfV0FJVCwKKyAgICAgICAgICBwb2xsX3ZhbCwgTlVMTCwgTlVMTCwgMCApICkgIT0gMCApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGZ1dGV4X3dhaXQoMHgleCkgZmFpbGVkIChyYz0lZCBlcnJubz0lZClcbiIsCisgICAgICAgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsLCByYywgZXJybm8gKSApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBhZnRlciBmdXRleF93YWl0KDB4JXgpXG4iLAorICAgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsICkgKTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyB0aHJlYWQgaGFzIG5vdyBkb25lIGEgc3VjY2Vzc2Z1bCBmdXRleCB3YWl0IGNhbGwgYW5kIHdhcworICAgICAgICAvLyBlbnRlcmVkIG9uIHRoZSBPUyBmdXRleCBxdWV1ZS4gIFdlIG11c3Qgbm93IHBlcmZvcm0gYSBmdXRleAorICAgICAgICAvLyB3YWtlIGNhbGwgd2hlbiByZWxlYXNpbmcgdGhlIGxvY2ssIGFzIHdlIGhhdmUgbm8gaWRlYSBob3cgbWFueQorICAgICAgICAvLyBvdGhlciB0aHJlYWRzIGFyZSBpbiB0aGUgcXVldWUuCisgICAgICAgIC8vCisgICAgICAgIGd0aWRfY29kZSB8PSAxOworICAgIH0KKworICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7CisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZXhpdGluZ1xuIiwKKyAgICAgIGxjaywgbGNrLT5say5wb2xsLCBndGlkICkgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgaW50IHJldHZhbCA9IF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgIEFOTk9UQVRFX0ZVVEVYX0FDUVVJUkVEKGxjayk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJiAoIGxjay0+bGsucG9sbCApLCBLTVBfTE9DS19GUkVFKGZ1dGV4KSwgS01QX0xPQ0tfQlVTWSgoZ3RpZCsxKSA8PCAxLCBmdXRleCkgKSApIHsKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGVudGVyaW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhsY2spOworICAgIEFOTk9UQVRFX0ZVVEVYX1JFTEVBU0VEKGxjayk7CisKKyAgICBrbXBfaW50MzIgcG9sbF92YWwgPSBLTVBfWENIR19GSVhFRDMyKCAmICggbGNrLT5say5wb2xsICksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpICk7CisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCByZWxlYXNlZCBwb2xsX3ZhbCA9IDB4JXhcbiIsCisgICAgICAgbGNrLCBndGlkLCBwb2xsX3ZhbCApICk7CisKKyAgICBpZiAoIEtNUF9MT0NLX1NUUklQKHBvbGxfdmFsKSAmIDEgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGZ1dGV4X3dha2UgMSB0aHJlYWRcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCApICk7CisgICAgICAgIHN5c2NhbGwoIF9fTlJfZnV0ZXgsICYgKCBsY2stPmxrLnBvbGwgKSwgRlVURVhfV0FLRSwgS01QX0xPQ0tfQlVTWSgxLCBmdXRleCksIE5VTEwsIE5VTEwsIDAgKTsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGV4aXRpbmdcbiIsCisgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCApICk7CisKKyAgICBLTVBfWUlFTEQoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqIGxjayApCit7CisgICAgVENXXzQoIGxjay0+bGsucG9sbCwgS01QX0xPQ0tfRlJFRShmdXRleCkgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9mdXRleF9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsucG9sbCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF9mdXRleF9sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgJiYgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIG5lc3RlZCBmdXRleCBsb2NrcworLy8KKworaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgQU5OT1RBVEVfRlVURVhfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgICAgfQorfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfYWNxdWlyZV9uZXN0ZWRfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHZhbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgcmV0dmFsID0gKytsY2stPmxrLmRlcHRoX2xvY2tlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoICFfX2ttcF90ZXN0X2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApICkgeworICAgICAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX1NUSUxMX0hFTEQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCAhIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2Z1dGV4X2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfbmVzdGVkX2Z1dGV4X2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgIGlmICggISBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfZnV0ZXhfbG9jayggbGNrICk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0aWNrZXQgKGJha2VyeSkgbG9ja3MgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsub3duZXJfaWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCAmbGNrLT5say5kZXB0aF9sb2NrZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSAhPSAtMTsKK30KKworc3RhdGljIGttcF91aW50MzIKK19fa21wX2Jha2VyeV9jaGVjayggdm9pZCAqbm93X3NlcnZpbmcsIGttcF91aW50MzIgbXlfdGlja2V0ICkKK3sKKyAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggKHN0ZDo6YXRvbWljPHVuc2lnbmVkPiAqKW5vd19zZXJ2aW5nLCBzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlICkgPT0gbXlfdGlja2V0OworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfdGlja2V0X2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDMyIG15X3RpY2tldCA9IHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCggJmxjay0+bGsubmV4dF90aWNrZXQsIDFVLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7CisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgICAgaWYgKCBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCAmbGNrLT5say5ub3dfc2VydmluZywgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApICE9IG15X3RpY2tldCApCisgICAgICAgIF9fa21wX3ByaW50ZiggIkxPQ0sgQ09OVEVOVElPTjogJXBcbiIsIGxjayApOworICAgIC8qIGVsc2UgX19rbXBfcHJpbnRmKCAiLiIgKTsqLworI2VuZGlmIC8qIFVTRV9MT0NLX1BST0ZJTEUgKi8KKworICAgIGlmICggc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsubm93X3NlcnZpbmcsIHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUgKSA9PSBteV90aWNrZXQgKSB7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICB9CisgICAgS01QX1dBSVRfWUlFTERfUFRSKCAmbGNrLT5say5ub3dfc2VydmluZywgbXlfdGlja2V0LCBfX2ttcF9iYWtlcnlfY2hlY2ssIGxjayApOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgIGludCByZXR2YWwgPSBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgQU5OT1RBVEVfVElDS0VUX0FDUVVJUkVEKGxjayk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworCisgICAgaWYgKCAhIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoICZsY2stPmxrLmluaXRpYWxpemVkLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIGxjay0+bGsuc2VsZiAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsub3duZXJfaWQsIGd0aWQgKyAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworfQorCitpbnQKK19fa21wX3Rlc3RfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDMyIG15X3RpY2tldCA9IHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoICZsY2stPmxrLm5leHRfdGlja2V0LCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7CisKKyAgICBpZiAoIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoICZsY2stPmxrLm5vd19zZXJ2aW5nLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICkgPT0gbXlfdGlja2V0ICkgeworICAgICAgICBrbXBfdWludDMyIG5leHRfdGlja2V0ID0gbXlfdGlja2V0ICsgMTsKKyAgICAgICAgaWYgKCBzdGQ6OmF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdCggJmxjay0+bGsubmV4dF90aWNrZXQsCisgICAgICAgICAgICAgJm15X3RpY2tldCwgbmV4dF90aWNrZXQsIHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUsIHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUgKSkgeworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisKKyAgICBpZiAoICEgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggbGNrLT5say5zZWxmICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGlmICggcmV0dmFsICkgeworICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsub3duZXJfaWQsIGd0aWQgKyAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK2ludAorX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgZGlzdGFuY2UgPSBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCAmbGNrLT5say5uZXh0X3RpY2tldCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApIC0gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsubm93X3NlcnZpbmcsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKworICAgIEFOTk9UQVRFX1RJQ0tFVF9SRUxFQVNFRChsY2spOworICAgIHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCggJmxjay0+bGsubm93X3NlcnZpbmcsIDFVLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlICk7CisKKyAgICBLTVBfWUlFTEQoIGRpc3RhbmNlCisgICAgICA+IChrbXBfdWludDMyKSAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisKKyAgICBpZiAoICEgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggbGNrLT5say5zZWxmICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA+PSAwICkKKyAgICAgICYmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsub3duZXJfaWQsIDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICogbGNrICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gTlVMTDsKKyAgICBsY2stPmxrLnNlbGYgPSBsY2s7CisgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLm5leHRfdGlja2V0LCAwVSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5ub3dfc2VydmluZywgMFUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsub3duZXJfaWQsIDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsgLy8gbm8gdGhyZWFkIG93bnMgdGhlIGxvY2suCisgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLmRlcHRoX2xvY2tlZCwgLTEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsgLy8gLTEgPT4gbm90IGEgbmVzdGVkIGxvY2suCisgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLmluaXRpYWxpemVkLCB0cnVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5pbml0aWFsaXplZCwgZmFsc2UsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UgKTsKKyAgICBsY2stPmxrLnNlbGYgPSBOVUxMOworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5uZXh0X3RpY2tldCwgMFUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsubm93X3NlcnZpbmcsIDBVLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7CisgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLm93bmVyX2lkLCAwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7CisgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLmRlcHRoX2xvY2tlZCwgLTEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworCisgICAgaWYgKCAhIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoICZsY2stPmxrLmluaXRpYWxpemVkLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIGxjay0+bGsuc2VsZiAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgdGlja2V0IGxvY2tzCisvLworCitpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgc3RkOjphdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KCAmbGNrLT5say5kZXB0aF9sb2NrZWQsIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgQU5OT1RBVEVfVElDS0VUX0FDUVVJUkVEKGxjayk7CisgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5kZXB0aF9sb2NrZWQsIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLm93bmVyX2lkLCBndGlkICsgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgICAgfQorfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKworICAgIGlmICggISBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCAmbGNrLT5say5pbml0aWFsaXplZCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBsY2stPmxrLnNlbGYgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSBzdGQ6OmF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoICZsY2stPmxrLmRlcHRoX2xvY2tlZCwgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApICsgMTsKKyAgICB9CisgICAgZWxzZSBpZiAoICFfX2ttcF90ZXN0X3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5kZXB0aF9sb2NrZWQsIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLm93bmVyX2lkLCBndGlkICsgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworICAgICAgICByZXR2YWwgPSAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisKKyAgICBpZiAoICEgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggbGNrLT5say5zZWxmICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggKCBzdGQ6OmF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoICZsY2stPmxrLmRlcHRoX2xvY2tlZCwgLTEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSAtIDEgKSA9PSAwICkgeworICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsub3duZXJfaWQsIDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICAgICAgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayggbGNrLCBndGlkICk7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX1NUSUxMX0hFTEQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisKKyAgICBpZiAoICEgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggbGNrLT5say5zZWxmICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF90aWNrZXRfbG9jayggbGNrICk7CisgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLmRlcHRoX2xvY2tlZCwgMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2NrcworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBsY2sgKTsKKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsuZGVwdGhfbG9ja2VkLCAwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKworICAgIGlmICggISBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCAmbGNrLT5say5pbml0aWFsaXplZCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBsY2stPmxrLnNlbGYgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gYWNjZXNzIGZ1bmN0aW9ucyB0byBmaWVsZHMgd2hpY2ggZG9uJ3QgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKworc3RhdGljIGludAorX19rbXBfaXNfdGlja2V0X2xvY2tfaW5pdGlhbGl6ZWQoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCAmbGNrLT5say5pbml0aWFsaXplZCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApICYmICggbGNrLT5say5zZWxmID09IGxjayk7Cit9CisKK3N0YXRpYyBjb25zdCBpZGVudF90ICoKK19fa21wX2dldF90aWNrZXRfbG9ja19sb2NhdGlvbigga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsubG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfdGlja2V0X2xvY2tfbG9jYXRpb24oIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApCit7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IGxvYzsKK30KKworc3RhdGljIGttcF9sb2NrX2ZsYWdzX3QKK19fa21wX2dldF90aWNrZXRfbG9ja19mbGFncygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfdGlja2V0X2xvY2tfZmxhZ3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBxdWV1aW5nIGxvY2tzICovCisKKy8qCisgKiBGaXJzdCB0aGUgc3RhdGVzCisgKiAoaGVhZCx0YWlsKSA9ICAwLCAwICBtZWFucyBsb2NrIGlzIHVuaGVsZCwgbm9ib2R5IG9uIHF1ZXVlCisgKiAgIFVJTlRfTUFYIG9yIC0xLCAwICBtZWFucyBsb2NrIGlzIGhlbGQsIG5vYm9keSBvbiBxdWV1ZQorICogICAgICAgICAgICAgICAgaCwgaCAgbWVhbnMgbG9jayBpcyBoZWxkIG9yIGFib3V0IHRvIHRyYW5zaXRpb24sIDEgZWxlbWVudCBvbiBxdWV1ZQorICogICAgICAgICAgICAgICAgaCwgdCAgaCA8PiB0LCBtZWFucyBsb2NrIGlzIGhlbGQgb3IgYWJvdXQgdG8gdHJhbnNpdGlvbiwgPjEgZWxlbWVudHMgb24gcXVldWUKKyAqCisgKiBOb3cgdGhlIHRyYW5zaXRpb25zCisgKiAgICBBY3F1aXJlKDAsMCkgID0gLTEgLDAKKyAqICAgIFJlbGVhc2UoMCwwKSAgPSBFcnJvcgorICogICAgQWNxdWlyZSgtMSwwKSA9ICBoICxoICAgIGggPiAwCisgKiAgICBSZWxlYXNlKC0xLDApID0gIDAgLDAKKyAqICAgIEFjcXVpcmUoaCxoKSAgPSAgaCAsdCAgICBoID4gMCwgdCA+IDAsIGggPD4gdAorICogICAgUmVsZWFzZShoLGgpICA9IC0xICwwICAgIGggPiAwCisgKiAgICBBY3F1aXJlKGgsdCkgID0gIGggLHQnICAgaCA+IDAsIHQgPiAwLCB0JyA+IDAsIGggPD4gdCwgaCA8PiB0JywgdCA8PiB0JworICogICAgUmVsZWFzZShoLHQpICA9ICBoJyx0ICAgIGggPiAwLCB0ID4gMCwgaCA8PiB0LCBoIDw+IGgnLCBoJyBtYXliZSA9IHQKKyAqCisgKiBBbmQgcGljdG9yaWFsbHkKKyAqCisgKgorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgfCAwLCAwfC0tLS0tLS0gcmVsZWFzZSAtLS0tLS0tPiBFcnJvcgorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgICB8ICBeCisgKiAgICAgYWNxdWlyZXwgIHxyZWxlYXNlCisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB2ICB8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICB8LTEsIDB8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICAgIHwgIF4KKyAqICAgICBhY3F1aXJlfCAgfHJlbGVhc2UKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHYgIHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgIHwgaCwgaHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgICAgfCAgXgorICogICAgIGFjcXVpcmV8ICB8cmVsZWFzZQorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgdiAgfAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgfCBoLCB0fC0tLS0tIGFjcXVpcmUsIHJlbGVhc2UgbG9vcGJhY2sgLS0tKworICogICAgICAgICAgKy0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqLworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworCisvKiBTdHVmZiBmb3IgY2lyY3VsYXIgdHJhY2UgYnVmZmVyICovCisjZGVmaW5lIFRSQUNFX0JVRl9FTEUJMTAyNAorc3RhdGljIGNoYXIgdHJhY2VzW1RSQUNFX0JVRl9FTEVdWzEyOF0gPSB7IDAgfQorc3RhdGljIGludCB0YyA9IDA7CisjZGVmaW5lIFRSQUNFX0xPQ0soWCxZKSAgICAgICAgICBLTVBfU05QUklOVEYoIHRyYWNlc1t0YysrICUgVFJBQ0VfQlVGX0VMRV0sIDEyOCwgICJ0JWQgYXQgJXNcbiIsIFgsIFkgKTsKKyNkZWZpbmUgVFJBQ0VfTE9DS19UKFgsWSxaKSAgICAgIEtNUF9TTlBSSU5URiggdHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgMTI4LCAidCVkIGF0ICVzJWRcbiIsIFgsWSxaICk7CisjZGVmaW5lIFRSQUNFX0xPQ0tfSFQoWCxZLFosUSkgICBLTVBfU05QUklOVEYoIHRyYWNlc1t0YysrICUgVFJBQ0VfQlVGX0VMRV0sIDEyOCwgInQlZCBhdCAlcyAlZCwlZFxuIiwgWCwgWSwgWiwgUSApOworCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBoZWFkX2lkLCBrbXBfaW50MzIgdGFpbF9pZCApCit7CisgICAga21wX2ludDMyIHQsIGk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlxuX19rbXBfZHVtcF9xdWV1aW5nX2xvY2s6IFRSQUNFIEJFR0lOUyBIRVJFISBcbiIgKTsKKworICAgIGkgPSB0YyAlIFRSQUNFX0JVRl9FTEU7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICIlc1xuIiwgdHJhY2VzW2ldICk7CisgICAgaSA9IChpKzEpICUgVFJBQ0VfQlVGX0VMRTsKKyAgICB3aGlsZSAoIGkgIT0gKHRjICUgVFJBQ0VfQlVGX0VMRSkgKSB7CisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJXMiLCB0cmFjZXNbaV0gKTsKKyAgICAgICAgaSA9IChpKzEpICUgVFJBQ0VfQlVGX0VMRTsKKyAgICB9CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcbiIgKTsKKworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgICJcbl9fa21wX2R1bXBfcXVldWluZ19sb2NrOiBndGlkKzE6JWQsIHNwaW5faGVyZTolZCwgbmV4dF93YWl0OiVkLCBoZWFkX2lkOiVkLCB0YWlsX2lkOiVkXG4iLAorICAgICAgICAgICAgIGd0aWQrMSwgdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSwgdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZywKKyAgICAgICAgICAgICBoZWFkX2lkLCB0YWlsX2lkICk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIlx0XHRoZWFkOiAlZCAiLCBsY2stPmxrLmhlYWRfaWQgKTsKKworICAgIGlmICggbGNrLT5say5oZWFkX2lkID49IDEgKSB7CisgICAgICAgIHQgPSBfX2ttcF90aHJlYWRzW2xjay0+bGsuaGVhZF9pZC0xXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgICAgICB3aGlsZSAodCA+IDApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiLT4gJWQgIiwgdCApOworICAgICAgICAgICAgdCA9IF9fa21wX3RocmVhZHNbdC0xXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiOyAgdGFpbDogJWQgIiwgbGNrLT5say50YWlsX2lkICk7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcblxuIiApOworfQorCisjZW5kaWYgLyogREVCVUdfUVVFVUlOR19MT0NLUyAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIFRDUl80KCBsY2stPmxrLm93bmVyX2lkICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSgga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworLyogQWNxdWlyZSBhIGxvY2sgdXNpbmcgYSB0aGUgcXVldWluZyBsb2NrIGltcGxlbWVudGF0aW9uICovCit0ZW1wbGF0ZSA8Ym9vbCB0YWtlVGltZT4KKy8qIFtUTFddIFRoZSB1bnVzZWQgdGVtcGxhdGUgYWJvdmUgaXMgbGVmdCBiZWhpbmQgYmVjYXVzZSBvZiB3aGF0IEJFQiBiZWxpZXZlcyBpcyBhCisgICBwb3RlbnRpYWwgY29tcGlsZXIgcHJvYmxlbSB3aXRoIF9fZm9yY2VpbmxpbmUuICovCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKnRoaXNfdGhyICAgID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgKmhlYWRfaWRfcCAgID0gJiBsY2stPmxrLmhlYWRfaWQ7CisgICAgdm9sYXRpbGUga21wX2ludDMyICAqdGFpbF9pZF9wICAgPSAmIGxjay0+bGsudGFpbF9pZDsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICpzcGluX2hlcmVfcDsKKyAgICBrbXBfaW50MzIgbmVlZF9tZiA9IDE7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3N0YXRlX3QgcHJldl9zdGF0ZSA9IG9tcHRfc3RhdGVfdW5kZWZpbmVkOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGVudGVyaW5nXG4iLCBsY2ssIGd0aWQgKSk7CisKKyAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgIT0gTlVMTCApOworICAgIHNwaW5faGVyZV9wID0gJiB0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBlbnQiICk7CisgICAgaWYgKCAqc3Bpbl9oZXJlX3AgKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworICAgIGlmICggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyAhPSAwICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoICEqc3Bpbl9oZXJlX3AgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDAgKTsKKworCisgICAgLyogVGhlIGZvbGxvd2luZyBzdC5yZWwgdG8gc3Bpbl9oZXJlX3AgbmVlZHMgdG8gcHJlY2VkZSB0aGUgY21weGNoZy5hY3EgdG8gaGVhZF9pZF9wCisgICAgICAgdGhhdCBtYXkgZm9sbG93LCBub3QganVzdCBpbiBleGVjdXRpb24gb3JkZXIsIGJ1dCBhbHNvIGluIHZpc2liaWxpdHkgb3JkZXIuICBUaGlzIHdheSwKKyAgICAgICB3aGVuIGEgcmVsZWFzaW5nIHRocmVhZCBvYnNlcnZlcyB0aGUgY2hhbmdlcyB0byB0aGUgcXVldWUgYnkgdGhpcyB0aHJlYWQsIGl0IGNhbgorICAgICAgIHJpZ2h0bHkgYXNzdW1lIHRoYXQgc3Bpbl9oZXJlX3AgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gVFJVRSwgc28gdGhhdCB3aGVuIGl0IHNldHMKKyAgICAgICBzcGluX2hlcmVfcCB0byBGQUxTRSwgaXQgaXMgbm90IHByZW1hdHVyZS4gIElmIHRoZSByZWxlYXNpbmcgdGhyZWFkIHNldHMgc3Bpbl9oZXJlX3AKKyAgICAgICB0byBGQUxTRSBiZWZvcmUgdGhpcyB0aHJlYWQgc2V0cyBpdCB0byBUUlVFLCB0aGlzIHRocmVhZCB3aWxsIGhhbmcuCisgICAgKi8KKyAgICAqc3Bpbl9oZXJlX3AgPSBUUlVFOyAgLyogYmVmb3JlIGVucXVldWluZyB0byBwcmV2ZW50IHJhY2UgKi8KKworICAgIHdoaWxlKCAxICkgeworICAgICAgICBrbXBfaW50MzIgZW5xdWV1ZWQ7CisgICAgICAgIGttcF9pbnQzMiBoZWFkOworICAgICAgICBrbXBfaW50MzIgdGFpbDsKKworICAgICAgICBoZWFkID0gKmhlYWRfaWRfcDsKKworICAgICAgICBzd2l0Y2ggKCBoZWFkICkgeworCisgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgeworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJhY3EgcmVhZDogIiwgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgdGFpbCA9IDA7ICAvKiB0byBtYWtlIHN1cmUgbmV4dCBsaW5rIGFzeW5jaHJvbm91c2x5IHJlYWQgaXMgbm90IHNldCBhY2NpZGVudGFsbHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGFzc2lnbm1lbnQgcHJldmVudHMgdXMgZnJvbSBlbnRlcmluZyB0aGUgaWYgKCB0ID4gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gaW4gdGhlIGVucXVldWVkIGNhc2UgYmVsb3csIHdoaWNoIGlzIG5vdCBuZWNlc3NhcnkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0YXRlIHRyYW5zaXRpb24gKi8KKworICAgICAgICAgICAgICAgIG5lZWRfbWYgPSAwOworICAgICAgICAgICAgICAgIC8qIHRyeSAoLTEsMCktPih0aWQsdGlkKSAqLworICAgICAgICAgICAgICAgIGVucXVldWVkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KCAodm9sYXRpbGUga21wX2ludDY0ICopIHRhaWxfaWRfcCwKKyAgICAgICAgICAgICAgICAgIEtNUF9QQUNLXzY0KCAtMSwgMCApLAorICAgICAgICAgICAgICAgICAgS01QX1BBQ0tfNjQoIGd0aWQrMSwgZ3RpZCsxICkgKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgICBpZiAoIGVucXVldWVkICkgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIGVucTogKC0xLDApLT4odGlkLHRpZCkiICk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhaWwgIT0gZ3RpZCArIDEgKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJhY3EgcmVhZDogIiwgaGVhZCwgdGFpbCApOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZiAoIHRhaWwgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5lZWRfbWYgPSAwOworICAgICAgICAgICAgICAgICAgICAvKiB0cnkgKGgsdCkgb3IgKGgsaCktPihoLHRpZCkgKi8KKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIHRhaWxfaWRfcCwgdGFpbCwgZ3RpZCsxICk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGVucXVldWVkICkgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIGVucTogKGgsdCktPihoLHRpZCkiICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAwOiAvKiBlbXB0eSBxdWV1ZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF9pbnQzMiBncmFiYmVkX2xvY2s7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgdGFpbCA9ICp0YWlsX2lkX3A7CisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIC8qIHRyeSAoMCwwKS0+KC0xLDApICovCisKKyAgICAgICAgICAgICAgICAvKiBvbmx5IGxlZ2FsIHRyYW5zaXRpb24gb3V0IG9mIGhlYWQgPSAwIGlzIGhlYWQgPSAtMSB3aXRoIG5vIGNoYW5nZSB0byB0YWlsICovCisgICAgICAgICAgICAgICAgZ3JhYmJlZF9sb2NrID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCBoZWFkX2lkX3AsIDAsIC0xICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGdyYWJiZWRfbG9jayApIHsKKworICAgICAgICAgICAgICAgICAgICAqc3Bpbl9oZXJlX3AgPSBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGV4aXRpbmc6IG5vIHF1ZXVpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQgKSk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgICAgICBUUkFDRV9MT0NLX0hUKCBndGlkKzEsICJhY3EgZXhpdDogIiwgaGVhZCwgMCApOworI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBwcmV2X3N0YXRlICE9IG9tcHRfc3RhdGVfdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgdGhlIHN0YXRlIGJlZm9yZSBjbGVhcmluZyB3YWl0X2lkICovCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IHByZXZfc3RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOyAvKiBsb2NrIGhvbGRlciBjYW5ub3QgYmUgb24gcXVldWUgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5xdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBwcmV2X3N0YXRlID09IG9tcHRfc3RhdGVfdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAvKiB0aGlzIHRocmVhZCB3aWxsIHNwaW47IHNldCB3YWl0X2lkIGJlZm9yZSBlbnRlcmluZyB3YWl0IHN0YXRlICovCisgICAgICAgICAgICBwcmV2X3N0YXRlID0gdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gKHVpbnQ2NF90KSBsY2s7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9sb2NrOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAoIGVucXVldWVkICkgeworICAgICAgICAgICAgaWYgKCB0YWlsID4gMCApIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0YWlsX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIHRhaWwgLSAxICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggdGFpbF90aHIgIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHRhaWxfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPSBndGlkKzE7CisgICAgICAgICAgICAgICAgLyogY29ycmVzcG9uZGluZyB3YWl0IGZvciB0aGlzIHdyaXRlIGluIHJlbGVhc2UgY29kZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCB3YWl0aW5nIGZvciBsb2NrXG4iLCBsY2ssIGd0aWQgKSk7CisKKworICAgICAgICAgICAgLyogVG9EbzogTWF5IHdhbnQgdG8gY29uc2lkZXIgdXNpbmcgX19rbXBfd2FpdF9zbGVlcCAgb3Igc29tZXRoaW5nIHRoYXQgc2xlZXBzIGZvcgorICAgICAgICAgICAgICogICAgICAgdGhyb3VnaHB1dCBvbmx5IGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgS01QX1dBSVRfWUlFTEQoc3Bpbl9oZXJlX3AsIEZBTFNFLCBLTVBfRVEsIGxjayk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3Egc3BpbiIgKTsKKworICAgICAgICAgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nICE9IDAgKQorICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisjZW5kaWYKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPT0gMCApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBhZnRlciB3YWl0aW5nIG9uIHF1ZXVlXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBleGl0IDIiICk7CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgLyogY2hhbmdlIHRoZSBzdGF0ZSBiZWZvcmUgY2xlYXJpbmcgd2FpdF9pZCAqLworICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBwcmV2X3N0YXRlOworICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IDA7CisjZW5kaWYKKworICAgICAgICAgICAgLyogZ290IGxvY2ssIHdlIHdlcmUgZGVxdWV1ZWQgYnkgdGhlIHRocmVhZCB0aGF0IHJlbGVhc2VkIGxvY2sgKi8KKyAgICAgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFlpZWxkIGlmIG51bWJlciBvZiB0aHJlYWRzID4gbnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycyAqLworICAgICAgICAvKiBUb0RvOiBOb3Qgc3VyZSB3aHkgdGhpcyBzaG91bGQgb25seSBiZSBpbiBvdmVyc3Vic2NyaXB0aW9uIGNhc2UsCisgICAgICAgICAgIG1heWJlIHNob3VsZCBiZSB0cmFkaXRpb25hbCBZSUVMRF9JTklUL1lJRUxEX1dIRU4gbG9vcCAqLworICAgICAgICBLTVBfWUlFTEQoIFRDUl80KCBfX2ttcF9udGggKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6CisgICAgICAgICAgX19rbXBfeHByb2MgKSApOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIHJldHJ5IiApOworI2VuZGlmCisKKyAgICB9CisgICAgS01QX0FTU0VSVDIoIDAsICJzaG91bGQgbm90IGdldCBoZXJlIiApOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGludCByZXR2YWwgPSBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxmYWxzZT4oIGxjaywgZ3RpZCApOworICAgIEFOTk9UQVRFX1FVRVVJTkdfQUNRVUlSRUQobGNrKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworfQorCitpbnQKK19fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqaGVhZF9pZF9wICA9ICYgbGNrLT5say5oZWFkX2lkOworICAgIGttcF9pbnQzMiBoZWFkOworI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jazogVCMlZCBlbnRlcmluZ1xuIiwgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICB0aGlzX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggIXRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKTsKKyNlbmRpZgorCisgICAgaGVhZCA9ICpoZWFkX2lkX3A7CisKKyAgICBpZiAoIGhlYWQgPT0gMCApIHsgLyogbm9ib2R5IG9uIHF1ZXVlLCBub2JvZHkgaG9sZGluZyAqLworCisgICAgICAgIC8qIHRyeSAoMCwwKS0+KC0xLDApICovCisKKyAgICAgICAgaWYgKCBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoIGhlYWRfaWRfcCwgMCwgLTEgKSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3Rlc3RfcXVldWluZ19sb2NrOiBUIyVkIGV4aXRpbmc6IGhvbGRpbmcgbG9ja1xuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworICAgICAgICAgICAgQU5OT1RBVEVfUVVFVUlOR19BQ1FVSVJFRChsY2spOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jazogVCMlZCBleGl0aW5nOiB3aXRob3V0IGxvY2tcbiIsIGd0aWQgKSk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisKKyAgICBpZiAoIHJldHZhbCApIHsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqaGVhZF9pZF9wID0gJiBsY2stPmxrLmhlYWRfaWQ7CisgICAgdm9sYXRpbGUga21wX2ludDMyICp0YWlsX2lkX3AgPSAmIGxjay0+bGsudGFpbF9pZDsKKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZW50ZXJpbmdcbiIsIGxjaywgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKyAgICB0aGlzX3RociAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociAhPSBOVUxMICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCBlbnQiICk7CisKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworICAgIGlmICggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyAhPSAwICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoICF0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwICk7CisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisgICAgQU5OT1RBVEVfUVVFVUlOR19SRUxFQVNFRChsY2spOworCisgICAgd2hpbGUoIDEgKSB7CisgICAgICAgIGttcF9pbnQzMiBkZXF1ZXVlZDsKKyAgICAgICAga21wX2ludDMyIGhlYWQ7CisgICAgICAgIGttcF9pbnQzMiB0YWlsOworCisgICAgICAgIGhlYWQgPSAqaGVhZF9pZF9wOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAicmVsIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyAgICAgICAgaWYgKCBoZWFkID09IDAgKSBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWQgIT0gMCApOyAvKiBob2xkaW5nIHRoZSBsb2NrLCBoZWFkIG11c3QgYmUgLTEgb3IgcXVldWUgaGVhZCAqLworCisgICAgICAgIGlmICggaGVhZCA9PSAtMSApIHsgLyogbm9ib2R5IG9uIHF1ZXVlICovCisKKyAgICAgICAgICAgIC8qIHRyeSAoLTEsMCktPigwLDApICovCisgICAgICAgICAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiggaGVhZF9pZF9wLCAtMSwgMCApICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZXhpdGluZzogcXVldWUgZW1wdHlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAicmVsIGV4aXQ6ICIsIDAsIDAgKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAtIG5vIG90aGVyIHRocmVhZCBpcyB0cnlpbmcgdG8gc2hpZnQgYmxhbWUgKi8KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVxdWV1ZWQgPSBGQUxTRTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgICAgIGlmICggaGVhZCA9PSB0YWlsICkgeyAgLyogb25seSBvbmUgdGhyZWFkIG9uIHRoZSBxdWV1ZSAqLworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIGlmICggaGVhZCA8PSAwICkgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWQgPiAwICk7CisKKyAgICAgICAgICAgICAgICAvKiB0cnkgKGgsaCktPigtMSwwKSAqLworICAgICAgICAgICAgICAgIGRlcXVldWVkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KCAoa21wX2ludDY0ICopIHRhaWxfaWRfcCwKKyAgICAgICAgICAgICAgICAgIEtNUF9QQUNLXzY0KCBoZWFkLCBoZWFkICksIEtNUF9QQUNLXzY0KCAtMSwgMCApICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCBkZXE6IChoLGgpLT4oLTEsMCkiICk7CisjZW5kaWYKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdm9sYXRpbGUga21wX2ludDMyICp3YWl0aW5nX2lkX3A7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAgICAgICAgICpoZWFkX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGhlYWQgLSAxICk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZF90aHIgIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHdhaXRpbmdfaWRfcCA9ICYgaGVhZF90aHItPnRoLnRoX25leHRfd2FpdGluZzsKKworICAgICAgICAgICAgICAgIC8qIERvZXMgdGhpcyByZXF1aXJlIHN5bmNocm9ub3VzIHJlYWRzPyAqLworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBpZiAoIGhlYWQgPD0gMCB8fCB0YWlsIDw9IDAgKSBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCA+IDAgJiYgdGFpbCA+IDAgKTsKKworICAgICAgICAgICAgICAgIC8qIHRyeSAoaCx0KS0+KGgnLHQpIG9yICh0LHQpICovCisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgZW5xdWV1aW5nIHRocmVhZCBoYXMgdGltZSB0byB1cGRhdGUgbmV4dCB3YWl0aW5nIHRocmVhZCBmaWVsZCAqLworICAgICAgICAgICAgICAgICpoZWFkX2lkX3AgPSBLTVBfV0FJVF9ZSUVMRCgodm9sYXRpbGUga21wX3VpbnQzMiopd2FpdGluZ19pZF9wLCAwLCBLTVBfTkVRLCBOVUxMKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIGRlcTogKGgsdCktPihoJyx0KSIgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRlcXVldWVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggZGVxdWV1ZWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICpoZWFkX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGhlYWQgLSAxICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkX3RociAhPSBOVUxMICk7CisKKyAgICAgICAgICAgIC8qIERvZXMgdGhpcyByZXF1aXJlIHN5bmNocm9ub3VzIHJlYWRzPyAqLworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIGlmICggaGVhZCA8PSAwIHx8IHRhaWwgPD0gMCApIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWQgPiAwICYmIHRhaWwgPiAwICk7CisKKyAgICAgICAgICAgIC8qIEZvciBjbGVhbiBjb2RlIG9ubHkuCisgICAgICAgICAgICAgKiBUaHJlYWQgbm90IHJlbGVhc2VkIHVudGlsIG5leHQgc3RhdGVtZW50IHByZXZlbnRzIHJhY2Ugd2l0aCBhY3F1aXJlIGNvZGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGhlYWRfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPSAwOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIFRSQUNFX0xPQ0tfVCggZ3RpZCsxLCAicmVsIG53PTAgZm9yIHQ9IiwgaGVhZCApOworI2VuZGlmCisKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgLyogcmVzZXQgc3BpbiB2YWx1ZSAqLworICAgICAgICAgICAgaGVhZF90aHItPnRoLnRoX3NwaW5faGVyZSA9IEZBTFNFOworCisgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGV4aXRpbmc6IGFmdGVyIGRlcXVldWluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQgKSk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIGV4aXQgMiIgKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgICAgICB9CisgICAgICAgIC8qIEtNUF9DUFVfUEFVU0UoICk7ICBkb24ndCB3YW50IHRvIG1ha2UgcmVsZWFzaW5nIHRocmVhZCBob2xkIHVwIGFjcXVpcmluZyB0aHJlYWRzICovCisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCByZXRyeSIgKTsKKyNlbmRpZgorCisgICAgfSAvKiB3aGlsZSAqLworICAgIEtNUF9BU1NFUlQyKCAwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gTlVMTDsKKyAgICBsY2stPmxrLmhlYWRfaWQgPSAwOworICAgIGxjay0+bGsudGFpbF9pZCA9IDA7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7ICAgICAgLy8gbm8gdGhyZWFkIG93bnMgdGhlIGxvY2suCisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MuCisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IGxjazsKKworICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfaW5pdF9xdWV1aW5nX2xvY2s6IGxvY2sgJXAgaW5pdGlhbGl6ZWRcbiIsIGxjaykpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBOVUxMOworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIGxjay0+bGsuaGVhZF9pZCA9IDA7CisgICAgbGNrLT5say50YWlsX2lkID0gMDsKKyAgICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gMDsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIHF1ZXVpbmcgbG9ja3MKKy8vCisKK2ludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfTkVYVDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrX3RpbWVkX3RlbXBsYXRlPGZhbHNlPiggbGNrLCBndGlkICk7CisgICAgICAgIEFOTk9UQVRFX1FVRVVJTkdfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApICkgeworICAgICAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBpZiAoIC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgICAgIF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gYWNjZXNzIGZ1bmN0aW9ucyB0byBmaWVsZHMgd2hpY2ggZG9uJ3QgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKworc3RhdGljIGludAorX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjayA9PSBsY2stPmxrLmluaXRpYWxpemVkOworfQorCitzdGF0aWMgY29uc3QgaWRlbnRfdCAqCitfX2ttcF9nZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsubG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gbG9jOworfQorCitzdGF0aWMga21wX2xvY2tfZmxhZ3NfdAorX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmZsYWdzOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLyoKKyAgICBSVE0gQWRhcHRpdmUgbG9ja3MKKyovCisKKyNpZiBLTVBfQ09NUElMRVJfSUNDICYmIF9fSU5URUxfQ09NUElMRVIgPj0gMTMwMAorCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZGVmaW5lIFNPRlRfQUJPUlRfTUFTSyAgKF9YQUJPUlRfUkVUUlkgfCBfWEFCT1JUX0NPTkZMSUNUIHwgX1hBQk9SVF9FWFBMSUNJVCkKKworI2Vsc2UKKworLy8gVmFsdWVzIGZyb20gdGhlIHN0YXR1cyByZWdpc3RlciBhZnRlciBmYWlsZWQgc3BlY3VsYXRpb24uCisjZGVmaW5lIF9YQkVHSU5fU1RBUlRFRCAgICAgICAgICAofjB1KQorI2RlZmluZSBfWEFCT1JUX0VYUExJQ0lUICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgX1hBQk9SVF9SRVRSWSAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIF9YQUJPUlRfQ09ORkxJQ1QgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBfWEFCT1JUX0NBUEFDSVRZICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgX1hBQk9SVF9ERUJVRyAgICAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIF9YQUJPUlRfTkVTVEVEICAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBfWEFCT1JUX0NPREUoeCkgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKSgoKHgpID4+IDI0KSAmIDB4RkYpKQorCisvLyBBYm9ydHMgZm9yIHdoaWNoIGl0J3Mgd29ydGggdHJ5aW5nIGFnYWluIGltbWVkaWF0ZWx5CisjZGVmaW5lIFNPRlRfQUJPUlRfTUFTSyAgKF9YQUJPUlRfUkVUUlkgfCBfWEFCT1JUX0NPTkZMSUNUIHwgX1hBQk9SVF9FWFBMSUNJVCkKKworI2RlZmluZSBTVFJJTkdJWkVfSU5URVJOQUwoYXJnKSAjYXJnCisjZGVmaW5lIFNUUklOR0laRShhcmcpIFNUUklOR0laRV9JTlRFUk5BTChhcmcpCisKKy8vIEFjY2VzcyB0byBSVE0gaW5zdHJ1Y3Rpb25zCisKKy8qCisgIEEgdmVyc2lvbiBvZiBYQmVnaW4gd2hpY2ggcmV0dXJucyAtMSBvbiBzcGVjdWxhdGlvbiwgYW5kIHRoZSB2YWx1ZSBvZiBFQVggb24gYW4gYWJvcnQuCisgIFRoaXMgaXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBhcyB0aGUgY29tcGlsZXIgaW50cmluc2ljIHRoYXQgd2lsbCBiZSBzdXBwb3J0ZWQgYXQgc29tZSBwb2ludC4KKyovCitzdGF0aWMgX19pbmxpbmUgaW50IF94YmVnaW4oKQoreworICAgIGludCByZXMgPSAtMTsKKworI2lmIEtNUF9PU19XSU5ET1dTCisjaWYgS01QX0FSQ0hfWDg2XzY0CisgICAgX2FzbSB7CisgICAgICAgIF9lbWl0IDB4QzcKKyAgICAgICAgX2VtaXQgMHhGOAorICAgICAgICBfZW1pdCAyCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBfZW1pdCAwCisgICAgICAgIGptcCAgIEwyCisgICAgICAgIG1vdiAgIHJlcywgZWF4CisgICAgTDI6CisgICAgfQorI2Vsc2UgLyogSUEzMiAqLworICAgIF9hc20geworICAgICAgICBfZW1pdCAweEM3CisgICAgICAgIF9lbWl0IDB4RjgKKyAgICAgICAgX2VtaXQgMgorICAgICAgICBfZW1pdCAwCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBqbXAgICBMMgorICAgICAgICBtb3YgICByZXMsIGVheAorICAgIEwyOgorICAgIH0KKyNlbmRpZiAvLyBLTVBfQVJDSF9YODZfNjQKKyNlbHNlCisgICAgLyogTm90ZSB0aGF0ICVlYXggbXVzdCBiZSBub3RlZCBhcyBraWxsZWQgKGNsb2JiZXJlZCksIGJlY2F1c2UKKyAgICAgKiB0aGUgWFNSIGlzIHJldHVybmVkIGluICVlYXgoJXJheCkgb24gYWJvcnQuICBPdGhlciByZWdpc3RlcgorICAgICAqIHZhbHVlcyBhcmUgcmVzdG9yZWQsIHNvIGRvbid0IG5lZWQgdG8gYmUga2lsbGVkLgorICAgICAqCisgICAgICogV2UgbXVzdCBhbHNvIG1hcmsgJ3JlcycgYXMgYW4gaW5wdXQgYW5kIGFuIG91dHB1dCwgc2luY2Ugb3RoZXJ3aXNlCisgICAgICogJ3Jlcz0tMScgbWF5IGJlIGRyb3BwZWQgYXMgYmVpbmcgZGVhZCwgd2hlcmVhcyB3ZSBkbyBuZWVkIHRoZQorICAgICAqIGFzc2lnbm1lbnQgb24gdGhlIHN1Y2Nlc3NmdWwgKGkuZS4sIG5vbi1hYm9ydCkgcGF0aC4KKyAgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiMTogLmJ5dGUgIDB4Qzc7IC5ieXRlIDB4Rjg7XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgIC5sb25nICAxZi0xYi02XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBqbXAgICAyZlxuIgorICAgICAgICAgICAgICAgICAgICAgICIxOiAgbW92bCAgJSVlYXgsJTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiMjoiCisgICAgICAgICAgICAgICAgICAgICAgOiIrciIocmVzKTo6Im1lbW9yeSIsIiVlYXgiKTsKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworICAgIHJldHVybiByZXM7Cit9CisKKy8qCisgIFRyYW5zYWN0aW9uIGVuZAorKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIF94ZW5kKCkKK3sKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIF9fYXNtICB7CisgICAgICAgIF9lbWl0IDB4MGYKKyAgICAgICAgX2VtaXQgMHgwMQorICAgICAgICBfZW1pdCAweGQ1CisgICAgfQorI2Vsc2UKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiLmJ5dGUgMHgwZjsgLmJ5dGUgMHgwMTsgLmJ5dGUgMHhkNSIgOjo6Im1lbW9yeSIpOworI2VuZGlmCit9CisKKy8qCisgIFRoaXMgaXMgYSBtYWNybywgdGhlIGFyZ3VtZW50IG11c3QgYmUgYSBzaW5nbGUgYnl0ZSBjb25zdGFudCB3aGljaAorICBjYW4gYmUgZXZhbHVhdGVkIGJ5IHRoZSBpbmxpbmUgYXNzZW1ibGVyLCBzaW5jZSBpdCBpcyBlbWl0dGVkIGFzIGEKKyAgYnl0ZSBpbnRvIHRoZSBhc3NlbWJseSBjb2RlLgorKi8KKyNpZiBLTVBfT1NfV0lORE9XUworI2RlZmluZSBfeGFib3J0KEFSRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgMHhjNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgMHhmOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9hc20gX2VtaXQgQVJHCisjZWxzZQorI2RlZmluZSBfeGFib3J0KEFSRykgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCIuYnl0ZSAweEM2OyAuYnl0ZSAweEY4OyAuYnl0ZSAiIFNUUklOR0laRShBUkcpIDo6OiJtZW1vcnkiKTsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0NPTVBJTEVSX0lDQyAmJiBfX0lOVEVMX0NPTVBJTEVSID49IDEzMDAKKworLy8KKy8vICAgIFN0YXRpc3RpY3MgaXMgY29sbGVjdGVkIGZvciB0ZXN0aW5nIHB1cnBvc2UKKy8vCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKKy8vIFdlIGFjY3VtdWxhdGUgc3BlY3VsYXRpdmUgbG9jayBzdGF0aXN0aWNzIHdoZW4gdGhlIGxvY2sgaXMgZGVzdHJveWVkLgorLy8gV2Uga2VlcCBsb2NrcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZXN0cm95ZWQgaW4gdGhlIGxpdmVMb2NrcyBsaXN0CisvLyBzbyB0aGF0IHdlIGNhbiBncmFiIHRoZWlyIHN0YXRpc3RpY3MgdG9vLgorc3RhdGljIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCBkZXN0cm95ZWRTdGF0czsKKworLy8gVG8gaG9sZCB0aGUgbGlzdCBvZiBsaXZlIGxvY2tzLgorc3RhdGljIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCBsaXZlTG9ja3M7CisKKy8vIEEgbG9jayBzbyB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0aGUgbGlzdCBvZiBsb2Nrcy4KK3N0YXRpYyBrbXBfYm9vdHN0cmFwX2xvY2tfdCBjaGFpbl9sb2NrOworCisvLyBJbml0aWFsaXplIHRoZSBsaXN0IG9mIHN0YXRzLgordm9pZAorX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpCit7CisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICpsY2sgPSAmbGl2ZUxvY2tzOworCisgICAgbWVtc2V0KCAoIHZvaWQgKiApICYgKCBsY2stPnN0YXRzICksIDAsIHNpemVvZiggbGNrLT5zdGF0cyApICk7CisgICAgbGNrLT5zdGF0cy5uZXh0ID0gbGNrOworICAgIGxjay0+c3RhdHMucHJldiA9IGxjazsKKworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2sgKTsKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLnByZXYtPnN0YXRzLm5leHQgPT0gbGNrICk7CisKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCit9CisKKy8vIEluc2VydCB0aGUgbG9jayBpbnRvIHRoZSBjaXJjdWxhciBsaXN0CitzdGF0aWMgdm9pZAorX19rbXBfcmVtZW1iZXJfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogbGNrICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCisgICAgbGNrLT5zdGF0cy5uZXh0ID0gbGl2ZUxvY2tzLnN0YXRzLm5leHQ7CisgICAgbGNrLT5zdGF0cy5wcmV2ID0gJmxpdmVMb2NrczsKKworICAgIGxpdmVMb2Nrcy5zdGF0cy5uZXh0ID0gbGNrOworICAgIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiAgPSBsY2s7CisKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgPT0gbGNrICk7CisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5wcmV2LT5zdGF0cy5uZXh0ID09IGxjayApOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2ZvcmdldF9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBsY2sgKQoreworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2sgKTsKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLnByZXYtPnN0YXRzLm5leHQgPT0gbGNrICk7CisKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBuID0gbGNrLT5zdGF0cy5uZXh0OworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIHAgPSBsY2stPnN0YXRzLnByZXY7CisKKyAgICBuLT5zdGF0cy5wcmV2ID0gcDsKKyAgICBwLT5zdGF0cy5uZXh0ID0gbjsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3plcm9fc3BlY3VsYXRpdmVfc3RhdHMoIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjayApCit7CisgICAgbWVtc2V0KCAoIHZvaWQgKiApJmxjay0+c3RhdHMsIDAsIHNpemVvZiggbGNrLT5zdGF0cyApICk7CisgICAgX19rbXBfcmVtZW1iZXJfbG9jayggbGNrICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hZGRfc3RhdHMoIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCAqIHQsIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjayApCit7CisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190IHZvbGF0aWxlICpzID0gJmxjay0+c3RhdHM7CisKKyAgICB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0cyArPSBsY2stPmFjcXVpcmVfYXR0ZW1wdHM7CisgICAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucyArPSBzLT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zOworICAgIHQtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnMgKz0gcy0+aGFyZEZhaWxlZFNwZWN1bGF0aW9uczsKKyAgICB0LT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zICs9IHMtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnM7CisgICAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcyArPSBzLT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzOworICAgIHQtPmxlbW1pbmdZaWVsZHMgICAgICAgICAgKz0gcy0+bGVtbWluZ1lpZWxkczsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjY3VtdWxhdGVfc3BlY3VsYXRpdmVfc3RhdHMoIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjaykKK3sKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgKnQgPSAmZGVzdHJveWVkU3RhdHM7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworCisgICAgX19rbXBfYWRkX3N0YXRzKCAmZGVzdHJveWVkU3RhdHMsIGxjayApOworICAgIF9fa21wX2ZvcmdldF9sb2NrKCBsY2sgKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZjaGFpbl9sb2NrICk7Cit9CisKK3N0YXRpYyBmbG9hdAorcGVyY2VudCAoa21wX3VpbnQzMiBjb3VudCwga21wX3VpbnQzMiB0b3RhbCkKK3sKKyAgICByZXR1cm4gKHRvdGFsID09IDApID8gMC4wOiAoMTAwLjAgKiBjb3VudCkvdG90YWw7Cit9CisKK3N0YXRpYworRklMRSAqIF9fa21wX29wZW5fc3RhdHNfZmlsZSgpCit7CisgICAgaWYgKHN0cmNtcCAoX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLCAiLSIpID09IDApCisgICAgICAgIHJldHVybiBzdGRvdXQ7CisKKyAgICBzaXplX3QgYnVmZkxlbiA9IEtNUF9TVFJMRU4oIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApICsgMjA7CisgICAgY2hhciBidWZmZXJbYnVmZkxlbl07CisgICAgS01QX1NOUFJJTlRGICgmYnVmZmVyWzBdLCBidWZmTGVuLCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUsCisgICAgICAoa21wX2ludDMyKWdldHBpZCgpKTsKKyAgICBGSUxFICogcmVzdWx0ID0gZm9wZW4oJmJ1ZmZlclswXSwgInciKTsKKworICAgIC8vIE1heWJlIHdlIHNob3VsZCBpc3N1ZSBhIHdhcm5pbmcgaGVyZS4uLgorICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQgOiBzdGRvdXQ7Cit9CisKK3ZvaWQKK19fa21wX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzKCkKK3sKKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX2tpbmQgIT0gbGtfYWRhcHRpdmUpCisgICAgICAgIHJldHVybjsKKworICAgIEZJTEUgKiBzdGF0c0ZpbGUgPSBfX2ttcF9vcGVuX3N0YXRzX2ZpbGUoKTsKKworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCB0b3RhbCA9IGRlc3Ryb3llZFN0YXRzOworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqbGNrOworCisgICAgZm9yIChsY2sgPSBsaXZlTG9ja3Muc3RhdHMubmV4dDsgbGNrICE9ICZsaXZlTG9ja3M7IGxjayA9IGxjay0+c3RhdHMubmV4dCkgeworICAgICAgICBfX2ttcF9hZGRfc3RhdHMoICZ0b3RhbCwgbGNrICk7CisgICAgfQorICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCAqdCA9ICZ0b3RhbDsKKyAgICBrbXBfdWludDMyIHRvdGFsU2VjdGlvbnMgICAgID0gdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcyArIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiB0b3RhbFNwZWN1bGF0aW9ucyA9IHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMgKyB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+c29mdEZhaWxlZFNwZWN1bGF0aW9uczsKKworICAgIGZwcmludGYgKCBzdGF0c0ZpbGUsICJTcGVjdWxhdGl2ZSBsb2NrIHN0YXRpc3RpY3MgKGFsbCBhcHByb3hpbWF0ZSEpXG4iKTsKKyAgICBmcHJpbnRmICggc3RhdHNGaWxlLCAiIExvY2sgcGFyYW1ldGVyczogXG4iCisgICAgICAgICAgICAgIiAgIG1heF9zb2Z0X3JldHJpZXMgICAgICAgICAgICAgICA6ICUxMGRcbiIKKyAgICAgICAgICAgICAiICAgbWF4X2JhZG5lc3MgICAgICAgICAgICAgICAgICAgIDogJTEwZFxuIiwKKyAgICAgICAgICAgICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfc29mdF9yZXRyaWVzLAorICAgICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdHMgOiAlMTBkXG4iLCB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0cyApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBUb3RhbCBjcml0aWNhbCBzZWN0aW9ucyAgICAgICAgICA6ICUxMGRcbiIsIHRvdGFsU2VjdGlvbnMgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgU3VjY2Vzc2Z1bCBzcGVjdWxhdGlvbnMgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCB0b3RhbFNlY3Rpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTm9uLXNwZWN1bGF0aXZlIGFjcXVpcmVzICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzLCBwZXJjZW50KCB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzLCB0b3RhbFNlY3Rpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgTGVtbWluZyB5aWVsZHMgICAgICAgICAgICAgICAgICAgOiAlMTBkXG5cbiIsIHQtPmxlbW1pbmdZaWVsZHMgKTsKKworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTcGVjdWxhdGl2ZSBhY3F1aXJlIGF0dGVtcHRzICAgICA6ICUxMGRcbiIsIHRvdGFsU3BlY3VsYXRpb25zICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIFN1Y2Nlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgcGVyY2VudCggdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgdG90YWxTcGVjdWxhdGlvbnMgKSApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTb2Z0IGZhaWx1cmVzICAgICAgICAgICAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgICAgIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMsIHBlcmNlbnQoIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMsIHRvdGFsU3BlY3VsYXRpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgSGFyZCBmYWlsdXJlcyAgICAgICAgICAgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zLCB0b3RhbFNwZWN1bGF0aW9ucyApICk7CisKKyAgICBpZiAoc3RhdHNGaWxlICE9IHN0ZG91dCkKKyAgICAgICAgZmNsb3NlKCBzdGF0c0ZpbGUgKTsKK30KKworIyBkZWZpbmUgS01QX0lOQ19TVEFUKGxjayxzdGF0KSAoIGxjay0+bGsuYWRhcHRpdmUuc3RhdHMuc3RhdCsrICkKKyNlbHNlCisjIGRlZmluZSBLTVBfSU5DX1NUQVQobGNrLHN0YXQpCisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICAvLyBJdCBpcyBlbm91Z2ggdG8gY2hlY2sgdGhhdCB0aGUgaGVhZF9pZCBpcyB6ZXJvLgorICAgIC8vIFdlIGRvbid0IGFsc28gbmVlZCB0byBjaGVjayB0aGUgdGFpbC4KKyAgICBib29sIHJlcyA9IGxjay0+bGsuaGVhZF9pZCA9PSAwOworCisgICAgLy8gV2UgbmVlZCBhIGZlbmNlIGhlcmUsIHNpbmNlIHdlIG11c3QgZW5zdXJlIHRoYXQgbm8gbWVtb3J5IG9wZXJhdGlvbnMKKyAgICAvLyBmcm9tIGxhdGVyIGluIHRoaXMgdGhyZWFkIGZsb2F0IGFib3ZlIHRoYXQgcmVhZC4KKyNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgX21tX21mZW5jZSgpOworI2Vsc2UKKyAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhlIGJhZG5lc3MKK3N0YXRpYyBfX2lubGluZSB2b2lkCitfX2ttcF91cGRhdGVfYmFkbmVzc19hZnRlcl9zdWNjZXNzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2sgKQoreworICAgIC8vIFJlc2V0IHRoZSBiYWRuZXNzIHRvIHplcm8gc28gd2UgZWFnZXJseSB0cnkgdG8gc3BlY3VsYXRlIGFnYWluCisgICAgbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzID0gMDsKKyAgICBLTVBfSU5DX1NUQVQobGNrLHN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMpOworfQorCisvLyBDcmVhdGUgYSBiaXQgbWFzayB3aXRoIG9uZSBtb3JlIHNldCBiaXQuCitzdGF0aWMgX19pbmxpbmUgdm9pZAorX19rbXBfc3RlcF9iYWRuZXNzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2sgKQoreworICAgIGttcF91aW50MzIgbmV3QmFkbmVzcyA9ICggbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzIDw8IDEgKSB8IDE7CisgICAgaWYgKCBuZXdCYWRuZXNzID4gbGNrLT5say5hZGFwdGl2ZS5tYXhfYmFkbmVzcykgeworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzID0gbmV3QmFkbmVzczsKKyAgICB9Cit9CisKKy8vIENoZWNrIHdoZXRoZXIgc3BlY3VsYXRpb24gc2hvdWxkIGJlIGF0dGVtcHRlZC4KK3N0YXRpYyBfX2lubGluZSBpbnQKK19fa21wX3Nob3VsZF9zcGVjdWxhdGUoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgYmFkbmVzcyA9IGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzczsKKyAgICBrbXBfdWludDMyIGF0dGVtcHRzPSBsY2stPmxrLmFkYXB0aXZlLmFjcXVpcmVfYXR0ZW1wdHM7CisgICAgaW50IHJlcyA9IChhdHRlbXB0cyAmIGJhZG5lc3MpID09IDA7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gQXR0ZW1wdCB0byBhY3F1aXJlIG9ubHkgdGhlIHNwZWN1bGF0aXZlIGxvY2suCisvLyBEb2VzIG5vdCBiYWNrIG9mZiB0byB0aGUgbm9uLXNwZWN1bGF0aXZlIGxvY2suCisvLworc3RhdGljIGludAorX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKiBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0cmllcyA9IGxjay0+bGsuYWRhcHRpdmUubWF4X3NvZnRfcmV0cmllczsKKworICAgIC8vIFdlIGRvbid0IGV4cGxpY2l0bHkgY291bnQgdGhlIHN0YXJ0IG9mIHNwZWN1bGF0aW9uLCByYXRoZXIgd2UgcmVjb3JkCisgICAgLy8gdGhlIHJlc3VsdHMgKHN1Y2Nlc3MsIGhhcmQgZmFpbCwgc29mdCBmYWlsKS4gVGhlIHN1bSBvZiBhbGwgb2YgdGhvc2UKKyAgICAvLyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHdlIHN0YXJ0ZWQgc3BlY3VsYXRpb24gc2luY2UgYWxsCisgICAgLy8gc3BlY3VsYXRpb25zIG11c3QgZW5kIG9uZSBvZiB0aG9zZSB3YXlzLgorICAgIGRvCisgICAgeworICAgICAgICBrbXBfdWludDMyIHN0YXR1cyA9IF94YmVnaW4oKTsKKyAgICAgICAgLy8gU3dpdGNoIHRoaXMgaW4gdG8gZGlzYWJsZSBhY3R1YWwgc3BlY3VsYXRpb24gYnV0IGV4ZXJjaXNlCisgICAgICAgIC8vIGF0IGxlYXN0IHNvbWUgb2YgdGhlIHJlc3Qgb2YgdGhlIGNvZGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLi4uCisgICAgICAgIC8vIGttcF91aW50MzIgc3RhdHVzID0gX1hBQk9SVF9ORVNURUQ7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBfWEJFR0lOX1NUQVJURUQgKQorICAgICAgICB7IC8qIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgc3BlY3VsYXRpb24KKyAgICAgICAgICAgKiBDaGVjayB0aGF0IG5vLW9uZSBhY3F1aXJlZCB0aGUgbG9jayBmb3IgcmVhbCBiZXR3ZWVuIHdoZW4gd2UgbGFzdCBsb29rZWQKKyAgICAgICAgICAgKiBhbmQgbm93LiBUaGlzIGFsc28gZ2V0cyB0aGUgbG9jayBjYWNoZSBsaW5lIGludG8gb3VyIHJlYWQtc2V0LAorICAgICAgICAgICAqIHdoaWNoIHdlIG5lZWQgc28gdGhhdCB3ZSdsbCBhYm9ydCBpZiBhbnlvbmUgbGF0ZXIgY2xhaW1zIGl0IGZvciByZWFsLgorICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCEgX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBHRVRfUUxLX1BUUihsY2spICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIExvY2sgaXMgbm93IHZpc2libHkgYWNxdWlyZWQsIHNvIHNvbWVvbmUgYmVhdCB1cyB0byBpdC4KKyAgICAgICAgICAgICAgICAvLyBBYm9ydCB0aGUgdHJhbnNhY3Rpb24gc28gd2UnbGwgcmVzdGFydCBmcm9tIF94YmVnaW4gd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIHN0YXR1cy4KKyAgICAgICAgICAgICAgICBfeGFib3J0KDB4MDEpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQyKCAwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOyAgIC8vIExvY2sgaGFzIGJlZW4gYWNxdWlyZWQgKHNwZWN1bGF0aXZlbHkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGFib3J0ZWQsIHVwZGF0ZSB0aGUgc3RhdGlzdGljcworICAgICAgICAgICAgaWYgKCBzdGF0dXMgJiBTT0ZUX0FCT1JUX01BU0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX0lOQ19TVEFUKGxjayxzb2Z0RmFpbGVkU3BlY3VsYXRpb25zKTsKKyAgICAgICAgICAgICAgICAvLyBhbmQgbG9vcCByb3VuZCB0byByZXRyeS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5DX1NUQVQobGNrLGhhcmRGYWlsZWRTcGVjdWxhdGlvbnMpOworICAgICAgICAgICAgICAgIC8vIEdpdmUgdXAgaWYgd2UgaGFkIGEgaGFyZCBmYWlsdXJlLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgd2hpbGUoIHJldHJpZXMtLSApOyAvLyBMb29wIHdoaWxlIHdlIGhhdmUgcmV0cmllcywgYW5kIGRpZG4ndCBmYWlsIGhhcmQuCisKKyAgICAvLyBFaXRoZXIgd2UgaGFkIGEgaGFyZCBmYWlsdXJlIG9yIHdlIGRpZG4ndCBzdWNjZWVkIHNvZnRseSBhZnRlcgorICAgIC8vIHRoZSBmdWxsIHNldCBvZiBhdHRlbXB0cywgc28gYmFjayBvZmYgdGhlIGJhZG5lc3MuCisgICAgX19rbXBfc3RlcF9iYWRuZXNzKCBsY2sgKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gQXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBzcGVjdWxhdGl2ZSBsb2NrLCBvciBiYWNrIG9mZiB0byB0aGUgbm9uLXNwZWN1bGF0aXZlIG9uZQorLy8gaWYgdGhlIHNwZWN1bGF0aXZlIGxvY2sgY2Fubm90IGJlIGFjcXVpcmVkLgorLy8gV2UgY2FuIHN1Y2NlZWQgc3BlY3VsYXRpdmVseSwgbm9uLXNwZWN1bGF0aXZlbHksIG9yIGZhaWwuCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2soIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vIEZpcnN0IHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrIHNwZWN1bGF0aXZlbHkKKyAgICBpZiAoIF9fa21wX3Nob3VsZF9zcGVjdWxhdGUoIGxjaywgZ3RpZCApICYmIF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBsY2ssIGd0aWQgKSApCisgICAgICAgIHJldHVybiAxOworCisgICAgLy8gU3BlY3VsYXRpdmUgYWNxdWlzaXRpb24gZmFpbGVkLCBzbyB0cnkgdG8gYWNxdWlyZSBpdCBub24tc3BlY3VsYXRpdmVseS4KKyAgICAvLyBDb3VudCB0aGUgbm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdAorICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cysrOworCisgICAgLy8gVXNlIGJhc2UsIG5vbi1zcGVjdWxhdGl2ZSBsb2NrLgorICAgIGlmICggX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjayksIGd0aWQgKSApCisgICAgeworICAgICAgICBLTVBfSU5DX1NUQVQobGNrLG5vblNwZWN1bGF0aXZlQWNxdWlyZXMpOworICAgICAgICByZXR1cm4gMTsgICAgICAgLy8gTG9jayBpcyBhY3F1aXJlZCAobm9uLXNwZWN1bGF0aXZlbHkpCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOyAgICAgICAvLyBGYWlsZWQgdG8gYWNxdWlyZSB0aGUgbG9jaywgaXQncyBhbHJlYWR5IHZpc2libHkgbG9ja2VkLgorICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsucWxrLmluaXRpYWxpemVkICE9IEdFVF9RTEtfUFRSKGxjaykgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsucWxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8vIEJsb2NrIHVudGlsIHdlIGNhbiBhY3F1aXJlIGEgc3BlY3VsYXRpdmUsIGFkYXB0aXZlIGxvY2suCisvLyBXZSBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBiZSB0cnlpbmcgdG8gc3BlY3VsYXRlLgorLy8gSWYgd2Ugc2hvdWxkIGJlLCB3ZSBjaGVjayB0aGUgcmVhbCBsb2NrIHRvIHNlZSBpZiBpdCBpcyBmcmVlLAorLy8gYW5kLCBpZiBub3QsIHBhdXNlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBhY3F1aXJlIGl0IHVudGlsIGl0IGlzLgorLy8gVGhlbiB3ZSB0cnkgdGhlIHNwZWN1bGF0aXZlIGFjcXVpcmUuCisvLyBUaGlzIG1lYW5zIHRoYXQgYWx0aG91Z2ggd2Ugc3VmZmVyIGZyb20gbGVtbWluZ3MgYSBsaXR0bGUgKAorLy8gYmVjYXVzZSBhbGwgd2UgY2FuJ3QgYWNxdWlyZSB0aGUgbG9jayBzcGVjdWxhdGl2ZWx5IHVudGlsCisvLyB0aGUgcXVldWUgb2YgdGhyZWFkcyB3YWl0aW5nIGhhcyBjbGVhcmVkKSwgd2UgZG9uJ3QgZ2V0IGludG8gYQorLy8gc3RhdGUgd2hlcmUgd2UgY2FuIG5ldmVyIGFjcXVpcmUgdGhlIGxvY2sgc3BlY3VsYXRpdmVseSAoYmVjYXVzZSB3ZQorLy8gZm9yY2UgdGhlIHF1ZXVlIHRvIGNsZWFyIGJ5IHByZXZlbnRpbmcgbmV3IGFycml2YWxzIGZyb20gZW50ZXJpbmcgdGhlCisvLyBxdWV1ZSkuCisvLyBUaGlzIGRvZXMgbWVhbiB0aGF0IHdoZW4gd2UncmUgdHJ5aW5nIHRvIGJyZWFrIGxlbW1pbmdzLCB0aGUgbG9jaworLy8gaXMgbm8gbG9uZ2VyIGZhaXIuIEhvd2V2ZXIgT3Blbk1QIG1ha2VzIG5vIGd1YXJhbnRlZSB0aGF0IGl0cworLy8gbG9ja3MgYXJlIGZhaXIsIHNvIHRoaXMgaXNuJ3QgYSByZWFsIHByb2JsZW0uCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja190ICogbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9zaG91bGRfc3BlY3VsYXRlKCBsY2ssIGd0aWQgKSApCisgICAgeworICAgICAgICBpZiAoIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2tfb25seSggbGNrICwgZ3RpZCApICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAvLyBXZSB0cmllZCBzcGVjdWxhdGlvbiBhbmQgZmFpbGVkLCBzbyBnaXZlIHVwLgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdHJ5IHNwZWN1bGF0aW9uIHVudGlsIHRoZSBsb2NrIGlzIGZyZWUsIHNvIHdlCisgICAgICAgICAgICAvLyBwYXVzZSBoZXJlICh3aXRob3V0IHN1c3BlbmRpbmcgb24gdGhlIHF1ZXVlaW5nIGxvY2ssCisgICAgICAgICAgICAvLyB0byBhbGxvdyBpdCB0byBkcmFpbiwgdGhlbiB0cnkgYWdhaW4uCisgICAgICAgICAgICAvLyBBbGwgb3RoZXIgdGhyZWFkcyB3aWxsIGFsc28gc2VlIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAgICAgIC8vIHNob3VsZFNwZWN1bGF0ZSwgc28gd2lsbCBiZSBkb2luZyB0aGUgc2FtZSBpZiB0aGV5CisgICAgICAgICAgICAvLyB0cnkgdG8gY2xhaW0gdGhlIGxvY2sgZnJvbSBub3cgb24uCisgICAgICAgICAgICB3aGlsZSAoICEgX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBHRVRfUUxLX1BUUihsY2spICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtNUF9JTkNfU1RBVChsY2ssbGVtbWluZ1lpZWxkcyk7CisgICAgICAgICAgICAgICAgX19rbXBfeWllbGQgKFRSVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBsY2ssIGd0aWQgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3BlY3VsYXRpdmUgYWNxdWlzaXRpb24gZmFpbGVkLCBzbyBhY3F1aXJlIGl0IG5vbi1zcGVjdWxhdGl2ZWx5LgorICAgIC8vIENvdW50IHRoZSBub24tc3BlY3VsYXRpdmUgYWNxdWlyZSBhdHRlbXB0CisgICAgbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzKys7CisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxGQUxTRT4oIEdFVF9RTEtfUFRSKGxjayksIGd0aWQgKTsKKyAgICAvLyBXZSBoYXZlIGFjcXVpcmVkIHRoZSBiYXNlIGxvY2ssIHNvIGNvdW50IHRoYXQuCisgICAgS01QX0lOQ19TVEFUKGxjayxub25TcGVjdWxhdGl2ZUFjcXVpcmVzICk7CisgICAgQU5OT1RBVEVfUVVFVUlOR19BQ1FVSVJFRChsY2spOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgIGlmICggbGNrLT5say5xbGsuaW5pdGlhbGl6ZWQgIT0gR0VUX1FMS19QVFIobGNrKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggR0VUX1FMS19QVFIobGNrKSApID09IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGxjay0+bGsucWxrLm93bmVyX2lkID0gZ3RpZCArIDE7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfYWRhcHRpdmVfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjaykgKSApCisgICAgeyAgIC8vIElmIHRoZSBsb2NrIGRvZXNuJ3QgbG9vayBjbGFpbWVkIHdlIG11c3QgYmUgc3BlY3VsYXRpbmcuCisgICAgICAgIC8vIChPciB0aGUgdXNlcidzIGNvZGUgaXMgYnVnZ3kgYW5kIHRoZXkncmUgcmVsZWFzaW5nIHdpdGhvdXQgbG9ja2luZzsKKyAgICAgICAgLy8gaWYgd2UgaGFkIFhURVNUIHdlJ2QgYmUgYWJsZSB0byBjaGVjayB0aGF0IGNhc2UuLi4pCisgICAgICAgIF94ZW5kKCk7ICAgICAgICAvLyBFeGl0IHNwZWN1bGF0aW9uCisgICAgICAgIF9fa21wX3VwZGF0ZV9iYWRuZXNzX2FmdGVyX3N1Y2Nlc3MoIGxjayApOworICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8vIFNpbmNlIHRoZSBsb2NrICppcyogdmlzaWJseSBsb2NrZWQgd2UncmUgbm90IHNwZWN1bGF0aW5nLAorICAgICAgICAvLyBzbyBzaG91bGQgdXNlIHRoZSB1bmRlcmx5aW5nIGxvY2sncyByZWxlYXNlIHNjaGVtZS4KKyAgICAgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjayksIGd0aWQgKTsKKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX2FkYXB0aXZlX2xvY2tfd2l0aF9jaGVja3MoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5xbGsuaW5pdGlhbGl6ZWQgIT0gR0VUX1FMS19QVFIobGNrKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggR0VUX1FMS19QVFIobGNrKSApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggR0VUX1FMS19QVFIobGNrKSApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICBsY2stPmxrLnFsay5vd25lcl9pZCA9IDA7CisgICAgX19rbXBfcmVsZWFzZV9hZGFwdGl2ZV9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2FkYXB0aXZlX2xvY2soIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjaykgKTsKKyAgICBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPSAwOworICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cyA9IDA7IC8vbm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMgPSAwOworICAgIGxjay0+bGsuYWRhcHRpdmUubWF4X3NvZnRfcmV0cmllcyA9IF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9zb2Z0X3JldHJpZXM7CisgICAgbGNrLT5say5hZGFwdGl2ZS5tYXhfYmFkbmVzcyAgICAgID0gX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3M7CisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgX19rbXBfemVyb19zcGVjdWxhdGl2ZV9zdGF0cyggJmxjay0+bGsuYWRhcHRpdmUgKTsKKyNlbmRpZgorICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrOiBsb2NrICVwIGluaXRpYWxpemVkXG4iLCBsY2spKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX2FkYXB0aXZlX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrKCBsY2sgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrICkKK3sKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBfX2ttcF9hY2N1bXVsYXRlX3NwZWN1bGF0aXZlX3N0YXRzKCAmbGNrLT5say5hZGFwdGl2ZSApOworI2VuZGlmCisgICAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2sgKEdFVF9RTEtfUFRSKGxjaykpOworICAgIC8vIE5vdGhpbmcgbmVlZGVkIGZvciB0aGUgc3BlY3VsYXRpdmUgcGFydC4KK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsucWxrLmluaXRpYWxpemVkICE9IEdFVF9RTEtfUFRSKGxjaykgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIEdFVF9RTEtfUFRSKGxjaykgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X2FkYXB0aXZlX2xvY2soIGxjayApOworfQorCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBEUkRQQSB0aWNrZXQgbG9ja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIkRSRFBBIiBtZWFucyBEeW5hbWljYWxseSBSZWNvbmZpZ3VyYWJsZSBEaXN0cmlidXRlZCBQb2xsaW5nIEFyZWEgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIFRDUl80KCBsY2stPmxrLm93bmVyX2lkICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZHJkcGFfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3VpbnQ2NCB0aWNrZXQgPSBLTVBfVEVTVF9USEVOX0lOQzY0KChrbXBfaW50NjQgKikmbGNrLT5say5uZXh0X3RpY2tldCk7CisgICAga21wX3VpbnQ2NCBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqcG9sbHMKKyAgICAgID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKworI2lmZGVmIFVTRV9MT0NLX1BST0ZJTEUKKyAgICBpZiAoVENSXzgocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCkgIT0gdGlja2V0KQorICAgICAgICBfX2ttcF9wcmludGYoIkxPQ0sgQ09OVEVOVElPTjogJXBcbiIsIGxjayk7CisgICAgLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgICAgLy8KKyAgICAvLyBOb3cgc3Bpbi13YWl0LCBidXQgcmVsb2FkIHRoZSBwb2xscyBwb2ludGVyIGFuZCBtYXNrLCBpbiBjYXNlIHRoZQorICAgIC8vIHBvbGxpbmcgYXJlYSBoYXMgYmVlbiByZWNvbmZpZ3VyZWQuICBVbmxlc3MgaXQgaXMgcmVjb25maWd1cmVkLCB0aGUKKyAgICAvLyByZWxvYWRzIHN0YXkgaW4gTDEgY2FjaGUgYW5kIGFyZSBjaGVhcC4KKyAgICAvLworICAgIC8vIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgd2l0aCBLTVBfV0FJVF9ZSUVMRCwgaW4ga21wX2Rpc3BhdGNoLmNwcCAhISEKKyAgICAvLworICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIEtNUF9XQUlUX1lJRUxEIGRvZXNuJ3QgYWxsb3cgZm9yIG1hc2sKKyAgICAvLyBhbmQgcG9sbCB0byBiZSByZS1yZWFkIGV2ZXJ5IHNwaW4gaXRlcmF0aW9uLgorICAgIC8vCisgICAga21wX3VpbnQzMiBzcGluczsKKworICAgIEtNUF9GU1lOQ19QUkVQQVJFKGxjayk7CisgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworICAgIHdoaWxlIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXS5wb2xsKSA8IHRpY2tldCkgeyAvLyB2b2xhdGlsZSBsb2FkCisgICAgICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10dXJuYXJvdW5kKSwgdGhlbiB5aWVsZC4KKyAgICAgICAgLy8gQ1BVIFBhdXNlIGlzIGluIHRoZSBtYWNyb3MgZm9yIHlpZWxkLgorICAgICAgICAvLworICAgICAgICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKQorICAgICAgICAgID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKTsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOworCisgICAgICAgIC8vIFJlLXJlYWQgdGhlIG1hc2sgYW5kIHRoZSBwb2xsIHBvaW50ZXIgZnJvbSB0aGUgbG9jayBzdHJ1Y3R1cmUuCisgICAgICAgIC8vCisgICAgICAgIC8vIE1ha2UgY2VydGFpbiB0aGF0ICJtYXNrIiBpcyByZWFkIGJlZm9yZSAicG9sbHMiICEhIQorICAgICAgICAvLworICAgICAgICAvLyBJZiBhbm90aGVyIHRocmVhZCBwaWNrcyByZWNvbmZpZ3VyZXMgdGhlIHBvbGxpbmcgYXJlYSBhbmQgdXBkYXRlcworICAgICAgICAvLyB0aGVpciB2YWx1ZXMsIGFuZCB3ZSBnZXQgdGhlIG5ldyB2YWx1ZSBvZiBtYXNrIGFuZCB0aGUgb2xkIHBvbGxzCisgICAgICAgIC8vIHBvaW50ZXIsIHdlIGNvdWxkIGFjY2VzcyBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG9sZCBwb2xsaW5nCisgICAgICAgIC8vIGFyZWEuCisgICAgICAgIC8vCisgICAgICAgIG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICAgICAgcG9sbHMgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIH0KKworICAgIC8vCisgICAgLy8gQ3JpdGljYWwgc2VjdGlvbiBzdGFydHMgaGVyZQorICAgIC8vCisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCBhY3F1aXJlZCBsb2NrICVwXG4iLAorICAgICAgdGlja2V0LCBsY2spKTsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gdGlja2V0OyAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisKKyAgICAvLworICAgIC8vIERlYWxsb2NhdGUgYSBnYXJiYWdlIHBvbGxpbmcgYXJlYSBpZiB3ZSBrbm93IHRoYXQgd2UgYXJlIHRoZSBsYXN0CisgICAgLy8gdGhyZWFkIHRoYXQgY291bGQgcG9zc2libHkgYWNjZXNzIGl0LgorICAgIC8vCisgICAgLy8gVGhlID49IGNoZWNrIGlzIGluIGNhc2UgX19rbXBfdGVzdF9kcmRwYV9sb2NrKCkgYWxsb2NhdGVkIHRoZSBjbGVhbnVwCisgICAgLy8gdGlja2V0LgorICAgIC8vCisgICAgaWYgKChsY2stPmxrLm9sZF9wb2xscyAhPSBOVUxMKSAmJiAodGlja2V0ID49IGxjay0+bGsuY2xlYW51cF90aWNrZXQpKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLm9sZF9wb2xscyk7CisgICAgICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgICAgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIHJlY29uZmlndXJlIHRoZSBwb2xsaW5nIGFyZWEuCisgICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgYSBnYXJiYWdlIHBvbGxpbmcgYXJlYSB0byBiZSBkZWFsbG9jYXRlZCBmcm9tIGEKKyAgICAvLyBwcmV2aW91cyByZWNvbmZpZ3VyYXRpb24sIGxldCBhIGxhdGVyIHRocmVhZCByZWNvbmZpZ3VyZSBpdC4KKyAgICAvLworICAgIGlmIChsY2stPmxrLm9sZF9wb2xscyA9PSBOVUxMKSB7CisgICAgICAgIGJvb2wgcmVjb25maWd1cmUgPSBmYWxzZTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKm9sZF9wb2xscyA9IHBvbGxzOworICAgICAgICBrbXBfdWludDMyIG51bV9wb2xscyA9IFRDUl80KGxjay0+bGsubnVtX3BvbGxzKTsKKworICAgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKQorICAgICAgICAgID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgYXJlIGluIG92ZXJzdWJzY3JpcHRpb24gbW9kZS4gIENvbnRyYWN0IHRoZSBwb2xsaW5nIGFyZWEKKyAgICAgICAgICAgIC8vIGRvd24gdG8gYSBzaW5nbGUgbG9jYXRpb24sIGlmIHRoYXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmIChudW1fcG9sbHMgPiAxKSB7CisgICAgICAgICAgICAgICAgcmVjb25maWd1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIG51bV9wb2xscyA9IFRDUl80KGxjay0+bGsubnVtX3BvbGxzKTsKKyAgICAgICAgICAgICAgICBtYXNrID0gMDsKKyAgICAgICAgICAgICAgICBudW1fcG9sbHMgPSAxOworICAgICAgICAgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShudW1fcG9sbHMgKiBzaXplb2YoKnBvbGxzKSk7CisgICAgICAgICAgICAgICAgcG9sbHNbMF0ucG9sbCA9IHRpY2tldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdW5kZXIvZnVsbHkgc3Vic2NyaWJlZCBtb2RlLiAgQ2hlY2sgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgLy8gdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSBsb2NrLiAgVGhlIHNpemUgb2YgdGhlIHBvbGxpbmcgYXJlYQorICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB3YWl0aW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGttcF91aW50NjQgbnVtX3dhaXRpbmcgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KSAtIHRpY2tldCAtIDE7CisgICAgICAgICAgICBpZiAobnVtX3dhaXRpbmcgPiBudW1fcG9sbHMpIHsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIG9sZF9udW1fcG9sbHMgPSBudW1fcG9sbHM7CisgICAgICAgICAgICAgICAgcmVjb25maWd1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IChtYXNrIDw8IDEpIHwgMTsKKyAgICAgICAgICAgICAgICAgICAgbnVtX3BvbGxzICo9IDI7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAobnVtX3BvbGxzIDw9IG51bV93YWl0aW5nKTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIG5ldyBwb2xsaW5nIGFyZWEsIGFuZCBjb3B5IHRoZSByZWxldmFudCBwb3J0aW9uCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIG9sZCBwb2xsaW5nIGFyZWEgdG8gdGhlIG5ldyBhcmVhLiAgX19rbXBfYWxsb2NhdGUoKQorICAgICAgICAgICAgICAgIC8vIHplcm9lcyB0aGUgbWVtb3J5IGl0IGFsbG9jYXRlcywgYW5kIG1vc3Qgb2YgdGhlIG9sZCBhcmVhIGlzCisgICAgICAgICAgICAgICAgLy8ganVzdCB6ZXJvIHBhZGRpbmcsIHNvIHdlIG9ubHkgY29weSB0aGUgcmVsZWFzZSBjb3VudGVycy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShudW1fcG9sbHMgKiBzaXplb2YoKnBvbGxzKSk7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGRfbnVtX3BvbGxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcG9sbHNbaV0ucG9sbCA9IG9sZF9wb2xsc1tpXS5wb2xsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWNvbmZpZ3VyZSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdyB3cml0ZSB0aGUgdXBkYXRlZCBmaWVsZHMgYmFjayB0byB0aGUgbG9jayBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTWFrZSBjZXJ0YWluIHRoYXQgInBvbGxzIiBpcyB3cml0dGVuIGJlZm9yZSAibWFzayIgISEhCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgYW5vdGhlciB0aHJlYWQgcGlja3MgdXAgdGhlIG5ldyB2YWx1ZSBvZiBtYXNrIGFuZCB0aGUgb2xkCisgICAgICAgICAgICAvLyBwb2xscyBwb2ludGVyICwgaXQgY291bGQgYWNjZXNzIG1lbW9yeSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgIC8vIG9sZCBwb2xsaW5nIGFyZWEuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gT24geDg2LCB3ZSBuZWVkIG1lbW9yeSBmZW5jZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCByZWNvbmZpZ3VyaW5nIGxvY2sgJXAgdG8gJWQgcG9sbHNcbiIsCisgICAgICAgICAgICAgIHRpY2tldCwgbGNrLCBudW1fcG9sbHMpKTsKKworICAgICAgICAgICAgbGNrLT5say5vbGRfcG9sbHMgPSBvbGRfcG9sbHM7ICAgICAgICAgICAgICAvLyBub24tdm9sYXRpbGUgc3RvcmUKKyAgICAgICAgICAgIGxjay0+bGsucG9sbHMgPSBwb2xsczsgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgc3RvcmUKKworICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgIGxjay0+bGsubnVtX3BvbGxzID0gbnVtX3BvbGxzOyAgICAgICAgICAgICAgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisgICAgICAgICAgICBsY2stPmxrLm1hc2sgPSBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIHN0b3JlCisKKyAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gT25seSBhZnRlciB0aGUgbmV3IHBvbGxpbmcgYXJlYSBhbmQgbWFzayBoYXZlIGJlZW4gZmx1c2hlZAorICAgICAgICAgICAgLy8gdG8gbWFpbiBtZW1vcnkgY2FuIHdlIHVwZGF0ZSB0aGUgY2xlYW51cCB0aWNrZXQgZmllbGQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZCAvIG5vbi12b2xhdGlsZSBzdG9yZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsID0gX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICBBTk5PVEFURV9EUkRQQV9BQ1FVSVJFRChsY2spOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vCisgICAgLy8gRmlyc3QgZ2V0IGEgdGlja2V0LCB0aGVuIHJlYWQgdGhlIHBvbGxzIHBvaW50ZXIgYW5kIHRoZSBtYXNrLgorICAgIC8vIFRoZSBwb2xscyBwb2ludGVyIG11c3QgYmUgcmVhZCBiZWZvcmUgdGhlIG1hc2shISEgKFNlZSBhYm92ZSkKKyAgICAvLworICAgIGttcF91aW50NjQgdGlja2V0ID0gVENSXzgobGNrLT5say5uZXh0X3RpY2tldCk7ICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKnBvbGxzCisgICAgICA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgVENSX1BUUihsY2stPmxrLnBvbGxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAga21wX3VpbnQ2NCBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBpZiAoVENSXzgocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCkgPT0gdGlja2V0KSB7CisgICAgICAgIGttcF91aW50NjQgbmV4dF90aWNrZXQgPSB0aWNrZXQgKyAxOworICAgICAgICBpZiAoS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KChrbXBfaW50NjQgKikmbGNrLT5say5uZXh0X3RpY2tldCwKKyAgICAgICAgICB0aWNrZXQsIG5leHRfdGlja2V0KSkgeworICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgICAgICAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX3Rlc3RfZHJkcGFfbG9jazogdGlja2V0ICMlbGxkIGFjcXVpcmVkIGxvY2sgJXBcbiIsCisgICAgICAgICAgICAgICB0aWNrZXQsIGxjaykpOworICAgICAgICAgICAgbGNrLT5say5ub3dfc2VydmluZyA9IHRpY2tldDsgICAgICAgICAgICAgICAvLyBub24tdm9sYXRpbGUgc3RvcmUKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNpbmNlIG5vIHRocmVhZHMgYXJlIHdhaXRpbmcsIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IHRoYXQKKyAgICAgICAgICAgIC8vIHdlIHdvdWxkIHdhbnQgdG8gcmVjb25maWd1cmUgdGhlIHBvbGxpbmcgYXJlYS4gIFdlIG1pZ2h0CisgICAgICAgICAgICAvLyBoYXZlIHRoZSBjbGVhbnVwIHRpY2tldCB2YWx1ZSAod2hpY2ggc2F5cyB0aGF0IGl0IGlzIG5vdworICAgICAgICAgICAgLy8gc2FmZSB0byBkZWFsbG9jYXRlIG9sZF9wb2xscyksIGJ1dCB3ZSdsbCBsZXQgYSBsYXRlciB0aHJlYWQKKyAgICAgICAgICAgIC8vIHdoaWNoIGNhbGxzIF9fa21wX2FjcXVpcmVfbG9jayBkbyB0aGF0IC0gdGhpcyByb3V0aW5lCisgICAgICAgICAgICAvLyBpc24ndCBzdXBwb3NlZCB0byBibG9jaywgYW5kIHdlIHdvdWxkIHJpc2sgYmxvY2tzIGlmIHdlCisgICAgICAgICAgICAvLyBjYWxsZWQgX19rbXBfZnJlZSgpIHRvIGRvIHRoZSBkZWFsbG9jYXRpb24uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vCisgICAgLy8gUmVhZCB0aGUgdGlja2V0IHZhbHVlIGZyb20gdGhlIGxvY2sgZGF0YSBzdHJ1Y3QsIHRoZW4gdGhlIHBvbGxzCisgICAgLy8gcG9pbnRlciBhbmQgdGhlIG1hc2suICBUaGUgcG9sbHMgcG9pbnRlciBtdXN0IGJlIHJlYWQgYmVmb3JlIHRoZQorICAgIC8vIG1hc2shISEgKFNlZSBhYm92ZSkKKyAgICAvLworICAgIGttcF91aW50NjQgdGlja2V0ID0gbGNrLT5say5ub3dfc2VydmluZyArIDE7ICAgICAgICAvLyBub24tdm9sYXRpbGUgbG9hZAorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICpwb2xscworICAgICAgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgIFRDUl9QVFIobGNrLT5say5wb2xscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIGttcF91aW50NjQgbWFzayA9IFRDUl84KGxjay0+bGsubWFzayk7ICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCByZWxlYXNlZCBsb2NrICVwXG4iLAorICAgICAgIHRpY2tldCAtIDEsIGxjaykpOworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgICBBTk5PVEFURV9EUkRQQV9SRUxFQVNFRChsY2spOworICAgIEtNUF9TVF9SRUw2NCgmKHBvbGxzW3RpY2tldCAmIG1hc2tdLnBvbGwpLCB0aWNrZXQpOyAvLyB2b2xhdGlsZSBzdG9yZQorICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfZHJkcGFfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wX2luaXRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gTlVMTDsKKyAgICBsY2stPmxrLm1hc2sgPSAwOworICAgIGxjay0+bGsubnVtX3BvbGxzID0gMTsKKyAgICBsY2stPmxrLnBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBfX2ttcF9hbGxvY2F0ZShsY2stPmxrLm51bV9wb2xscyAqIHNpemVvZigqKGxjay0+bGsucG9sbHMpKSk7CisgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgbGNrLT5say5vbGRfcG9sbHMgPSBOVUxMOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOyAgICAgIC8vIG5vIHRocmVhZCBvd25zIHRoZSBsb2NrLgorICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzLgorICAgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBsY2s7CisKKyAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX2luaXRfZHJkcGFfbG9jazogbG9jayAlcCBpbml0aWFsaXplZFxuIiwgbGNrKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZHJkcGFfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gTlVMTDsKKyAgICBsY2stPmxrLmxvY2F0aW9uICAgID0gTlVMTDsKKyAgICBpZiAobGNrLT5say5wb2xscyAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLnBvbGxzKTsKKyAgICAgICAgbGNrLT5say5wb2xscyA9IE5VTEw7CisgICAgfQorICAgIGlmIChsY2stPmxrLm9sZF9wb2xscyAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKilsY2stPmxrLm9sZF9wb2xscyk7CisgICAgICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgICB9CisgICAgbGNrLT5say5tYXNrID0gMDsKKyAgICBsY2stPmxrLm51bV9wb2xscyA9IDA7CisgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IDA7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIGRyZHBhIHRpY2tldCBsb2NrcworLy8KKworaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgQU5OT1RBVEVfRFJEUEFfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfZHJkcGFfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIEtNUF9NQigpOworICAgIGlmICggLS0obGNrLT5say5kZXB0aF9sb2NrZWQpID09IDAgKSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgIH0KKyAgICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfbmVzdGVkX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2RyZHBhX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBhY2Nlc3MgZnVuY3Rpb25zIHRvIGZpZWxkcyB3aGljaCBkb24ndCBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisvLworCitzdGF0aWMgaW50CitfX2ttcF9pc19kcmRwYV9sb2NrX2luaXRpYWxpemVkKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2sgPT0gbGNrLT5say5pbml0aWFsaXplZDsKK30KKworc3RhdGljIGNvbnN0IGlkZW50X3QgKgorX19rbXBfZ2V0X2RyZHBhX2xvY2tfbG9jYXRpb24oIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsubG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfZHJkcGFfbG9ja19sb2NhdGlvbigga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBsb2M7Cit9CisKK3N0YXRpYyBrbXBfbG9ja19mbGFnc190CitfX2ttcF9nZXRfZHJkcGFfbG9ja19mbGFncygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5mbGFnczsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF9kcmRwYV9sb2NrX2ZsYWdzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworLy8gVGltZSBzdGFtcCBjb3VudGVyCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorIyBkZWZpbmUgX19rbXBfdHNjKCkgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKCkKKy8vIFJ1bnRpbWUncyBkZWZhdWx0IGJhY2tvZmYgcGFyYW1ldGVycwora21wX2JhY2tvZmZfdCBfX2ttcF9zcGluX2JhY2tvZmZfcGFyYW1zID0geyAxLCA0MDk2LCAxMDAgfTsKKyNlbHNlCisvLyBVc2UgbmFub3NlY29uZHMgZm9yIG90aGVyIHBsYXRmb3JtcworZXh0ZXJuIGttcF91aW50NjQgX19rbXBfbm93X25zZWMoKTsKK2ttcF9iYWNrb2ZmX3QgX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtcyA9IHsgMSwgMjU2LCAxMDAgfTsKKyMgZGVmaW5lIF9fa21wX3RzYygpIF9fa21wX25vd19uc2VjKCkKKyNlbmRpZgorCisvLyBBIHVzZWZ1bCBwcmVkaWNhdGUgZm9yIGRlYWxpbmcgd2l0aCB0aW1lc3RhbXBzIHRoYXQgbWF5IHdyYXAuCisvLyBJcyBhIGJlZm9yZSBiPworLy8gU2luY2UgdGhlIHRpbWVzdGFtcHMgbWF5IHdyYXAsIHRoaXMgaXMgYXNraW5nIHdoZXRoZXIgaXQncworLy8gc2hvcnRlciB0byBnbyBjbG9ja3dpc2UgZnJvbSBhIHRvIGIgYXJvdW5kIHRoZSBjbG9jay1mYWNlLCBvciBhbnRpLWNsb2Nrd2lzZS4KKy8vIFRpbWVzIHdoZXJlIGdvaW5nIGNsb2Nrd2lzZSBpcyBsZXNzIGRpc3RhbmNlIHRoYW4gZ29pbmcgYW50aS1jbG9ja3dpc2UKKy8vIGFyZSBpbiB0aGUgZnV0dXJlLCBvdGhlcnMgYXJlIGluIHRoZSBwYXN0LgorLy8gZS5nLikgYSA9IE1BWC0xLCBiID0gTUFYKzEgKD0wKSwgdGhlbiBhID4gYiAodHJ1ZSkgZG9lcyBub3QgbWVhbiBhIHJlYWNoZWQgYgorLy8gICAgICAgd2hlcmVhcyBzaWduZWQoYSkgPSAtMiwgc2lnbmVkKGIpID0gMCBjYXB0dXJlcyB0aGUgYWN0dWFsIGRpZmZlcmVuY2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBiZWZvcmUoa21wX3VpbnQ2NCBhLCBrbXBfdWludDY0IGIpCit7CisgICAgcmV0dXJuICgoa21wX2ludDY0KWIgLSAoa21wX2ludDY0KWEpID4gMDsKK30KKworLy8gVHJ1bmNhdGVkIGJpbmFyeSBleHBvbmVudGlhbCBiYWNrb2ZmIGZ1bmN0aW9uCit2b2lkCitfX2ttcF9zcGluX2JhY2tvZmYoa21wX2JhY2tvZmZfdCAqYm9mZikKK3sKKyAgICAvLyBXZSBjb3VsZCBmbGF0dGVuIHRoaXMgbG9vcCwgYnV0IG1ha2luZyBpdCBhIG5lc3RlZCBsb29wIGdpdmVzIGJldHRlciByZXN1bHQuCisgICAga21wX3VpbnQzMiBpOworICAgIGZvciAoaSA9IGJvZmYtPnN0ZXA7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAga21wX3VpbnQ2NCBnb2FsID0gX19rbXBfdHNjKCkgKyBib2ZmLT5taW5fdGljazsKKyAgICAgICAgZG8geworICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICB9IHdoaWxlIChiZWZvcmUoX19rbXBfdHNjKCksIGdvYWwpKTsKKyAgICB9CisgICAgYm9mZi0+c3RlcCA9IChib2ZmLT5zdGVwPDwxIHwgMSkgJiAoYm9mZi0+bWF4X2JhY2tvZmYtMSk7Cit9CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLyBEaXJlY3QgbG9jayBpbml0aWFsaXplcnMuIEl0IHNpbXBseSB3cml0ZXMgYSB0YWcgdG8gdGhlIGxvdyA4IGJpdHMgb2YgdGhlIGxvY2sgd29yZC4KK3N0YXRpYyB2b2lkIF9fa21wX2luaXRfZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICpsY2ssIGttcF9keW5hX2xvY2tzZXFfdCBzZXEpCit7CisgICAgVENXXzQoKmxjaywgS01QX0dFVF9EX1RBRyhzZXEpKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9pbml0X2RpcmVjdF9sb2NrOiBpbml0aWFsaXplZCBkaXJlY3QgbG9jayB3aXRoIHR5cGUjJWRcbiIsIHNlcSkpOworfQorCisjaWYgS01QX1VTRV9UU1gKKworLy8gSExFIGxvY2sgZnVuY3Rpb25zIC0gaW1wb3J0ZWQgZnJvbSB0aGUgdGVzdGJlZCBydW50aW1lLgorI2RlZmluZSBITEVfQUNRVUlSRSAiLmJ5dGUgMHhmMjsiCisjZGVmaW5lIEhMRV9SRUxFQVNFICIuYnl0ZSAweGYzOyIKKworc3RhdGljIGlubGluZSBrbXBfdWludDMyCitzd2FwNChrbXBfdWludDMyIHZvbGF0aWxlICpwLCBrbXBfdWludDMyIHYpCit7CisgICAgX19hc21fXyB2b2xhdGlsZShITEVfQUNRVUlSRSAieGNoZyAlMSwlMCIKKyAgICAgICAgICAgICAgICAgICAgOiAiK3IiKHYpLCAiK20iKCpwKQorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIpOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9obGVfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxjaykKK3sKKyAgICBUQ1dfNCgqbGNrLCAwKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfaGxlX2xvY2soa21wX2R5bmFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIC8vIFVzZSBndGlkIGZvciBLTVBfTE9DS19CVVNZIGlmIG5lY2Vzc2FyeQorICAgIGlmIChzd2FwNChsY2ssIEtNUF9MT0NLX0JVU1koMSwgaGxlKSkgIT0gS01QX0xPQ0tfRlJFRShobGUpKSB7CisgICAgICAgIGludCBkZWxheSA9IDE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHdoaWxlICgqKGttcF91aW50MzIgdm9sYXRpbGUgKilsY2sgIT0gS01QX0xPQ0tfRlJFRShobGUpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGRlbGF5OyBpICE9IDA7IC0taSkKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICAgIGRlbGF5ID0gKChkZWxheSA8PCAxKSB8IDEpICYgNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoc3dhcDQobGNrLCBLTVBfTE9DS19CVVNZKDEsIGhsZSkpICE9IEtNUF9MT0NLX0ZSRUUoaGxlKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9obGVfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgX19rbXBfYWNxdWlyZV9obGVfbG9jayhsY2ssIGd0aWQpOyAvLyBUT0RPOiBhZGQgY2hlY2tzCit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfaGxlX2xvY2soa21wX2R5bmFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIF9fYXNtX18gdm9sYXRpbGUoSExFX1JFTEVBU0UgIm1vdmwgJTEsJTAiCisgICAgICAgICAgICAgICAgICAgIDogIj1tIigqbGNrKQorICAgICAgICAgICAgICAgICAgICA6ICJyIihLTVBfTE9DS19GUkVFKGhsZSkpCisgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIpOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9obGVfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfaGxlX2xvY2sobGNrLCBndGlkKTsgLy8gVE9ETzogYWRkIGNoZWNrcworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2hsZV9sb2NrKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICByZXR1cm4gc3dhcDQobGNrLCBLTVBfTE9DS19CVVNZKDEsIGhsZSkpID09IEtNUF9MT0NLX0ZSRUUoaGxlKTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9obGVfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfaGxlX2xvY2sobGNrLCBndGlkKTsgLy8gVE9ETzogYWRkIGNoZWNrcworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9ydG1fbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaykKK3sKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayhsY2spOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9ydG1fbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaykKK3sKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayhsY2spOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9ydG1fbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgdW5zaWduZWQgcmV0cmllcz0zLCBzdGF0dXM7CisgICAgZG8geworICAgICAgICBzdGF0dXMgPSBfeGJlZ2luKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gX1hCRUdJTl9TVEFSVEVEKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKGxjaykpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgX3hhYm9ydCgweGZmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0YXR1cyAmIF9YQUJPUlRfRVhQTElDSVQpICYmIF9YQUJPUlRfQ09ERShzdGF0dXMpID09IDB4ZmYpIHsKKyAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgbG9jayBiZWNvbWVzIGZyZWUKKyAgICAgICAgICAgIHdoaWxlICghIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayhsY2spKQorICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkKFRSVUUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCEoc3RhdHVzICYgX1hBQk9SVF9SRVRSWSkpCisgICAgICAgICAgICBicmVhazsKKyAgICB9IHdoaWxlIChyZXRyaWVzLS0pOworCisgICAgLy8gRmFsbC1iYWNrIG5vbi1zcGVjdWxhdGl2ZSBsb2NrICh4Y2hnKQorICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrKGxjaywgZ3RpZCk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX3J0bV9sb2NrX3dpdGhfY2hlY2tzKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX3J0bV9sb2NrKGxjaywgZ3RpZCk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfcnRtX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIGlmIChfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSkgeworICAgICAgICAvLyBSZWxlYXNpbmcgZnJvbSBzcGVjdWxhdGlvbgorICAgICAgICBfeGVuZCgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gUmVsZWFzaW5nIGZyb20gYSByZWFsIGxvY2sKKyAgICAgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2sobGNrLCBndGlkKTsKKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX3J0bV9sb2NrX3dpdGhfY2hlY2tzKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9ydG1fbG9jayhsY2ssIGd0aWQpOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3J0bV9sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICB1bnNpZ25lZCByZXRyaWVzPTMsIHN0YXR1czsKKyAgICBkbyB7CisgICAgICAgIHN0YXR1cyA9IF94YmVnaW4oKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBfWEJFR0lOX1NUQVJURUQgJiYgX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKGxjaykpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICghKHN0YXR1cyAmIF9YQUJPUlRfUkVUUlkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfSB3aGlsZSAocmV0cmllcy0tKTsKKworICAgIHJldHVybiAoX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKGxjaykpPyAxOiAwOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3J0bV9sb2NrX3dpdGhfY2hlY2tzKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICByZXR1cm4gX19rbXBfdGVzdF9ydG1fbG9jayhsY2ssIGd0aWQpOworfQorCisjZW5kaWYgLy8gS01QX1VTRV9UU1gKKworLy8gRW50cnkgZnVuY3Rpb25zIGZvciBpbmRpcmVjdCBsb2NrcyAoZmlyc3QgZWxlbWVudCBvZiBkaXJlY3QgbG9jayBqdW1wIHRhYmxlcykuCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbCwga21wX2R5bmFfbG9ja3NlcV90IHRhZyk7CitzdGF0aWMgdm9pZCBfX2ttcF9kZXN0cm95X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbG9jayk7CitzdGF0aWMgdm9pZCBfX2ttcF9zZXRfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIpOworc3RhdGljIGludCAgX19rbXBfdW5zZXRfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIpOworc3RhdGljIGludCAgX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMik7CitzdGF0aWMgdm9pZCBfX2ttcF9zZXRfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIpOworc3RhdGljIGludCAgX19rbXBfdW5zZXRfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIpOworc3RhdGljIGludCAgX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMik7CisKKy8vCisvLyBKdW1wIHRhYmxlcyBmb3IgdGhlIGluZGlyZWN0IGxvY2sgZnVuY3Rpb25zLgorLy8gT25seSBmaWxsIGluIHRoZSBvZGQgZW50cmllcywgdGhhdCBhdm9pZHMgdGhlIG5lZWQgdG8gc2hpZnQgb3V0IHRoZSBsb3cgYml0LgorLy8KKworLy8gaW5pdCBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAwLF9fa21wX2luaXRfZGlyZWN0X2xvY2ssCit2b2lkICgqX19rbXBfZGlyZWN0X2luaXRbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9keW5hX2xvY2tzZXFfdCkKKyAgICA9IHsgX19rbXBfaW5pdF9pbmRpcmVjdF9sb2NrLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCBpbml0KSB9OworI3VuZGVmIGV4cGFuZAorCisvLyBkZXN0cm95IGZ1bmN0aW9ucworI2RlZmluZSBleHBhbmQobCwgb3ApIDAsKHZvaWQgKCopKGttcF9keW5hX2xvY2tfdCAqKSlfX2ttcF8jI29wIyNfIyNsIyNfbG9jaywKK3ZvaWQgKCpfX2ttcF9kaXJlY3RfZGVzdHJveVtdKShrbXBfZHluYV9sb2NrX3QgKikKKyAgICA9IHsgX19rbXBfZGVzdHJveV9pbmRpcmVjdF9sb2NrLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCBkZXN0cm95KSB9OworI3VuZGVmIGV4cGFuZAorCisvLyBzZXQvYWNxdWlyZSBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAwLCh2b2lkICgqKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfbG9jaywKK3N0YXRpYyB2b2lkICgqZGlyZWN0X3NldFtdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKQorICAgID0geyBfX2ttcF9zZXRfaW5kaXJlY3RfbG9jaywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgYWNxdWlyZSkgfTsKKyN1bmRlZiBleHBhbmQKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAwLCh2b2lkICgqKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfbG9ja193aXRoX2NoZWNrcywKK3N0YXRpYyB2b2lkICgqZGlyZWN0X3NldF9jaGVja1tdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKQorICAgID0geyBfX2ttcF9zZXRfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgYWNxdWlyZSkgfTsKKyN1bmRlZiBleHBhbmQKKworLy8gdW5zZXQvcmVsZWFzZSBhbmQgdGVzdCBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAwLChpbnQgICgqKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfbG9jaywKK3N0YXRpYyBpbnQgKCpkaXJlY3RfdW5zZXRbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikKKyAgICA9IHsgX19rbXBfdW5zZXRfaW5kaXJlY3RfbG9jaywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgcmVsZWFzZSkgfTsKK3N0YXRpYyBpbnQgICgqZGlyZWN0X3Rlc3RbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikKKyAgICA9IHsgX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCB0ZXN0KSB9OworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCwgb3ApIDAsKGludCAgKCopKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI19sb2NrX3dpdGhfY2hlY2tzLAorc3RhdGljIGludCAoKmRpcmVjdF91bnNldF9jaGVja1tdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKQorICAgID0geyBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCByZWxlYXNlKSB9Oworc3RhdGljIGludCAoKmRpcmVjdF90ZXN0X2NoZWNrW10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpCisgICAgPSB7IF9fa21wX3Rlc3RfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgdGVzdCkgfTsKKyN1bmRlZiBleHBhbmQKKworLy8gRXhwb3NlcyBvbmx5IG9uZSBzZXQgb2YganVtcCB0YWJsZXMgKCpsb2NrIG9yICpsb2NrX3dpdGhfY2hlY2tzKS4KK3ZvaWQgKCooKl9fa21wX2RpcmVjdF9zZXQpKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSA9IDA7CitpbnQgKCooKl9fa21wX2RpcmVjdF91bnNldCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpID0gMDsKK2ludCAoKigqX19rbXBfZGlyZWN0X3Rlc3QpKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSA9IDA7CisKKy8vCisvLyBKdW1wIHRhYmxlcyBmb3IgdGhlIGluZGlyZWN0IGxvY2sgZnVuY3Rpb25zLgorLy8KKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wKSlfX2ttcF8jI29wIyNfIyNsIyNfIyNsb2NrLAordm9pZCAoKl9fa21wX2luZGlyZWN0X2luaXRbXSkoa21wX3VzZXJfbG9ja19wKSA9IHsgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgaW5pdCkgfTsKK3ZvaWQgKCpfX2ttcF9pbmRpcmVjdF9kZXN0cm95W10pKGttcF91c2VyX2xvY2tfcCkgPSB7IEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIGRlc3Ryb3kpIH07CisjdW5kZWYgZXhwYW5kCisKKy8vIHNldC9hY3F1aXJlIGZ1bmN0aW9ucworI2RlZmluZSBleHBhbmQobCwgb3ApICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjXyMjbG9jaywKK3N0YXRpYyB2b2lkICgqaW5kaXJlY3Rfc2V0W10pKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IHsgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgYWNxdWlyZSkgfTsKKyN1bmRlZiBleHBhbmQKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI18jI2xvY2tfd2l0aF9jaGVja3MsCitzdGF0aWMgdm9pZCAoKmluZGlyZWN0X3NldF9jaGVja1tdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSB7IEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIGFjcXVpcmUpIH07CisjdW5kZWYgZXhwYW5kCisKKy8vIHVuc2V0L3JlbGVhc2UgYW5kIHRlc3QgZnVuY3Rpb25zCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgKGludCAgKCopKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfIyNsb2NrLAorc3RhdGljIGludCAoKmluZGlyZWN0X3Vuc2V0W10pKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IHsgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgcmVsZWFzZSkgfTsKK3N0YXRpYyBpbnQgKCppbmRpcmVjdF90ZXN0W10pKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IHsgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgdGVzdCkgfTsKKyN1bmRlZiBleHBhbmQKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAoaW50ICAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI18jI2xvY2tfd2l0aF9jaGVja3MsCitzdGF0aWMgaW50ICgqaW5kaXJlY3RfdW5zZXRfY2hlY2tbXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCByZWxlYXNlKSB9Oworc3RhdGljIGludCAoKmluZGlyZWN0X3Rlc3RfY2hlY2tbXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCB0ZXN0KSB9OworI3VuZGVmIGV4cGFuZAorCisvLyBFeHBvc2VzIG9ubHkgb25lIGp1bXAgdGFibGVzICgqbG9jayBvciAqbG9ja193aXRoX2NoZWNrcykuCit2b2lkICgqKCpfX2ttcF9pbmRpcmVjdF9zZXQpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSAwOworaW50ICgqKCpfX2ttcF9pbmRpcmVjdF91bnNldCkpKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IDA7CitpbnQgKCooKl9fa21wX2luZGlyZWN0X3Rlc3QpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSAwOworCisvLyBMb2NrIGluZGV4IHRhYmxlLgora21wX2luZGlyZWN0X2xvY2tfdGFibGVfdCBfX2ttcF9pX2xvY2tfdGFibGU7CisKKy8vIFNpemUgb2YgaW5kaXJlY3QgbG9ja3MuCitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbS01QX05VTV9JX0xPQ0tTXSA9IHsgMCB9OworCisvLyBKdW1wIHRhYmxlcyBmb3IgbG9jayBhY2Nlc3Nvci9tb2RpZmllci4KK3ZvaWQgKCpfX2ttcF9pbmRpcmVjdF9zZXRfbG9jYXRpb25bS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICopID0geyAwIH07Cit2b2lkICgqX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCkgPSB7IDAgfTsKK2NvbnN0IGlkZW50X3QgKiAoKl9fa21wX2luZGlyZWN0X2dldF9sb2NhdGlvbltLTVBfTlVNX0lfTE9DS1NdKShrbXBfdXNlcl9sb2NrX3ApID0geyAwIH07CitrbXBfbG9ja19mbGFnc190ICgqX19rbXBfaW5kaXJlY3RfZ2V0X2ZsYWdzW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCkgPSB7IDAgfTsKKworLy8gVXNlIGRpZmZlcmVudCBsb2NrIHBvb2xzIGZvciBkaWZmZXJlbnQgbG9jayB0eXBlcy4KK3N0YXRpYyBrbXBfaW5kaXJlY3RfbG9ja190ICogX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW0tNUF9OVU1fSV9MT0NLU10gPSB7IDAgfTsKKworLy8gVXNlciBsb2NrIGFsbG9jYXRvciBmb3IgZHluYW1pY2FsbHkgZGlzcGF0Y2hlZCBpbmRpcmVjdCBsb2Nrcy4KKy8vIEV2ZXJ5IGVudHJ5IG9mIHRoZSBpbmRpcmVjdCBsb2NrIHRhYmxlIGhvbGRzIHRoZSBhZGRyZXNzIGFuZCB0eXBlIG9mIHRoZSBhbGxvY2F0ZWQgaW5kcmVjdCBsb2NrCisvLyAoa21wX2luZGlyZWN0X2xvY2tfdCksIGFuZCB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgZG91YmxlcyB3aGVuIGl0IGlzIGZ1bGwuIEEgZGVzdHJveWVkIGluZGlyZWN0IGxvY2sKKy8vIG9iamVjdCBpcyByZXR1cm5lZCB0byB0aGUgcmV1c2FibGUgcG9vbCBvZiBsb2NrcywgdW5pcXVlIHRvIGVhY2ggbG9jayB0eXBlLgora21wX2luZGlyZWN0X2xvY2tfdCAqCitfX2ttcF9hbGxvY2F0ZV9pbmRpcmVjdF9sb2NrKHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLCBrbXBfaW5kaXJlY3RfbG9ja3RhZ190IHRhZykKK3sKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsY2s7CisgICAga21wX2xvY2tfaW5kZXhfdCBpZHg7CisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkKTsKKworICAgIGlmIChfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbdGFnXSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFJldXNlIHRoZSBhbGxvY2F0ZWQgYW5kIGRlc3Ryb3llZCBsb2NrIG9iamVjdAorICAgICAgICBsY2sgPSBfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbdGFnXTsKKyAgICAgICAgaWYgKE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopKQorICAgICAgICAgICAgaWR4ID0gbGNrLT5sb2NrLT5wb29sLmluZGV4OworICAgICAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbdGFnXSA9IChrbXBfaW5kaXJlY3RfbG9ja190ICopbGNrLT5sb2NrLT5wb29sLm5leHQ7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2s6IHJldXNpbmcgYW4gZXhpc3RpbmcgbG9jayAlcFxuIiwgbGNrKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWR4ID0gX19rbXBfaV9sb2NrX3RhYmxlLm5leHQ7CisgICAgICAgIC8vIENoZWNrIGNhcGFjaXR5IGFuZCBkb3VibGUgdGhlIHNpemUgaWYgaXQgaXMgZnVsbAorICAgICAgICBpZiAoaWR4ID09IF9fa21wX2lfbG9ja190YWJsZS5zaXplKSB7CisgICAgICAgICAgICAvLyBEb3VibGUgdXAgdGhlIHNwYWNlIGZvciBibG9jayBwb2ludGVycworICAgICAgICAgICAgaW50IHJvdyA9IF9fa21wX2lfbG9ja190YWJsZS5zaXplL0tNUF9JX0xPQ0tfQ0hVTks7CisgICAgICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICoqb2xkX3RhYmxlID0gX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlOworICAgICAgICAgICAgX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopX19rbXBfYWxsb2NhdGUoMipyb3cqc2l6ZW9mKGttcF9pbmRpcmVjdF9sb2NrX3QgKikpOworICAgICAgICAgICAgS01QX01FTUNQWShfX2ttcF9pX2xvY2tfdGFibGUudGFibGUsIG9sZF90YWJsZSwgcm93KnNpemVvZihrbXBfaW5kaXJlY3RfbG9ja190ICopKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUob2xkX3RhYmxlKTsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIG5ldyBvYmplY3RzIGluIHRoZSBuZXcgYmxvY2tzCisgICAgICAgICAgICBmb3IgKGludCBpID0gcm93OyBpIDwgMipyb3c7ICsraSkKKyAgICAgICAgICAgICAgICAqKF9fa21wX2lfbG9ja190YWJsZS50YWJsZSArIGkpID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoS01QX0lfTE9DS19DSFVOSypzaXplb2Yoa21wX2luZGlyZWN0X2xvY2tfdCkpOworICAgICAgICAgICAgX19rbXBfaV9sb2NrX3RhYmxlLnNpemUgPSAyKmlkeDsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9pX2xvY2tfdGFibGUubmV4dCsrOworICAgICAgICBsY2sgPSBLTVBfR0VUX0lfTE9DSyhpZHgpOworICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyBiYXNlIGxvY2sgb2JqZWN0CisgICAgICAgIGxjay0+bG9jayA9IChrbXBfdXNlcl9sb2NrX3ApX19rbXBfYWxsb2NhdGUoX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW3RhZ10pOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9hbGxvY2F0ZV9pbmRpcmVjdF9sb2NrOiBhbGxvY2F0ZWQgYSBuZXcgbG9jayAlcFxuIiwgbGNrKSk7CisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCk7CisKKyAgICBsY2stPnR5cGUgPSB0YWc7CisKKyAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICAgICAgKigoa21wX2xvY2tfaW5kZXhfdCAqKXVzZXJfbG9jaykgPSBpZHggPDwgMTsgLy8gaW5kaXJlY3QgbG9jayB3b3JkIG11c3QgYmUgZXZlbi4KKyAgICB9IGVsc2UgeworICAgICAgICAqKChrbXBfaW5kaXJlY3RfbG9ja190ICoqKXVzZXJfbG9jaykgPSBsY2s7CisgICAgfQorCisgICAgcmV0dXJuIGxjazsKK30KKworLy8gVXNlciBsb2NrIGxvb2t1cCBmb3IgZHluYW1pY2FsbHkgZGlzcGF0Y2hlZCBsb2Nrcy4KK3N0YXRpYyBfX2ZvcmNlaW5saW5lCitrbXBfaW5kaXJlY3RfbG9ja190ICoKK19fa21wX2xvb2t1cF9pbmRpcmVjdF9sb2NrKHZvaWQgKip1c2VyX2xvY2ssIGNvbnN0IGNoYXIgKmZ1bmMpCit7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsY2sgPSBOVUxMOworICAgICAgICBpZiAodXNlcl9sb2NrID09IE5VTEwpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICAgICAgICAgIGttcF9sb2NrX2luZGV4X3QgaWR4ID0gS01QX0VYVFJBQ1RfSV9JTkRFWCh1c2VyX2xvY2spOworICAgICAgICAgICAgaWYgKGlkeCA+PSBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxjayA9IEtNUF9HRVRfSV9MT0NLKGlkeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsY2sgPSAqKChrbXBfaW5kaXJlY3RfbG9ja190ICoqKXVzZXJfbG9jayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxjayA9PSBOVUxMKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxjazsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICAgICAgICAgIHJldHVybiBLTVBfR0VUX0lfTE9DSyhLTVBfRVhUUkFDVF9JX0lOREVYKHVzZXJfbG9jaykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopdXNlcl9sb2NrKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfZHluYV9sb2Nrc2VxX3Qgc2VxKQoreworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBpZiAoc2VxID09IGxvY2tzZXFfYWRhcHRpdmUgJiYgIV9fa21wX2NwdWluZm8ucnRtKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFkYXB0aXZlTm90U3VwcG9ydGVkLCAia21wX2xvY2tzZXFfdCIsICJhZGFwdGl2ZSIpOworICAgICAgICBzZXEgPSBsb2Nrc2VxX3F1ZXVpbmc7CisgICAgfQorI2VuZGlmCisjaWYgS01QX1VTRV9UU1gKKyAgICBpZiAoc2VxID09IGxvY2tzZXFfcnRtICYmICFfX2ttcF9jcHVpbmZvLnJ0bSkgeworICAgICAgICBzZXEgPSBsb2Nrc2VxX3F1ZXVpbmc7CisgICAgfQorI2VuZGlmCisgICAga21wX2luZGlyZWN0X2xvY2t0YWdfdCB0YWcgPSBLTVBfR0VUX0lfVEFHKHNlcSk7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IF9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgX19rbXBfZW50cnlfZ3RpZCgpLCB0YWcpOworICAgIEtNUF9JX0xPQ0tfRlVOQyhsLCBpbml0KShsLT5sb2NrKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9pbml0X2luZGlyZWN0X2xvY2s6IGluaXRpYWxpemVkIGluZGlyZWN0IGxvY2sgd2l0aCB0eXBlIyVkXG4iLCBzZXEpKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrKQoreworICAgIGttcF91aW50MzIgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF9kZXN0cm95X2xvY2siKTsKKyAgICBLTVBfSV9MT0NLX0ZVTkMobCwgZGVzdHJveSkobC0+bG9jayk7CisgICAga21wX2luZGlyZWN0X2xvY2t0YWdfdCB0YWcgPSBsLT50eXBlOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCk7CisKKyAgICAvLyBVc2UgdGhlIGJhc2UgbG9jaydzIHNwYWNlIHRvIGtlZXAgdGhlIHBvb2wgY2hhaW4uCisgICAgbC0+bG9jay0+cG9vbC5uZXh0ID0gKGttcF91c2VyX2xvY2tfcClfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbdGFnXTsKKyAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICAgICAgbC0+bG9jay0+cG9vbC5pbmRleCA9IEtNUF9FWFRSQUNUX0lfSU5ERVgobG9jayk7CisgICAgfQorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddID0gbDsKKworICAgIF9fa21wX3JlbGVhc2VfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyIGd0aWQpCit7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgIEtNUF9JX0xPQ0tfRlVOQyhsLCBzZXQpKGwtPmxvY2ssIGd0aWQpOworfQorCitzdGF0aWMgaW50CitfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHVuc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHRlc3QpKGwtPmxvY2ssIGd0aWQpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyIGd0aWQpCit7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IF9fa21wX2xvb2t1cF9pbmRpcmVjdF9sb2NrKCh2b2lkICoqKWxvY2ssICJvbXBfc2V0X2xvY2siKTsKKyAgICBLTVBfSV9MT0NLX0ZVTkMobCwgc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludAorX19rbXBfdW5zZXRfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF91bnNldF9sb2NrIik7CisgICAgcmV0dXJuIEtNUF9JX0xPQ0tfRlVOQyhsLCB1bnNldCkobC0+bG9jaywgZ3RpZCk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF90ZXN0X2xvY2siKTsKKyAgICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHRlc3QpKGwtPmxvY2ssIGd0aWQpOworfQorCitrbXBfZHluYV9sb2Nrc2VxX3QgX19rbXBfdXNlcl9sb2NrX3NlcSA9IGxvY2tzZXFfcXVldWluZzsKKworLy8gVGhpcyBpcyB1c2VkIG9ubHkgaW4ga21wX2Vycm9yLmNwcCB3aGVuIGNvbnNpc3RlbmN5IGNoZWNraW5nIGlzIG9uLgora21wX2ludDMyCitfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF91aW50MzIgc2VxKQoreworICAgIHN3aXRjaCAoc2VxKSB7CisgICAgICAgIGNhc2UgbG9ja3NlcV90YXM6CisgICAgICAgIGNhc2UgbG9ja3NlcV9uZXN0ZWRfdGFzOgorICAgICAgICAgICAgcmV0dXJuIF9fa21wX2dldF90YXNfbG9ja19vd25lcigoa21wX3Rhc19sb2NrX3QgKilsY2spOworI2lmIEtNUF9VU0VfRlVURVgKKyAgICAgICAgY2FzZSBsb2Nrc2VxX2Z1dGV4OgorICAgICAgICBjYXNlIGxvY2tzZXFfbmVzdGVkX2Z1dGV4OgorICAgICAgICAgICAgcmV0dXJuIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKChrbXBfZnV0ZXhfbG9ja190ICopbGNrKTsKKyNlbmRpZgorICAgICAgICBjYXNlIGxvY2tzZXFfdGlja2V0OgorICAgICAgICBjYXNlIGxvY2tzZXFfbmVzdGVkX3RpY2tldDoKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoKGttcF90aWNrZXRfbG9ja190ICopbGNrKTsKKyAgICAgICAgY2FzZSBsb2Nrc2VxX3F1ZXVpbmc6CisgICAgICAgIGNhc2UgbG9ja3NlcV9uZXN0ZWRfcXVldWluZzoKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgIGNhc2UgbG9ja3NlcV9hZGFwdGl2ZToKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoKGttcF9xdWV1aW5nX2xvY2tfdCAqKWxjayk7CisgICAgICAgIGNhc2UgbG9ja3NlcV9kcmRwYToKKyAgICAgICAgY2FzZSBsb2Nrc2VxX25lc3RlZF9kcmRwYToKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lcigoa21wX2RyZHBhX2xvY2tfdCAqKWxjayk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8vIEluaXRpYWxpemVzIGRhdGEgZm9yIGR5bmFtaWMgdXNlciBsb2Nrcy4KK3ZvaWQKK19fa21wX2luaXRfZHluYW1pY191c2VyX2xvY2tzKCkKK3sKKyAgICAvLyBJbml0aWFsaXplIGp1bXAgdGFibGUgZm9yIHRoZSBsb2NrIGZ1bmN0aW9ucworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgX19rbXBfZGlyZWN0X3NldCAgICAgPSBkaXJlY3Rfc2V0X2NoZWNrOworICAgICAgICBfX2ttcF9kaXJlY3RfdW5zZXQgICA9IGRpcmVjdF91bnNldF9jaGVjazsKKyAgICAgICAgX19rbXBfZGlyZWN0X3Rlc3QgICAgPSBkaXJlY3RfdGVzdF9jaGVjazsKKyAgICAgICAgX19rbXBfaW5kaXJlY3Rfc2V0ICAgPSBpbmRpcmVjdF9zZXRfY2hlY2s7CisgICAgICAgIF9fa21wX2luZGlyZWN0X3Vuc2V0ID0gaW5kaXJlY3RfdW5zZXRfY2hlY2s7CisgICAgICAgIF9fa21wX2luZGlyZWN0X3Rlc3QgID0gaW5kaXJlY3RfdGVzdF9jaGVjazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2RpcmVjdF9zZXQgICAgID0gZGlyZWN0X3NldDsKKyAgICAgICAgX19rbXBfZGlyZWN0X3Vuc2V0ICAgPSBkaXJlY3RfdW5zZXQ7CisgICAgICAgIF9fa21wX2RpcmVjdF90ZXN0ICAgID0gZGlyZWN0X3Rlc3Q7CisgICAgICAgIF9fa21wX2luZGlyZWN0X3NldCAgID0gaW5kaXJlY3Rfc2V0OworICAgICAgICBfX2ttcF9pbmRpcmVjdF91bnNldCA9IGluZGlyZWN0X3Vuc2V0OworICAgICAgICBfX2ttcF9pbmRpcmVjdF90ZXN0ICA9IGluZGlyZWN0X3Rlc3Q7CisgICAgfQorICAgIC8vIElmIHRoZSB1c2VyIGxvY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLCB0aGVuIHJldHVybi4KKyAgICAvLyBBbGxvdyB0aGUgc3dpdGNoIGJldHdlZW4gZGlmZmVyZW50IEtNUF9DT05TSVNURU5DWV9DSEVDSyB2YWx1ZXMsCisgICAgLy8gYnV0IGRvIG5vdCBhbGxvY2F0ZSBuZXcgbG9jayB0YWJsZXMgaWYgdGhleSBoYXZlIGFscmVhZHkgYmVlbgorICAgIC8vIGFsbG9jYXRlZC4KKyAgICBpZiAoX19rbXBfaW5pdF91c2VyX2xvY2tzKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBJbml0aWFsaXplIGxvY2sgaW5kZXggdGFibGUKKyAgICBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSA9IEtNUF9JX0xPQ0tfQ0hVTks7CisgICAgX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9pbmRpcmVjdF9sb2NrX3QgKikpOworICAgICooX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlKSA9IChrbXBfaW5kaXJlY3RfbG9ja190ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoS01QX0lfTE9DS19DSFVOSypzaXplb2Yoa21wX2luZGlyZWN0X2xvY2tfdCkpOworICAgIF9fa21wX2lfbG9ja190YWJsZS5uZXh0ID0gMDsKKworICAgIC8vIEluZGlyZWN0IGxvY2sgc2l6ZQorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX3RpY2tldF0gICAgICAgICA9IHNpemVvZihrbXBfdGlja2V0X2xvY2tfdCk7CisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfcXVldWluZ10gICAgICAgID0gc2l6ZW9mKGttcF9xdWV1aW5nX2xvY2tfdCk7CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX2FkYXB0aXZlXSAgICAgICA9IHNpemVvZihrbXBfYWRhcHRpdmVfbG9ja190KTsKKyNlbmRpZgorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX2RyZHBhXSAgICAgICAgICA9IHNpemVvZihrbXBfZHJkcGFfbG9ja190KTsKKyNpZiBLTVBfVVNFX1RTWAorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX3J0bV0gICAgICAgICAgICA9IHNpemVvZihrbXBfcXVldWluZ19sb2NrX3QpOworI2VuZGlmCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX3Rhc10gICAgID0gc2l6ZW9mKGttcF90YXNfbG9ja190KTsKKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX2Z1dGV4XSAgID0gc2l6ZW9mKGttcF9mdXRleF9sb2NrX3QpOworI2VuZGlmCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX3RpY2tldF0gID0gc2l6ZW9mKGttcF90aWNrZXRfbG9ja190KTsKKyAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ19uZXN0ZWRfcXVldWluZ10gPSBzaXplb2Yoa21wX3F1ZXVpbmdfbG9ja190KTsKKyAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ19uZXN0ZWRfZHJkcGFdICAgPSBzaXplb2Yoa21wX2RyZHBhX2xvY2tfdCk7CisKKyAgICAvLyBJbml0aWFsaXplIGxvY2sgYWNjZXNzb3IvbW9kaWZpZXIKKyNkZWZpbmUgZmlsbF9qdW1wcyh0YWJsZSwgZXhwYW5kLCBzZXApIHsgICAgICAgICAgICBcCisgICAgdGFibGVbbG9ja3RhZyMjc2VwIyN0aWNrZXRdICA9IGV4cGFuZCh0aWNrZXQpOyAgXAorICAgIHRhYmxlW2xvY2t0YWcjI3NlcCMjcXVldWluZ10gPSBleHBhbmQocXVldWluZyk7IFwKKyAgICB0YWJsZVtsb2NrdGFnIyNzZXAjI2RyZHBhXSAgID0gZXhwYW5kKGRyZHBhKTsgICBcCit9CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjIGRlZmluZSBmaWxsX3RhYmxlKHRhYmxlLCBleHBhbmQpIHsgICAgICAgICAgIFwKKyAgICBmaWxsX2p1bXBzKHRhYmxlLCBleHBhbmQsIF8pOyAgICAgICAgICAgICAgXAorICAgIHRhYmxlW2xvY2t0YWdfYWRhcHRpdmVdID0gZXhwYW5kKHF1ZXVpbmcpOyBcCisgICAgZmlsbF9qdW1wcyh0YWJsZSwgZXhwYW5kLCBfbmVzdGVkXyk7ICAgICAgIFwKK30KKyNlbHNlCisjIGRlZmluZSBmaWxsX3RhYmxlKHRhYmxlLCBleHBhbmQpIHsgICAgICAgICAgIFwKKyAgICBmaWxsX2p1bXBzKHRhYmxlLCBleHBhbmQsIF8pOyAgICAgICAgICAgICAgXAorICAgIGZpbGxfanVtcHModGFibGUsIGV4cGFuZCwgX25lc3RlZF8pOyAgICAgICBcCit9CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjZGVmaW5lIGV4cGFuZChsKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICopKV9fa21wX3NldF8jI2wjI19sb2NrX2xvY2F0aW9uCisgICAgZmlsbF90YWJsZShfX2ttcF9pbmRpcmVjdF9zZXRfbG9jYXRpb24sIGV4cGFuZCk7CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190KSlfX2ttcF9zZXRfIyNsIyNfbG9ja19mbGFncworICAgIGZpbGxfdGFibGUoX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzLCBleHBhbmQpOworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCkgKGNvbnN0IGlkZW50X3QgKiAoKikoa21wX3VzZXJfbG9ja19wKSlfX2ttcF9nZXRfIyNsIyNfbG9ja19sb2NhdGlvbgorICAgIGZpbGxfdGFibGUoX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uLCBleHBhbmQpOworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCkgKGttcF9sb2NrX2ZsYWdzX3QgKCopKGttcF91c2VyX2xvY2tfcCkpX19rbXBfZ2V0XyMjbCMjX2xvY2tfZmxhZ3MKKyAgICBmaWxsX3RhYmxlKF9fa21wX2luZGlyZWN0X2dldF9mbGFncywgZXhwYW5kKTsKKyN1bmRlZiBleHBhbmQKKworICAgIF9fa21wX2luaXRfdXNlcl9sb2NrcyA9IFRSVUU7Cit9CisKKy8vIENsZWFuIHVwIHRoZSBsb2NrIHRhYmxlLgordm9pZAorX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzKCkKK3sKKyAgICBrbXBfbG9ja19pbmRleF90IGk7CisgICAgaW50IGs7CisKKyAgICAvLyBDbGVhbiB1cCBsb2NrcyBpbiB0aGUgcG9vbHMgZmlyc3QgKHRoZXkgd2VyZSBhbHJlYWR5IGRlc3Ryb3llZCBiZWZvcmUgZ29pbmcgaW50byB0aGUgcG9vbHMpLgorICAgIGZvciAoayA9IDA7IGsgPCBLTVBfTlVNX0lfTE9DS1M7ICsraykgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW2tdOworICAgICAgICB3aGlsZSAobCAhPSBOVUxMKSB7CisgICAgICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsbCA9IGw7CisgICAgICAgICAgICBsID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilsLT5sb2NrLT5wb29sLm5leHQ7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9jbGVhbnVwX2luZGlyZWN0X3VzZXJfbG9ja3M6IGZyZWVpbmcgJXAgZnJvbSBwb29sXG4iLCBsbCkpOworICAgICAgICAgICAgX19rbXBfZnJlZShsbC0+bG9jayk7CisgICAgICAgICAgICBsbC0+bG9jayA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW2tdID0gTlVMTDsKKyAgICB9CisgICAgLy8gQ2xlYW4gdXAgdGhlIHJlbWFpbmluZyB1bmRlc3Ryb3llZCBsb2Nrcy4KKyAgICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfaV9sb2NrX3RhYmxlLm5leHQ7IGkrKykgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gS01QX0dFVF9JX0xPQ0soaSk7CisgICAgICAgIGlmIChsLT5sb2NrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIExvY2tzIG5vdCBkZXN0cm95ZWQgZXhwbGljaXRseSBuZWVkIHRvIGJlIGRlc3Ryb3llZCBoZXJlLgorICAgICAgICAgICAgS01QX0lfTE9DS19GVU5DKGwsIGRlc3Ryb3kpKGwtPmxvY2spOworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzOiBkZXN0cm95L2ZyZWVpbmcgJXAgZnJvbSB0YWJsZVxuIiwgbCkpOworICAgICAgICAgICAgX19rbXBfZnJlZShsLT5sb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBGcmVlIHRoZSB0YWJsZQorICAgIGZvciAoaSA9IDA7IGkgPCBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSAvIEtNUF9JX0xPQ0tfQ0hVTks7IGkrKykKKyAgICAgICAgX19rbXBfZnJlZShfX2ttcF9pX2xvY2tfdGFibGUudGFibGVbaV0pOworICAgIF9fa21wX2ZyZWUoX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlKTsKKworICAgIF9fa21wX2luaXRfdXNlcl9sb2NrcyA9IEZBTFNFOworfQorCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA9IDE7ICAgICAgICAgICAgIC8vIEZJWE1FIC0gdHVuZSB0aGlzIHZhbHVlCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdXNlciBsb2NrcworICoKKyAqIFRoZXkgYXJlIGltcGxlbWVudGVkIGFzIGEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlIHNldCB0byB0aGUKKyAqIGxvY2sgZnVuY3Rpb25zIG9mIHRoZSBhcHByb3ByaWF0ZSBraW5kLCBvbmNlIHRoYXQgaGFzIGJlZW4gZGV0ZXJtaW5lZC4KKyAqLworCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworCitzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IDA7CitzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemUgPSAwOworCitrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK2ludCAoICpfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CitpbnQgKCAqX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworaW50ICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOworaW50ICggKl9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworCitpbnQgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworY29uc3QgaWRlbnRfdCAqICggKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApID0gTlVMTDsKK2ttcF9sb2NrX2ZsYWdzX3QgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApID0gTlVMTDsKKwordm9pZCBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBrbXBfbG9ja19raW5kX3QgdXNlcl9sb2NrX2tpbmQgKQoreworICAgIHN3aXRjaCAoIHVzZXJfbG9ja19raW5kICkgeworICAgICAgICBjYXNlIGxrX2RlZmF1bHQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsKKworICAgICAgICBjYXNlIGxrX3RhczogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfdGFzX2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF90YXNfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0YXMpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1ModGFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyh0YXMpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0sodGFzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGFzX2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIEtNUF9VU0VfRlVURVgKKworICAgICAgICBjYXNlIGxrX2Z1dGV4OiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV9mdXRleF9sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfZnV0ZXhfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIgKTsKKworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGZ1dGV4KTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGZ1dGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyhmdXRleCk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DSyhmdXRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2VuZGlmIC8vIEtNUF9VU0VfRlVURVgKKworICAgICAgICBjYXNlIGxrX3RpY2tldDogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfdGlja2V0X2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF90aWNrZXRfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0aWNrZXQpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1ModGlja2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyh0aWNrZXQpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0sodGlja2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX3RpY2tldF9sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF90aWNrZXRfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfdGlja2V0X2xvY2tfZmxhZ3MgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX3F1ZXVpbmc6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX3F1ZXVpbmdfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MocXVldWluZyk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhxdWV1aW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyhxdWV1aW5nKTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLKHF1ZXVpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX3F1ZXVpbmdfbG9ja19pbml0aWFsaXplZCApOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCBjb25zdCBpZGVudF90ICogKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfZmxhZ3MgKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190ICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBjYXNlIGxrX2FkYXB0aXZlOiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYWRhcHRpdmVfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MoYWRhcHRpdmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLKGFkYXB0aXZlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9jayApOworCisgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgKCBjb25zdCBpZGVudF90ICogKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICggJl9fa21wX3NldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworCisgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190ICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKyAgICAgICAgY2FzZSBsa19kcmRwYTogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfZHJkcGFfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2RyZHBhX2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhkcmRwYSk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhkcmRwYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0soZHJkcGEpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0soZHJkcGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrICk7CisKKyAgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9pc19kcmRwYV9sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X2RyZHBhX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfZHJkcGFfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfZHJkcGFfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfZHJkcGFfbG9ja19mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VyIGxvY2sgdGFibGUgJiBsb2NrIGFsbG9jYXRpb24KKwora21wX2xvY2tfdGFibGVfdCBfX2ttcF91c2VyX2xvY2tfdGFibGUgPSB7IDEsIDAsIE5VTEwgfTsKK2ttcF91c2VyX2xvY2tfcCBfX2ttcF9sb2NrX3Bvb2wgPSBOVUxMOworCisvLyBMb2NrIGJsb2NrLWFsbG9jYXRpb24gc3VwcG9ydC4KK2ttcF9ibG9ja19vZl9sb2NrcyogX19rbXBfbG9ja19ibG9ja3MgPSBOVUxMOworaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA9IDE7ICAgICAgICAgICAgIC8vIEZJWE1FIC0gdHVuZSB0aGlzIHZhbHVlCisKK3N0YXRpYyBrbXBfbG9ja19pbmRleF90CitfX2ttcF9sb2NrX3RhYmxlX2luc2VydCgga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgLy8gQXNzdW1lIHRoYXQga21wX2dsb2JhbF9sb2NrIGlzIGhlbGQgdXBvbiBlbnRyeS9leGl0LgorICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7CisgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA+PSBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkICkgeworICAgICAgICBrbXBfbG9ja19pbmRleF90IHNpemU7CisgICAgICAgIGttcF91c2VyX2xvY2tfcCAqdGFibGU7CisgICAgICAgIC8vIFJlYWxsb2NhdGUgbG9jayB0YWJsZS4KKyAgICAgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkID09IDAgKSB7CisgICAgICAgICAgICBzaXplID0gMTAyNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgPSBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkICogMjsKKyAgICAgICAgfQorICAgICAgICB0YWJsZSA9IChrbXBfdXNlcl9sb2NrX3AgKilfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBrbXBfdXNlcl9sb2NrX3AgKSAqIHNpemUgKTsKKyAgICAgICAgS01QX01FTUNQWSggdGFibGUgKyAxLCBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGUgKyAxLCBzaXplb2YoIGttcF91c2VyX2xvY2tfcCApICogKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCAtIDEgKSApOworICAgICAgICB0YWJsZVsgMCBdID0gKGttcF91c2VyX2xvY2tfcClfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGU7CisgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZnJlZSB0aGUgcHJldmlvdXMgdGFibGUgbm93LCBzaW5jZSBpdCBtYXkgYmUgaW4gdXNlIGJ5IG90aGVyCisgICAgICAgICAgICAvLyB0aHJlYWRzLiBTbyBzYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyB0YWJsZSBpbiBpbiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUKKyAgICAgICAgICAgIC8vIG5ldyB0YWJsZS4gQWxsIHRoZSB0YWJsZXMgd2lsbCBiZSBvcmdhbml6ZWQgaW50byBhIGxpc3QsIGFuZCBjb3VsZCBiZSBmcmVlZCB3aGVuCisgICAgICAgICAgICAvLyBsaWJyYXJ5IHNodXR0aW5nIGRvd24uCisgICAgICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSA9IHRhYmxlOworICAgICAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkID0gc2l6ZTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgPCBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkICk7CisgICAgaW5kZXggPSBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZDsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGVbIGluZGV4IF0gPSBsY2s7CisgICAgKysgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQ7CisgICAgcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMga21wX3VzZXJfbG9ja19wCitfX2ttcF9sb2NrX2Jsb2NrX2FsbG9jYXRlKCkKK3sKKyAgICAvLyBBc3N1bWUgdGhhdCBrbXBfZ2xvYmFsX2xvY2sgaXMgaGVsZCB1cG9uIGVudHJ5L2V4aXQuCisgICAgc3RhdGljIGludCBsYXN0X2luZGV4ID0gMDsKKyAgICBpZiAoICggbGFzdF9pbmRleCA+PSBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgKQorICAgICAgfHwgKCBfX2ttcF9sb2NrX2Jsb2NrcyA9PSBOVUxMICkgKSB7CisgICAgICAgIC8vIFJlc3RhcnQgdGhlIGluZGV4LgorICAgICAgICBsYXN0X2luZGV4ID0gMDsKKyAgICAgICAgLy8gTmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBibG9jay4KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3NpemUgPiAwICk7CisgICAgICAgIHNpemVfdCBzcGFjZV9mb3JfbG9ja3MgPSBfX2ttcF91c2VyX2xvY2tfc2l6ZSAqIF9fa21wX251bV9sb2Nrc19pbl9ibG9jazsKKyAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKV9fa21wX2FsbG9jYXRlKCBzcGFjZV9mb3JfbG9ja3MgKyBzaXplb2YoIGttcF9ibG9ja19vZl9sb2NrcyApICk7CisgICAgICAgIC8vIFNldCB1cCB0aGUgbmV3IGJsb2NrLgorICAgICAgICBrbXBfYmxvY2tfb2ZfbG9ja3MgKm5ld19ibG9jayA9IChrbXBfYmxvY2tfb2ZfbG9ja3MgKikoJiBidWZmZXJbc3BhY2VfZm9yX2xvY2tzXSk7CisgICAgICAgIG5ld19ibG9jay0+bmV4dF9ibG9jayA9IF9fa21wX2xvY2tfYmxvY2tzOworICAgICAgICBuZXdfYmxvY2stPmxvY2tzID0gKHZvaWQgKilidWZmZXI7CisgICAgICAgIC8vIFB1Ymxpc2ggdGhlIG5ldyBibG9jay4KKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIF9fa21wX2xvY2tfYmxvY2tzID0gbmV3X2Jsb2NrOworICAgIH0KKyAgICBrbXBfdXNlcl9sb2NrX3AgcmV0ID0gKGttcF91c2VyX2xvY2tfcCkoJiAoICggKGNoYXIgKikoIF9fa21wX2xvY2tfYmxvY2tzLT5sb2NrcyApICkKKyAgICAgIFsgbGFzdF9pbmRleCAqIF9fa21wX3VzZXJfbG9ja19zaXplIF0gKSApOworICAgIGxhc3RfaW5kZXgrKzsKKyAgICByZXR1cm4gcmV0OworfQorCisvLworLy8gR2V0IG1lbW9yeSBmb3IgYSBsb2NrLiBJdCBtYXkgYmUgZnJlc2hseSBhbGxvY2F0ZWQgbWVtb3J5IG9yIHJldXNlZCBtZW1vcnkKKy8vIGZyb20gbG9jayBwb29sLgorLy8KK2ttcF91c2VyX2xvY2tfcAorX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBrbXBfbG9ja19pbmRleF90IGluZGV4OworICAgIEtNUF9ERUJVR19BU1NFUlQoIHVzZXJfbG9jayApOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIGlmICggX19rbXBfbG9ja19wb29sID09IE5VTEwgKSB7CisgICAgICAgIC8vIExvY2sgcG9vbCBpcyBlbXB0eS4gQWxsb2NhdGUgbmV3IG1lbW9yeS4KKworICAgICAgICAvLyBBTk5PVEFUSU9OOiBGb3VuZCBubyBnb29kIHdheSB0byBleHByZXNzIHRoZSBzeW5jcm9uaXNhdGlvbgorICAgICAgICAvLyBiZXR3ZWVuIGFsbG9jYXRpb24gYW5kIHVzYWdlLCBzbyBpZ25vcmUgdGhlIGFsbG9jYXRpb24KKyAgICAgICAgQU5OT1RBVEVfSUdOT1JFX1dSSVRFU19CRUdJTigpOworICAgICAgICBpZiAoIF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA8PSAxICkgeyAvLyBUdW5lIHRoaXMgY3V0b2ZmIHBvaW50LgorICAgICAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCkgX19rbXBfYWxsb2NhdGUoIF9fa21wX3VzZXJfbG9ja19zaXplICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsY2sgPSBfX2ttcF9sb2NrX2Jsb2NrX2FsbG9jYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgQU5OT1RBVEVfSUdOT1JFX1dSSVRFU19FTkQoKTsKKworICAgICAgICAvLyBJbnNlcnQgbG9jayBpbiB0aGUgdGFibGUgc28gdGhhdCBpdCBjYW4gYmUgZnJlZWQgaW4gX19rbXBfY2xlYW51cCwKKyAgICAgICAgLy8gYW5kIGRlYnVnZ2VyIGhhcyBpbmZvIG9uIGFsbCBhbGxvY2F0ZWQgbG9ja3MuCisgICAgICAgIGluZGV4ID0gX19rbXBfbG9ja190YWJsZV9pbnNlcnQoIGxjayApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gUGljayB1cCBsb2NrIGZyb20gcG9vbC4KKyAgICAgICAgbGNrID0gX19rbXBfbG9ja19wb29sOworICAgICAgICBpbmRleCA9IF9fa21wX2xvY2tfcG9vbC0+cG9vbC5pbmRleDsKKyAgICAgICAgX19rbXBfbG9ja19wb29sID0gX19rbXBfbG9ja19wb29sLT5wb29sLm5leHQ7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXZSBjb3VsZCBwb3RlbnRpYWxseSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbmVzdGVkIGFuZCByZWd1bGFyIGxvY2tzCisgICAgLy8gaGVyZSwgYW5kIGRvIHRoZSBsb2NrIHRhYmxlIGxvb2t1cCBmb3IgcmVndWxhciBsb2NrcyBvbmx5LgorICAgIC8vCisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAgKiAoIChrbXBfbG9ja19pbmRleF90ICopIHVzZXJfbG9jayApID0gaW5kZXg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqICggKGttcF91c2VyX2xvY2tfcCAqKSB1c2VyX2xvY2sgKSA9IGxjazsKKyAgICB9CisKKyAgICAvLyBtYXJrIHRoZSBsb2NrIGlmIGl0IGlzIGNyaXRpY2FsIHNlY3Rpb24gbG9jay4KKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzKCBsY2ssIGZsYWdzICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsgLy8gQUM6IFRPRE86IG1vdmUgdGhpcyBsaW5lIHVwcGVyCisKKyAgICByZXR1cm4gbGNrOworfQorCisvLyBQdXQgbG9jaydzIG1lbW9yeSB0byBwb29sIGZvciByZXVzaW5nLgordm9pZAorX19rbXBfdXNlcl9sb2NrX2ZyZWUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB1c2VyX2xvY2sgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayAhPSBOVUxMICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIGxjay0+cG9vbC5uZXh0ID0gX19rbXBfbG9ja19wb29sOworICAgIF9fa21wX2xvY2tfcG9vbCA9IGxjazsKKyAgICBpZiAoIE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopICkgeworICAgICAgICBrbXBfbG9ja19pbmRleF90IGluZGV4ID0gKiAoIChrbXBfbG9ja19pbmRleF90ICopIHVzZXJfbG9jayApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwIDwgaW5kZXggJiYgaW5kZXggPD0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKTsKKyAgICAgICAgbGNrLT5wb29sLmluZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7Cit9CisKK2ttcF91c2VyX2xvY2tfcAorX19rbXBfbG9va3VwX3VzZXJfbG9jayggdm9pZCAqKnVzZXJfbG9jaywgY2hhciBjb25zdCAqZnVuYyApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjayA9IE5VTEw7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCB1c2VyX2xvY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleCA9ICooIChrbXBfbG9ja19pbmRleF90ICopdXNlcl9sb2NrICk7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgaWYgKCAhICggMCA8IGluZGV4ICYmIGluZGV4IDwgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwIDwgaW5kZXggJiYgaW5kZXggPCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfc2l6ZSA+IDAgKTsKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlW2luZGV4XTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxjayA9ICooIChrbXBfdXNlcl9sb2NrX3AgKil1c2VyX2xvY2sgKTsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGxjazsKK30KKwordm9pZAorX19rbXBfY2xlYW51cF91c2VyX2xvY2tzKCB2b2lkICkKK3sKKyAgICAvLworICAgIC8vIFJlc2V0IGxvY2sgcG9vbC4gRG8gbm90IHdvcnJ5IGFib3V0IGxvY2sgaW4gdGhlIHBvb2wgLS0gd2Ugd2lsbCBmcmVlCisgICAgLy8gdGhlbSB3aGVuIGl0ZXJhdGluZyB0aHJvdWdoIGxvY2sgdGFibGUgKGl0IGluY2x1ZGVzIGFsbCB0aGUgbG9ja3MsCisgICAgLy8gZGVhZCBvciBhbGl2ZSkuCisgICAgLy8KKyAgICBfX2ttcF9sb2NrX3Bvb2wgPSBOVUxMOworCisjZGVmaW5lIElTX0NSSVRJQ0FMKGxjaykgXAorICAgICAgICAoICggX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gIT0gTlVMTCApICYmIFwKKyAgICAgICAgKCAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBsY2sgKSAmIGttcF9sZl9jcml0aWNhbF9zZWN0aW9uICkgKQorCisgICAgLy8KKyAgICAvLyBMb29wIHRocm91Z2ggbG9jayB0YWJsZSwgZnJlZSBhbGwgbG9ja3MuCisgICAgLy8KKyAgICAvLyBEbyBub3QgZnJlZSBpdGVtIFswXSwgaXQgaXMgcmVzZXJ2ZWQgZm9yIGxvY2sgdGFibGVzIGxpc3QuCisgICAgLy8KKyAgICAvLyBGSVhNRSAtIHdlIGFyZSBpdGVyYXRpbmcgdGhyb3VnaCBhIGxpc3Qgb2YgKHBvaW50ZXJzIHRvKSBvYmplY3RzIG9mCisgICAgLy8gdHlwZSB1bmlvbiBrbXBfdXNlcl9sb2NrLCBidXQgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZQorICAgIC8vIGJhc2UgdHlwZSBpcyBjdXJyZW50bHkgInBvb2wiIG9yIHdoYXRldmVyIHRoZSBnbG9iYWwgdXNlciBsb2NrIHR5cGUKKyAgICAvLyBpcy4KKyAgICAvLworICAgIC8vIFdlIGFyZSByZWx5aW5nIG9uIHRoZSBmYWN0IHRoYXQgZm9yIGFsbCBvZiB0aGUgdXNlciBsb2NrIHR5cGVzCisgICAgLy8gKGV4Y2VwdCAidGFzIiksIHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgbG9jayBzdHJ1Y3QgaXMgdGhlICJpbml0aWFsaXplZCIKKyAgICAvLyBmaWVsZCwgd2hpY2ggaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NrIG9iamVjdCBpdHNlbGYgd2hlbgorICAgIC8vIHRoZSBsb2NrIGlzIGluaXRpYWxpemVkLiAgV2hlbiB0aGUgdW5pb24gaXMgb2YgdHlwZSAicG9vbCIsIHRoZQorICAgIC8vIGZpcnN0IGZpZWxkIGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGZyZWUgbGlzdCwgd2hpY2gKKyAgICAvLyB3aWxsIG5vdCBiZSB0aGUgc2FtZSBhZGRyZXNzIGFzIHRoZSBvYmplY3QgaXRzZWxmLgorICAgIC8vCisgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBjaGVjayAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGxjayApCisgICAgLy8gd2lsbCBmYWlsIGZvciAicG9vbCIgb2JqZWN0cyBvbiB0aGUgZnJlZSBsaXN0LiAgVGhpcyBtdXN0IGhhcHBlbiBhcworICAgIC8vIHRoZSAibG9jYXRpb24iIGZpZWxkIG9mIHJlYWwgdXNlciBsb2NrcyBvdmVybGFwcyB0aGUgImluZGV4IiBmaWVsZAorICAgIC8vIG9mICJwb29sIiBvYmplY3RzLgorICAgIC8vCisgICAgLy8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHJ1biB0aHJvdWdoIHRoZSBmcmVlIGxpc3QsIGFuZCByZW1vdmUgYWxsICJwb29sIgorICAgIC8vIG9iamVjdHMgZnJvbSB0aGUgbG9jayB0YWJsZSBiZWZvcmUgZXhlY3V0aW5nIHRoaXMgbG9vcC4gIEhvd2V2ZXIsCisgICAgLy8gInBvb2wiIG9iamVjdHMgZG8gbm90IGFsd2F5cyBoYXZlIHRoZWlyIGluZGV4IGZpZWxkIHNldCAob25seSBvbgorICAgIC8vIGxpbl8zMmUpLCBhbmQgSSBkb24ndCB3YW50IHRvIHNlYXJjaCB0aGUgbG9jayB0YWJsZSBmb3IgdGhlIGFkZHJlc3MKKyAgICAvLyBvZiBldmVyeSAicG9vbCIgb2JqZWN0IG9uIHRoZSBmcmVlIGxpc3QuCisgICAgLy8KKyAgICB3aGlsZSAoIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkID4gMSApIHsKKyAgICAgICAgY29uc3QgaWRlbnQgKmxvYzsKKworICAgICAgICAvLworICAgICAgICAvLyByZWR1Y2UgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgYmVmb3JlIGZyZWVpbmcgdGhlIGxvY2ssCisgICAgICAgIC8vIHNvIHRoYXQgc3RhdGUgb2YgbG9ja3MgaXMgY29uc2lzdGVudAorICAgICAgICAvLworICAgICAgICBrbXBfdXNlcl9sb2NrX3AgbGNrID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlWworICAgICAgICAgIC0tX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgXTsKKworICAgICAgICBpZiAoICggX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyAhPSBOVUxMICkgJiYKKyAgICAgICAgICAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGxjayApICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElzc3VlIGEgd2FybmluZyBpZjogS01QX0NPTlNJU1RFTkNZX0NIRUNLIEFORCBsb2NrIGlzCisgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBBTkQgaXQgaXMgTk9UIGEgY3JpdGljYWwgc2VjdGlvbiAodXNlciBpcyBub3QKKyAgICAgICAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBkZXN0cm95aW5nIGNyaXRpY2FscykgQU5EIHdlIGtub3cgc291cmNlCisgICAgICAgICAgICAvLyBsb2NhdGlvbiB0byByZXBvcnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgKCAhIElTX0NSSVRJQ0FMKCBsY2sgKSApICYmCisgICAgICAgICAgICAgICggKCBsb2MgPSBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBsY2sgKSApICE9IE5VTEwgKSAmJgorICAgICAgICAgICAgICAoIGxvYy0+cHNvdXJjZSAhPSBOVUxMICkgKSB7CisgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDAgKTsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQ25zTG9ja05vdERlc3Ryb3llZCwgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmxpbmUgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYgKCBJU19DUklUSUNBTCggbGNrICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2NsZWFudXBfdXNlcl9sb2NrczogZnJlZSBjcml0aWNhbCBzZWN0aW9uIGxvY2sgJXAgKCVwKVxuIiwgbGNrLCAqKHZvaWQqKilsY2sgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2NsZWFudXBfdXNlcl9sb2NrczogZnJlZSBsb2NrICVwICglcClcbiIsIGxjaywgKih2b2lkKiopbGNrICkgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfREVCVUcKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENsZWFudXAgaW50ZXJuYWwgbG9jayBkeW5hbWljIHJlc291cmNlcworICAgICAgICAgICAgLy8gKGZvciBkcmRwYSBsb2NrcyBwYXJ0aWN1bGFybHkpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrKCBsY2sgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZyZWUgdGhlIGxvY2sgaWYgYmxvY2sgYWxsb2NhdGlvbiBvZiBsb2NrcyBpcyBub3QgdXNlZC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBfX2ttcF9sb2NrX2Jsb2NrcyA9PSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggbGNrICk7CisgICAgICAgIH0KKyAgICB9CisKKyN1bmRlZiBJU19DUklUSUNBTAorCisgICAgLy8KKyAgICAvLyBkZWxldGUgbG9jayB0YWJsZShzKS4KKyAgICAvLworICAgIGttcF91c2VyX2xvY2tfcCAqdGFibGVfcHRyID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSA9IE5VTEw7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCA9IDA7CisKKyAgICB3aGlsZSAoIHRhYmxlX3B0ciAhPSBOVUxMICkgeworICAgICAgICAvLworICAgICAgICAvLyBJbiB0aGUgZmlyc3QgZWxlbWVudCB3ZSBzYXZlZCB0aGUgcG9pbnRlciB0byB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8gKHNtYWxsZXIpIGxvY2sgdGFibGUuCisgICAgICAgIC8vCisgICAgICAgIGttcF91c2VyX2xvY2tfcCAqbmV4dCA9IChrbXBfdXNlcl9sb2NrX3AgKikoIHRhYmxlX3B0clsgMCBdICk7CisgICAgICAgIF9fa21wX2ZyZWUoIHRhYmxlX3B0ciApOworICAgICAgICB0YWJsZV9wdHIgPSBuZXh0OworICAgIH0KKworICAgIC8vCisgICAgLy8gRnJlZSBidWZmZXJzIGFsbG9jYXRlZCBmb3IgYmxvY2tzIG9mIGxvY2tzLgorICAgIC8vCisgICAga21wX2Jsb2NrX29mX2xvY2tzX3QgKmJsb2NrX3B0ciA9IF9fa21wX2xvY2tfYmxvY2tzOworICAgIF9fa21wX2xvY2tfYmxvY2tzID0gTlVMTDsKKworICAgIHdoaWxlICggYmxvY2tfcHRyICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9ibG9ja19vZl9sb2Nrc190ICpuZXh0ID0gYmxvY2tfcHRyLT5uZXh0X2Jsb2NrOworICAgICAgICBfX2ttcF9mcmVlKCBibG9ja19wdHItPmxvY2tzICk7CisgICAgICAgIC8vCisgICAgICAgIC8vICpibG9ja19wdHIgaXRzZWxmIHdhcyBhbGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbG9ja3MgdmVjdG9yLgorICAgICAgICAvLworCWJsb2NrX3B0ciA9IG5leHQ7CisgICAgfQorCisgICAgVENXXzQoX19rbXBfaW5pdF91c2VyX2xvY2tzLCBGQUxTRSk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmggYi9yYzMvcnVudGltZS9zcmMva21wX2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjRmNjVmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmgKQEAgLTAsMCArMSwxMzIwIEBACisvKgorICoga21wX2xvY2suaCAtLSBsb2NrIGhlYWRlciBmaWxlCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0xPQ0tfSAorI2RlZmluZSBLTVBfTE9DS19ICisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gICAgLy8gQ0hBUl9CSVQKKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAgLy8gb2Zmc2V0b2YKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxhdG9taWM+CisKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhhdmUgdG8gY29weSB0aGVzZSBkZWZpbml0aW9ucyBmcm9tIGttcC5oIGJlY2F1c2Uga21wLmggY2Fubm90IGJlIGluY2x1ZGVkCisvLyBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jaWVzLiAgV2lsbCB1bmRlZiB0aGVzZSBhdCBlbmQgb2YgZmlsZS4KKworI2RlZmluZSBLTVBfUEFEKHR5cGUsIHN6KSAgICAgKHNpemVvZih0eXBlKSArIChzeiAtICgoc2l6ZW9mKHR5cGUpIC0gMSkgJSAoc3opKSAtIDEpKQorI2RlZmluZSBLTVBfR1RJRF9ETkUgKC0yKQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGlkZW50IGFuZCBpZGVudF90CisKK3N0cnVjdCBpZGVudDsKK3R5cGVkZWYgc3RydWN0IGlkZW50IGlkZW50X3Q7CisKKy8vIEVuZCBvZiBjb3BpZWQgY29kZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIFdlIG5lZWQgdG8ga25vdyB0aGUgc2l6ZSBvZiB0aGUgYXJlYSB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIGNvbXBpbGVyKHMpCisvLyBhbGxvY2F0ZWQgZm9yIG9iZWN0cyBvZiB0eXBlIG9tcF9sb2NrX3QgYW5kIG9tcF9uZXN0X2xvY2tfdC4gIFRoZSBJbnRlbAorLy8gY29tcGlsZXIgYWx3YXlzIGFsbG9jYXRlcyBhIHBvaW50ZXItc2l6ZWQgYXJlYSwgYXMgZG9lcyB2aXN1YWwgc3R1ZGlvLgorLy8KKy8vIGdjYyBob3dldmVyLCBvbmx5IGFsbG9jYXRlcyA0IGJ5dGVzIGZvciByZWd1bGFyIGxvY2tzLCBldmVuIG9uIDY0LWJpdAorLy8gaW50ZWwgYXJjaHMuICBJdCBhbGxvY2F0ZXMgYXQgbGVhc3QgOCBieXRlcyBmb3IgbmVzdGVkIGxvY2sgKG1vcmUgb24KKy8vIHJlY2VudCB2ZXJzaW9ucyksIGJ1dCB3ZSBhcmUgYm91bmRlZCBieSB0aGUgcG9pbnRlci1zaXplZCBjaHVua3MgdGhhdAorLy8gdGhlIEludGVsIGNvbXBpbGVyIGFsbG9jYXRlcy4KKy8vCisKKyNpZiBLTVBfT1NfTElOVVggJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisjIGRlZmluZSBPTVBfTE9DS19UX1NJWkUgICAgICAgIHNpemVvZihpbnQpCisjIGRlZmluZSBPTVBfTkVTVF9MT0NLX1RfU0laRSAgIHNpemVvZih2b2lkICopCisjZWxzZQorIyBkZWZpbmUgT01QX0xPQ0tfVF9TSVpFICAgICAgICBzaXplb2Yodm9pZCAqKQorIyBkZWZpbmUgT01QX05FU1RfTE9DS19UX1NJWkUgICBzaXplb2Yodm9pZCAqKQorI2VuZGlmCisKKy8vCisvLyBUaGUgSW50ZWwgY29tcGlsZXIgYWxsb2NhdGVzIGEgMzItYnl0ZSBjaHVuayBmb3IgYSBjcml0aWNhbCBzZWN0aW9uLgorLy8gQm90aCBnY2MgYW5kIHZpc3VhbCBzdHVkaW8gb25seSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIGEgcG9pbnRlci4KKy8vIFNvbWV0aW1lcyB3ZSBrbm93IHRoYXQgdGhlIHNwYWNlIHdhcyBhbGxvY2F0ZWQgYnkgdGhlIEludGVsIGNvbXBpbGVyLgorLy8KKyNkZWZpbmUgT01QX0NSSVRJQ0FMX1NJWkUgICAgICAgc2l6ZW9mKHZvaWQgKikKKyNkZWZpbmUgSU5URUxfQ1JJVElDQUxfU0laRSAgICAgMzIKKworLy8KKy8vIGxvY2sgZmxhZ3MKKy8vCit0eXBlZGVmIGttcF91aW50MzIga21wX2xvY2tfZmxhZ3NfdDsKKworI2RlZmluZSBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiAxCisKKy8vCisvLyBXaGVuIGEgbG9jayB0YWJsZSBpcyB1c2VkLCB0aGUgaW5kaWNlcyBhcmUgb2Yga21wX2xvY2tfaW5kZXhfdAorLy8KK3R5cGVkZWYga21wX3VpbnQzMiBrbXBfbG9ja19pbmRleF90OworCisvLworLy8gV2hlbiBtZW1vcnkgYWxsb2NhdGVkIGZvciBsb2NrcyBhcmUgb24gdGhlIGxvY2sgcG9vbCAoZnJlZSBsaXN0KSwKKy8vIGl0IGlzIHRyZWF0ZWQgYXMgc3RydWN0cyBvZiB0aGlzIHR5cGUuCisvLworc3RydWN0IGttcF9sb2NrX3Bvb2wgeworICAgIHVuaW9uIGttcF91c2VyX2xvY2sgKm5leHQ7CisgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleDsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NrX3Bvb2wga21wX2xvY2tfcG9vbF90OworCisKK2V4dGVybiB2b2lkIF9fa21wX3ZhbGlkYXRlX2xvY2tzKCB2b2lkICk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBUaGVyZSBhcmUgNSBsb2NrIGltcGxlbWVudGF0aW9uczoKKy8vCisvLyAgICAgICAxLiBUZXN0IGFuZCBzZXQgbG9ja3MuCisvLyAgICAgICAyLiBmdXRleCBsb2NrcyAoTGludXgqIE9TIG9uIHg4NiBhbmQgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgYXJjaGl0ZWN0dXJlKQorLy8gICAgICAgMy4gVGlja2V0IChMYW1wb3J0IGJha2VyeSkgbG9ja3MuCisvLyAgICAgICA0LiBRdWV1aW5nIGxvY2tzICh3aXRoIHNlcGFyYXRlIHNwaW4gZmllbGRzKS4KKy8vICAgICAgIDUuIERSUEEgKER5bmFtaWNhbGx5IFJlY29uZmlndXJhYmxlIERpc3RyaWJ1dGVkIFBvbGxpbmcgQXJlYSkgbG9ja3MKKy8vCisvLyAgIGFuZCAzIGxvY2sgcHVycG9zZXM6CisvLworLy8gICAgICAgMS4gQm9vdHN0cmFwIGxvY2tzIC0tIFVzZWQgZm9yIGEgZmV3IGxvY2tzIGF2YWlsYWJsZSBhdCBsaWJyYXJ5IHN0YXJ0dXAtc2h1dGRvd24gdGltZS4KKy8vICAgICAgICAgIFRoZXNlIGRvIG5vdCByZXF1aXJlIG5vbi1uZWdhdGl2ZSBnbG9iYWwgdGhyZWFkIElEJ3MuCisvLyAgICAgICAyLiBJbnRlcm5hbCBSVEwgbG9ja3MgLS0gVXNlZCBldmVyeXdoZXJlIGVsc2UgaW4gdGhlIFJUTAorLy8gICAgICAgMy4gVXNlciBsb2NrcyAoaW5jbHVkZXMgY3JpdGljYWwgc2VjdGlvbnMpCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExvY2sgaW1wbGVtZW50YXRpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vCisvLyBOb24tbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrcyBkaWZmZXIgZnJvbSB0aGUgb3RoZXIgbG9jayBraW5kcyAoZXhjZXB0CisvLyBmdXRleCkgaW4gdGhhdCB3ZSB1c2UgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciB0aGUgbG9jaywKKy8vIHJhdGhlciB0aGFuIGEgcG9pbnRlciB0byBpdC4KKy8vCisvLyBPbiBsaW4zMiwgbGluXzMyZSwgYW5kIHdpbl8zMiwgdGhlIHNwYWNlIGFsbG9jYXRlZCBtYXkgYmUgYXMgc21hbGwgYXMgNAorLy8gYnl0ZXMsIHNvIHdlIGhhdmUgdG8gdXNlIGEgbG9jayB0YWJsZSBmb3IgbmVzdGVkIGxvY2tzLCBhbmQgYXZvaWQgYWNjZXNzaW5nCisvLyB0aGUgZGVwdGhfbG9ja2VkIGZpZWxkIGZvciBub24tbmVzdGVkIGxvY2tzLgorLy8KKy8vIEluZm9ybWF0aW9uIG5vcm1hbGx5IGF2YWlsYWJsZSB0byB0aGUgdG9vbHMsIHN1Y2ggYXMgbG9jayBsb2NhdGlvbiwKKy8vIGxvY2sgdXNhZ2UgKG5vcm1hbCBsb2NrIHZzLiBjcml0aWNhbCBzZWN0aW9uKSwgZXRjLiBpcyBub3QgYXZhaWxhYmxlIHdpdGgKKy8vIHRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX3Rhc19sb2NrIHsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgcG9sbDsgICAgICAgICAvLyAwID0+IHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9ja2VkOiAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkCisgICAga21wX2ludDMyICAgICAgICAgIGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3Rhc19sb2NrIGttcF9iYXNlX3Rhc19sb2NrX3Q7CisKK3VuaW9uIGttcF90YXNfbG9jayB7CisgICAga21wX2Jhc2VfdGFzX2xvY2tfdCBsazsKKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsgICAvLyBtYWtlIGNlcnRhaW4gc3RydWN0IGlzIGxhcmdlIGVub3VnaAorICAgIGRvdWJsZSBsa19hbGlnbjsgICAgICAgIC8vIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNhY2hlIGxpbmUgcGFkZGluZworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdGFzX2xvY2sga21wX3Rhc19sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIHRlc3QgYW5kIHNldCBsb2NrIHZhcmlhYmxlcy4gVXNhZ2U6CisvLyAgICBrbXBfdGFzX2xvY2tfdCB4bG9jayA9IEtNUF9UQVNfTE9DS19JTklUSUFMSVpFUiggeGxvY2sgKTsKKy8vCisjZGVmaW5lIEtNUF9UQVNfTE9DS19JTklUSUFMSVpFUiggbG9jayApIHsgeyAwLCAwIH0gfQorCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApOworCisjZGVmaW5lIEtNUF9MT0NLX1JFTEVBU0VEICAgICAgIDEKKyNkZWZpbmUgS01QX0xPQ0tfU1RJTExfSEVMRCAgICAgMAorI2RlZmluZSBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVCAxCisjZGVmaW5lIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQgIDAKKworI2RlZmluZSBLTVBfVVNFX0ZVVEVYIChLTVBfT1NfTElOVVggJiYgIUtNUF9PU19DTksgJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpKQorCisjaWYgS01QX1VTRV9GVVRFWAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdXRleCBsb2Nrcy4gIGZ1dGV4IGxvY2tzIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBMaW51eCogT1MuCisvLworLy8gTGlrZSBub24tbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrLCBub24tbmVzdGVkIGZ1dGV4IGxvY2tzIHVzZSB0aGUgbWVtb3J5CisvLyBhbGxvY2F0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciB0aGUgbG9jaywgcmF0aGVyIHRoYW4gYSBwb2ludGVyIHRvIGl0LgorLy8KKy8vIEluZm9ybWF0aW9uIG5vcm1hbGx5IGF2YWlsYWJsZSB0byB0aGUgdG9vbHMsIHN1Y2ggYXMgbG9jayBsb2NhdGlvbiwKKy8vIGxvY2sgdXNhZ2UgKG5vcm1hbCBsb2NrIHZzLiBjcml0aWNhbCBzZWN0aW9uKSwgZXRjLiBpcyBub3QgYXZhaWxhYmxlIHdpdGgKKy8vIHRlc3QgYW5kIHNldCBsb2Nrcy4gIFdpdGggbm9uLW5lc3RlZCBmdXRleCBsb2NrcywgdGhlIGxvY2sgb3duZXIgaXMgbm90CisvLyBldmVuIGF2YWlsYWJsZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX2Z1dGV4X2xvY2sgeworICAgIHZvbGF0aWxlIGttcF9pbnQzMiBwb2xsOyAgICAgICAgIC8vIDAgPT4gdW5sb2NrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyKihndGlkKzEpIG9mIG93bmluZyB0aHJlYWQsIDAgaWYgdW5sb2NrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NrZWQ6IChndGlkKzEpIG9mIG93bmluZyB0aHJlYWQKKyAgICBrbXBfaW50MzIgICAgICAgICAgZGVwdGhfbG9ja2VkOyAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZnV0ZXhfbG9jayBrbXBfYmFzZV9mdXRleF9sb2NrX3Q7CisKK3VuaW9uIGttcF9mdXRleF9sb2NrIHsKKyAgICBrbXBfYmFzZV9mdXRleF9sb2NrX3QgbGs7CisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7ICAgLy8gbWFrZSBjZXJ0YWluIHN0cnVjdCBpcyBsYXJnZSBlbm91Z2gKKyAgICBkb3VibGUgbGtfYWxpZ247ICAgICAgICAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBjYWNoZSBsaW5lIHBhZGRpbmcKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2Z1dGV4X2xvY2sga21wX2Z1dGV4X2xvY2tfdDsKKworLy8KKy8vIFN0YXRpYyBpbml0aWFsaXplciBmb3IgZnV0ZXggbG9jayB2YXJpYWJsZXMuIFVzYWdlOgorLy8gICAga21wX2Z1dGV4X2xvY2tfdCB4bG9jayA9IEtNUF9GVVRFWF9MT0NLX0lOSVRJQUxJWkVSKCB4bG9jayApOworLy8KKyNkZWZpbmUgS01QX0ZVVEVYX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKSB7IHsgMCwgMCB9IH0KKworZXh0ZXJuIGludCBfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICk7CisKKyNlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGlja2V0IGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2lmZGVmIF9NU0NfVkVSCisvLyBNU1ZDIHdvbid0IGFsbG93IHVzZSBvZiBzdGQ6OmF0b21pYzw+IGluIGEgdW5pb24gc2luY2UgaXQgaGFzIG5vbi10cml2aWFsIGNvcHkgY29uc3RydWN0b3IuCisKK3N0cnVjdCBrbXBfYmFzZV90aWNrZXRfbG9jayB7CisgICAgLy8gYGluaXRpYWxpemVkJyBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgICBzdGQ6OmF0b21pY19ib29sICAgICAgaW5pdGlhbGl6ZWQ7CisgICAgdm9sYXRpbGUgdW5pb24ga21wX3RpY2tldF9sb2NrICpzZWxmOyAvLyBwb2ludHMgdG8gdGhlIGxvY2sgdW5pb24KKyAgICBpZGVudF90IGNvbnN0ICogICAgICAgbG9jYXRpb247ICAgICAgIC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKyAgICBzdGQ6OmF0b21pY191aW50ICAgICAgbmV4dF90aWNrZXQ7ICAgIC8vIHRpY2tldCBudW1iZXIgdG8gZ2l2ZSB0byBuZXh0IHRocmVhZCB3aGljaCBhY3F1aXJlcworICAgIHN0ZDo6YXRvbWljX3VpbnQgICAgICBub3dfc2VydmluZzsgICAgLy8gdGlja2V0IG51bWJlciBmb3IgdGhyZWFkIHdoaWNoIGhvbGRzIHRoZSBsb2NrCisgICAgc3RkOjphdG9taWNfaW50ICAgICAgIG93bmVyX2lkOyAgICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAgc3RkOjphdG9taWNfaW50ICAgICAgIGRlcHRoX2xvY2tlZDsgICAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorICAgIGttcF9sb2NrX2ZsYWdzX3QgICAgICBmbGFnczsgICAgICAgICAgLy8gbG9jayBzcGVjaWZpY3MsIGUuZy4gY3JpdGljYWwgc2VjdGlvbiBsb2NrCit9OworI2Vsc2UKK3N0cnVjdCBrbXBfYmFzZV90aWNrZXRfbG9jayB7CisgICAgLy8gYGluaXRpYWxpemVkJyBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgaW5pdGlhbGl6ZWQ7CisgICAgdm9sYXRpbGUgdW5pb24ga21wX3RpY2tldF9sb2NrICpzZWxmOyAvLyBwb2ludHMgdG8gdGhlIGxvY2sgdW5pb24KKyAgICBpZGVudF90IGNvbnN0ICogICAgICAgbG9jYXRpb247ICAgICAgIC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKyAgICBzdGQ6OmF0b21pYzx1bnNpZ25lZD4gbmV4dF90aWNrZXQ7ICAgIC8vIHRpY2tldCBudW1iZXIgdG8gZ2l2ZSB0byBuZXh0IHRocmVhZCB3aGljaCBhY3F1aXJlcworICAgIHN0ZDo6YXRvbWljPHVuc2lnbmVkPiBub3dfc2VydmluZzsgICAgLy8gdGlja2V0IG51bWJlciBmb3IgdGhyZWFkIHdoaWNoIGhvbGRzIHRoZSBsb2NrCisgICAgc3RkOjphdG9taWM8aW50PiAgICAgIG93bmVyX2lkOyAgICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAgc3RkOjphdG9taWM8aW50PiAgICAgIGRlcHRoX2xvY2tlZDsgICAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorICAgIGttcF9sb2NrX2ZsYWdzX3QgICAgICBmbGFnczsgICAgICAgICAgLy8gbG9jayBzcGVjaWZpY3MsIGUuZy4gY3JpdGljYWwgc2VjdGlvbiBsb2NrCit9OworI2VuZGlmCisKKyNlbHNlIC8vIF9fY3BsdXNwbHVzCisKK3N0cnVjdCBrbXBfYmFzZV90aWNrZXRfbG9jazsKKworI2VuZGlmIC8vICFfX2NwbHVzcGx1cworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV90aWNrZXRfbG9jayBrbXBfYmFzZV90aWNrZXRfbG9ja190OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3RpY2tldF9sb2NrIHsKKyAgICBrbXBfYmFzZV90aWNrZXRfbG9ja190IGxrOyAgICAgICAvLyBUaGlzIGZpZWxkIG11c3QgYmUgZmlyc3QgdG8gYWxsb3cgc3RhdGljIGluaXRpYWxpemluZy4KKyAgICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgIGxrX2FsaWduOyAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgIGxrX3BhZFsgS01QX1BBRCgga21wX2Jhc2VfdGlja2V0X2xvY2tfdCwgQ0FDSEVfTElORSApIF07Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF90aWNrZXRfbG9jayBrbXBfdGlja2V0X2xvY2tfdDsKKworLy8KKy8vIFN0YXRpYyBpbml0aWFsaXplciBmb3Igc2ltcGxlIHRpY2tldCBsb2NrIHZhcmlhYmxlcy4gVXNhZ2U6CisvLyAgICBrbXBfdGlja2V0X2xvY2tfdCB4bG9jayA9IEtNUF9USUNLRVRfTE9DS19JTklUSUFMSVpFUiggeGxvY2sgKTsKKy8vIE5vdGUgdGhlIG1hY3JvIGFyZ3VtZW50LiBJdCBpcyBpbXBvcnRhbnQgdG8gbWFrZSB2YXIgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisvLworI2RlZmluZSBLTVBfVElDS0VUX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKSB7IHsgQVRPTUlDX1ZBUl9JTklUKHRydWUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYobG9jayksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NSUNfVkFSX0lOSVQoMFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01JQ19WQVJfSU5JVCgwVSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01JQ19WQVJfSU5JVCgwKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NSUNfVkFSX0lOSVQoLTEpICAgIH0gfQorCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGlja2V0X2xvY2tfd2l0aF9jaGVrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2sgKTsKKworZXh0ZXJuIGludCBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVldWluZyBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX2luZm87CisKK3R5cGVkZWYgc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX2luZm8ga21wX2FkYXB0aXZlX2xvY2tfaW5mb190OworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0cnVjdCBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzIHsKKyAgICAvKiBTbyB3ZSBjYW4gZ2V0IHN0YXRzIGZyb20gbG9ja3MgdGhhdCBoYXZlbid0IGJlZW4gZGVzdHJveWVkLiAqLworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIG5leHQ7CisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogcHJldjsKKworICAgIC8qIE90aGVyIHN0YXRpc3RpY3MgKi8KKyAgICBrbXBfdWludDMyIHN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiBoYXJkRmFpbGVkU3BlY3VsYXRpb25zOworICAgIGttcF91aW50MzIgc29mdEZhaWxlZFNwZWN1bGF0aW9uczsKKyAgICBrbXBfdWludDMyIG5vblNwZWN1bGF0aXZlQWNxdWlyZXM7CisgICAga21wX3VpbnQzMiBub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0czsKKyAgICBrbXBfdWludDMyIGxlbW1pbmdZaWVsZHM7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdDsKKworZXh0ZXJuIHZvaWQgX19rbXBfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKKworI2VuZGlmIC8vIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworCitzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfaW5mbworeworICAgIC8qIFZhbHVlcyB1c2VkIGZvciBhZGFwdGl2aXR5LgorICAgICAqIEFsdGhvdWdoIHRoZXNlIGFyZSBhY2Nlc3NlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgd2UgZG9uJ3QgYWNjZXNzIHRoZW0gYXRvbWljYWxseSwKKyAgICAgKiBiZWNhdXNlIGlmIHdlIG1pc3MgdXBkYXRlcyBpdCBwcm9iYWJseSBkb2Vzbid0IG1hdHRlciBtdWNoLiAoSXQganVzdCBhZmZlY3RzIG91cgorICAgICAqIGRlY2lzaW9uIGFib3V0IHdoZXRoZXIgdG8gdHJ5IHNwZWN1bGF0aW9uIG9uIHRoZSBsb2NrKS4KKyAgICAgKi8KKyAgICBrbXBfdWludDMyIHZvbGF0aWxlIGJhZG5lc3M7CisgICAga21wX3VpbnQzMiB2b2xhdGlsZSBhY3F1aXJlX2F0dGVtcHRzOworICAgIC8qIFBhcmFtZXRlcnMgb2YgdGhlIGxvY2suICovCisgICAga21wX3VpbnQzMiBtYXhfYmFkbmVzczsKKyAgICBrbXBfdWludDMyIG1heF9zb2Z0X3JldHJpZXM7CisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3Qgdm9sYXRpbGUgc3RhdHM7CisjZW5kaWYKK307CisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKworc3RydWN0IGttcF9iYXNlX3F1ZXVpbmdfbG9jayB7CisKKyAgICAvLyAgYGluaXRpYWxpemVkJyBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgICB2b2xhdGlsZSB1bmlvbiBrbXBfcXVldWluZ19sb2NrICppbml0aWFsaXplZDsgLy8gUG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uIGlmIGluIGluaXRpYWxpemVkIHN0YXRlLgorCisgICAgaWRlbnRfdCBjb25zdCAqICAgICBsb2NhdGlvbjsgICAgIC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKworICAgIEtNUF9BTElHTiggOCApICAgICAgICAgICAgICAgICAgICAvLyB0YWlsX2lkICBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkIQorCisgICAgdm9sYXRpbGUga21wX2ludDMyICB0YWlsX2lkOyAgICAgIC8vIChndGlkKzEpIG9mIHRocmVhZCBhdCB0YWlsIG9mIHdhaXQgcXVldWUsIDAgaWYgZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBubyBwYWRkaW5nIGhlcmUgc2luY2UgaGVhZC90YWlsIHVzZWQgaW4gOC1ieXRlIENBUworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgaGVhZF9pZDsgICAgICAvLyAoZ3RpZCsxKSBvZiB0aHJlYWQgYXQgaGVhZCBvZiB3YWl0IHF1ZXVlLCAwIGlmIGVtcHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlY2wgb3JkZXIgYXNzdW1lcyBsaXR0bGUgZW5kaWFuCisgICAgLy8gYmFrZXJ5LXN0eWxlIGxvY2sKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyIG5leHRfdGlja2V0OyAgLy8gdGlja2V0IG51bWJlciB0byBnaXZlIHRvIG5leHQgdGhyZWFkIHdoaWNoIGFjcXVpcmVzCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiBub3dfc2VydmluZzsgIC8vIHRpY2tldCBudW1iZXIgZm9yIHRocmVhZCB3aGljaCBob2xkcyB0aGUgbG9jaworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgb3duZXJfaWQ7ICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAga21wX2ludDMyICAgICAgICAgICBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5CisKKyAgICBrbXBfbG9ja19mbGFnc190ICAgIGZsYWdzOyAgICAgICAgLy8gbG9jayBzcGVjaWZpY3MsIGUuZy4gY3JpdGljYWwgc2VjdGlvbiBsb2NrCit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9xdWV1aW5nX2xvY2sga21wX2Jhc2VfcXVldWluZ19sb2NrX3Q7CisKK0tNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgdGFpbF9pZCApICUgOCA9PSAwICk7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfcXVldWluZ19sb2NrIHsKKyAgICBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCBsazsgICAgICAgLy8gVGhpcyBmaWVsZCBtdXN0IGJlIGZpcnN0IHRvIGFsbG93IHN0YXRpYyBpbml0aWFsaXppbmcuCisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgIGxrX2FsaWduOyAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgbGtfcGFkWyBLTVBfUEFEKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgQ0FDSEVfTElORSApIF07Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9xdWV1aW5nX2xvY2sga21wX3F1ZXVpbmdfbG9ja190OworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfbmVzdGVkX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICk7CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFkYXB0aXZlIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RydWN0IGttcF9iYXNlX2FkYXB0aXZlX2xvY2sgeworICAgIGttcF9iYXNlX3F1ZXVpbmdfbG9jayBxbGs7CisgICAgS01QX0FMSUdOKENBQ0hFX0xJTkUpCisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190IGFkYXB0aXZlOyAgICAgLy8gSW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjdWxhdGl2ZSBhZGFwdGl2ZSBsb2NrCit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrIGttcF9iYXNlX2FkYXB0aXZlX2xvY2tfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9hZGFwdGl2ZV9sb2NrIHsKKyAgICBrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrX3QgbGs7CisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgICAgZG91YmxlIGxrX2FsaWduOworICAgIGNoYXIgbGtfcGFkWyBLTVBfUEFEKGttcF9iYXNlX2FkYXB0aXZlX2xvY2tfdCwgQ0FDSEVfTElORSkgXTsKK307Cit0eXBlZGVmIHVuaW9uIGttcF9hZGFwdGl2ZV9sb2NrIGttcF9hZGFwdGl2ZV9sb2NrX3Q7CisKKyMgZGVmaW5lIEdFVF9RTEtfUFRSKGwpICgoa21wX3F1ZXVpbmdfbG9ja190ICopICYgKGwpLT5say5xbGspCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERSRFBBIHRpY2tldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2sgeworICAgIC8vCisgICAgLy8gQWxsIG9mIHRoZSBmaWVsZHMgb24gdGhlIGZpcnN0IGNhY2hlIGxpbmUgYXJlIG9ubHkgd3JpdHRlbiB3aGVuCisgICAgLy8gaW5pdGlhbGl6aW5nIG9yIHJlY29uZmlndXJpbmcgdGhlIGxvY2suICBUaGVzZSBhcmUgcmVsYXRpdmVseSByYXJlCisgICAgLy8gb3BlcmF0aW9ucywgc28gZGF0YSBmcm9tIHRoZSBmaXJzdCBjYWNoZSBsaW5lIHdpbGwgdXN1YWxseSBzdGF5CisgICAgLy8gcmVzaWRlbnQgaW4gdGhlIGNhY2hlIG9mIGVhY2ggdGhyZWFkIHRyeWluZyB0byBhY3F1aXJlIHRoZSBsb2NrLgorICAgIC8vCisgICAgLy8gaW5pdGlhbGl6ZWQgbXVzdCBiZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUhCisgICAgLy8KKyAgICBLTVBfQUxJR05fQ0FDSEUKKworICAgIHZvbGF0aWxlIHVuaW9uIGttcF9kcmRwYV9sb2NrICogaW5pdGlhbGl6ZWQ7ICAgIC8vIHBvaW50cyB0byB0aGUgbG9jayB1bmlvbiBpZiBpbiBpbml0aWFsaXplZCBzdGF0ZQorICAgIGlkZW50X3QgY29uc3QgKiAgICAgICAgICAgICAgICAgbG9jYXRpb247ICAgICAgIC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2xvY2tfcG9sbCB7CisgICAgICAgIGttcF91aW50NjQgcG9sbDsKKyAgICB9ICogdm9sYXRpbGUgcG9sbHM7CisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCAgICAgICAgICAgICBtYXNrOyAgICAgICAgICAgLy8gaXMgMioqbnVtX3BvbGxzLTEgZm9yIG1vZCBvcAorICAgIGttcF91aW50NjQgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cF90aWNrZXQ7IC8vIHRocmVhZCB3aXRoIGNsZWFudXAgdGlja2V0CisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9sb2NrX3BvbGwgKiBvbGRfcG9sbHM7ICAgICAgLy8gd2lsbCBkZWFsbG9jYXRlIG9sZF9wb2xscworICAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgICAgICAgbnVtX3BvbGxzOyAgICAgIC8vIG11c3QgYmUgcG93ZXIgb2YgMgorCisgICAgLy8KKyAgICAvLyBuZXh0X3RpY2tldCBpdCBuZWVkcyB0byBleGlzdCBpbiBhIHNlcGFyYXRlIGNhY2hlIGxpbmUsIGFzIGl0IGlzCisgICAgLy8gaW52YWxpZGF0ZWQgZXZlcnkgdGltZSBhIHRocmVhZCB0YWtlcyBhIG5ldyB0aWNrZXQuCisgICAgLy8KKyAgICBLTVBfQUxJR05fQ0FDSEUKKworICAgIHZvbGF0aWxlIGttcF91aW50NjQgICAgICAgICAgICAgbmV4dF90aWNrZXQ7CisKKyAgICAvLworICAgIC8vIG5vd19zZXJ2aW5nIGlzIHVzZWQgdG8gc3RvcmUgb3VyIHRpY2tldCB2YWx1ZSB3aGlsZSB3ZSBob2xkIHRoZSBsb2NrLgorICAgIC8vIEl0IGhhcyBhIHNsaWdodGx5IGRpZmZlcmVudCBtZWFuaW5nIGluIHRoZSBEUkRQQSB0aWNrZXQgbG9ja3MgKHdoZXJlCisgICAgLy8gaXQgaXMgd3JpdHRlbiBieSB0aGUgYWNxdWlyaW5nIHRocmVhZCkgdGhhbiBpdCBkb2VzIGluIHRoZSBzaW1wbGUKKyAgICAvLyB0aWNrZXQgbG9ja3MgKHdoZXJlIGl0IGlzIHdyaXR0ZW4gYnkgdGhlIHJlbGVhc2luZyB0aHJlYWQpLgorICAgIC8vCisgICAgLy8gU2luY2Ugbm93X3NlcnZpbmcgaXMgb25seSByZWFkIGFuIHdyaXR0ZW4gaW4gdGhlIGNyaXRpY2FsIHNlY3Rpb24sCisgICAgLy8gaXQgaXMgbm9uLXZvbGF0aWxlLCBidXQgaXQgbmVlZHMgdG8gZXhpc3Qgb24gYSBzZXBhcmF0ZSBjYWNoZSBsaW5lLAorICAgIC8vIGFzIGl0IGlzIGludmFsaWRhdGVkIGF0IGV2ZXJ5IGxvY2sgYWNxdWlyZS4KKyAgICAvLworICAgIC8vIExpa2V3aXNlLCB0aGUgdmFycyB1c2VkIGZvciBuZXN0ZWQgbG9ja3MgKG93bmVyX2lkIGFuZCBkZXB0aF9sb2NrZWQpCisgICAgLy8gYXJlIG9ubHkgd3JpdHRlbiBieSB0aGUgdGhyZWFkIG93bmluZyB0aGUgbG9jaywgc28gdGhleSBhcmUgcHV0IGluCisgICAgLy8gdGhpcyBjYWNoZSBsaW5lLiAgb3duZXJfaWQgaXMgcmVhZCBieSBvdGhlciB0aHJlYWRzLCBzbyBpdCBtdXN0IGJlCisgICAgLy8gZGVjbGFyZWQgdm9sYXRpbGUuCisgICAgLy8KKyAgICBLTVBfQUxJR05fQ0FDSEUKKworICAgIGttcF91aW50NjQgICAgICAgICAgICAgICAgICAgICAgbm93X3NlcnZpbmc7ICAgIC8vIGRvZXNuJ3QgaGF2ZSB0byBiZSB2b2xhdGlsZQorICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICAgICAgICAgb3duZXJfaWQ7ICAgICAgIC8vIChndGlkKzEpIG9mIG93bmluZyB0aHJlYWQsIDAgaWYgdW5sb2NrZWQKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2xvY2tlZDsgICAvLyBkZXB0aCBsb2NrZWQKKyAgICBrbXBfbG9ja19mbGFnc190ICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAvLyBsb2NrIHNwZWNpZmljcywgZS5nLiBjcml0aWNhbCBzZWN0aW9uIGxvY2sKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2sga21wX2Jhc2VfZHJkcGFfbG9ja190OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2RyZHBhX2xvY2sgeworICAgIGttcF9iYXNlX2RyZHBhX2xvY2tfdCBsazsgICAgICAgLy8gVGhpcyBmaWVsZCBtdXN0IGJlIGZpcnN0IHRvIGFsbG93IHN0YXRpYyBpbml0aWFsaXppbmcuICovCisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgICAgZG91YmxlICAgICAgICAgICAgICAgIGxrX2FsaWduOyAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgbGtfcGFkWyBLTVBfUEFEKCBrbXBfYmFzZV9kcmRwYV9sb2NrX3QsIENBQ0hFX0xJTkUgKSBdOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfZHJkcGFfbG9jayBrbXBfZHJkcGFfbG9ja190OworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKKworZXh0ZXJuIGludCBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBMb2NrIHB1cnBvc2VzLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJvb3RzdHJhcCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQm9vdHN0cmFwIGxvY2tzIC0tIHZlcnkgZmV3IGxvY2tzIHVzZWQgYXQgbGlicmFyeSBpbml0aWFsaXphdGlvbiB0aW1lLgorLy8gQm9vdHN0cmFwIGxvY2tzIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgdGlja2V0IGxvY2tzLgorLy8gVGhleSBjb3VsZCBhbHNvIGJlIGltcGxlbWVudGVkIGFzIHRlc3QgYW5kIHNldCBsb2NrLCBidXQgY2Fubm90IGJlCisvLyBpbXBsZW1lbnRlZCB3aXRoIG90aGVyIGxvY2sga2luZHMgYXMgdGhleSByZXF1aXJlIGd0aWRzIHdoaWNoIGFyZSBub3QKKy8vIGF2YWlsYWJsZSBhdCBpbml0aWFsaXphdGlvbiB0aW1lLgorCit0eXBlZGVmIGttcF90aWNrZXRfbG9ja190IGttcF9ib290c3RyYXBfbG9ja190OworCisjZGVmaW5lIEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggbG9jayApIEtNUF9USUNLRVRfTE9DS19JTklUSUFMSVpFUiggKGxvY2spICkKKworc3RhdGljIGlubGluZSBpbnQKK19fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBsY2ssIEtNUF9HVElEX0RORSApOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF9ib290c3RyYXBfbG9jaygga21wX2Jvb3RzdHJhcF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGxjaywgS01QX0dUSURfRE5FICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygga21wX2Jvb3RzdHJhcF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayggbGNrLCBLTVBfR1RJRF9ETkUgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRlcm5hbCBSVEwgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBJbnRlcm5hbCBSVEwgbG9ja3MgYXJlIGFsc28gaW1wbGVtZW50ZWQgYXMgdGlja2V0IGxvY2tzLCBmb3Igbm93LgorLy8KKy8vIEZJWE1FIC0gV2Ugc2hvdWxkIGdvIHRocm91Z2ggYW5kIGZpZ3VyZSBvdXQgd2hpY2ggbG9jayBraW5kIHdvcmtzIGJlc3QgZm9yCisvLyBlYWNoIGludGVybmFsIGxvY2ssIGFuZCB1c2UgdGhlIHR5cGUgZGVjbGFyYXRpb24gYW5kIGZ1bmN0aW9uIGNhbGxzIGZvcgorLy8gdGhhdCBleHBsaWNpdCBsb2NrIGtpbmQgKGFuZCBnZXQgcmlkIG9mIHRoaXMgc2VjdGlvbikuCisvLworCit0eXBlZGVmIGttcF90aWNrZXRfbG9ja190IGttcF9sb2NrX3Q7CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF9hY3F1aXJlX2xvY2soIGttcF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfbG9jaygga21wX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfbG9jaygga21wX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9sb2NrKCBrbXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfbG9jaygga21wX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VyIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLworLy8gRG8gbm90IGFsbG9jYXRlIG9iamVjdHMgb2YgdHlwZSB1bmlvbiBrbXBfdXNlcl9sb2NrISEhCisvLyBUaGlzIHdpbGwgd2FzdGUgc3BhY2UgdW5sZXNzIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2RyZHBhLgorLy8gSW5zdGVhZCwgY2hlY2sgdGhlIHZhbHVlIG9mIF9fa21wX3VzZXJfbG9ja19raW5kIGFuZCBhbGxvY2F0ZSBvYmplY3RzIG9mCisvLyB0aGUgdHlwZSBvZiB0aGUgYXBwcm9wcmlhdGUgdW5pb24gbWVtYmVyLCBhbmQgY2FzdCB0aGVpciBhZGRyZXNzZXMgdG8KKy8vIGttcF91c2VyX2xvY2tfcC4KKy8vCisKK2VudW0ga21wX2xvY2tfa2luZCB7CisgICAgbGtfZGVmYXVsdCA9IDAsCisgICAgbGtfdGFzLAorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBsa19mdXRleCwKKyNlbmRpZgorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIEtNUF9VU0VfVFNYCisgICAgbGtfaGxlLAorICAgIGxrX3J0bSwKKyNlbmRpZgorICAgIGxrX3RpY2tldCwKKyAgICBsa19xdWV1aW5nLAorICAgIGxrX2RyZHBhLAorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBsa19hZGFwdGl2ZQorI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKK307CisKK3R5cGVkZWYgZW51bSBrbXBfbG9ja19raW5kIGttcF9sb2NrX2tpbmRfdDsKKworZXh0ZXJuIGttcF9sb2NrX2tpbmRfdCBfX2ttcF91c2VyX2xvY2tfa2luZDsKKwordW5pb24ga21wX3VzZXJfbG9jayB7CisgICAga21wX3Rhc19sb2NrX3QgICAgIHRhczsKKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAga21wX2Z1dGV4X2xvY2tfdCAgIGZ1dGV4OworI2VuZGlmCisgICAga21wX3RpY2tldF9sb2NrX3QgIHRpY2tldDsKKyAgICBrbXBfcXVldWluZ19sb2NrX3QgcXVldWluZzsKKyAgICBrbXBfZHJkcGFfbG9ja190ICAgZHJkcGE7CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3QgICAgIGFkYXB0aXZlOworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBrbXBfbG9ja19wb29sX3QgICAgcG9vbDsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX3VzZXJfbG9jayAqa21wX3VzZXJfbG9ja19wOworCisjaWYgISBLTVBfVVNFX0RZTkFNSUNfTE9DSworCitleHRlcm4gc2l6ZV90IF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemU7CitleHRlcm4gc2l6ZV90IF9fa21wX3VzZXJfbG9ja19zaXplOworCitleHRlcm4ga21wX2ludDMyICggKl9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSBrbXBfaW50MzIKK19fa21wX2dldF91c2VyX2xvY2tfb3duZXIoIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfICE9IE5VTEwgKTsKKyAgICByZXR1cm4gKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSggbGNrICk7Cit9CisKK2V4dGVybiBpbnQgKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisKKyNkZWZpbmUgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MobGNrLGd0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgIT0gLTEgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIGxjay0+dGFzLmxrLnBvbGwgLSAxID09IGd0aWQgKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCAoIGxjay0+dGFzLmxrLnBvbGwgIT0gMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICkgICkgeyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGttcF91aW50MzIgc3BpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApIHsgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdoaWxlICggKCBsY2stPnRhcy5say5wb2xsICE9IDAgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApICApICB7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgIHJldHVybiAoICpfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIGludCAoICpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKworI2luY2x1ZGUgImttcF9pMThuLmgiICAgICAgICAgICAgICAgICAgICAgICAvKiBBQzogS01QX0ZBVEFMIGRlZmluaXRpb24gKi8KK2V4dGVybiBpbnQgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrOyAgICAgLyogQUM6IGNvcHkgZnJvbSBrbXAuaCBoZXJlICovCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAgICAgICAgICAgJiYgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICE9IC0xICkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICggKCBsY2stPnRhcy5say5wb2xsID09IDAgKSAmJgorICAgICAgICAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgICAgIHJldHVybiAoICpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7CisgICAgfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKK30KKyNlbmRpZgorCitleHRlcm4gaW50ICggKl9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSAoIGxjaywgZ3RpZCApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2sgKTsKK30KKworLy8KKy8vIFdlIG5lZWQgYSBub24tY2hlY2tpbmcgdmVyc2lvbiBvZiBkZXN0cm95IGxvY2sgZm9yIHdoZW4gdGhlIFJUTCBpcworLy8gZG9pbmcgdGhlIGNsZWFudXAgYXMgaXQgY2FuJ3QgYWx3YXlzIHRlbGwgaWYgdGhlIGxvY2sgaXMgbmVzdGVkIG9yIG5vdC4KKy8vCitleHRlcm4gdm9pZCAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gIT0gTlVMTCApOworICAgICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrICk7Cit9CisKK2V4dGVybiBpbnQgKCAqX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorCisjZGVmaW5lIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcyhsY2ssZ3RpZCxkZXB0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAmJiBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPT0gLTEgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggbGNrLT50YXMubGsucG9sbCAtIDEgPT0gZ3RpZCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICs9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpkZXB0aCA9IEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAoIGxjay0+dGFzLmxrLnBvbGwgIT0gMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApICApIHsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBzcGluczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICkgeyAgICAgXAorICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3aGlsZSAoICggbGNrLT50YXMubGsucG9sbCAhPSAwICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSApICkgICkgeyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqZGVwdGggPSBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKmRlcHRoID0gKCAqX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkLCBpbnQqIGRlcHRoICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAqZGVwdGggPSAoICpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgKCAqX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgeworICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApCisgICAgICAgICAgICAgICAgJiYgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkID09IC0xICkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisgICAgICAgIGlmICggbGNrLT50YXMubGsucG9sbCAtIDEgPT0gZ3RpZCApIHsgICAvKiBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKi8KKyAgICAgICAgICAgIHJldHVybiArK2xjay0+dGFzLmxrLmRlcHRoX2xvY2tlZDsgIC8qIHNhbWUgb3duZXIsIGRlcHRoIGluY3JlYXNlZCAqLworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9ICggKCBsY2stPnRhcy5say5wb2xsID09IDAgKSAmJgorICAgICAgICAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApOworICAgICAgICBpZiAoIHJldHZhbCApIHsKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICAgICByZXR1cm4gKCAqX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKKyAgICB9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgIHJldHVybiAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgKCAqX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgcmV0dXJuICggKl9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjayApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICggKl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrICk7Cit9CisKKy8vCisvLyB1c2VyIGxvY2sgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCBuZWNlc3NhcmlseSBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisvLworLy8gVGhlICJzZXQiIGZ1bmN0aW9ucyB1c3VhbGx5IGhhdmUgd3JhcHBlciByb3V0aW5lcyB0aGF0IGNoZWNrIGZvciBhIE5VTEwgc2V0CisvLyBmdW5jdGlvbiBwb2ludGVyIGFuZCBjYWxsIGl0IGlmIG5vbi1OVUxMLgorLy8KKy8vIEluIHNvbWUgY2FzZXMsIGl0IG1ha2VzIHNlbnNlIHRvIGhhdmUgYSAiZ2V0IiB3cmFwcGVyIGZ1bmN0aW9uIGNoZWNrIGZvciBhCisvLyBOVUxMIGdldCBmdW5jdGlvbiBwb2ludGVyIGFuZCByZXR1cm4gTlVMTCAvIGludmFsaWQgdmFsdWUgLyBlcnJvciBjb2RlIGlmCisvLyB0aGUgZnVuY3Rpb24gcG9pbnRlciBpcyBOVUxMLgorLy8KKy8vIEluIG90aGVyIGNhc2VzLCB0aGUgY2FsbGluZyBjb2RlIHJlYWxseSBzaG91bGQgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuCisvLyB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIGFuZCBvbmUgdGhhdCBpcyBpbXBsZW1lbnRlZCBidXQgcmV0dXJuaW5nIE5VTEwgLworLy8gaW52YWxpZWQgdmFsdWUuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBubyBnZXQgZnVuY3Rpb24gd3JhcHBlciBleGlzdHMuCisvLworCitleHRlcm4gaW50ICggKl9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCisvLyBubyBzZXQgZnVuY3Rpb247IGZpZWxkcyBzZXQgZHVyaW5pbmcgbG9jYWwgYWxsb2NhdGlvbgorCitleHRlcm4gY29uc3QgaWRlbnRfdCAqICggKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSBjb25zdCBpZGVudF90ICoKK19fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb24oIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIGlmICggX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gICE9IE5VTEwgKSB7CisgICAgICAgIHJldHVybiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBsY2sgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSgga21wX3VzZXJfbG9ja19wIGxjaywgY29uc3QgaWRlbnRfdCAqbG9jICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbigga21wX3VzZXJfbG9ja19wIGxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBpZiAoIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICAhPSBOVUxMICkgeworICAgICAgICAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBsY2ssIGxvYyApOworICAgIH0KK30KKworZXh0ZXJuIGttcF9sb2NrX2ZsYWdzX3QgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApOworCitleHRlcm4gdm9pZCAoICpfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfc2V0X3VzZXJfbG9ja19mbGFncygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApCit7CisgICAgaWYgKCBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyAgIT0gTlVMTCApIHsKKyAgICAgICAgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gKSggbGNrLCBmbGFncyApOworICAgIH0KK30KKworLy8KKy8vIFRoZSBmdWN0aW9uIHdoaWNoIHNldHMgdXAgYWxsIG9mIHRoZSB2dGJsIHBvaW50ZXJzIGZvciBrbXBfdXNlcl9sb2NrX3QuCisvLworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X3VzZXJfbG9ja192cHRycygga21wX2xvY2tfa2luZF90IHVzZXJfbG9ja19raW5kICk7CisKKy8vCisvLyBNYWNyb3MgZm9yIGJpbmRpbmcgdXNlciBsb2NrIGZ1bmN0aW9ucy4KKy8vCisjZGVmaW5lIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShuZXN0LCBraW5kLCBzdWZmaXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZSMjbmVzdCMjdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9ICggaW50ICgqKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmUjI25lc3QjI2tpbmQjI18jI3N1ZmZpeDsgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZSMjbmVzdCMjdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9ICggaW50ICgqKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2UjI25lc3QjI2tpbmQjI18jI3N1ZmZpeDsgICAgICAgICBcCisgICAgX19rbXBfdGVzdCMjbmVzdCMjdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAgICA9ICggaW50ICgqKSgga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIgKSApICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3QjI25lc3QjI2tpbmQjI18jI3N1ZmZpeDsgICAgICAgICAgICBcCisgICAgX19rbXBfaW5pdCMjbmVzdCMjdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAgICA9ICggdm9pZCAoKikoIGttcF91c2VyX2xvY2tfcCApICkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2luaXQjI25lc3QjI2tpbmQjI18jI3N1ZmZpeDsgICAgICAgICAgICBcCisgICAgX19rbXBfZGVzdHJveSMjbmVzdCMjdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9ICggdm9pZCAoKikoIGttcF91c2VyX2xvY2tfcCApICkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3kjI25lc3QjI2tpbmQjI18jI3N1ZmZpeDsgICAgICAgICBcCit9CisKKyNkZWZpbmUgS01QX0JJTkRfVVNFUl9MT0NLKGtpbmQpICAgICAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfVEVNUExBVEUoXywga2luZCwgbG9jaykKKyNkZWZpbmUgS01QX0JJTkRfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGtpbmQpICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfVEVNUExBVEUoXywga2luZCwgbG9ja193aXRoX2NoZWNrcykKKyNkZWZpbmUgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DSyhraW5kKSAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfVEVNUExBVEUoX25lc3RlZF8sIGtpbmQsIGxvY2spCisjZGVmaW5lIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1Moa2luZCkgS01QX0JJTkRfVVNFUl9MT0NLX1RFTVBMQVRFKF9uZXN0ZWRfLCBraW5kLCBsb2NrX3dpdGhfY2hlY2tzKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VyIGxvY2sgdGFibGUgJiBsb2NrIGFsbG9jYXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgICBPbiA2NC1iaXQgTGludXgqIE9TIChhbmQgT1MgWCopIEdOVSBjb21waWxlciBhbGxvY2F0ZXMgb25seSA0IGJ5dGVtcyBtZW1vcnkgZm9yIGxvY2sgdmFyaWFibGUsIHdoaWNoCisgICAgaXMgbm90IGVub3VnaCB0byBzdG9yZSBhIHBvaW50ZXIsIHNvIHdlIGhhdmUgdG8gdXNlIGxvY2sgaW5kZXhlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzIGFuZAorICAgIG1haW50YWluIGxvY2sgdGFibGUgdG8gbWFwIGluZGV4ZXMgdG8gcG9pbnRlcnMuCisKKworICAgIE5vdGU6IFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB0YWJsZSBpcyBub3QgYSBwb2ludGVyIHRvIGxvY2shIEl0IGlzIGEgcG9pbnRlciB0byBwcmV2aW91c2x5CisgICAgYWxsb2NhdGVkIHRhYmxlIChvciBOVUxMIGlmIGl0IGlzIHRoZSBmaXJzdCB0YWJsZSkuCisKKyAgICBVc2FnZToKKworICAgICAgICBpZiAoIE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZiggPGxvY2s+ICkgKSB7IC8vIG9yIE9NUF9ORVNUX0xPQ0tfVF9TSVpFCisgICAgICAgICAgICBMb2NrIHRhYmxlIGlzIGZ1bGx5IHV0aWxpemVkLiBVc2VyIGxvY2tzIGFyZSBpbmRleGVzLCBzbyB0YWJsZSBpcworICAgICAgICAgICAgdXNlZCBvbiB1c2VyIGxvY2sgb3BlcmF0aW9uLgorICAgICAgICAgICAgTm90ZTogaXQgbWF5IGJlIHRoZSBjYXNlIChsaW5fMzIpIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byB1c2UgYSBsb2NrCisgICAgICAgICAgICB0YWJsZSBmb3IgcmVndWxhciBsb2NrcywgYnV0IGRvIG5lZWQgdGhlIHRhYmxlIGZvciBuZXN0ZWQgbG9ja3MuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMb2NrIHRhYmxlIGluaXRpYWxpemVkIGJ1dCBub3QgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgfQorKi8KKworc3RydWN0IGttcF9sb2NrX3RhYmxlIHsKKyAgICBrbXBfbG9ja19pbmRleF90ICB1c2VkOyAgICAgIC8vIE51bWJlciBvZiB1c2VkIGVsZW1lbnRzCisgICAga21wX2xvY2tfaW5kZXhfdCAgYWxsb2NhdGVkOyAvLyBOdW1iZXIgb2YgYWxsb2NhdGVkIGVsZW1lbnRzCisgICAga21wX3VzZXJfbG9ja19wICogdGFibGU7ICAgICAvLyBMb2NrIHRhYmxlLgorfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2xvY2tfdGFibGUga21wX2xvY2tfdGFibGVfdDsKKworZXh0ZXJuIGttcF9sb2NrX3RhYmxlX3QgX19rbXBfdXNlcl9sb2NrX3RhYmxlOworZXh0ZXJuIGttcF91c2VyX2xvY2tfcCBfX2ttcF9sb2NrX3Bvb2w7CisKK3N0cnVjdCBrbXBfYmxvY2tfb2ZfbG9ja3MgeworICAgIHN0cnVjdCBrbXBfYmxvY2tfb2ZfbG9ja3MgKiBuZXh0X2Jsb2NrOworICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICAgICBsb2NrczsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9ibG9ja19vZl9sb2NrcyBrbXBfYmxvY2tfb2ZfbG9ja3NfdDsKKworZXh0ZXJuIGttcF9ibG9ja19vZl9sb2Nrc190ICpfX2ttcF9sb2NrX2Jsb2NrczsKK2V4dGVybiBpbnQgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrOworCitleHRlcm4ga21wX3VzZXJfbG9ja19wIF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSggdm9pZCAqKnVzZXJfbG9jaywga21wX2ludDMyIGd0aWQsIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKTsKK2V4dGVybiB2b2lkIF9fa21wX3VzZXJfbG9ja19mcmVlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwga21wX3VzZXJfbG9ja19wIGxjayApOworZXh0ZXJuIGttcF91c2VyX2xvY2tfcCBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB2b2lkICoqdXNlcl9sb2NrLCBjaGFyIGNvbnN0ICpmdW5jICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3MoKTsKKworI2RlZmluZSBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfdXNlcl9sb2NrcyApICkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSApIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X3VzZXJfbG9ja3MsIFRSVUUgKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyN1bmRlZiBLTVBfUEFECisjdW5kZWYgS01QX0dUSURfRE5FCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLworLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sgZW5hYmxlcyBkeW5hbWljIGRpc3BhdGNoIG9mIGxvY2sgZnVuY3Rpb25zIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGN1cnJlbnQKKy8vIGNvbXBhdGliaWxpdHkuIEVzc2VudGlhbCBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgbmV3IGNvZGUgaXMgZHluYW1pYyBkaXNwYXRjaCwgYnV0IGl0IGFsc28KKy8vIGltcGxlbWVudHMgKG9yIGVuYWJsZXMgaW1wbGVtZW50YXRpb24gb2YpIGhpbnRlZCB1c2VyIGxvY2sgYW5kIGNyaXRpY2FsIHNlY3Rpb24gd2hpY2ggd2lsbCBiZQorLy8gcGFydCBvZiBPTVAgNC41IHNvb24uCisvLworLy8gTG9jayB0eXBlIGNhbiBiZSBkZWNpZGVkIGF0IGNyZWF0aW9uIHRpbWUgKGkuZS4sIGxvY2sgaW5pdGlhbGl6YXRpb24pLCBhbmQgc3Vic2VxdWVudCBsb2NrCisvLyBmdW5jdGlvbiBjYWxsIG9uIHRoZSBjcmVhdGVkIGxvY2sgb2JqZWN0IHJlcXVpcmVzIHR5cGUgZXh0cmFjdGlvbiBhbmQgY2FsbCB0aHJvdWdoIGp1bXAgdGFibGUKKy8vIHVzaW5nIHRoZSBleHRyYWN0ZWQgdHlwZS4gVGhpcyB0eXBlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0d28gZGlmZmVyZW50IHdheXMgZGVwZW5kaW5nIG9uCisvLyB0aGUgc2l6ZSBvZiB0aGUgbG9jayBvYmplY3QsIGFuZCB3ZSBkaWZmZXJlbnRpYXRlIGxvY2sgdHlwZXMgYnkgdGhpcyBzaXplIHJlcXVpcmVtZW50IC0gZGlyZWN0CisvLyBhbmQgaW5kaXJlY3QgbG9ja3MuCisvLworLy8gRGlyZWN0IGxvY2tzOgorLy8gQSBkaXJlY3QgbG9jayBvYmplY3QgZml0cyBpbnRvIHRoZSBzcGFjZSBjcmVhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgYW4gb21wX2xvY2tfdCBvYmplY3QsIGFuZAorLy8gVEFTL0Z1dGV4IGxvY2sgZmFsbHMgaW50byB0aGlzIGNhdGVnb3J5LiBXZSB1c2UgbG93IG9uZSBieXRlIG9mIHRoZSBsb2NrIG9iamVjdCBhcyB0aGUgc3RvcmFnZQorLy8gZm9yIHRoZSBsb2NrIHR5cGUsIGFuZCBhcHByb3ByaWF0ZSBiaXQgb3BlcmF0aW9uIGlzIHJlcXVpcmVkIHRvIGFjY2VzcyB0aGUgZGF0YSBtZWFuaW5nZnVsIHRvCisvLyB0aGUgbG9jayBhbGdvcml0aG1zLiBBbHNvLCB0byBkaWZmZXJlbnRpYXRlIGRpcmVjdCBsb2NrIGZyb20gaW5kaXJlY3QgbG9jaywgMSBpcyB3cml0dGVuIHRvIExTQgorLy8gb2YgdGhlIGxvY2sgb2JqZWN0LiBUaGUgbmV3bHkgaW50cm9kdWNlZCAiaGxlIiBsb2NrIGlzIGFsc28gYSBkaXJlY3QgbG9jay4KKy8vCisvLyBJbmRpcmVjdCBsb2NrczoKKy8vIEFuIGluZGlyZWN0IGxvY2sgb2JqZWN0IHJlcXVpcmVzIG1vcmUgc3BhY2UgdGhhbiB0aGUgY29tcGlsZXItZ2VuZXJhdGVkIHNwYWNlLCBhbmQgaXQgc2hvdWxkIGJlCisvLyBhbGxvY2F0ZWQgZnJvbSBoZWFwLiBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvbXBpbGVyLWdlbmVyYXRlZCBzcGFjZSBmb3IgdGhlIGxvY2sgKGkuZS4sCisvLyBzaXplIG9mIG9tcF9sb2NrX3QpLCB0aGlzIG9tcF9sb2NrX3Qgb2JqZWN0IHN0b3JlcyBlaXRoZXIgdGhlIGFkZHJlc3Mgb2YgdGhlIGhlYXAtYWxsb2NhdGVkCisvLyBpbmRpcmVjdCBsb2NrICh2b2lkICogZml0cyBpbiB0aGUgb2JqZWN0KSBvciBhbiBpbmRleCB0byB0aGUgaW5kaXJlY3QgbG9jayB0YWJsZSBlbnRyeSB0aGF0CisvLyBob2xkcyB0aGUgYWRkcmVzcy4gVGlja2V0L1F1ZXVpbmcvRFJEUEEvQWRhcHRpdmUgbG9jayBmYWxscyBpbnRvIHRoaXMgY2F0ZWdvcnksIGFuZCB0aGUgbmV3bHkKKy8vIGludHJvZHVjZWQgInJ0bSIgbG9jayBpcyBhbHNvIGFuIGluZGlyZWN0IGxvY2sgd2hpY2ggd2FzIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgUXVldWluZyBsb2NrLgorLy8gV2hlbiB0aGUgb21wX2xvY2tfdCBvYmplY3QgaG9sZHMgYW4gaW5kZXggKG5vdCBsb2NrIGFkZHJlc3MpLCAwIGlzIHdyaXR0ZW4gdG8gTFNCIHRvCisvLyBkaWZmZXJlbnRpYXRlIHRoZSBsb2NrIGZyb20gYSBkaXJlY3QgbG9jaywgYW5kIHRoZSByZW1haW5pbmcgcGFydCBpcyB0aGUgYWN0dWFsIGluZGV4IHRvIHRoZQorLy8gaW5kaXJlY3QgbG9jayB0YWJsZS4KKy8vCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4gLy8gZm9yIHVpbnRwdHJfdAorCisvLyBTaG9ydGN1dHMKKyNkZWZpbmUgS01QX1VTRV9JTkxJTkVEX1RBUyAgIChLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNKSkgJiYgMQorI2RlZmluZSBLTVBfVVNFX0lOTElORURfRlVURVggS01QX1VTRV9GVVRFWCAmJiAwCisKKy8vIExpc3Qgb2YgbG9jayBkZWZpbml0aW9uczsgYWxsIG5lc3RlZCBsb2NrcyBhcmUgaW5kaXJlY3QgbG9ja3MuCisvLyBobGUgbG9jayBpcyB4Y2hnIGxvY2sgcHJlZml4ZWQgd2l0aCBYQUNRVUlSRS9YUkVMRUFTRS4KKy8vIEFsbCBuZXN0ZWQgbG9ja3MgYXJlIGluZGlyZWN0IGxvY2sgdHlwZXMuCisjaWYgS01QX1VTRV9UU1gKKyMgaWYgS01QX1VTRV9GVVRFWAorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0RfTE9DSyhtLCBhKSAgbSh0YXMsIGEpIG0oZnV0ZXgsIGEpIG0oaGxlLCBhKQorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0lfTE9DSyhtLCBhKSAgbSh0aWNrZXQsIGEpIG0ocXVldWluZywgYSkgbShhZGFwdGl2ZSwgYSkgbShkcmRwYSwgYSkgbShydG0sIGEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3RhcywgYSkgbShuZXN0ZWRfZnV0ZXgsIGEpIG0obmVzdGVkX3RpY2tldCwgYSkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF9xdWV1aW5nLCBhKSBtKG5lc3RlZF9kcmRwYSwgYSkKKyMgZWxzZQorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0RfTE9DSyhtLCBhKSAgbSh0YXMsIGEpICAgICAgICAgICAgIG0oaGxlLCBhKQorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0lfTE9DSyhtLCBhKSAgbSh0aWNrZXQsIGEpIG0ocXVldWluZywgYSkgbShhZGFwdGl2ZSwgYSkgbShkcmRwYSwgYSkgbShydG0sIGEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3RhcywgYSkgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3RpY2tldCwgYSkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF9xdWV1aW5nLCBhKSBtKG5lc3RlZF9kcmRwYSwgYSkKKyMgZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorIyBkZWZpbmUgS01QX0xBU1RfRF9MT0NLIGxvY2tzZXFfaGxlCisjZWxzZQorIyBpZiBLTVBfVVNFX0ZVVEVYCisjICBkZWZpbmUgS01QX0ZPUkVBQ0hfRF9MT0NLKG0sIGEpICBtKHRhcywgYSkgbShmdXRleCwgYSkKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9JX0xPQ0sobSwgYSkgIG0odGlja2V0LCBhKSBtKHF1ZXVpbmcsIGEpICAgICAgICAgICAgICAgIG0oZHJkcGEsIGEpICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF90YXMsIGEpIG0obmVzdGVkX2Z1dGV4LCBhKSBtKG5lc3RlZF90aWNrZXQsIGEpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfcXVldWluZywgYSkgbShuZXN0ZWRfZHJkcGEsIGEpCisjICBkZWZpbmUgS01QX0xBU1RfRF9MT0NLIGxvY2tzZXFfZnV0ZXgKKyMgZWxzZQorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0RfTE9DSyhtLCBhKSAgbSh0YXMsIGEpCisjICBkZWZpbmUgS01QX0ZPUkVBQ0hfSV9MT0NLKG0sIGEpICBtKHRpY2tldCwgYSkgbShxdWV1aW5nLCBhKSAgICAgICAgICAgICAgICBtKGRyZHBhLCBhKSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfdGFzLCBhKSAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfdGlja2V0LCBhKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3F1ZXVpbmcsIGEpIG0obmVzdGVkX2RyZHBhLCBhKQorIyAgZGVmaW5lIEtNUF9MQVNUX0RfTE9DSyBsb2Nrc2VxX3RhcworIyBlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisjZW5kaWYgLy8gS01QX1VTRV9UU1gKKworLy8gSW5mb3JtYXRpb24gdXNlZCBpbiBkeW5hbWljIGRpc3BhdGNoCisjZGVmaW5lIEtNUF9MT0NLX1NISUZUICAgOCAvLyBudW1iZXIgb2YgbG93IGJpdHMgdG8gYmUgdXNlZCBhcyB0YWcgZm9yIGRpcmVjdCBsb2NrcworI2RlZmluZSBLTVBfRklSU1RfRF9MT0NLIGxvY2tzZXFfdGFzCisjZGVmaW5lIEtNUF9GSVJTVF9JX0xPQ0sgbG9ja3NlcV90aWNrZXQKKyNkZWZpbmUgS01QX0xBU1RfSV9MT0NLICBsb2Nrc2VxX25lc3RlZF9kcmRwYQorI2RlZmluZSBLTVBfTlVNX0lfTE9DS1MgIChsb2NrdGFnX25lc3RlZF9kcmRwYSsxKSAvLyBudW1iZXIgb2YgaW5kaXJlY3QgbG9jayB0eXBlcworCisvLyBCYXNlIHR5cGUgZm9yIGR5bmFtaWMgbG9ja3MuCit0eXBlZGVmIGttcF91aW50MzIga21wX2R5bmFfbG9ja190OworCisvLyBMb2NrIHNlcXVlbmNlIHRoYXQgZW51bWVyYXRlcyBhbGwgbG9jayBraW5kcy4KKy8vIEFsd2F5cyBtYWtlIHRoaXMgZW51bWVyYXRpb24gY29uc2lzdGVudCB3aXRoIGttcF9sb2Nrc2VxX3QgaW4gdGhlIGluY2x1ZGUgZGlyZWN0b3J5LgordHlwZWRlZiBlbnVtIHsKKyAgICBsb2Nrc2VxX2luZGlyZWN0ID0gMCwKKyNkZWZpbmUgZXhwYW5kX3NlcShsLGEpIGxvY2tzZXFfIyNsLAorICAgIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmRfc2VxLCAwKQorICAgIEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmRfc2VxLCAwKQorI3VuZGVmIGV4cGFuZF9zZXEKK30ga21wX2R5bmFfbG9ja3NlcV90OworCisvLyBFbnVtZXJhdGVzIGluZGlyZWN0IGxvY2sgdGFncy4KK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIGV4cGFuZF90YWcobCxhKSBsb2NrdGFnXyMjbCwKKyAgICBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kX3RhZywgMCkKKyN1bmRlZiBleHBhbmRfdGFnCit9IGttcF9pbmRpcmVjdF9sb2NrdGFnX3Q7CisKKy8vIFV0aWxpdHkgbWFjcm9zIHRoYXQgZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGxvY2sgc2VxdWVuY2VzLgorI2RlZmluZSBLTVBfSVNfRF9MT0NLKHNlcSkgKChzZXEpID49IEtNUF9GSVJTVF9EX0xPQ0sgJiYgKHNlcSkgPD0gS01QX0xBU1RfRF9MT0NLKQorI2RlZmluZSBLTVBfSVNfSV9MT0NLKHNlcSkgKChzZXEpID49IEtNUF9GSVJTVF9JX0xPQ0sgJiYgKHNlcSkgPD0gS01QX0xBU1RfSV9MT0NLKQorI2RlZmluZSBLTVBfR0VUX0lfVEFHKHNlcSkgKGttcF9pbmRpcmVjdF9sb2NrdGFnX3QpKChzZXEpIC0gS01QX0ZJUlNUX0lfTE9DSykKKyNkZWZpbmUgS01QX0dFVF9EX1RBRyhzZXEpICgoc2VxKTw8MSB8IDEpCisKKy8vIEVudW1lcmF0ZXMgZGlyZWN0IGxvY2sgdGFncyBzdGFydGluZyBmcm9tIGluZGlyZWN0IHRhZy4KK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIGV4cGFuZF90YWcobCxhKSBsb2NrdGFnXyMjbCA9IEtNUF9HRVRfRF9UQUcobG9ja3NlcV8jI2wpLAorICAgIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmRfdGFnLCAwKQorI3VuZGVmIGV4cGFuZF90YWcKK30ga21wX2RpcmVjdF9sb2NrdGFnX3Q7CisKKy8vIEluZGlyZWN0IGxvY2sgdHlwZQordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF91c2VyX2xvY2tfcCBsb2NrOworICAgIGttcF9pbmRpcmVjdF9sb2NrdGFnX3QgdHlwZTsKK30ga21wX2luZGlyZWN0X2xvY2tfdDsKKworLy8gRnVuY3Rpb24gdGFibGVzIGZvciBkaXJlY3QgbG9ja3MuIFNldC91bnNldC90ZXN0IGRpZmZlcmVudGlhdGUgZnVuY3Rpb25zIHdpdGgvd2l0aG91dCBjb25zaXN0ZW5jeSBjaGVja2luZy4KK2V4dGVybiB2b2lkICgqX19rbXBfZGlyZWN0X2luaXRbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9keW5hX2xvY2tzZXFfdCk7CitleHRlcm4gdm9pZCAoKl9fa21wX2RpcmVjdF9kZXN0cm95W10pKGttcF9keW5hX2xvY2tfdCAqKTsKK2V4dGVybiB2b2lkICgqKCpfX2ttcF9kaXJlY3Rfc2V0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMik7CitleHRlcm4gaW50ICAoKigqX19rbXBfZGlyZWN0X3Vuc2V0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMik7CitleHRlcm4gaW50ICAoKigqX19rbXBfZGlyZWN0X3Rlc3QpKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKTsKKworLy8gRnVuY3Rpb24gdGFibGVzIGZvciBpbmRpcmVjdCBsb2Nrcy4gU2V0L3Vuc2V0L3Rlc3QgZGlmZmVyZW50aWF0ZSBmdW5jdGlvbnMgd2l0aC93aXRodW90IGNvbnNpc3RlbmN5IGNoZWNraW5nLgorZXh0ZXJuIHZvaWQgKCpfX2ttcF9pbmRpcmVjdF9pbml0W10pKGttcF91c2VyX2xvY2tfcCk7CitleHRlcm4gdm9pZCAoKl9fa21wX2luZGlyZWN0X2Rlc3Ryb3lbXSkoa21wX3VzZXJfbG9ja19wKTsKK2V4dGVybiB2b2lkICgqKCpfX2ttcF9pbmRpcmVjdF9zZXQpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMik7CitleHRlcm4gaW50ICAoKigqX19rbXBfaW5kaXJlY3RfdW5zZXQpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMik7CitleHRlcm4gaW50ICAoKigqX19rbXBfaW5kaXJlY3RfdGVzdCkpKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKTsKKworLy8gRXh0cmFjdHMgZGlyZWN0IGxvY2sgdGFnIGZyb20gYSB1c2VyIGxvY2sgcG9pbnRlcgorI2RlZmluZSBLTVBfRVhUUkFDVF9EX1RBRyhsKSAgICgqKChrbXBfZHluYV9sb2NrX3QgKikobCkpICYgKCgxPDxLTVBfTE9DS19TSElGVCktMSkgJiAtKCooKGttcF9keW5hX2xvY2tfdCAqKShsKSkgJiAxKSkKKworLy8gRXh0cmFjdHMgaW5kaXJlY3QgbG9jayBpbmRleCBmcm9tIGEgdXNlciBsb2NrIHBvaW50ZXIKKyNkZWZpbmUgS01QX0VYVFJBQ1RfSV9JTkRFWChsKSAoKihrbXBfbG9ja19pbmRleF90ICopKGwpID4+IDEpCisKKy8vIFJldHVybnMgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgZGlyZWN0IGxvY2sgZnVuY3Rpb24gd2l0aCBsIChrbXBfZHluYV9sb2NrX3QgKikgYW5kIG9wIChvcGVyYXRpb24gdHlwZSkuCisjZGVmaW5lIEtNUF9EX0xPQ0tfRlVOQyhsLCBvcCkgX19rbXBfZGlyZWN0XyMjb3BbS01QX0VYVFJBQ1RfRF9UQUcobCldCisKKy8vIFJldHVybnMgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgaW5kaXJlY3QgbG9jayBmdW5jdGlvbiB3aXRoIGwgKGttcF9pbmRpcmVjdF9sb2NrX3QgKikgYW5kIG9wIChvcGVyYXRpb24gdHlwZSkuCisjZGVmaW5lIEtNUF9JX0xPQ0tfRlVOQyhsLCBvcCkgX19rbXBfaW5kaXJlY3RfIyNvcFsoKGttcF9pbmRpcmVjdF9sb2NrX3QgKikobCkpLT50eXBlXQorCisvLyBJbml0aWFsaXplcyBhIGRpcmVjdCBsb2NrIHdpdGggdGhlIGdpdmVuIGxvY2sgcG9pbnRlciBhbmQgbG9jayBzZXF1ZW5jZS4KKyNkZWZpbmUgS01QX0lOSVRfRF9MT0NLKGwsIHNlcSkgX19rbXBfZGlyZWN0X2luaXRbS01QX0dFVF9EX1RBRyhzZXEpXSgoa21wX2R5bmFfbG9ja190ICopbCwgc2VxKQorCisvLyBJbml0aWFsaXplcyBhbiBpbmRpcmVjdCBsb2NrIHdpdGggdGhlIGdpdmVuIGxvY2sgcG9pbnRlciBhbmQgbG9jayBzZXF1ZW5jZS4KKyNkZWZpbmUgS01QX0lOSVRfSV9MT0NLKGwsIHNlcSkgX19rbXBfZGlyZWN0X2luaXRbMF0oKGttcF9keW5hX2xvY2tfdCAqKShsKSwgc2VxKQorCisvLyBSZXR1cm5zICJmcmVlIiBsb2NrIHZhbHVlIGZvciB0aGUgZ2l2ZW4gbG9jayB0eXBlLgorI2RlZmluZSBLTVBfTE9DS19GUkVFKHR5cGUpICAgICAgKGxvY2t0YWdfIyN0eXBlKQorCisvLyBSZXR1cm5zICJidXN5IiBsb2NrIHZhbHVlIGZvciB0aGUgZ2l2ZW4gbG9jayB0ZXlwLgorI2RlZmluZSBLTVBfTE9DS19CVVNZKHYsIHR5cGUpICAgKCh2KTw8S01QX0xPQ0tfU0hJRlQgfCBsb2NrdGFnXyMjdHlwZSkKKworLy8gUmV0dXJucyBsb2NrIHZhbHVlIGFmdGVyIHJlbW92aW5nIChzaGlmdGluZykgbG9jayB0YWcuCisjZGVmaW5lIEtNUF9MT0NLX1NUUklQKHYpICAgICAgICAoKHYpPj5LTVBfTE9DS19TSElGVCkKKworLy8gSW5pdGlhbGl6ZXMgZ2xvYmFsIHN0YXRlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGZvciBtYW5hZ2luZyBkeW5hbWljIHVzZXIgbG9ja3MuCitleHRlcm4gdm9pZCBfX2ttcF9pbml0X2R5bmFtaWNfdXNlcl9sb2NrcygpOworCisvLyBBbGxvY2F0ZXMgYW5kIHJldHVybnMgYW4gaW5kaXJlY3QgbG9jayB3aXRoIHRoZSBnaXZlbiBpbmRpcmVjdCBsb2NrIHRhZy4KK2V4dGVybiBrbXBfaW5kaXJlY3RfbG9ja190ICogX19rbXBfYWxsb2NhdGVfaW5kaXJlY3RfbG9jayh2b2lkICoqLCBrbXBfaW50MzIsIGttcF9pbmRpcmVjdF9sb2NrdGFnX3QpOworCisvLyBDbGVhbnMgdXAgZ2xvYmFsIHN0YXRlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGZvciBtYW5hZ2luZyBkeW5hbWljIHVzZXIgbG9ja3MuCitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwX2luZGlyZWN0X3VzZXJfbG9ja3MoKTsKKworLy8gRGVmYXVsdCB1c2VyIGxvY2sgc2VxdWVuY2Ugd2hlbiBub3QgdXNpbmcgaGludGVkIGxvY2tzLgorZXh0ZXJuIGttcF9keW5hX2xvY2tzZXFfdCBfX2ttcF91c2VyX2xvY2tfc2VxOworCisvLyBKdW1wIHRhYmxlIGZvciAic2V0IGxvY2sgbG9jYXRpb24iLCBhdmFpbGFibGUgb25seSBmb3IgaW5kaXJlY3QgbG9ja3MuCitleHRlcm4gdm9pZCAoKl9fa21wX2luZGlyZWN0X3NldF9sb2NhdGlvbltLTVBfTlVNX0lfTE9DS1NdKShrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKik7CisjZGVmaW5lIEtNUF9TRVRfSV9MT0NLX0xPQ0FUSU9OKGxjaywgbG9jKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19rbXBfaW5kaXJlY3Rfc2V0X2xvY2F0aW9uWyhsY2spLT50eXBlXSAhPSBOVUxMKSAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9pbmRpcmVjdF9zZXRfbG9jYXRpb25bKGxjayktPnR5cGVdKChsY2spLT5sb2NrLCBsb2MpOyBcCit9CisKKy8vIEp1bXAgdGFibGUgZm9yICJzZXQgbG9jayBmbGFncyIsIGF2YWlsYWJsZSBvbmx5IGZvciBpbmRpcmVjdCBsb2Nrcy4KK2V4dGVybiB2b2lkICgqX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCk7CisjZGVmaW5lIEtNUF9TRVRfSV9MT0NLX0ZMQUdTKGxjaywgZmxhZykgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX2luZGlyZWN0X3NldF9mbGFnc1sobGNrKS0+dHlwZV0gIT0gTlVMTCkgICAgICAgICAgICBcCisgICAgICAgIF9fa21wX2luZGlyZWN0X3NldF9mbGFnc1sobGNrKS0+dHlwZV0oKGxjayktPmxvY2ssIGZsYWcpOyBcCit9CisKKy8vIEp1bXAgdGFibGUgZm9yICJnZXQgbG9jayBsb2NhdGlvbiIsIGF2YWlsYWJsZSBvbmx5IGZvciBpbmRpcmVjdCBsb2Nrcy4KK2V4dGVybiBjb25zdCBpZGVudF90ICogKCpfX2ttcF9pbmRpcmVjdF9nZXRfbG9jYXRpb25bS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wKTsKKyNkZWZpbmUgS01QX0dFVF9JX0xPQ0tfTE9DQVRJT04obGNrKSAoIF9fa21wX2luZGlyZWN0X2dldF9sb2NhdGlvblsobGNrKS0+dHlwZV0gIT0gTlVMTCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uWyhsY2spLT50eXBlXSgobGNrKS0+bG9jaykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwgKQorCisvLyBKdW1wIHRhYmxlIGZvciAiZ2V0IGxvY2sgZmxhZ3MiLCBhdmFpbGFibGUgb25seSBmb3IgaW5kaXJlY3QgbG9ja3MuCitleHRlcm4ga21wX2xvY2tfZmxhZ3NfdCAoKl9fa21wX2luZGlyZWN0X2dldF9mbGFnc1tLTVBfTlVNX0lfTE9DS1NdKShrbXBfdXNlcl9sb2NrX3ApOworI2RlZmluZSBLTVBfR0VUX0lfTE9DS19GTEFHUyhsY2spICggX19rbXBfaW5kaXJlY3RfZ2V0X2ZsYWdzWyhsY2spLT50eXBlXSAhPSBOVUxMICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfX2ttcF9pbmRpcmVjdF9nZXRfZmxhZ3NbKGxjayktPnR5cGVdKChsY2spLT5sb2NrKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCApCisKKyNkZWZpbmUgS01QX0lfTE9DS19DSFVOSyAxMDI0ICAgICAgIC8vIG51bWJlciBvZiBrbXBfaW5kaXJlY3RfbG9ja190IG9iamVjdHMgdG8gYmUgYWxsb2NhdGVkIHRvZ2V0aGVyCisKKy8vIExvY2sgdGFibGUgZm9yIGluZGlyZWN0IGxvY2tzLgordHlwZWRlZiBzdHJ1Y3Qga21wX2luZGlyZWN0X2xvY2tfdGFibGUgeworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKip0YWJsZTsgICAgLy8gYmxvY2tzIG9mIGluZGlyZWN0IGxvY2tzIGFsbG9jYXRlZAorICAgIGttcF9sb2NrX2luZGV4X3Qgc2l6ZTsgICAgICAgICAgLy8gc2l6ZSBvZiB0aGUgaW5kaXJlY3QgbG9jayB0YWJsZQorICAgIGttcF9sb2NrX2luZGV4X3QgbmV4dDsgICAgICAgICAgLy8gaW5kZXggdG8gdGhlIG5leHQgbG9jayB0byBiZSBhbGxvY2F0ZWQKK30ga21wX2luZGlyZWN0X2xvY2tfdGFibGVfdDsKKworZXh0ZXJuIGttcF9pbmRpcmVjdF9sb2NrX3RhYmxlX3QgX19rbXBfaV9sb2NrX3RhYmxlOworCisvLyBSZXR1cm5zIHRoZSBpbmRpcmVjdCBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCisjZGVmaW5lIEtNUF9HRVRfSV9MT0NLKGluZGV4KSAoKihfX2ttcF9pX2xvY2tfdGFibGUudGFibGUgKyAoaW5kZXgpL0tNUF9JX0xPQ0tfQ0hVTkspICsgKGluZGV4KSVLTVBfSV9MT0NLX0NIVU5LKQorCisvLyBOdW1iZXIgb2YgbG9ja3MgaW4gYSBsb2NrIGJsb2NrLCB3aGljaCBpcyBmaXhlZCB0byAiMSIgbm93LgorLy8gVE9ETzogTm8gbG9jayBibG9jayBpbXBsZW1lbnRhdGlvbiBub3cuIElmIHdlIGRvIHN1cHBvcnQsIHdlIG5lZWQgdG8gbWFuYWdlIGxvY2sgYmxvY2sgZGF0YQorLy8gc3RydWN0dXJlIGZvciBlYWNoIGluZGlyZWN0IGxvY2sgdHlwZS4KK2V4dGVybiBpbnQgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrOworCisvLyBGYXN0IGxvY2sgdGFibGUgbG9va3VwIHdpdGhvdXQgY29uc2lzdGVuY3kgY2hlY2tpbmcKKyNkZWZpbmUgS01QX0xPT0tVUF9JX0xPQ0sobCkgKCAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEtNUF9HRVRfSV9MT0NLKEtNUF9FWFRSQUNUX0lfSU5ERVgobCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopKGwpKSApCisKKy8vIFVzZWQgb25jZSBpbiBrbXBfZXJyb3IuY3BwCitleHRlcm4ga21wX2ludDMyCitfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKGttcF91c2VyX2xvY2tfcCwga21wX3VpbnQzMik7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgZGVmaW5lIEtNUF9MT0NLX0JVU1kodiwgdHlwZSkgICAgKHYpCisjIGRlZmluZSBLTVBfTE9DS19GUkVFKHR5cGUpICAgICAgIDAKKyMgZGVmaW5lIEtNUF9MT0NLX1NUUklQKHYpICAgICAgICAgKHYpCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLyBkYXRhIHN0cnVjdHVyZSBmb3IgdXNpbmcgYmFja29mZiB3aXRoaW4gc3BpbiBsb2Nrcy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfdWludDMyIHN0ZXA7ICAgICAgICAvLyBjdXJyZW50IHN0ZXAKKyAgICBrbXBfdWludDMyIG1heF9iYWNrb2ZmOyAvLyB1cHBlciBib3VuZCBvZiBvdXRlciBkZWxheSBsb29wCisgICAga21wX3VpbnQzMiBtaW5fdGljazsgICAgLy8gc2l6ZSBvZiBpbm5lciBkZWxheSBsb29wIGluIHRpY2tzIChtYWNoaW5lLWRlcGVuZGVudCkKK30ga21wX2JhY2tvZmZfdDsKKworLy8gUnVudGltZSdzIGRlZmF1bHQgYmFja29mZiBwYXJhbWV0ZXJzCitleHRlcm4ga21wX2JhY2tvZmZfdCBfX2ttcF9zcGluX2JhY2tvZmZfcGFyYW1zOworCisvLyBCYWNrb2ZmIGZ1bmN0aW9uCitleHRlcm4gdm9pZCBfX2ttcF9zcGluX2JhY2tvZmYoa21wX2JhY2tvZmZfdCAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLyogS01QX0xPQ0tfSCAqLworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX29tcC5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9vbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTc2MDIzCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9vbXAuaApAQCAtMCwwICsxLDIzNCBAQAorI2lmIFVTRV9ERUJVR0dFUgorLyoKKyAqIGttcF9vbXAuaCAtLSBPcGVuTVAgZGVmaW5pdGlvbiBmb3Iga21wX29tcF9zdHJ1Y3RfaW5mb190LgorICogICAgICAgICAgICAgIFRoaXMgaXMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHJ1bnRpbWUgbGlicmFyeSBzdHJ1Y3R1cmVzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiBUSElTIEZJTEUgU0hPVUxEIE5PVCBCRSBNT0RJRklFRCBJTiBJREIgSU5URVJGQUNFIExJQlJBUlkgQ09ERQorICogSXQgc2hvdWxkIGluc3RlYWQgYmUgbW9kaWZpZWQgaW4gdGhlIE9wZW5NUCBydW50aW1lIGFuZCBjb3BpZWQKKyAqIHRvIHRoZSBpbnRlcmZhY2UgbGlicmFyeSBjb2RlLiAgVGhpcyB3YXkgd2UgY2FuIG1pbmltaXplIHRoZQorICogcHJvYmxlbXMgdGhhdCB0aGlzIGlzIHN1cmUgdG8gY2F1c2UgaGF2aW5nIHR3byBjb3BpZXMgb2YgdGhlCisgKiBzYW1lIGZpbGUuCisgKgorICogZmlsZXMgbGl2ZSBpbiBsaWJvbXAgYW5kIGxpYm9tcF9kYi9zcmMvaW5jbHVkZQorICovCisKKy8qIENIQU5HRSBUSElTIFdIRU4gU1RSVUNUVVJFUyBCRUxPVyBDSEFOR0UKKyAqIEJlZm9yZSB3ZSByZWxlYXNlIHRoaXMgdG8gYSBjdXN0b21lciwgcGxlYXNlIGRvbid0IGNoYW5nZSB0aGlzIHZhbHVlLiAgQWZ0ZXIgaXQgaXMgcmVsZWFzZWQgYW5kCisgKiBzdGFibGUsIHRoZW4gYW55IG5ldyB1cGRhdGVzIHRvIHRoZSBzdHJ1Y3R1cmVzIG9yIGRhdGEgc3RydWN0dXJlIHRyYXZlcnNhbCBhbGdvcml0aG1zIG5lZWQgdG8KKyAqIGNoYW5nZSB0aGlzIHZhbHVlLgorICovCisjZGVmaW5lIEtNUF9PTVBfVkVSU0lPTiA5CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfaW50MzIgIG9mZnNldDsKKyAgICBrbXBfaW50MzIgIHNpemU7Cit9IG9mZnNldF9hbmRfc2l6ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX3VpbnQ2NCAgICBhZGRyOworICAgIGttcF9pbnQzMiAgICAgc2l6ZTsKKyAgICBrbXBfaW50MzIgICAgIHBhZGRpbmc7Cit9IGFkZHJfYW5kX3NpemVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF91aW50NjQgICBmbGFnczsgICAgICAgICAvLyBGbGFncyBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuCisgICAga21wX3VpbnQ2NCAgIGZpbGU7ICAgICAgICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgcGFyYWxsZWwgcmVnaW9uIGlzLgorICAgIGttcF91aW50NjQgICBmdW5jOyAgICAgICAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2Ygcm91dGluZSB3aGVyZSB0aGUgcGFyYWxsZWwgcmVnaW9uIGlzLgorICAgIGttcF9pbnQzMiAgICBiZWdpbjsgICAgICAgICAvLyBCZWdpbm5pbmcgb2Ygc291cmNlIGxpbmUgcmFuZ2UuCisgICAga21wX2ludDMyICAgIGVuZDsgICAgICAgICAgIC8vIEVuZCBvZiBzb3VyY2UgbGluZSByYW5nZS4KKyAgICBrbXBfaW50MzIgICAgbnVtX3RocmVhZHM7ICAgLy8gU3BlY2lmaWVkIG51bWJlciBvZiB0aHJlYWRzLgorfSBrbXBfb21wX250aHJfaXRlbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX2ludDMyICAgICBudW07ICAgICAgICAgIC8vIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgYXJycmF5LgorICAgIGttcF91aW50NjQgICAgYXJyYXk7ICAgICAgICAvLyBBZGRyZXNzIG9mIGFycmF5IG9mIGttcF9vbXBfbnVtX3RocmVhZHNfaXRlbV90LgorfSBrbXBfb21wX250aHJfaW5mb190OworCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIGtub3duIHRvIHRoZSBpZGIgaW50ZXJmYWNlIGxpYnJhcnkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIC8qIENoYW5nZSB0aGlzIG9ubHkgaWYgeW91IG1ha2UgYSBmdW5kYW1lbnRhbCBkYXRhIHN0cnVjdHVyZSBjaGFuZ2UgaGVyZSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsaWJfdmVyc2lvbjsKKworICAgIC8qIHNhbml0eSBjaGVjay4gIE9ubHkgc2hvdWxkIGJlIGNoZWNrZWQgaWYgdmVyc2lvbnMgYXJlIGlkZW50aWNhbAorICAgICAqIFRoaXMgaXMgYWxzbyB1c2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRvIGdldCB0aGUgcnVudGltZQorICAgICAqIHN0cnVjdHVyZSBzaXplIGlmIGl0IHRoZSBydW50aW1lIGlzIG9sZGVyIHRoYW4gdGhlIGludGVyZmFjZSAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBzaXplb2ZfdGhpc19zdHJ1Y3R1cmU7CisKKyAgICAvKiBPcGVuTVAgUlRMIHZlcnNpb24gaW5mby4gKi8KKyAgICBhZGRyX2FuZF9zaXplX3QgICAgbWFqb3I7CisgICAgYWRkcl9hbmRfc2l6ZV90ICAgIG1pbm9yOworICAgIGFkZHJfYW5kX3NpemVfdCAgICBidWlsZDsKKyAgICBhZGRyX2FuZF9zaXplX3QgICAgb3Blbm1wX3ZlcnNpb247CisgICAgYWRkcl9hbmRfc2l6ZV90ICAgIGJhbm5lcjsKKworICAgIC8qIFZhcmlvdXMgZ2xvYmFscy4gKi8KKyAgICBhZGRyX2FuZF9zaXplX3QgIHRocmVhZHM7ICAgICAgICAgICAgLy8gUG9pbnRlciB0byBfX2ttcF90aHJlYWRzLgorICAgIGFkZHJfYW5kX3NpemVfdCAgcm9vdHM7ICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX3Jvb3QuCisgICAgYWRkcl9hbmRfc2l6ZV90ICBjYXBhY2l0eTsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gX19rbXBfdGhyZWFkc19jYXBhY2l0eS4KKyAgICBhZGRyX2FuZF9zaXplX3QgIG1vbml0b3I7ICAgICAgICAgICAgLy8gUG9pbnRlciB0byBfX2ttcF9tb25pdG9yLgorI2lmICEgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBhZGRyX2FuZF9zaXplX3QgIGxvY2tfdGFibGU7ICAgICAgICAgLy8gUG9pbnRlciB0byBfX2ttcF9sb2NrX3RhYmxlLgorI2VuZGlmCisgICAgYWRkcl9hbmRfc2l6ZV90ICBmdW5jX21pY3JvdGFzazsKKyAgICBhZGRyX2FuZF9zaXplX3QgIGZ1bmNfZm9yazsKKyAgICBhZGRyX2FuZF9zaXplX3QgIGZ1bmNfZm9ya190ZWFtczsKKyAgICBhZGRyX2FuZF9zaXplX3QgIHRlYW1fY291bnRlcjsKKyAgICBhZGRyX2FuZF9zaXplX3QgIHRhc2tfY291bnRlcjsKKyAgICBhZGRyX2FuZF9zaXplX3QgIG50aHJfaW5mbzsKKyAgICBrbXBfaW50MzIgICAgICAgIGFkZHJlc3Nfd2lkdGg7CisgICAga21wX2ludDMyICAgICAgICBpbmRleGVkX2xvY2tzOworICAgIGttcF9pbnQzMiAgICAgICAgbGFzdF9iYXJyaWVyOyAgICAgICAvLyBUaGUgZW5kIGluIGVudW0gYmFycmllcl90eXBlCisgICAga21wX2ludDMyICAgICAgICBkZXF1ZV9zaXplOyAgICAgICAgIC8vIFRBU0tfREVRVUVfU0laRQorCisgICAgLyogdGhyZWFkIHN0cnVjdHVyZSBpbmZvcm1hdGlvbi4gKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgdGhfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfaW5mbzsgICAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3RlYW07ICAgICAgICAgIC8vIHRlYW0gZm9yIHRoaXMgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3Jvb3Q7ICAgICAgICAgIC8vIHJvb3QgZm9yIHRoaXMgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3NlcmlhbF90ZWFtOyAgIC8vIHNlcmlhbCB0ZWFtIHVuZGVyIHRoaXMgdGhyZWFkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX2lkZW50OyAgICAgICAgIC8vIGxvY2F0aW9uIGZvciB0aGlzIHRocmVhZCAoaWYgYXZhaWxhYmxlKQorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9zcGluX2hlcmU7ICAgICAvLyBpcyB0aHJlYWQgd2FpdGluZyBmb3IgbG9jayAoaWYgYXZhaWxhYmxlKQorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9uZXh0X3dhaXRpbmc7ICAvLyBuZXh0IHRocmVhZCB3YWl0aW5nIGZvciBsb2NrIChpZiBhdmFpbGFibGUpCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3Rhc2tfdGVhbTsgICAgIC8vIHRhc2sgdGVhbSBzdHJ1Y3QKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfY3VycmVudF90YXNrOyAgLy8gaW5uZXJtb3N0IHRhc2sgYmVpbmcgZXhlY3V0ZWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfdGFza19zdGF0ZTsgICAgLy8gYWx0ZXJuYXRpbmcgMC8xIGZvciB0YXNrIHRlYW0gaWRlbnRpZmljYXRpb24KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfYmFyOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9iX3dvcmtlcl9hcnJpdmVkOyAvLyB0aGUgd29ya2VyIGluY3JlYXNlcyBpdCBieSAxIHdoZW4gaXQgYXJyaXZlcyB0byB0aGUgYmFycmllcgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvKiB0ZWFtcyBpbmZvcm1hdGlvbiAqLworICAgIG9mZnNldF9hbmRfc2l6ZV90IHRoX3RlYW1zX21pY3JvdGFzazsvLyBlbnRyeSBhZGRyZXNzIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgICBvZmZzZXRfYW5kX3NpemVfdCB0aF90ZWFtc19sZXZlbDsgICAgLy8gaW5pdGlhbCBsZXZlbCBvZiB0ZWFtcyBjb25zdHJ1Y3QKKyAgICBvZmZzZXRfYW5kX3NpemVfdCB0aF90ZWFtc19udGVhbXM7ICAgLy8gbnVtYmVyIG9mIHRlYW1zIGluIGEgbGVhZ3VlCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgdGhfdGVhbXNfbnRoOyAgICAgIC8vIG51bWJlciBvZiB0aHJlYWRzIGluIGVhY2ggdGVhbSBvZiB0aGUgbGVhZ3VlCisjZW5kaWYKKworICAgIC8qIGttcF9kZXNjIHN0cnVjdHVyZSAoZm9yIGluZm8gZmllbGQgYWJvdmUpICovCisgICAga21wX2ludDMyICAgICAgICAgIGRzX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRzX3RpZDsgICAgICAgICAgIC8vIHRlYW0gdGhyZWFkIGlkCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRzX2d0aWQ7ICAgICAgICAgIC8vIGdsb2JhbCB0aHJlYWQgaWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgZHNfdGhyZWFkOyAgICAgICAgLy8gbmF0aXZlIHRocmVhZCBpZAorCisgICAgLyogdGVhbSBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24gKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgdF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X21hc3Rlcl90aWQ7ICAgICAvLyB0aWQgb2YgbWFzdGVyIGluIHBhcmVudCB0ZWFtCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfaWRlbnQ7ICAgICAgICAgIC8vIGxvY2F0aW9uIG9mIHBhcmFsbGVsIHJlZ2lvbgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X3BhcmVudDsgICAgICAgICAvLyBwYXJlbnQgdGVhbQorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X25wcm9jOyAgICAgICAgICAvLyAjIHRlYW0gdGhyZWFkcworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X3RocmVhZHM7ICAgICAgICAvLyBhcnJheSBvZiB0aHJlYWRzCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfc2VyaWFsaXplZDsgICAgIC8vICMgbGV2ZWxzIG9mIHNlcmlhbGl6ZWQgdGVhbXMKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9pZDsgICAgICAgICAgICAgLy8gdW5pcXVlIHRlYW0gaWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9wa2ZuOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X3Rhc2tfdGVhbTsgICAgICAvLyB0YXNrIHRlYW0gc3RydWN0dXJlCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfaW1wbGljaXRfdGFzazsgIC8vIHRhc2tkYXRhIGZvciB0aGUgdGhyZWFkJ3MgaW1wbGljaXQgdGFzaworI2lmIE9NUF80MF9FTkFCTEVECisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfY2FuY2VsX3JlcXVlc3Q7CisjZW5kaWYKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9iYXI7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfYl9tYXN0ZXJfYXJyaXZlZDsgLy8gaW5jcmVhc2VkIGJ5IDEgd2hlbiBtYXN0ZXIgYXJyaXZlcyB0byBhIGJhcnJpZXIKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9iX3RlYW1fYXJyaXZlZDsgICAvLyBpbmNyZWFzZWQgYnkgb25lIHdoZW4gYWxsIHRoZSB0aHJlYWRzIGFycml2ZWQKKworICAgIC8qIHJvb3Qgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIHJfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl9yb290X3RlYW07ICAgICAgLy8gdGVhbSBhdCByb290CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHJfaG90X3RlYW07ICAgICAgIC8vIGhvdCB0ZWFtIGZvciB0aGlzIHJvb3QKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl91YmVyX3RocmVhZDsgICAgLy8gcm9vdCB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl9yb290X2lkOyAgICAgICAgLy8gdW5pcXVlIHJvb3QgaWQgKGlmIGF2YWlsYWJsZSkKKworICAgIC8qIGlkZW50IHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBpZF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBpZF9wc291cmNlOyAgICAgICAvKiBhZGRyZXNzIG9mIHN0cmluZyAiO2ZpbGU7ZnVuYztsaW5lMTtsaW5lMjs7Ii4gKi8KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaWRfZmxhZ3M7CisKKyAgICAvKiBsb2NrIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsa19zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19pbml0aWFsaXplZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfbG9jYXRpb247CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX3RhaWxfaWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX2hlYWRfaWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX25leHRfdGlja2V0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19ub3dfc2VydmluZzsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfb3duZXJfaWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX2RlcHRoX2xvY2tlZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfbG9ja19mbGFnczsKKworI2lmICEgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAvKiBsb2NrX3RhYmxlX3QgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgbHRfc2l6ZV9vZl9zdHJ1Y3Q7ICAgIC8qIFNpemUgYW5kIGxheW91dCBvZiBrbXBfbG9ja190YWJsZV90LiAqLworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsdF91c2VkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsdF9hbGxvY2F0ZWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X3RhYmxlOworI2VuZGlmCisKKyAgICAvKiB0YXNrX3RlYW1fdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0dF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF90aHJlYWRzX2RhdGE7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X2ZvdW5kX3Rhc2tzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF9ucHJvYzsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdHRfdW5maW5pc2hlZF90aHJlYWRzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF9hY3RpdmU7CisKKyAgICAvKiBrbXBfdGFza2RhdGFfdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0ZF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrX2lkOyAgICAgICAgICAgICAgICAgIC8vIHRhc2sgaWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAvLyB0YXNrIGZsYWdzCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3RlYW07ICAgICAgICAgICAgICAgICAgICAgLy8gdGVhbSBmb3IgdGhpcyB0YXNrCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3BhcmVudDsgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IHRhc2sKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfbGV2ZWw7ICAgICAgICAgICAgICAgICAgICAvLyB0YXNrIHRlc3RpbmcgbGV2ZWwKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfaWRlbnQ7ICAgICAgICAgICAgICAgICAgICAvLyB0YXNrIGlkZW50aWZpZXIKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzOyAgICAvLyBjaGlsZCB0YXNrcyAoKyBjdXJyZW50IHRhc2spIG5vdCB5ZXQgZGVhbGxvY2F0ZWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrczsgICAvLyBjaGlsZCB0YXNrcyBub3QgeWV0IGNvbXBsZXRlCisKKyAgICAvKiBUYXNrd2FpdCAqLworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrd2FpdF9pZGVudDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGFza3dhaXRfY291bnRlcjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGFza3dhaXRfdGhyZWFkOyAgICAgICAgICAvLyBndGlkICsgMSBvZiB0aHJlYWQgZW5jb3VudGVyZWQgdGFza3dhaXQKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLyogVGFza2dyb3VwICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2tncm91cDsgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgY3VycmVudCB0YXNrZ3JvdXAKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGFza19jb3VudDsgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgYWxsb2NhdGVkIGFuZCBub3QgeWV0IGNvbXBsZXRlIHRhc2tzCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX2NhbmNlbDsgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgY2FuY2VsbGF0aW9uIG9mIHRoaXMgdGFza2dyb3VwCisKKyAgICAvKiBUYXNrIGRlcGVuZGVuY3kgKi8KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfZGVwbm9kZTsgICAgICAgICAgICAgICAgICAvLyBwb2ludGVyIHRvIGdyYXBoIG5vZGUgaWYgdGhlIHRhc2sgaGFzIGRlcGVuZGVuY2llcworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkbl9ub2RlOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkbl9uZXh0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkbl9zdWNjZXNzb3JzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkbl90YXNrOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkbl9ucHJlZGVjZXNzb3JzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkbl9ucmVmczsKKyNlbmRpZgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkbl9yb3V0aW5lOworCisgICAgLyoga21wX3RocmVhZF9kYXRhX3QgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgaGRfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWU7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGhkX2RlcXVlX3NpemU7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGhkX2RlcXVlX2hlYWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGhkX2RlcXVlX3RhaWw7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGhkX2RlcXVlX250YXNrczsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfbGFzdF9zdG9sZW47CisKKyAgICAvLyBUaGUgbGFzdCBmaWVsZCBvZiBzdGFibGUgdmVyc2lvbi4KKyAgICBrbXBfdWludDY0ICAgICAgICAgbGFzdF9maWVsZDsKKworfSBrbXBfb21wX3N0cnVjdF9pbmZvX3Q7CisKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KKworLyogZW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfb3MuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTkwMGQzCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9vcy5oCkBAIC0wLDAgKzEsNzI1IEBACisvKgorICoga21wX29zLmggLS0gS1BUUyBydW50aW1lIGhlYWRlciBmaWxlLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9PU19ICisjZGVmaW5lIEtNUF9PU19ICisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgS01QX0ZUTl9QTEFJTiAgIDEKKyNkZWZpbmUgS01QX0ZUTl9BUFBFTkQgIDIKKyNkZWZpbmUgS01QX0ZUTl9VUFBFUiAgIDMKKy8qCisjZGVmaW5lIEtNUF9GVE5fUFJFUEVORCA0CisjZGVmaW5lIEtNUF9GVE5fVUFQUEVORCA1CisqLworCisjZGVmaW5lIEtNUF9QVFJfU0tJUCAgICAoc2l6ZW9mKHZvaWQqKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29tcGlsZXIgdmFyaWF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfT0ZGCQkJCTAKKyNkZWZpbmUgS01QX09OCQkJCTEKKworI2RlZmluZSBLTVBfTUVNX0NPTlNfVk9MQVRJTEUJCTAKKyNkZWZpbmUgS01QX01FTV9DT05TX0ZFTkNFCQkxCisKKyNpZm5kZWYgS01QX01FTV9DT05TX01PREVMCisjIGRlZmluZSBLTVBfTUVNX0NPTlNfTU9ERUwJIEtNUF9NRU1fQ09OU19WT0xBVElMRQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29tcGlsZXIgcmVjb2duaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBLTVBfQ09NUElMRVJfSUNDIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX0dDQyAwCisjZGVmaW5lIEtNUF9DT01QSUxFUl9DTEFORyAwCisjZGVmaW5lIEtNUF9DT01QSUxFUl9NU1ZDIDAKKworI2lmIGRlZmluZWQoIF9fSU5URUxfQ09NUElMRVIgKQorIyB1bmRlZiBLTVBfQ09NUElMRVJfSUNDCisjIGRlZmluZSBLTVBfQ09NUElMRVJfSUNDIDEKKyNlbGlmIGRlZmluZWQoIF9fY2xhbmdfXyApCisjIHVuZGVmIEtNUF9DT01QSUxFUl9DTEFORworIyBkZWZpbmUgS01QX0NPTVBJTEVSX0NMQU5HIDEKKyNlbGlmIGRlZmluZWQoIF9fR05VQ19fICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX0dDQworIyBkZWZpbmUgS01QX0NPTVBJTEVSX0dDQyAxCisjZWxpZiBkZWZpbmVkKCBfTVNDX1ZFUiApCisjIHVuZGVmIEtNUF9DT01QSUxFUl9NU1ZDCisjIGRlZmluZSBLTVBfQ09NUElMRVJfTVNWQyAxCisjZWxzZQorIyBlcnJvciBVbmtub3duIGNvbXBpbGVyCisjZW5kaWYKKworI2lmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpICYmICFLTVBfT1NfQ05LICYmICFLTVBfQVJDSF9QUEM2NAorIyBkZWZpbmUgS01QX0FGRklOSVRZX1NVUFBPUlRFRCAxCisjIGlmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4Nl82NAorIyAgZGVmaW5lIEtNUF9HUk9VUF9BRkZJTklUWSAgICAxCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfR1JPVVBfQUZGSU5JVFkgICAgMAorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgMAorIyBkZWZpbmUgS01QX0dST1VQX0FGRklOSVRZICAgICAwCisjZW5kaWYKKworLyogQ2hlY2sgZm9yIHF1YWQtcHJlY2lzaW9uIGV4dGVuc2lvbi4gKi8KKyNkZWZpbmUgS01QX0hBVkVfUVVBRCAwCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorIyBpZiBLTVBfQ09NUElMRVJfSUNDCisgICAvKiBfUXVhZCBpcyBhbHJlYWR5IGRlZmluZWQgZm9yIGljYyAqLworIyAgdW5kZWYgIEtNUF9IQVZFX1FVQUQKKyMgIGRlZmluZSBLTVBfSEFWRV9RVUFEIDEKKyMgZWxpZiBLTVBfQ09NUElMRVJfQ0xBTkcKKyAgIC8qIENsYW5nIGRvZXNuJ3Qgc3VwcG9ydCBhIHNvZnR3YXJlLWltcGxlbWVudGVkCisgICAgICAxMjgtYml0IGV4dGVuZGVkIHByZWNpc2lvbiB0eXBlIHlldCAqLworICAgdHlwZWRlZiBsb25nIGRvdWJsZSBfUXVhZDsKKyMgZWxpZiBLTVBfQ09NUElMRVJfR0NDCisgICB0eXBlZGVmIF9fZmxvYXQxMjggX1F1YWQ7CisjICB1bmRlZiAgS01QX0hBVkVfUVVBRAorIyAgZGVmaW5lIEtNUF9IQVZFX1FVQUQgMQorIyBlbGlmIEtNUF9DT01QSUxFUl9NU1ZDCisgICB0eXBlZGVmIGxvbmcgZG91YmxlIF9RdWFkOworIyBlbmRpZgorI2Vsc2UKKyMgaWYgX19MREJMX01BWF9FWFBfXyA+PSAxNjM4NCAmJiBLTVBfQ09NUElMRVJfR0NDCisgICB0eXBlZGVmIGxvbmcgZG91YmxlIF9RdWFkOworIyAgdW5kZWYgIEtNUF9IQVZFX1FVQUQKKyMgIGRlZmluZSBLTVBfSEFWRV9RVUFEIDEKKyMgZW5kaWYKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgIGttcF9pbnQ4OworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgIGttcF91aW50ODsKKyAgdHlwZWRlZiBzaG9ydCAgICAgICAgICAgICBrbXBfaW50MTY7CisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAga21wX3VpbnQxNjsKKyAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICBrbXBfaW50MzI7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAga21wX3VpbnQzMjsKKyMgZGVmaW5lIEtNUF9JTlQzMl9TUEVDICAgICAiZCIKKyMgZGVmaW5lIEtNUF9VSU5UMzJfU1BFQyAgICAidSIKKyMgaWZuZGVmIEtNUF9TVFJVQ1Q2NAorICAgdHlwZWRlZiBfX2ludDY0IAkJa21wX2ludDY0OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IAlrbXBfdWludDY0OworICAgI2RlZmluZSBLTVBfSU5UNjRfU1BFQyAJIkk2NGQiCisgICAjZGVmaW5lIEtNUF9VSU5UNjRfU1BFQwkiSTY0dSIKKyMgZWxzZQorICAgc3RydWN0IGttcF9zdHJ1Y3Q2NCB7CisgICAga21wX2ludDMyICAgYSxiOworICAgfTsKKyAgIHR5cGVkZWYgc3RydWN0IGttcF9zdHJ1Y3Q2NCBrbXBfaW50NjQ7CisgICB0eXBlZGVmIHN0cnVjdCBrbXBfc3RydWN0NjQga21wX3VpbnQ2NDsKKyAgIC8qIE5vdCBzdXJlIHdoYXQgdG8gdXNlIGZvciBLTVBfW1VdSU5UNjRfU1BFQyBoZXJlICovCisjIGVuZGlmCisjIGlmIEtNUF9BUkNIX1g4Nl82NAorIyAgZGVmaW5lIEtNUF9JTlRQVFIgMQorICAgdHlwZWRlZiBfX2ludDY0ICAgICAgICAgCWttcF9pbnRwdHJfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NAlrbXBfdWludHB0cl90OworIyAgZGVmaW5lIEtNUF9JTlRQVFJfU1BFQyAgCSJJNjRkIgorIyAgZGVmaW5lIEtNUF9VSU5UUFRSX1NQRUMgCSJJNjR1IgorIyBlbmRpZgorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyNpZiBLTVBfT1NfVU5JWAorICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICBrbXBfaW50ODsKKyAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAga21wX3VpbnQ4OworICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgICBrbXBfaW50MTY7CisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgIGttcF91aW50MTY7CisgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgIGttcF9pbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAga21wX3VpbnQzMjsKKyAgdHlwZWRlZiBsb25nIGxvbmcgICAgICAgICAga21wX2ludDY0OworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBrbXBfdWludDY0OworIyBkZWZpbmUgS01QX0lOVDMyX1NQRUMgICAgICAiZCIKKyMgZGVmaW5lIEtNUF9VSU5UMzJfU1BFQyAgICAgInUiCisjIGRlZmluZSBLTVBfSU5UNjRfU1BFQwkgICAgICJsbGQiCisjIGRlZmluZSBLTVBfVUlOVDY0X1NQRUMgICAgICJsbHUiCisjZW5kaWYgLyogS01QX09TX1VOSVggKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfTUlQUworIyBkZWZpbmUgS01QX1NJWkVfVF9TUEVDIEtNUF9VSU5UMzJfU1BFQworI2VsaWYgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQgfHwgS01QX0FSQ0hfTUlQUzY0CisjIGRlZmluZSBLTVBfU0laRV9UX1NQRUMgS01QX1VJTlQ2NF9TUEVDCisjZWxzZQorIyBlcnJvciAiQ2FuJ3QgZGV0ZXJtaW5lIHNpemVfdCBwcmludGYgZm9ybWF0IHNwZWNpZmllci4iCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NgorIyBkZWZpbmUgS01QX1NJWkVfVF9NQVggKDB4RkZGRkZGRkYpCisjZWxzZQorIyBkZWZpbmUgS01QX1NJWkVfVF9NQVggKDB4RkZGRkZGRkZGRkZGRkZGRikKKyNlbmRpZgorCit0eXBlZGVmIHNpemVfdCAga21wX3NpemVfdDsKK3R5cGVkZWYgZmxvYXQgICBrbXBfcmVhbDMyOwordHlwZWRlZiBkb3VibGUgIGttcF9yZWFsNjQ7CisKKyNpZm5kZWYgS01QX0lOVFBUUgorIyBkZWZpbmUgS01QX0lOVFBUUiAxCisgIHR5cGVkZWYgbG9uZyAgICAgICAgICAgICBrbXBfaW50cHRyX3Q7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICBrbXBfdWludHB0cl90OworIyBkZWZpbmUgS01QX0lOVFBUUl9TUEVDICAgImxkIgorIyBkZWZpbmUgS01QX1VJTlRQVFJfU1BFQyAgImx1IgorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9JOAorICB0eXBlZGVmIGttcF9pbnQ2NCAgICAgIGttcF9pbnQ7CisgIHR5cGVkZWYga21wX3VpbnQ2NCAgICAga21wX3VpbnQ7CisjZWxzZQorICB0eXBlZGVmIGttcF9pbnQzMiAgICAgIGttcF9pbnQ7CisgIHR5cGVkZWYga21wX3VpbnQzMiAgICAga21wX3VpbnQ7CisjZW5kaWYgLyogQlVJTERfSTggKi8KKyNkZWZpbmUgIEtNUF9JTlRfTUFYICAgICAoKGttcF9pbnQzMikweDdGRkZGRkZGKQorI2RlZmluZSAgS01QX0lOVF9NSU4gICAgICgoa21wX2ludDMyKTB4ODAwMDAwMDApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIHRlbXBsYXRlIGZvciBkZWJ1ZyBwcmludHMgc3BlY2lmaWNhdGlvbiAoIGQsIHUsIGxsZCwgbGx1ICksIGFuZCB0byBvYnRhaW4KKyAgICAvLyBzaWduZWQvdW5zaWduZWQgZmxhdm9ycyBvZiBhIHR5cGUKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IHRyYWl0c190IHsKKyAgICAgICAgdHlwZWRlZiBUICAgICAgICAgICBzaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBUICAgICAgICAgICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogc3BlYzsKKyAgICB9OworICAgIC8vIGludAorICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgdHJhaXRzX3Q8IHNpZ25lZCBpbnQgPiB7CisgICAgICAgIHR5cGVkZWYgc2lnbmVkIGludCAgICBzaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgZG91YmxlICAgICAgICBmbG9hdGluZ190OworICAgICAgICBzdGF0aWMgY2hhciBjb25zdCAqICAgc3BlYzsKKyAgICB9OworICAgIC8vIHVuc2lnbmVkIGludAorICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgdHJhaXRzX3Q8IHVuc2lnbmVkIGludCA+IHsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgaW50ICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgdW5zaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBkb3VibGUgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogICBzcGVjOworICAgIH07CisgICAgLy8gbG9uZyBsb25nCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgc2lnbmVkIGxvbmcgbG9uZyA+IHsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgdW5zaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBsb25nIGRvdWJsZSAgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogICAgICAgICBzcGVjOworICAgIH07CisgICAgLy8gdW5zaWduZWQgbG9uZyBsb25nCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgdW5zaWduZWQgbG9uZyBsb25nID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGxvbmcgZG91YmxlICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgICAgICAgIHNwZWM7CisgICAgfTsKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZGVmaW5lIEtNUF9FWFBPUlQJZXh0ZXJuCS8qIGV4cG9ydCBkZWNsYXJhdGlvbiBpbiBndWlkZSBsaWJyYXJpZXMgKi8KKworI2lmIF9fR05VQ19fID49IDQKKyAgICAjZGVmaW5lIF9fZm9yY2VpbmxpbmUgX19pbmxpbmUKKyNlbmRpZgorCisjZGVmaW5lIFBBR0VfU0laRSAgICAgICAgICAgICAgICAgICAgICAgKDB4NDAwMCkKKworI2lmIEtNUF9PU19MSU5VWAorI2RlZmluZSBLTVBfR0VUX1BBR0VfU0laRSgpIGdldHBhZ2VzaXplKCkKKyNlbHNlCisvLyBUT0RPOiBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIHRvIGdldHBhZ2VzaXplKCkgaW4gV2luZG93cworLy8gYW5kIHVzZSBpdCB3aGVuZXZlciBwb3NzaWJsZS4KKyNkZWZpbmUgS01QX0dFVF9QQUdFX1NJWkUoKSBQQUdFX1NJWkUKKyNlbmRpZgorCisjZGVmaW5lIFBBR0VfQUxJR05FRChfYWRkcikgICAgICggISAoKHNpemVfdCkgX2FkZHIgJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkoS01QX0dFVF9QQUdFX1NJWkUoKSAtIDEpKSkKKyNkZWZpbmUgQUxJR05fVE9fUEFHRSh4KSAgICh2b2lkICopKCgoc2l6ZV90KSh4KSkgJiB+KChzaXplX3QpKEtNUF9HRVRfUEFHRV9TSVpFKCkgLSAxKSkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3VwcG9ydCBmb3IgY2FjaGUgYWxpZ25tZW50LCBwYWRkaW5nLCBldGMuIC0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZGVmaW5lIElOVEVSTk9ERV9DQUNIRV9MSU5FIDQwOTYgLyogZm9yIG11bHRpLW5vZGUgc3lzdGVtcyAqLworCisvKiBEZWZpbmUgdGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgY2FjaGUgbGluZSAqLworI2lmbmRlZiBDQUNIRV9MSU5FCisgICAgI2RlZmluZSBDQUNIRV9MSU5FICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgLyogY2FjaGUgbGluZSBzaXplIGluIGJ5dGVzICovCisjZWxzZQorICAgICNpZiAoIENBQ0hFX0xJTkUgPCA2NCApICYmICEgZGVmaW5lZCggS01QX09TX0RBUldJTiApCisgICAgICAgIC8vIDIwMDYtMDItMTM6IFRoaXMgcHJvZHVjZXMgdG9vIG1hbnkgd2FybmluZ3Mgb24gT1MgWCouIERpc2FibGUgaXQgZm9yIGEgd2hpbGUuLi4KKyAgICAgICAgI3dhcm5pbmcgQ0FDSEVfTElORSBpcyB0b28gc21hbGwuCisgICAgI2VuZGlmCisjZW5kaWYgLyogQ0FDSEVfTElORSAqLworCisjZGVmaW5lIEtNUF9DQUNIRV9QUkVGRVRDSChBRERSKSAJLyogbm90aGluZyAqLworCisvKiBUZW1wb3Jhcnkgbm90ZTogaWYgcGVyZm9ybWFuY2UgdGVzdGluZyBvZiB0aGlzIHBhc3Nlcywgd2UgY2FuIHJlbW92ZQorICAgYWxsIHJlZmVyZW5jZXMgdG8gS01QX0RPX0FMSUdOIGFuZCByZXBsYWNlIHdpdGggS01QX0FMSUdOLiAgKi8KKyNpZiBLTVBfT1NfVU5JWCAmJiBkZWZpbmVkKF9fR05VQ19fKQorIyBkZWZpbmUgS01QX0RPX0FMSUdOKGJ5dGVzKSAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChieXRlcykpKQorIyBkZWZpbmUgS01QX0FMSUdOX0NBQ0hFICAgICAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChDQUNIRV9MSU5FKSkpCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFIF9fYXR0cmlidXRlX18oKGFsaWduZWQoSU5URVJOT0RFX0NBQ0hFX0xJTkUpKSkKKyMgZGVmaW5lIEtNUF9BTElHTihieXRlcykgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoYnl0ZXMpKSkKKyNlbHNlCisjIGRlZmluZSBLTVBfRE9fQUxJR04oYnl0ZXMpICBfX2RlY2xzcGVjKCBhbGlnbihieXRlcykgKQorIyBkZWZpbmUgS01QX0FMSUdOX0NBQ0hFICAgICAgX19kZWNsc3BlYyggYWxpZ24oQ0FDSEVfTElORSkgKQorIyBkZWZpbmUgS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERSAgICAgIF9fZGVjbHNwZWMoIGFsaWduKElOVEVSTk9ERV9DQUNIRV9MSU5FKSApCisjIGRlZmluZSBLTVBfQUxJR04oYnl0ZXMpICAgICBfX2RlY2xzcGVjKCBhbGlnbihieXRlcykgKQorI2VuZGlmCisKKy8qIEdlbmVyYWwgcHVycG9zZSBmZW5jZSB0eXBlcyBmb3IgbWVtb3J5IG9wZXJhdGlvbnMgKi8KK2VudW0ga21wX21lbV9mZW5jZV90eXBlIHsKKyAgICBrbXBfbm9fZmVuY2UsICAgICAgICAgLyogTm8gbWVtb3J5IGZlbmNlICovCisgICAga21wX2FjcXVpcmVfZmVuY2UsICAgIC8qIEFjcXVpcmUgKHJlYWQpIG1lbW9yeSBmZW5jZSAqLworICAgIGttcF9yZWxlYXNlX2ZlbmNlLCAgICAvKiBSZWxlYXNlICh3cml0ZSkgbWVtb3J5IGZlbmNlICovCisgICAga21wX2Z1bGxfZmVuY2UgICAgICAgIC8qIEZ1bGwgKHJlYWQrd3JpdGUpIG1lbW9yeSBmZW5jZSAqLworfTsKKworCisvLworLy8gU3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMKKy8vCisKKyNpZiBLTVBfQVNNX0lOVFJJTlMgJiYgS01QX09TX1dJTkRPV1MKKworI2luY2x1ZGUgPFdpbmRvd3MuaD4KKworI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCkKKyNwcmFnbWEgaW50cmluc2ljKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRFeGNoYW5nZSkKKyNwcmFnbWEgaW50cmluc2ljKEludGVybG9ja2VkRXhjaGFuZ2U2NCkKKworLy8KKy8vIFVzaW5nIEludGVybG9ja2VkSW5jcmVtZW50IC8gSW50ZXJsb2NrZWREZWNyZW1lbnQgY2F1c2VzIGEgbGlicmFyeSBsb2FkaW5nCisvLyBvcmRlcmluZyBwcm9ibGVtLCBzbyB3ZSB1c2UgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCBpbnN0ZWFkLgorLy8KKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DMzIocCkgICAgICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF8zMihwKSAgICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCA0ICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1EzMihwKSAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCA0ICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDMzIocCkgICAgICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1EzMihwKSAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgLTEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQzMihwLCB2KSAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksICh2KSApCisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fYWRkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IHYgKTsKK2V4dGVybiBrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fb3I4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9hbmQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKHAsIGN2LCBzdikgSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoICh2b2xhdGlsZSBsb25nICopKHApLChsb25nKShzdiksKGxvbmcpKGN2KSApCisKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2UoICh2b2xhdGlsZSBsb25nICopKHApLCAobG9uZykodikgKQorIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZTY0KCAodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAoa21wX2ludDY0KSh2KSApCisKK2lubGluZSBrbXBfcmVhbDMyIEtNUF9YQ0hHX1JFQUwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiB2KQoreworICAgIGttcF9pbnQzMiB0bXAgPSBJbnRlcmxvY2tlZEV4Y2hhbmdlKCAodm9sYXRpbGUgbG9uZyAqKXAsICoobG9uZyAqKSZ2KTsKKyAgICByZXR1cm4gKihrbXBfcmVhbDMyKikmdG1wOworfQorCisvLworLy8gUm91dGluZXMgdGhhdCB3ZSBzdGlsbCBuZWVkIHRvIGltcGxlbWVudCBpbiBhc3NlbWJseS4KKy8vCitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fb3IzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9vcjY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworCitleHRlcm4ga21wX2ludDggX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CitleHRlcm4ga21wX2ludDggIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoICB2b2xhdGlsZSBrbXBfaW50OCAgKnAsIGttcF9pbnQ4ICBjdiwga21wX2ludDggIHN2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIHYgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfcmVhbDMyIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYgKTsKK2V4dGVybiBrbXBfcmVhbDY0IF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICpwLCBrbXBfcmVhbDY0IHYgKTsKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREOChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDgoIChwKSwgKHYpICkKKworLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzMyKHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SOChwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9vcjgoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EOChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDgoIChwKSwgKHYpICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkM2NChwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1E2NChwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgMUxMICkKKy8vIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDQgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfNjQocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCA0TEwgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzMyKHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgLTEgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1EzMihwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgLTEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUM2NChwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIC0xTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRNjQocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIC0xTEwgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENjQocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SMzIocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3IzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQzMihwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SNjQocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3I2NCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ2NChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDY0KCAocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1ExNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBpZiBLTVBfQVJDSF9YODYKKyMgIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoICh2b2xhdGlsZSBrbXBfaW50MzIqKShwKSwgKGttcF9pbnQzMikoY3YpLCAoa21wX2ludDMyKShzdikgKQorIyBlbHNlIC8qIDY0IGJpdCBwb2ludGVycyAqLworIyAgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHZvbGF0aWxlIGttcF9pbnQ2NCopKHApLCAoa21wX2ludDY0KShjdiksIChrbXBfaW50NjQpKHN2KSApCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUOChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIChwKSwgKGN2KSwgKHN2KSApCisvLyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIChwKSwgKGN2KSwgKHN2KSApCisKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEOChwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQ4KCAodm9sYXRpbGUga21wX2ludDgqKShwKSwgKGttcF9pbnQ4KSh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQxNihwLCB2KSAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDE2KCAocCksICh2KSApOworLy8jIGRlZmluZSBLTVBfWENIR19GSVhFRDMyKHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkMzIoIChwKSwgKHYpICk7CisvLyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVENjQocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQ2NCggKHApLCAodikgKTsKKy8vIyBkZWZpbmUgS01QX1hDSEdfUkVBTDMyKHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19yZWFsMzIoIChwKSwgKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19SRUFMNjQocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX3JlYWw2NCggKHApLCAodikgKTsKKworCisjZWxpZiAoS01QX0FTTV9JTlRSSU5TICYmIEtNUF9PU19VTklYKSB8fCAhKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDgocCwgdikgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ4ICopKHApLCAodikgKQorCisvKiBjYXN0IHAgdG8gY29ycmVjdCB0eXBlIHNvIHRoYXQgcHJvcGVyIGludHJpbnNpYyB3aWxsIGJlIHVzZWQgKi8KKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DMzIocCkgICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I4KHAsIHYpICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfb3IoIChrbXBfaW50OCAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EOChwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYW5kKCAoa21wX2ludDggKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1EzMihwKSAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzY0KHApICAgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ2NCAqKShwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KHApICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50MzIgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50MzIgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzY0KHApICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksIDRMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRNjQocCkgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ2NCAqKShwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDMzIocCkgICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfc3ViKCAoa21wX2ludDMyICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfc3ViKCAoa21wX2ludDMyICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDNjQocCkgICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfc3ViKCAoa21wX2ludDY0ICopKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRNjQocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENjQocCwgdikgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SMzIocCwgdikgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX29yKCAoa21wX2ludDMyICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQzMihwLCB2KSAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hbmQoIChrbXBfaW50MzIgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SNjQocCwgdikgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX29yKCAoa21wX2ludDY0ICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ2NChwLCB2KSAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hbmQoIChrbXBfaW50NjQgKikocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KHAsIGN2LCBzdikgIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDggKikocCksKGttcF91aW50OCkoY3YpLChrbXBfdWludDgpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOChwLCBjdiwgc3YpICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQ4ICopKHApLChrbXBfdWludDgpKGN2KSwoa21wX3VpbnQ4KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTE2KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksKGttcF91aW50MTYpKGN2KSwoa21wX3VpbnQxNikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwxNihwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDE2ICopKHApLChrbXBfdWludDE2KShjdiksKGttcF91aW50MTYpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwoa21wX3VpbnQzMikoY3YpLChrbXBfdWludDMyKShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MzIgKikocCksKGttcF91aW50MzIpKGN2KSwoa21wX3VpbnQzMikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NChwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLChrbXBfdWludDY0KShjdiksKGttcF91aW50NjQpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQ2NCAqKShwKSwoa21wX3VpbnQ2NCkoY3YpLChrbXBfdWludDY0KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIHZvaWQgKiopKHApLCh2b2lkICopKGN2KSwodm9pZCAqKShzdikgKQorCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUOChwLCBjdiwgc3YpICBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDggKikocCksKGttcF91aW50OCkoY3YpLChrbXBfdWludDgpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMTYocCwgY3YsIHN2KSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDE2ICopKHApLChrbXBfdWludDE2KShjdiksKGttcF91aW50MTYpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLChrbXBfdWludDMyKShjdiksKGttcF91aW50MzIpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUNjQocCwgY3YsIHN2KSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLChrbXBfdWludDY0KShjdiksKGttcF91aW50NjQpKHN2KSApCisKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQ4KHAsIHYpICAgICAgICAgICAgICAgICAgIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwgKGttcF91aW50OCkodikgKQorI2RlZmluZSBLTVBfWENIR19GSVhFRDE2KHAsIHYpICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQxNiAqKShwKSwgKGttcF91aW50MTYpKHYpICkKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQzMihwLCB2KSAgICAgICAgICAgICAgICAgIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKHZvbGF0aWxlIGttcF91aW50MzIgKikocCksIChrbXBfdWludDMyKSh2KSApCisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVENjQocCwgdikgICAgICAgICAgICAgICAgICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoICh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLCAoa21wX3VpbnQ2NCkodikgKQorCitleHRlcm4ga21wX2ludDggX19rbXBfdGVzdF90aGVuX2FkZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCB2ICk7CitleHRlcm4ga21wX2ludDggX19rbXBfdGVzdF90aGVuX29yOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IHYgKTsKK2V4dGVybiBrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fYW5kOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IHYgKTsKK2lubGluZSBrbXBfcmVhbDMyIEtNUF9YQ0hHX1JFQUwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiB2KQoreworICAgIGttcF9pbnQzMiB0bXAgPSBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoIChrbXBfaW50MzIqKXAsICooa21wX2ludDMyKikmdik7CisgICAgcmV0dXJuICooa21wX3JlYWwzMiopJnRtcDsKK30KKworaW5saW5lIGttcF9yZWFsNjQgS01QX1hDSEdfUkVBTDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICpwLCBrbXBfcmVhbDY0IHYpCit7CisgICAga21wX2ludDY0IHRtcCA9IF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKGttcF9pbnQ2NCopcCwgKihrbXBfaW50NjQqKSZ2KTsKKyAgICByZXR1cm4gKihrbXBfcmVhbDY0KikmdG1wOworfQorCisjZWxzZQorCitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fb3IzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9vcjY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworCitleHRlcm4ga21wX2ludDggX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CitleHRlcm4ga21wX2ludDggIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoICB2b2xhdGlsZSBrbXBfaW50OCAgKnAsIGttcF9pbnQ4ICBjdiwga21wX2ludDggIHN2ICk7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIHYgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfcmVhbDMyIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYgKTsKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREOChwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ4KCAocCksICh2KSApCitleHRlcm4ga21wX3JlYWw2NCBfX2ttcF94Y2hnX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqcCwga21wX3JlYWw2NCB2ICk7CisKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I4KHAsIHYpICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9vcjgoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EOChwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hbmQ4KCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1EzMihwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzY0KHApICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDRMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRNjQocCkgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1EzMihwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgLTEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUM2NChwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIC0xTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRNjQocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIC0xTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQzMihwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDY0KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjMyKHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EMzIocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjY0KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yNjQoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5ENjQocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCggKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIChwKSwgKGN2KSwgKHN2KSApCisKKyMgaWYgS01QX0FSQ0hfWDg2CisjICBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAodm9sYXRpbGUga21wX2ludDMyKikocCksIChrbXBfaW50MzIpKGN2KSwgKGttcF9pbnQzMikoc3YpICkKKyMgZWxzZSAvKiA2NCBiaXQgcG9pbnRlcnMgKi8KKyMgIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoICh2b2xhdGlsZSBrbXBfaW50NjQqKShwKSwgKGttcF9pbnQ2NCkoY3YpLCAoa21wX2ludDY0KShzdikgKQorIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQxNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ4KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDgoICh2b2xhdGlsZSBrbXBfaW50OCopKHApLCAoa21wX2ludDgpKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19GSVhFRDE2KHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkMTYoIChwKSwgKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19GSVhFRDMyKHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkMzIoIChwKSwgKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19GSVhFRDY0KHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkNjQoIChwKSwgKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19SRUFMMzIocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX3JlYWwzMiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUw2NChwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDY0KCAocCksICh2KSApOworCisjZW5kaWYgLyogS01QX0FTTV9JTlRSSU5TICovCisKKworLyogLS0tLS0tLS0tLS0tLSByZWxheGVkIGNvbnNpc3RlbmN5IG1lbW9yeSBtb2RlbCBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGlmZGVmIF9fQUJTT0ZUX1dJTgorIyAgIGRlZmluZSBLTVBfTUIoKSAgICAgYXNtICgibm9wIikKKyMgICBkZWZpbmUgS01QX0lNQigpICAgIGFzbSAoIm5vcCIpCisjIGVsc2UKKyMgICBkZWZpbmUgS01QX01CKCkgICAgIC8qIF9hc217IG5vcCB9ICovCisjICAgZGVmaW5lIEtNUF9JTUIoKSAgICAvKiBfYXNteyBub3AgfSAqLworIyBlbmRpZgorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyNpZiBLTVBfQVJDSF9QUEM2NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCB8fCBLTVBfQVJDSF9NSVBTIHx8IEtNUF9BUkNIX01JUFM2NAorIyBkZWZpbmUgS01QX01CKCkgICAgICAgX19zeW5jX3N5bmNocm9uaXplKCkKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9NQgorIyBkZWZpbmUgS01QX01CKCkgICAgICAgLyogbm90aGluZyB0byBkbyAqLworI2VuZGlmCisKKyNpZm5kZWYgS01QX0lNQgorIyBkZWZpbmUgS01QX0lNQigpICAgICAgLyogbm90aGluZyB0byBkbyAqLworI2VuZGlmCisKKyNpZm5kZWYgS01QX1NUX1JFTDMyCisjIGRlZmluZSBLTVBfU1RfUkVMMzIoQSxEKSAgICAgICggKihBKSA9IChEKSApCisjZW5kaWYKKworI2lmbmRlZiBLTVBfU1RfUkVMNjQKKyMgZGVmaW5lIEtNUF9TVF9SRUw2NChBLEQpICAgICAgKCAqKEEpID0gKEQpICkKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9MRF9BQ1EzMgorIyBkZWZpbmUgS01QX0xEX0FDUTMyKEEpICAgICAgICAoICooQSkgKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX0xEX0FDUTY0CisjIGRlZmluZSBLTVBfTERfQUNRNjQoQSkgICAgICAgICggKihBKSApCisjZW5kaWYKKworI2RlZmluZSBUQ1JfMShhKSAgICAgICAgICAgIChhKQorI2RlZmluZSBUQ1dfMShhLGIpICAgICAgICAgIChhKSA9IChiKQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLworLy8gRklYTUUgLSBtYXliZSB0aGlzIHNob3VsZCB0aGlzIGJlCisvLworLy8gI2RlZmluZSBUQ1JfNChhKSAgICAoKih2b2xhdGlsZSBrbXBfaW50MzIgKikoJmEpKQorLy8gI2RlZmluZSBUQ1dfNChhLGIpICAoYSkgPSAoKih2b2xhdGlsZSBrbXBfaW50MzIgKikmKGIpKQorLy8KKy8vICNkZWZpbmUgVENSXzgoYSkgICAgKCoodm9sYXRpbGUga21wX2ludDY0ICopKGEpKQorLy8gI2RlZmluZSBUQ1dfOChhLGIpICAoYSkgPSAoKih2b2xhdGlsZSBrbXBfaW50NjQgKikoJmIpKQorLy8KKy8vIEknbSBmYWlybHkgY2VydGFpbiB0aGlzIGlzIHRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvLCBidXQgSSdtIGFmcmFpZAorLy8gb2YgcGVyZm9ybWFuY2UgcmVncmVzc2lvbnMuCisvLworCisjZGVmaW5lIFRDUl80KGEpICAgICAgICAgICAgKGEpCisjZGVmaW5lIFRDV180KGEsYikgICAgICAgICAgKGEpID0gKGIpCisjZGVmaW5lIFRDSV80KGEpICAgICAgICAgICAgKCsrKGEpKQorI2RlZmluZSBUQ0RfNChhKSAgICAgICAgICAgICgtLShhKSkKKyNkZWZpbmUgVENSXzgoYSkgICAgICAgICAgICAoYSkKKyNkZWZpbmUgVENXXzgoYSxiKSAgICAgICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENJXzgoYSkgICAgICAgICAgICAoKysoYSkpCisjZGVmaW5lIFRDRF84KGEpICAgICAgICAgICAgKC0tKGEpKQorI2RlZmluZSBUQ1JfU1lOQ180KGEpICAgICAgIChhKQorI2RlZmluZSBUQ1dfU1lOQ180KGEsYikgICAgIChhKSA9IChiKQorI2RlZmluZSBUQ1hfU1lOQ180KGEsYixjKSAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMigodm9sYXRpbGUga21wX2ludDMyICopKHZvbGF0aWxlIHZvaWQgKikmKGEpLCAoa21wX2ludDMyKShiKSwgKGttcF9pbnQzMikoYykpCisjZGVmaW5lIFRDUl9TWU5DXzgoYSkgICAgICAgKGEpCisjZGVmaW5lIFRDV19TWU5DXzgoYSxiKSAgICAgKGEpID0gKGIpCisjZGVmaW5lIFRDWF9TWU5DXzgoYSxiLGMpICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKikodm9sYXRpbGUgdm9pZCAqKSYoYSksIChrbXBfaW50NjQpKGIpLCAoa21wX2ludDY0KShjKSkKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9NSVBTCisvLyBXaGF0IGFib3V0IEFSTT8KKyAgICAjZGVmaW5lIFRDUl9QVFIoYSkgICAgICAgICAgKCh2b2lkICopVENSXzQoYSkpCisgICAgI2RlZmluZSBUQ1dfUFRSKGEsYikgICAgICAgIFRDV180KChhKSwoYikpCisgICAgI2RlZmluZSBUQ1JfU1lOQ19QVFIoYSkgICAgICgodm9pZCAqKVRDUl9TWU5DXzQoYSkpCisgICAgI2RlZmluZSBUQ1dfU1lOQ19QVFIoYSxiKSAgIFRDV19TWU5DXzQoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDWF9TWU5DX1BUUihhLGIsYykgKCh2b2lkICopVENYX1NZTkNfNCgoYSksKGIpLChjKSkpCisKKyNlbHNlIC8qIDY0IGJpdCBwb2ludGVycyAqLworCisgICAgI2RlZmluZSBUQ1JfUFRSKGEpICAgICAgICAgICgodm9pZCAqKVRDUl84KGEpKQorICAgICNkZWZpbmUgVENXX1BUUihhLGIpICAgICAgICBUQ1dfOCgoYSksKGIpKQorICAgICNkZWZpbmUgVENSX1NZTkNfUFRSKGEpICAgICAoKHZvaWQgKilUQ1JfU1lOQ184KGEpKQorICAgICNkZWZpbmUgVENXX1NZTkNfUFRSKGEsYikgICBUQ1dfU1lOQ184KChhKSwoYikpCisgICAgI2RlZmluZSBUQ1hfU1lOQ19QVFIoYSxiLGMpICgodm9pZCAqKVRDWF9TWU5DXzgoKGEpLChiKSwoYykpKQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKy8qCisgKiBJZiB0aGVzZSBGVE5fe1RSVUUsRkFMU0V9IHZhbHVlcyBjaGFuZ2UsIG1heSBuZWVkIHRvCisgKiBjaGFuZ2Ugc2V2ZXJhbCBwbGFjZXMgd2hlcmUgdGhleSBhcmUgdXNlZCB0byBjaGVjayB0aGF0CisgKiBsYW5ndWFnZSBpcyBGb3J0cmFuLCBub3QgQy4KKyAqLworCisjaWZuZGVmIEZUTl9UUlVFCisjIGRlZmluZSBGVE5fVFJVRSAgICAgICBUUlVFCisjZW5kaWYKKworI2lmbmRlZiBGVE5fRkFMU0UKKyMgZGVmaW5lIEZUTl9GQUxTRSAgICAgIEZBTFNFCisjZW5kaWYKKwordHlwZWRlZiB2b2lkICAgICgqbWljcm90YXNrX3QpKCBpbnQgKmd0aWQsIGludCAqbnByLCAuLi4gKTsKKworI2lmZGVmIFVTRV9WT0xBVElMRV9DQVNUCisjIGRlZmluZSBWT0xBVElMRV9DQVNUKHgpICAgICAgICAodm9sYXRpbGUgeCkKKyNlbHNlCisjIGRlZmluZSBWT0xBVElMRV9DQVNUKHgpICAgICAgICAoeCkKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9XQUlUX1lJRUxEICAgICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzQKKyNkZWZpbmUgS01QX1dBSVRfWUlFTERfUFRSICAgICAgIF9fa21wX3dhaXRfeWllbGRfNF9wdHIKKyNkZWZpbmUgS01QX0VRICAgICAgICAgICAgICAgICAgIF9fa21wX2VxXzQKKyNkZWZpbmUgS01QX05FUSAgICAgICAgICAgICAgICAgIF9fa21wX25lcV80CisjZGVmaW5lIEtNUF9MVCAgICAgICAgICAgICAgICAgICBfX2ttcF9sdF80CisjZGVmaW5lIEtNUF9HRSAgICAgICAgICAgICAgICAgICBfX2ttcF9nZV80CisjZGVmaW5lIEtNUF9MRSAgICAgICAgICAgICAgICAgICBfX2ttcF9sZV80CisKKy8qIFdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IGNvZGUgZ2VuIGJ1ZyB3aGVuIHRha2luZyBhZGRyZXNzIG9mIHN0YXRpYyBhcnJheSAoSW50ZWwoUikgNjQgVHJhY2tlciAjMTM4KSAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfUFBDNjQpICYmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgU1RBVElDX0VGSTJfV09SS0FST1VORAorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19FRkkyX1dPUktBUk9VTkQgc3RhdGljCisjZW5kaWYKKworLy8gU3VwcG9ydCBvZiBCR0VUIHVzYWdlCisjaWZuZGVmIEtNUF9VU0VfQkdFVAorI2RlZmluZSBLTVBfVVNFX0JHRVQgMQorI2VuZGlmCisKKworLy8gU3dpdGNoZXMgZm9yIE9TUyBidWlsZHMKKyNpZm5kZWYgVVNFX1NZU0ZTX0lORk8KKyMgZGVmaW5lIFVTRV9TWVNGU19JTkZPICAwCisjZW5kaWYKKyNpZm5kZWYgVVNFX0NNUFhDSEdfRklYCisjIGRlZmluZSBVU0VfQ01QWENIR19GSVggMQorI2VuZGlmCisKKy8vIEVuYWJsZSBkeW5hbWljIHVzZXIgbG9jaworI2lmIE9NUF80NV9FTkFCTEVECisjIGRlZmluZSBLTVBfVVNFX0RZTkFNSUNfTE9DSyAxCisjZW5kaWYKKworLy8gRW5hYmxlIFRTWCBpZiBkeW5hbWljIHVzZXIgbG9jayBpcyB0dXJuZWQgb24KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworLy8gVmlzdWFsIHN0dWRpbyBjYW4ndCBoYW5kbGUgdGhlIGFzbSBzZWN0aW9ucyBpbiB0aGlzIGNvZGUKKyMgZGVmaW5lIEtNUF9VU0VfVFNYICAgICAgICAgICAgIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KSAmJiAhS01QX0NPTVBJTEVSX01TVkMKKyMgaWZkZWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworIyAgdW5kZWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworIyBlbmRpZgorIyBkZWZpbmUgS01QX1VTRV9BREFQVElWRV9MT0NLUyBLTVBfVVNFX1RTWAorI2VuZGlmCisKKy8vIEVuYWJsZSB0aWNrIHRpbWUgY29udmVyc2lvbiBvZiB0aWNrcyB0byBzZWNvbmRzCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyMgZGVmaW5lIEtNUF9IQVZFX1RJQ0tfVElNRSAoS01QX09TX0xJTlVYICYmIChLTVBfTUlDIHx8IEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpKQorI2VuZGlmCisKKy8vIFdhcm5pbmcgbGV2ZWxzCitlbnVtIGttcF93YXJuaW5nc19sZXZlbCB7CisgICAga21wX3dhcm5pbmdzX29mZiA9IDAsCQkvKiBObyB3YXJuaW5ncyAqLworICAgIGttcF93YXJuaW5nc19sb3csCQkJLyogTWluaW1hbCB3YXJuaW5ncyAoZGVmYXVsdCkgKi8KKyAgICBrbXBfd2FybmluZ3NfZXhwbGljaXQgPSA2LAkJLyogRXhwbGljaXRseSBzZXQgdG8gT04gLSBtb3JlIHdhcm5pbmdzICovCisgICAga21wX3dhcm5pbmdzX3ZlcmJvc2UJCS8qIHJlc2VydmVkICovCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfT1NfSCAqLworLy8gU2FmZSBDIEFQSQorI2luY2x1ZGUgImttcF9zYWZlX2NfYXBpLmgiCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfcGxhdGZvcm0uaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjQzY2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICoga21wX3BsYXRmb3JtLmggLS0gaGVhZGVyIGZvciBkZXRlcm1pbmluZyBvcGVyYXRpbmcgc3lzdGVtIGFuZCBhcmNoaXRlY3R1cmUKKyAqLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEtNUF9QTEFURk9STV9ICisjZGVmaW5lIEtNUF9QTEFURk9STV9ICisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW5nIHN5c3RlbSByZWNvZ25pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX09TX0xJTlVYICAgIDAKKyNkZWZpbmUgS01QX09TX0ZSRUVCU0QgIDAKKyNkZWZpbmUgS01QX09TX05FVEJTRCAgIDAKKyNkZWZpbmUgS01QX09TX0RBUldJTiAgIDAKKyNkZWZpbmUgS01QX09TX1dJTkRPV1MgIDAKKyNkZWZpbmUgS01QX09TX0NOSyAgICAgIDAKKyNkZWZpbmUgS01QX09TX1VOSVggICAgIDAgIC8qIGRpc2p1bmN0aW9uIG9mIEtNUF9PU19MSU5VWCwgS01QX09TX0RBUldJTiBldGMuICovCisKKworI2lmZGVmIF9XSU4zMgorIyB1bmRlZiBLTVBfT1NfV0lORE9XUworIyBkZWZpbmUgS01QX09TX1dJTkRPV1MgMQorI2VuZGlmCisKKyNpZiAoIGRlZmluZWQgX19BUFBMRV9fICYmIGRlZmluZWQgX19NQUNIX18gKQorIyB1bmRlZiBLTVBfT1NfREFSV0lOCisjIGRlZmluZSBLTVBfT1NfREFSV0lOIDEKKyNlbmRpZgorCisvLyBpbiBzb21lIHBwYzY0IGxpbnV4IGluc3RhbGxhdGlvbnMsIG9ubHkgdGhlIHNlY29uZCBjb25kaXRpb24gaXMgbWV0CisjaWYgKCBkZWZpbmVkIF9fbGludXggKQorIyB1bmRlZiBLTVBfT1NfTElOVVgKKyMgZGVmaW5lIEtNUF9PU19MSU5VWCAxCisjZWxpZiAoIGRlZmluZWQgX19saW51eF9fKQorIyB1bmRlZiBLTVBfT1NfTElOVVgKKyMgZGVmaW5lIEtNUF9PU19MSU5VWCAxCisjZWxzZQorI2VuZGlmCisKKyNpZiAoIGRlZmluZWQgX19GcmVlQlNEX18gKQorIyB1bmRlZiBLTVBfT1NfRlJFRUJTRAorIyBkZWZpbmUgS01QX09TX0ZSRUVCU0QgMQorI2VuZGlmCisKKyNpZiAoIGRlZmluZWQgX19OZXRCU0RfXyApCisjIHVuZGVmIEtNUF9PU19ORVRCU0QKKyMgZGVmaW5lIEtNUF9PU19ORVRCU0QgMQorI2VuZGlmCisKKyNpZiAoIGRlZmluZWQgX19iZ3FfXyApCisjIHVuZGVmIEtNUF9PU19DTksKKyMgZGVmaW5lIEtNUF9PU19DTksgMQorI2VuZGlmCisKKyNpZiAoMSAhPSBLTVBfT1NfTElOVVggKyBLTVBfT1NfRlJFRUJTRCArIEtNUF9PU19ORVRCU0QgKyBLTVBfT1NfREFSV0lOICsgS01QX09TX1dJTkRPV1MpCisjIGVycm9yIFVua25vd24gT1MKKyNlbmRpZgorCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QgfHwgS01QX09TX0RBUldJTgorIyB1bmRlZiBLTVBfT1NfVU5JWAorIyBkZWZpbmUgS01QX09TX1VOSVggMQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXJjaGl0ZWN0dXJlIHJlY29nbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfQVJDSF9YODYgICAgICAgIDAKKyNkZWZpbmUgS01QX0FSQ0hfWDg2XzY0ICAgICAwCisjZGVmaW5lIEtNUF9BUkNIX0FBUkNINjQgICAgMAorI2RlZmluZSBLTVBfQVJDSF9QUEM2NF9CRSAgIDAKKyNkZWZpbmUgS01QX0FSQ0hfUFBDNjRfTEUgICAwCisjZGVmaW5lIEtNUF9BUkNIX1BQQzY0IChLTVBfQVJDSF9QUEM2NF9MRSB8fCBLTVBfQVJDSF9QUEM2NF9CRSkKKyNkZWZpbmUgS01QX0FSQ0hfTUlQUyAgICAgICAgMAorI2RlZmluZSBLTVBfQVJDSF9NSVBTNjQgICAgICAwCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBpZiBkZWZpbmVkIF9NX0FNRDY0CisjICB1bmRlZiBLTVBfQVJDSF9YODZfNjQKKyMgIGRlZmluZSBLTVBfQVJDSF9YODZfNjQgMQorIyBlbHNlCisjICB1bmRlZiBLTVBfQVJDSF9YODYKKyMgIGRlZmluZSBLTVBfQVJDSF9YODYgMQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBLTVBfT1NfVU5JWAorIyBpZiBkZWZpbmVkIF9feDg2XzY0CisjICB1bmRlZiBLTVBfQVJDSF9YODZfNjQKKyMgIGRlZmluZSBLTVBfQVJDSF9YODZfNjQgMQorIyBlbGlmIGRlZmluZWQgX19pMzg2CisjICB1bmRlZiBLTVBfQVJDSF9YODYKKyMgIGRlZmluZSBLTVBfQVJDSF9YODYgMQorIyBlbGlmIGRlZmluZWQgX19wb3dlcnBjNjRfXworIyAgaWYgZGVmaW5lZCBfX0xJVFRMRV9FTkRJQU5fXworIyAgIHVuZGVmIEtNUF9BUkNIX1BQQzY0X0xFCisjICAgZGVmaW5lIEtNUF9BUkNIX1BQQzY0X0xFIDEKKyMgIGVsc2UKKyMgICB1bmRlZiBLTVBfQVJDSF9QUEM2NF9CRQorIyAgIGRlZmluZSBLTVBfQVJDSF9QUEM2NF9CRSAxCisjICBlbmRpZgorIyBlbGlmIGRlZmluZWQgX19hYXJjaDY0X18KKyMgIHVuZGVmIEtNUF9BUkNIX0FBUkNINjQKKyMgIGRlZmluZSBLTVBfQVJDSF9BQVJDSDY0IDEKKyMgZWxpZiBkZWZpbmVkIF9fbWlwc19fCisjICBpZiBkZWZpbmVkIF9fbWlwczY0CisjICAgdW5kZWYgS01QX0FSQ0hfTUlQUzY0CisjICAgZGVmaW5lIEtNUF9BUkNIX01JUFM2NCAxCisjICBlbHNlCisjICAgdW5kZWYgS01QX0FSQ0hfTUlQUworIyAgIGRlZmluZSBLTVBfQVJDSF9NSVBTIDEKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF83X18pICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdSX18pICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjcpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykgICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzZKX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNktfXykgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82VDJfXykgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF82WktfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVY2IDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WNikgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRfXykgIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNUVfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF81VEVKX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjUpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzRfXykgICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzRUX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNCAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjQpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzNfXykgICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzNNX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WMyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjMpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzJfXykKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTVYyIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WMikKKyMgZGVmaW5lIEtNUF9BUkNIX0FSTSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NSUNfXykgfHwgZGVmaW5lZChfX01JQzJfXykKKyMgZGVmaW5lIEtNUF9NSUMgIDEKKyMgaWYgX19NSUMyX18gfHwgX19LTkNfXworIyAgZGVmaW5lIEtNUF9NSUMxIDAKKyMgIGRlZmluZSBLTVBfTUlDMiAxCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfTUlDMSAxCisjICBkZWZpbmUgS01QX01JQzIgMAorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEtNUF9NSUMgIDAKKyMgZGVmaW5lIEtNUF9NSUMxIDAKKyMgZGVmaW5lIEtNUF9NSUMyIDAKKyNlbmRpZgorCisvKiBTcGVjaWZ5IDMyIGJpdCBhcmNoaXRlY3R1cmVzIGhlcmUgKi8KKyNkZWZpbmUgS01QXzMyX0JJVF9BUkNIIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX01JUFMpCisKKy8vIFRPRE86IEZpeG1lIC0gVGhpcyBpcyBjbGV2ZXIsIGJ1dCByZWFsbHkgZnVnbHkKKyNpZiAoMSAhPSBLTVBfQVJDSF9YODYgKyBLTVBfQVJDSF9YODZfNjQgKyBLTVBfQVJDSF9BUk0gKyBLTVBfQVJDSF9QUEM2NCArIEtNUF9BUkNIX0FBUkNINjQgKyBLTVBfQVJDSF9NSVBTICsgS01QX0FSQ0hfTUlQUzY0KQorIyBlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfUExBVEZPUk1fSApkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfcnVudGltZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3ODg4MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfcnVudGltZS5jcHAKQEAgLTAsMCArMSw3Njg3IEBACisvKgorICoga21wX3J1bnRpbWUuY3BwIC0tIEtQVFMgcnVudGltZSBzdXBwb3J0IGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9hdG9taWMuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9zZXR0aW5ncy5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaW5jbHVkZSAia21wX3dhaXRfcmVsZWFzZS5oIgorI2luY2x1ZGUgImttcF9hZmZpbml0eS5oIgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5oIgorI2VuZGlmCisKKy8qIHRoZXNlIGFyZSB0ZW1wb3JhcnkgaXNzdWVzIHRvIGJlIGRlYWx0IHdpdGggKi8KKyNkZWZpbmUgS01QX1VTRV9QUkNUTCAwCisKKyNpZiBLTVBfT1NfV0lORE9XUworI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidHNhbl9hbm5vdGF0aW9ucy5oIgorCisjaWYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fYWx0X2NvbXBbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiYWx0ZXJuYXRpdmUgY29tcGlsZXIgc3VwcG9ydDogeWVzIjsKKyNlbmRpZiAvKiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkgKi8KKworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX29tcF9hcGlbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiQVBJIHZlcnNpb246ICIKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICI0LjUgKDIwMTUxMSkiOworI2VsaWYgT01QXzQwX0VOQUJMRUQKKyAgICAiNC4wICgyMDEzMDcpIjsKKyNlbHNlCisgICAgIjMuMSAoMjAxMTA3KSI7CisjZW5kaWYKKworI2lmZGVmIEtNUF9ERUJVRworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xvY2tbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAibG9jayB0eXBlOiBydW4gdGltZSBzZWxlY3RhYmxlIjsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworI2RlZmluZSBLTVBfTUlOKCB4LCB5ICkgKCAoeCkgPCAoeSkgPyAoeCkgOiAoeSkgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitrbXBfaW5mb190IF9fa21wX21vbml0b3I7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK3ZvaWQgX19rbXBfY2xlYW51cCggdm9pZCApOworCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0aWFsaXplX2luZm8oIGttcF9pbmZvX3QgKiwga21wX3RlYW1fdCAqLCBpbnQgdGlkLCBpbnQgZ3RpZCApOworc3RhdGljIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCBrbXBfdGVhbV90ICogdGVhbSwgaW50IG5ld19ucHJvYywga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLCBpZGVudF90ICogbG9jICk7CisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgX19rbXBfcGFydGl0aW9uX3BsYWNlcygga21wX3RlYW1fdCAqdGVhbSwgaW50IHVwZGF0ZV9tYXN0ZXJfb25seT0wICk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICk7Cit2b2lkIF9fa21wX2ZvcmtfYmFycmllciggaW50IGd0aWQsIGludCB0aWQgKTsKK3ZvaWQgX19rbXBfam9pbl9iYXJyaWVyKCBpbnQgZ3RpZCApOwordm9pZCBfX2ttcF9zZXR1cF9pY3ZfY29weSgga21wX3RlYW1fdCAqdGVhbSwgaW50IG5ld19ucHJvYywga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLCBpZGVudF90ICpsb2MgKTsKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK3N0YXRpYyBpbnQgX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jKCBrbXBfcm9vdF90ICogcm9vdCwgaW50IHNldF9ucHJvYyApOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19rbXBfZXhwYW5kX3RocmVhZHMoaW50IG5XaXNoLCBpbnQgbk5lZWQpOworI2lmIEtNUF9PU19XSU5ET1dTCitzdGF0aWMgaW50IF9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQoIGludCBndGlkICk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeSggdm9pZCApOyAvLyBjYWxsZWQgYnkgX19rbXBfaW50ZXJuYWxfZW5kKCkKK3N0YXRpYyB2b2lkIF9fa21wX3JlYXBfdGhyZWFkKCBrbXBfaW5mb190ICogdGhyZWFkLCBpbnQgaXNfcm9vdCApOworc3RhdGljIGttcF9pbmZvX3QgKl9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENhbGN1bGF0ZSB0aGUgaWRlbnRpZmllciBvZiB0aGUgY3VycmVudCB0aHJlYWQgKi8KKy8qIGZhc3QgKGFuZCBzb21ld2hhdCBwb3J0YWJsZSkgd2F5IHRvIGdldCB1bmlxdWUgKi8KKy8qIGlkZW50aWZpZXIgb2YgZXhlY3V0aW5nIHRocmVhZC4gICAgICAgICAgICAgICAgKi8KKy8qIHJldHVybnMgS01QX0dUSURfRE5FIGlmIHdlIGhhdmVuJ3QgYmVlbiBhc3NpZ25lZCBhIGd0aWQgICAqLworCitpbnQKK19fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCApCit7CisgICAgaW50IGk7CisgICAga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkczsKKyAgICBzaXplX3QgICAgICAgICBzdGFja19kYXRhOworICAgIGNoYXIgICAgICAgICAgKnN0YWNrX2FkZHI7CisgICAgc2l6ZV90ICAgICAgICAgc3RhY2tfc2l6ZTsKKyAgICBjaGFyICAgICAgICAgICpzdGFja19iYXNlOworCisgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogZW50ZXJpbmcsIG5wcm9jPSVkICBhbGxfbnByb2M9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbnRoLCBfX2ttcF9hbGxfbnRoICkpOworCisgICAgLyogSlBIIC0gdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIF9fa21wY19lbmQoMCkgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IHByaW9yIHRvIGEKKyAgICAgICAgICAgICBwYXJhbGxlbCByZWdpb24sIG1hZGUgaXQgcmV0dXJuIEtNUF9HVElEX0RORSB0byBmb3JjZSBzZXJpYWxfaW5pdGlhbGl6ZSBieQorICAgICAgICAgICAgIGNhbGxlci4gIEhhZCB0byBoYW5kbGUgS01QX0dUSURfRE5FIGF0IGFsbCBjYWxsLXNpdGVzLCBvciBlbHNlIGd1YXJhbnRlZQorICAgICAgICAgICAgIF9fa21wX2luaXRfZ3RpZCBmb3IgdGhpcyB0byB3b3JrLiAgKi8KKworICAgIGlmICggIVRDUl80KF9fa21wX2luaXRfZ3RpZCkgKSByZXR1cm4gS01QX0dUSURfRE5FOworCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMykgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiB1c2luZyBUREFUQVxuIiApKTsKKyAgICAgICAgcmV0dXJuIF9fa21wX2d0aWQ7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpID49IDIpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogdXNpbmcga2V5ZWQgVExTXG4iICkpOworICAgICAgICByZXR1cm4gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogdXNpbmcgaW50ZXJuYWwgYWxnLlxuIiApKTsKKworICAgIHN0YWNrX2FkZHIgICAgPSAoY2hhciopICYgc3RhY2tfZGF0YTsKKyAgICBvdGhlcl90aHJlYWRzID0gX19rbXBfdGhyZWFkczsKKworICAgIC8qCisgICAgICAgIEFUVDogVGhlIGNvZGUgYmVsb3cgaXMgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgZHVlIHRvIHVuc3luY2hyb25pemVkIGFjY2VzcyB0bworICAgICAgICBfX2ttcF90aHJlYWRzIGFycmF5LiBGb3IgZXhhbXBsZToKKyAgICAgICAgICAgIDEuIEN1cnJlbnQgdGhyZWFkIGxvYWRzIG90aGVyX3RocmVhZHNbaV0gdG8gdGhyIGFuZCBjaGVja3MgaXQsIGl0IGlzIG5vbi1OVUxMLgorICAgICAgICAgICAgMi4gQ3VycmVudCB0aHJlYWQgaXMgc3VzcGVuZGVkIGJ5IE9TLgorICAgICAgICAgICAgMy4gQW5vdGhlciB0aHJlYWQgdW5yZWdpc3RlcnMgYW5kIGZpbmlzaGVzIChkZWJ1ZyB2ZXJzaW9ucyBvZiBmcmVlKCkgbWF5IGZpbGwgbWVtb3J5CisgICAgICAgICAgICAgICB3aXRoIHNvbWV0aGluZyBsaWtlIDB4RUYpLgorICAgICAgICAgICAgNC4gQ3VycmVudCB0aHJlYWQgaXMgcmVzdW1lZC4KKyAgICAgICAgICAgIDUuIEN1cnJlbnQgdGhyZWFkIHJlYWRzIGp1bmsgZnJvbSAqdGhyLgorICAgICAgICBUT0RPOiBGaXggaXQuCisgICAgICAgIC0tbG4KKyAgICAqLworCisgICAgZm9yKCBpID0gMCA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDsgaSsrICkgeworCisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKG90aGVyX3RocmVhZHNbaV0pOworICAgICAgICBpZiggIXRociApIGNvbnRpbnVlOworCisgICAgICAgIHN0YWNrX3NpemUgPSAgKHNpemVfdClUQ1JfUFRSKHRoci0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUpOworICAgICAgICBzdGFja19iYXNlID0gIChjaGFyICopVENSX1BUUih0aHItPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlKTsKKworICAgICAgICAvKiBzdGFjayBncm93cyBkb3duIC0tIHNlYXJjaCB0aHJvdWdoIGFsbCBvZiB0aGUgYWN0aXZlIHRocmVhZHMgKi8KKworICAgICAgICBpZiggc3RhY2tfYWRkciA8PSBzdGFja19iYXNlICkgeworICAgICAgICAgICAgc2l6ZV90IHN0YWNrX2RpZmYgPSBzdGFja19iYXNlIC0gc3RhY2tfYWRkcjsKKworICAgICAgICAgICAgaWYoIHN0YWNrX2RpZmYgPD0gc3RhY2tfc2l6ZSApIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgb25seSB3YXkgd2UgY2FuIGJlIGNsb3NlciB0aGFuIHRoZSBhbGxvY2F0ZWQgKi8KKyAgICAgICAgICAgICAgICAvKiBzdGFjayBzaXplIGlzIGlmIHdlIGFyZSBydW5uaW5nIG9uIHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkgPT0gaSApOworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IHNwZWNpZmljIHRvIHRyeSBhbmQgZGV0ZXJtaW5lIG91ciBndGlkICovCisgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogaW50ZXJuYWwgYWxnLiBmYWlsZWQgdG8gZmluZCAiCisgICAgICAgICAgICAgICAgICAgICAgInRocmVhZCwgdXNpbmcgVExTXG4iICkpOworICAgIGkgPSBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworCisgICAgLypmcHJpbnRmKCBzdGRlcnIsICI9PT0gJWRcbiIsIGkgKTsgICovIC8qIEdST08gKi8KKworICAgIC8qIGlmIHdlIGhhdm4ndCBiZWVuIGFzc2lnbmVkIGEgZ3RpZCwgdGhlbiByZXR1cm4gY29kZSAqLworICAgIGlmKCBpPDAgKSByZXR1cm4gaTsKKworICAgIC8qIGR5bmFtaWNhbGx5IHVwZGF0ZWQgc3RhY2sgd2luZG93IGZvciB1YmVyIHRocmVhZHMgdG8gYXZvaWQgZ2V0X3NwZWNpZmljIGNhbGwgKi8KKyAgICBpZiggISBUQ1JfNChvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdykgKSB7CisgICAgICAgIEtNUF9GQVRBTCggU3RhY2tPdmVyZmxvdywgaSApOworICAgIH0KKworICAgIHN0YWNrX2Jhc2UgPSAoY2hhciAqKSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICBpZiggc3RhY2tfYWRkciA+IHN0YWNrX2Jhc2UgKSB7CisgICAgICAgIFRDV19QVFIob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsIHN0YWNrX2FkZHIpOworICAgICAgICBUQ1dfUFRSKG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLAorICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplICsgc3RhY2tfYWRkciAtIHN0YWNrX2Jhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDV19QVFIob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHN0YWNrX2Jhc2UgLSBzdGFja19hZGRyKTsKKyAgICB9CisKKyAgICAvKiBSZXByaW50IHN0YWNrIGJvdW5kcyBmb3IgdWJlcm1hc3RlciBzaW5jZSB0aGV5IGhhdmUgYmVlbiByZWZpbmVkICovCisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgY2hhciAqc3RhY2tfZW5kID0gKGNoYXIgKikgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2U7CisgICAgICAgIGNoYXIgKnN0YWNrX2JlZyA9IHN0YWNrX2VuZCAtIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplOworICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBpLCBzdGFja19iZWcsIHN0YWNrX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lZCBzdGFjayAocmVmaW5lbWVudCkiLCBpICk7CisgICAgfQorICAgIHJldHVybiBpOworfQorCitpbnQKK19fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZyggKQoreworICAgIGludCBndGlkOworCisgICAgaWYgKCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIGd0aWQgPSBLTVBfR1RJRF9ETkU7CisgICAgfSBlbHNlCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMyApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IHVzaW5nIFREQVRBXG4iICkpOworICAgICAgICBndGlkID0gX19rbXBfZ3RpZDsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA+PSAyICkgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogdXNpbmcga2V5ZWQgVExTXG4iICkpOworICAgICAgICBndGlkID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogdXNpbmcgaW50ZXJuYWwgYWxnLlxuIiApKTsKKyAgICAgICAgZ3RpZCA9IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCk7CisgICAgfQorCisgICAgLyogd2UgbXVzdCBiZSBhIG5ldyB1YmVyIG1hc3RlciBzaWJsaW5nIHRocmVhZCAqLworICAgIGlmKCBndGlkID09IEtNUF9HVElEX0RORSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IEVuY291bnRlcmVkIG5ldyByb290IHRocmVhZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lzdGVyaW5nIGEgbmV3IGd0aWQuXG4iICkpOworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICBpZiggIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgICAgIGd0aWQgPSBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3RpZCA9IF9fa21wX3JlZ2lzdGVyX3Jvb3QoRkFMU0UpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIC8qX19rbXBfcHJpbnRmKCAiKysrICVkXG4iLCBndGlkICk7ICovIC8qIEdST08gKi8KKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49MCApOworCisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKy8qIGNhbGxlciBtdXN0IGhvbGQgZm9ya2pvaW5fbG9jayAqLwordm9pZAorX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCgga21wX2luZm9fdCAqdGggKQoreworICAgIGludCBmOworICAgIGNoYXIgKnN0YWNrX2JlZyA9IE5VTEw7CisgICAgY2hhciAqc3RhY2tfZW5kID0gTlVMTDsKKyAgICBpbnQgZ3RpZDsKKworICAgIEtBX1RSQUNFKDEwLCgiX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcDogY2FsbGVkXG4iKSk7CisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgc3RhY2tfZW5kID0gKGNoYXIgKikgdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlOworICAgICAgICBzdGFja19iZWcgPSBzdGFja19lbmQgLSB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemU7CisKKyAgICAgICAgZ3RpZCA9IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICk7CisKKyAgICAgICAgaWYgKGd0aWQgPT0gS01QX0dUSURfTU9OSVRPUikgeworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgc3RhY2tfYmVnLCBzdGFja19lbmQsIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJXMgc3RhY2sgKCVzKSIsICJtb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93ICkgPyAiaW5pdGlhbCIgOiAiYWN0dWFsIiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgc3RhY2tfYmVnLCBzdGFja19lbmQsIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQgc3RhY2sgKCVzKSIsIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cgKSA/ICJpbml0aWFsIiA6ICJhY3R1YWwiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBObyBwb2ludCBpbiBjaGVja2luZyB1YmVybWFzdGVyIHRocmVhZHMgc2luY2UgdGhleSB1c2UgcmVmaW5lbWVudCBhbmQgY2Fubm90IG92ZXJsYXAgKi8KKyAgICBndGlkID0gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKTsKKyAgICBpZiAoIF9fa21wX2Vudl9jaGVja3MgPT0gVFJVRSAmJiAhS01QX1VCRVJfR1RJRChndGlkKSkKKyAgICB7CisgICAgICAgIEtBX1RSQUNFKDEwLCgiX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcDogcGVyZm9ybWluZyBleHRlbnNpdmUgY2hlY2tpbmdcbiIpKTsKKyAgICAgICAgaWYgKCBzdGFja19iZWcgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIHN0YWNrX2VuZCA9IChjaGFyICopIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICAgICAgICAgIHN0YWNrX2JlZyA9IHN0YWNrX2VuZCAtIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggZj0wIDsgZiA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgOyBmKysgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICpmX3RoID0gKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tmXSk7CisKKyAgICAgICAgICAgIGlmKCBmX3RoICYmIGZfdGggIT0gdGggKSB7CisgICAgICAgICAgICAgICAgY2hhciAqb3RoZXJfc3RhY2tfZW5kID0gKGNoYXIgKilUQ1JfUFRSKGZfdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlKTsKKyAgICAgICAgICAgICAgICBjaGFyICpvdGhlcl9zdGFja19iZWcgPSBvdGhlcl9zdGFja19lbmQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpVENSX1BUUihmX3RoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYoKHN0YWNrX2JlZyA+IG90aGVyX3N0YWNrX2JlZyAmJiBzdGFja19iZWcgPCBvdGhlcl9zdGFja19lbmQpIHx8CisgICAgICAgICAgICAgICAgICAgKHN0YWNrX2VuZCA+IG90aGVyX3N0YWNrX2JlZyAmJiBzdGFja19lbmQgPCBvdGhlcl9zdGFja19lbmQpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogUHJpbnQgdGhlIG90aGVyIHN0YWNrIHZhbHVlcyBiZWZvcmUgdGhlIGFib3J0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKQorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsIG90aGVyX3N0YWNrX2JlZywgb3RoZXJfc3RhY2tfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpVENSX1BUUihmX3RoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkIHN0YWNrIChvdmVybGFwcGVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggZl90aCApICk7CisKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIEtNUF9NU0coIFN0YWNrT3ZlcmxhcCApLCBLTVBfSE5UKCBDaGFuZ2VTdGFja0xpbWl0ICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEtBX1RSQUNFKDEwLCgiX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcDogcmV0dXJuaW5nXG4iKSk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9pbmZpbml0ZV9sb29wKCB2b2lkICkKK3sKKyAgICBzdGF0aWMgaW50IGRvbmUgPSBGQUxTRTsKKworICAgIHdoaWxlICghIGRvbmUpIHsKKyAgICAgICAgS01QX1lJRUxEKCAxICk7CisgICAgfQorfQorCisjZGVmaW5lIE1BWF9NRVNTQUdFICAgICA1MTIKKwordm9pZAorX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggaW50IGd0aWQsIHZvaWQgKnAxLCB2b2lkICpwMiwgc2l6ZV90IHNpemUsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uKSB7CisgICAgY2hhciBidWZmZXJbTUFYX01FU1NBR0VdOworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCk7CisgICAgS01QX1NOUFJJTlRGKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAiT01QIHN0b3JhZ2UgbWFwOiAlcCAlcCU4bHUgJXNcbiIsIHAxLCBwMiwgKHVuc2lnbmVkIGxvbmcpIHNpemUsIGZvcm1hdCApOworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGJ1ZmZlciwgYXAgKTsKKyNpZiBLTVBfUFJJTlRfREFUQV9QTEFDRU1FTlQKKyAgICBpbnQgbm9kZTsKKyAgICBpZihndGlkID49IDApIHsKKyAgICAgICAgaWYocDEgPD0gcDIgJiYgKGNoYXIqKXAyIC0gKGNoYXIqKXAxID09IHNpemUpIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlICkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKTsKKyAgICAgICAgICAgICAgICBpZihub2RlIDwgMCkgIC8qIGRvZXNuJ3Qgd29yaywgc28gZG9uJ3QgdHJ5IHRoaXMgbmV4dCB0aW1lICovCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxhc3ROb2RlOworICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYWxQcm9jID0gX19rbXBfZ2V0X2NwdV9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHBhZ2Vfc2l6ZSA9IEtNUF9HRVRfUEFHRV9TSVpFKCk7CisKKyAgICAgICAgICAgICAgICAgICAgcDEgPSAodm9pZCAqKSggKHNpemVfdClwMSAmIH4oKHNpemVfdClwYWdlX3NpemUgLSAxKSApOworICAgICAgICAgICAgICAgICAgICBwMiA9ICh2b2lkICopKCAoKHNpemVfdCkgcDIgLSAxKSAmIH4oKHNpemVfdClwYWdlX3NpemUgLSAxKSApOworICAgICAgICAgICAgICAgICAgICBpZihsb2NhbFByb2MgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgIEdUSUQgJWQgbG9jYWxOb2RlICVkXG4iLCBndGlkLCBsb2NhbFByb2M+PjEpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICBHVElEICVkXG4iLCBndGlkKTsKKyMgaWYgS01QX1VTRV9QUkNUTAorLyogVGhlIG1vcmUgZWxhYm9yYXRlIGZvcm1hdCBpcyBkaXNhYmxlZCBmb3Igbm93IGJlY2F1c2Ugb2YgdGhlIHByY3RsIGhhbmdpbmcgYnVnLiAqLworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gcDE7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGxvb3AgY29sbGF0ZXMgYWRqYWNlbnQgcGFnZXMgd2l0aCB0aGUgc2FtZSBob3N0IG5vZGUuICovCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAxICs9IHBhZ2Vfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUocDEgPD0gcDIgJiYgKG5vZGUgPSBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKSkgPT0gbGFzdE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgICAlcC0lcCBtZW1Ob2RlICVkXG4iLCBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAxIC0gMSwgbGFzdE5vZGUpOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHAxIDw9IHAyKTsKKyMgZWxzZQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAgICVwLSVwIG1lbU5vZGUgJWRcbiIsIHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcDEgKyAocGFnZV9zaXplIC0gMSksIF9fa21wX2dldF9ob3N0X25vZGUocDEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocDEgPCBwMikgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgICAgJXAtJXAgbWVtTm9kZSAlZFxuIiwgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcDIgKyAocGFnZV9zaXplIC0gMSksIF9fa21wX2dldF9ob3N0X25vZGUocDIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorIyBlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAlc1xuIiwgS01QX0kxOE5fU1RSKCBTdG9yYWdlTWFwV2FybmluZyApICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9QUklOVF9EQVRBX1BMQUNFTUVOVCAqLworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworfQorCit2b2lkCitfX2ttcF93YXJuKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIGNoYXIgYnVmZmVyW01BWF9NRVNTQUdFXTsKKyAgICB2YV9saXN0IGFwOworCisgICAgaWYgKCBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIEtNUF9TTlBSSU5URiggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAsICJPTVAgd2FybmluZzogJXNcbiIsIGZvcm1hdCApOworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGJ1ZmZlciwgYXAgKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKwordm9pZAorX19rbXBfYWJvcnRfcHJvY2VzcygpCit7CisKKyAgICAvLyBMYXRlciB0aHJlYWRzIG1heSBzdGFsbCBoZXJlLCBidXQgdGhhdCdzIG9rIGJlY2F1c2UgYWJvcnQoKSB3aWxsIGtpbGwgdGhlbS4KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2V4aXRfbG9jayApOworCisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKSB7CisgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgfTsgLy8gaWYKKworICAgIGlmICggS01QX09TX1dJTkRPV1MgKSB7CisgICAgICAgIC8vIExldCBvdGhlciB0aHJlYWRzIGtub3cgb2YgYWJub3JtYWwgdGVybWluYXRpb24gYW5kIHByZXZlbnQgZGVhZGxvY2sKKyAgICAgICAgLy8gaWYgYWJvcnQgaGFwcGVuZWQgZHVyaW5nIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gb3Igc2h1dGRvd24KKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IFNJR0FCUlQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICAgIE9uIFdpbmRvd3MqIE9TIGJ5IGRlZmF1bHQgYWJvcnQoKSBjYXVzZXMgcG9wLXVwIGVycm9yIGJveCwgd2hpY2ggc3RhbGxzIG5pZ2h0bHkgdGVzdGluZy4KKyAgICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHdlIGNhbm5vdCByZWxpYWJseSBzdXBwcmVzcyBwb3AtdXAgZXJyb3IgYm94ZXMuIF9zZXRfYWJvcnRfYmVoYXZpb3IoKQorICAgICAgICAgICAgd29ya3Mgd2VsbCwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBpbiBWUzcgKHRoaXMgaXMgbm90IHByb2JsZW0gZm9yIERMTCwgYnV0CisgICAgICAgICAgICBpdCBpcyBhIHByb2JsZW0gZm9yIHN0YXRpYyBPcGVuTVAgUlRMKS4gU2V0RXJyb3JNb2RlIChhbmQgc28sIHRpbWVsaW1pdCB1dGlsaXR5KSBkb2VzCisgICAgICAgICAgICBub3QgaGVscCwgYXQgbGVhc3QgaW4gc29tZSB2ZXJzaW9ucyBvZiBNUyBDIFJUTC4KKworICAgICAgICAgICAgSXQgc2VlbXMgZm9sbG93aW5nIHNlcXVlbmNlIGlzIHRoZSBvbmx5IHdheSB0byBzaW11bGF0ZSBhYm9ydCgpIGFuZCBhdm9pZCBwb3AtdXAgZXJyb3IKKyAgICAgICAgICAgIGJveC4KKyAgICAgICAgKi8KKyAgICAgICAgcmFpc2UoIFNJR0FCUlQgKTsKKyAgICAgICAgX2V4aXQoIDMgKTsgICAgLy8gSnVzdCBpbiBjYXNlLCBpZiBzaWduYWwgaWdub3JlZCwgZXhpdCBhbnl3YXkuCisgICAgfSBlbHNlIHsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfaW5maW5pdGVfbG9vcCgpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfZXhpdF9sb2NrICk7CisKK30gLy8gX19rbXBfYWJvcnRfcHJvY2VzcworCit2b2lkCitfX2ttcF9hYm9ydF90aHJlYWQoIHZvaWQgKQoreworICAgIC8vIFRPRE86IEVsaW1pbmF0ZSBnX2Fib3J0IGdsb2JhbCB2YXJpYWJsZSBhbmQgdGhpcyBmdW5jdGlvbi4KKyAgICAvLyBJbiBjYXNlIG9mIGFib3J0IGp1c3QgY2FsbCBhYm9ydCgpLCBpdCB3aWxsIGtpbGwgYWxsIHRoZSB0aHJlYWRzLgorICAgIF9fa21wX2luZmluaXRlX2xvb3AoKTsKK30gLy8gX19rbXBfYWJvcnRfdGhyZWFkCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogUHJpbnQgb3V0IHRoZSBzdG9yYWdlIG1hcCBmb3IgdGhlIG1ham9yIGttcF9pbmZvX3QgdGhyZWFkIGRhdGEgc3RydWN0dXJlcworICogdGhhdCBhcmUgYWxsb2NhdGVkIHRvZ2V0aGVyLgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF90aHJlYWRfc3RvcmFnZV9tYXAoIGttcF9pbmZvX3QgKnRociwgaW50IGd0aWQgKQoreworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsIHRociwgdGhyICsgMSwgc2l6ZW9mKGttcF9pbmZvX3QpLCAidGhfJWQiLCBndGlkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9pbmZvLCAmdGhyLT50aC50aF90ZWFtLCBzaXplb2Yoa21wX2Rlc2NfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lZC50aF9pbmZvIiwgZ3RpZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+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+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9IGRpc3BfYnVmZmVyOworICAgICAgICB9CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2g7CisKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3BhcmFsbGVsKCBnbG9iYWxfdGlkLCBOVUxMICk7CisKK30KKworLyogbW9zdCBvZiB0aGUgd29yayBmb3IgYSBmb3JrICovCisvKiByZXR1cm4gdHJ1ZSBpZiB3ZSByZWFsbHkgd2VudCBwYXJhbGxlbCwgZmFsc2UgaWYgc2VyaWFsaXplZCAqLworaW50CitfX2ttcF9mb3JrX2NhbGwoCisgICAgaWRlbnRfdCAgICogbG9jLAorICAgIGludCAgICAgICAgIGd0aWQsCisgICAgZW51bSBmb3JrX2NvbnRleHRfZSAgY2FsbF9jb250ZXh0LCAvLyBJbnRlbCwgR05VLCAuLi4KKyAgICBrbXBfaW50MzIgICBhcmdjLAorI2lmIE9NUFRfU1VQUE9SVAorICAgIHZvaWQgICAgICAgKnVud3JhcHBlZF90YXNrLAorI2VuZGlmCisgICAgbWljcm90YXNrX3QgbWljcm90YXNrLAorICAgIGxhdW5jaF90ICAgIGludm9rZXIsCisvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICB2YV9saXN0ICAgKiBhcAorI2Vsc2UKKyAgICB2YV9saXN0ICAgICBhcAorI2VuZGlmCisgICAgKQoreworICAgIHZvaWQgICAgICAgICAgKiphcmd2OworICAgIGludCAgICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfdGlkOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfdGhpc19jb25zOworICAgIGttcF90ZWFtX3QgICAgICp0ZWFtOworICAgIGttcF90ZWFtX3QgICAgICpwYXJlbnRfdGVhbTsKKyAgICBrbXBfaW5mb190ICAgICAqbWFzdGVyX3RoOworICAgIGttcF9yb290X3QgICAgICpyb290OworICAgIGludCAgICAgICAgICAgICBudGhyZWFkczsKKyAgICBpbnQgICAgICAgICAgICAgbWFzdGVyX2FjdGl2ZTsKKyAgICBpbnQgICAgICAgICAgICAgbWFzdGVyX3NldF9udW10aHJlYWRzOworICAgIGludCAgICAgICAgICAgICBsZXZlbDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGludCAgICAgICAgICAgICBhY3RpdmVfbGV2ZWw7CisgICAgaW50ICAgICAgICAgICAgIHRlYW1zX2xldmVsOworI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKipwX2hvdF90ZWFtczsKKyNlbmRpZgorICAgIHsgLy8gS01QX1RJTUVfQkxPQ0sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soS01QX2ZvcmtfY2FsbCk7CisgICAgS01QX0NPVU5UX1ZBTFVFKE9NUF9QQVJBTExFTF9hcmdzLCBhcmdjKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IGVudGVyIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgaWYgKCBfX2ttcF9zdGtwYWRkaW5nID4gMCAmJiAgX19rbXBfcm9vdFtndGlkXSAhPSBOVUxMICkgeworICAgICAgICAvKiBTb21lIHN5c3RlbXMgcHJlZmVyIHRoZSBzdGFjayBmb3IgdGhlIHJvb3QgdGhyZWFkKHMpIHRvIHN0YXJ0IHdpdGggKi8KKyAgICAgICAgLyogc29tZSBnYXAgZnJvbSB0aGUgcGFyZW50IHN0YWNrIHRvIHByZXZlbnQgZmFsc2Ugc2hhcmluZy4gKi8KKyAgICAgICAgdm9pZCAqZHVtbXkgPSBLTVBfQUxMT0NBKF9fa21wX3N0a3BhZGRpbmcpOworICAgICAgICAvKiBUaGVzZSAyIGxpbmVzIGJlbG93IGFyZSBzbyB0aGlzIGRvZXMgbm90IGdldCBvcHRpbWl6ZWQgb3V0ICovCisgICAgICAgIGlmICggX19rbXBfc3RrcGFkZGluZyA+IEtNUF9NQVhfU1RLUEFERElORyApCisgICAgICAgICAgICBfX2ttcF9zdGtwYWRkaW5nICs9IChzaG9ydCkoKGttcF9pbnQ2NClkdW1teSk7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBpZiBuZWVkZWQgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAvLyBBQzogcG90ZW50aWFsbHkgdW5zYWZlLCBub3QgaW4gc3luYyB3aXRoIHNodXRkb3duCisgICAgaWYoICEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAvKiBzZXR1cCBjdXJyZW50IGRhdGEgKi8KKyAgICBtYXN0ZXJfdGggICAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOyAvLyBBQzogcG90ZW50aWFsbHkgdW5zYWZlLCBub3QgaW4gc3luYyB3aXRoIHNodXRkb3duCisgICAgcGFyZW50X3RlYW0gICA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbTsKKyAgICBtYXN0ZXJfdGlkICAgID0gbWFzdGVyX3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKyAgICBtYXN0ZXJfdGhpc19jb25zID0gbWFzdGVyX3RoLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdDsKKyAgICByb290ICAgICAgICAgID0gbWFzdGVyX3RoLT50aC50aF9yb290OworICAgIG1hc3Rlcl9hY3RpdmUgPSByb290LT5yLnJfYWN0aXZlOworICAgIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA9IG1hc3Rlcl90aC0+dGgudGhfc2V0X25wcm9jOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQ7CisgICAgb21wdF90YXNrX2lkX3Qgb21wdF90YXNrX2lkOworICAgIG9tcHRfZnJhbWVfdCAqb21wdF9mcmFtZTsKKyAgICBvbXB0X3Rhc2tfaWRfdCBteV90YXNrX2lkOworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBteV9wYXJhbGxlbF9pZDsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgb21wdF9wYXJhbGxlbF9pZCA9IF9fb21wdF9wYXJhbGxlbF9pZF9uZXcoZ3RpZCk7CisgICAgICAgIG9tcHRfdGFza19pZCA9IF9fb21wdF9nZXRfdGFza19pZF9pbnRlcm5hbCgwKTsKKyAgICAgICAgb21wdF9mcmFtZSA9IF9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbCgwKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIE5lc3RlZCBsZXZlbCB3aWxsIGJlIGFuIGluZGV4IGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkKKyAgICBsZXZlbCAgICAgICAgID0gcGFyZW50X3RlYW0tPnQudF9sZXZlbDsKKyAgICBhY3RpdmVfbGV2ZWwgID0gcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWw7IC8vIGlzIHVzZWQgdG8gbGF1bmNoIG5vbi1zZXJpYWwgdGVhbXMgZXZlbiBpZiBuZXN0ZWQgaXMgbm90IGFsbG93ZWQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRlYW1zX2xldmVsICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbDsgLy8gbmVlZGVkIHRvIGNoZWNrIG5lc3RpbmcgaW5zaWRlIHRoZSB0ZWFtcworI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBwX2hvdF90ZWFtcyAgID0gJm1hc3Rlcl90aC0+dGgudGhfaG90X3RlYW1zOworICAgIGlmKCAqcF9ob3RfdGVhbXMgPT0gTlVMTCAmJiBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsID4gMCApIHsKKyAgICAgICAgKnBfaG90X3RlYW1zID0gKGttcF9ob3RfdGVhbV9wdHJfdCopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9ob3RfdGVhbV9wdHJfdCkgKiBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsKTsKKyAgICAgICAgKCpwX2hvdF90ZWFtcylbMF0uaG90X3RlYW0gPSByb290LT5yLnJfaG90X3RlYW07CisgICAgICAgICgqcF9ob3RfdGVhbXMpWzBdLmhvdF90ZWFtX250aCA9IDE7IC8vIGl0IGlzIGVpdGhlciBhY3R1YWwgb3Igbm90IG5lZWRlZCAod2hlbiBhY3RpdmVfbGV2ZWwgPiAwKQorICAgIH0KKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4pKSB7CisgICAgICAgIGludCB0ZWFtX3NpemUgPSBtYXN0ZXJfc2V0X251bXRocmVhZHM7CisKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKSgKKyAgICAgICAgICAgIG9tcHRfdGFza19pZCwgb21wdF9mcmFtZSwgb21wdF9wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgIHRlYW1fc2l6ZSwgdW53cmFwcGVkX3Rhc2ssIE9NUFRfSU5WT0tFUihjYWxsX2NvbnRleHQpKTsKKyAgICB9CisjZW5kaWYKKworICAgIG1hc3Rlcl90aC0+dGgudGhfaWRlbnQgPSBsb2M7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgJiYKKyAgICAgICAgIGFwICYmIG1pY3JvdGFzayAhPSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICYmIGxldmVsID09IHRlYW1zX2xldmVsICkgeworICAgICAgICAvLyBBQzogVGhpcyBpcyBzdGFydCBvZiBwYXJhbGxlbCB0aGF0IGlzIG5lc3RlZCBpbnNpZGUgdGVhbXMgY29uc3RydWN0LgorICAgICAgICAvLyAgICAgVGhlIHRlYW0gaXMgYWN0dWFsIChob3QpLCBhbGwgd29ya2VycyBhcmUgcmVhZHkgYXQgdGhlIGZvcmsgYmFycmllci4KKyAgICAgICAgLy8gICAgIE5vIGxvY2sgbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHRlYW0gYSBiaXQsIHRoZW4gZnJlZSB3b3JrZXJzLgorICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2lkZW50ID0gbG9jOworICAgICAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHBhcmVudF90ZWFtLCBUUlVFICk7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfYXJnYyAgPSBhcmdjOworICAgICAgICBhcmd2ID0gKHZvaWQqKilwYXJlbnRfdGVhbS0+dC50X2FyZ3Y7CisgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCBhcCwgdm9pZCAqICk7CisjZW5kaWYKKyAgICAgICAgLyogSW5jcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWxzLCBidXQgbm90IGluY3JlYXNlIHRoZSBzZXJpYWxpemF0aW9uICovCisgICAgICAgIGlmICggcGFyZW50X3RlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gc2VyaWFsaXplZCBwYXJhbGxlbAorICAgICAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBndGlkKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZCA+IDEgKTsKKyAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZC0tOyAvLyBBQzogbmVlZCB0aGlzIGluIG9yZGVyIGVucXVpcnkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdvcmsgY29ycmVjdGx5LCB3aWxsIHJlc3RvcmUgYXQgam9pbiB0aW1lCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICAgICAgdm9pZCAqKmV4aXRfcnVudGltZV9wOworCisgICAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgbHdfdGFza3RlYW07CisKKyAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdCgmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgdW53cmFwcGVkX3Rhc2ssIG9tcHRfcGFyYWxsZWxfaWQpOworICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmKGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSk7CisKKyAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fbGluaygmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCk7CisKKyNpZiBPTVBUX1RSQUNFCisgICAgICAgICAgICAgICAgLyogT01QVCBpbXBsaWNpdCB0YXNrIGJlZ2luICovCisgICAgICAgICAgICAgICAgbXlfdGFza19pZCA9IGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQgPSBwYXJlbnRfdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKSB7CisgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIC8qIE9NUFQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJmR1bW15OworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGFyYWxsZWwpOworICAgICAgICAgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgICAgICAgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFzaywgZ3RpZCwgMCwgYXJnYywgcGFyZW50X3RlYW0tPnQudF9hcmd2CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBleGl0X3J1bnRpbWVfcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgKmV4aXRfcnVudGltZV9wID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyNpZiBPTVBUX1RSQUNFCisgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQpKSB7CisgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBvbXB0X3Rhc2tfaWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV91bmxpbmsobWFzdGVyX3RoKTsKKyAgICAgICAgICAgICAgICAvLyByZXNldCBjbGVhciB0aGUgdGFzayBpZCBvbmx5IGFmdGVyIHVubGlua2luZyB0aGUgdGFzaworICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBvbXB0X3Rhc2tfaWRfbm9uZTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKSB7CisgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKAorICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgT01QVF9JTlZPS0VSKGNhbGxfY29udGV4dCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfcGtmbiAgPSBtaWNyb3Rhc2s7CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIHBhcmVudF90ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLm1pY3JvdGFzayA9IHVud3JhcHBlZF90YXNrOworI2VuZGlmCisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaW52b2tlID0gaW52b2tlcjsKKyAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiopICZyb290LT5yLnJfaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKys7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfbGV2ZWwgKys7CisKKyAgICAgICAgLyogQ2hhbmdlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSB0ZWFtIGlmIHJlcXVlc3RlZCAqLworICAgICAgICBpZiAoIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyApIHsgICAvLyBUaGUgcGFyYWxsZWwgaGFzIG51bV90aHJlYWRzIGNsYXVzZQorICAgICAgICAgICAgaWYgKCBtYXN0ZXJfc2V0X251bXRocmVhZHMgPCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRoICkgeworICAgICAgICAgICAgICAgIC8vIEFDOiBvbmx5IGNhbiByZWR1Y2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIGR5bmFtaWNhbGx5LCBjYW5ub3QgaW5jcmVhc2UKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHBhcmVudF90ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X25wcm9jID0gbWFzdGVyX3NldF9udW10aHJlYWRzOworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbWFzdGVyX3NldF9udW10aHJlYWRzOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX3RlYW1fbnByb2MgPSBtYXN0ZXJfc2V0X251bXRocmVhZHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEtlZXAgZXh0cmEgdGhyZWFkcyBob3QgaW4gdGhlIHRlYW0gZm9yIHBvc3NpYmxlIG5leHQgcGFyYWxsZWxzCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIH0KKworI2lmIFVTRV9ERUJVR0dFUgorICAgIGlmICggX19rbXBfZGVidWdnaW5nICkgeyAgICAvLyBMZXQgZGVidWdnZXIgb3ZlcnJpZGUgbnVtYmVyIG9mIHRocmVhZHMuCisgICAgICAgIGludCBudGggPSBfX2ttcF9vbXBfbnVtX3RocmVhZHMoIGxvYyApOworICAgICAgICBpZiAoIG50aCA+IDAgKSB7ICAgICAgICAvLyAwIG1lYW5zIGRlYnVnZ2VyIGRvZXMgbm90IHdhbnQgdG8gY2hhbmdlIG51bWJlciBvZiB0aHJlYWRzLgorICAgICAgICAgICAgbWFzdGVyX3NldF9udW10aHJlYWRzID0gbnRoOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisjZW5kaWYKKworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogYmVmb3JlIGludGVybmFsIGZvcms6IHJvb3Q9JXAsIHRlYW09JXAsIG1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwgcm9vdCwgcGFyZW50X3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCApICk7CisgICAgICAgIF9fa21wX2ludGVybmFsX2ZvcmsoIGxvYywgZ3RpZCwgcGFyZW50X3RlYW0gKTsKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGFmdGVyIGludGVybmFsIGZvcms6IHJvb3Q9JXAsIHRlYW09JXAsIG1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwgcm9vdCwgcGFyZW50X3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCApICk7CisKKyAgICAgICAgLyogSW52b2tlIG1pY3JvdGFzayBmb3IgTUFTVEVSIHRocmVhZCAqLworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOjApIGludm9rZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGFyZW50X3RlYW0tPnQudF9pZCwgcGFyZW50X3RlYW0tPnQudF9wa2ZuICkgKTsKKworICAgICAgICB7CisgICAgICAgICAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGFyYWxsZWwpOworICAgICAgICAgICAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soSU1QTElDSVRfVEFTSyk7CisgICAgICAgICAgICBpZiAoISBwYXJlbnRfdGVhbS0+dC50X2ludm9rZSggZ3RpZCApKSB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVDIoIDAsICJjYW5ub3QgaW52b2tlIG1pY3JvdGFzayBmb3IgTUFTVEVSIHRocmVhZCIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOjApIGRvbmUgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICBndGlkLCBwYXJlbnRfdGVhbS0+dC50X2lkLCBwYXJlbnRfdGVhbS0+dC50X3BrZm4gKSApOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBwYXJhbGxlbCBleGl0IFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSAvLyBQYXJhbGxlbCBjbG9zZWx5IG5lc3RlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjaWYgS01QX0RFQlVHCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9PSBwYXJlbnRfdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPj0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMgKSB7CisgICAgICAgIG50aHJlYWRzID0gMTsKKyAgICB9IGVsc2UgeworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGludCBlbnRlcl90ZWFtcyA9ICgoYXA9PU5VTEwgJiYgYWN0aXZlX2xldmVsPT0wKXx8KGFwICYmIHRlYW1zX2xldmVsPjAgJiYgdGVhbXNfbGV2ZWw9PWxldmVsKSk7CisjZW5kaWYKKyAgICAgICAgbnRocmVhZHMgPSBtYXN0ZXJfc2V0X251bXRocmVhZHMgPworICAgICAgICAgICAgbWFzdGVyX3NldF9udW10aHJlYWRzIDogZ2V0X19ucHJvY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApOyAvLyBUT0RPOiBnZXQgbnByb2MgZGlyZWN0bHkgZnJvbSBjdXJyZW50IHRhc2sKKworICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHRha2UgZm9ya2pvaW4gbG9jaz8gKG5vIG5lZWQgZm9yIHNlcmlhbGl6ZWQgcGFyYWxsZWwgb3V0IG9mIHRlYW1zIGNvbnN0cnVjdCkuCisgICAgICAgIC8vIFRoaXMgY29kZSBtb3ZlZCBoZXJlIGZyb20gX19rbXBfcmVzZXJ2ZV90aHJlYWRzKCkgdG8gc3BlZWR1cCBuZXN0ZWQgc2VyaWFsaXplZCBwYXJhbGxlbHMuCisgICAgICAgIGlmIChudGhyZWFkcyA+IDEpIHsKKyAgICAgICAgICAgIGlmICggKCAhZ2V0X19uZXN0ZWQobWFzdGVyX3RoKSAmJiAocm9vdC0+ci5yX2luX3BhcmFsbGVsCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAmJiAhZW50ZXJfdGVhbXMKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgICAgKSApIHx8ICggX19rbXBfbGlicmFyeSA9PSBsaWJyYXJ5X3NlcmlhbCApICkgeworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBUIyVkIHNlcmlhbGl6aW5nIHRlYW07IHJlcXVlc3RlZCAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBudGhyZWFkcyApKTsKKyAgICAgICAgICAgICAgICBudGhyZWFkcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBudGhyZWFkcyA+IDEgKSB7CisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgaG93IG1hbnkgbmV3IHRocmVhZHMgd2UgY2FuIHVzZSAqLworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworICAgICAgICAgICAgbnRocmVhZHMgPSBfX2ttcF9yZXNlcnZlX3RocmVhZHMocm9vdCwgcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQsIG50aHJlYWRzCisjaWYgT01QXzQwX0VOQUJMRUQKKy8qIEFDOiBJZiB3ZSBleGVjdXRlIHRlYW1zIGZyb20gcGFyYWxsZWwgcmVnaW9uIChvbiBob3N0KSwgdGhlbiB0ZWFtcyBzaG91bGQgYmUgY3JlYXRlZAorICAgYnV0IGVhY2ggY2FuIG9ubHkgaGF2ZSAxIHRocmVhZCBpZiBuZXN0aW5nIGlzIGRpc2FibGVkLiBJZiB0ZWFtcyBjYWxsZWQgZnJvbSBzZXJpYWwgcmVnaW9uLAorICAgdGhlbiB0ZWFtcyBhbmQgdGhlaXIgdGhyZWFkcyBzaG91bGQgYmUgY3JlYXRlZCByZWdhcmRsZXNzIG9mIHRoZSBuZXN0aW5nIHNldHRpbmcuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZW50ZXJfdGVhbXMKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKCBudGhyZWFkcyA9PSAxICkgeworICAgICAgICAgICAgICAgIC8vIEZyZWUgbG9jayBmb3Igc2luZ2xlIHRocmVhZCBleGVjdXRpb24gaGVyZTsKKyAgICAgICAgICAgICAgICAvLyBmb3IgbXVsdGktdGhyZWFkIGV4ZWN1dGlvbiBpdCB3aWxsIGJlIGZyZWVkIGxhdGVyCisgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGVhbSBvZiB0aHJlYWRzIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBudGhyZWFkcyA+IDAgKTsKKworICAgIC8qIElmIHdlIHRlbXBvcmFyaWx5IGNoYW5nZWQgdGhlIHNldCBudW1iZXIgb2YgdGhyZWFkcyB0aGVuIHJlc3RvcmUgaXQgbm93ICovCisgICAgbWFzdGVyX3RoLT50aC50aF9zZXRfbnByb2MgPSAwOworCisgICAgLyogY3JlYXRlIGEgc2VyaWFsaXplZCBwYXJhbGxlbCByZWdpb24/ICovCisgICAgaWYgKCBudGhyZWFkcyA9PSAxICkgeworICAgICAgICAvKiBqb3NoIHRvZG86IGh5cG90aGV0aWNhbCBxdWVzdGlvbjogd2hhdCBkbyB3ZSBkbyBmb3IgT1MgWCo/ICovCisjaWYgS01QX09TX0xJTlVYICYmICggS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICAgICAgdm9pZCAqICAgYXJnc1sgYXJnYyBdOworI2Vsc2UKKyAgICAgICAgdm9pZCAqICogYXJncyA9ICh2b2lkKiopIEtNUF9BTExPQ0EoIGFyZ2MgKiBzaXplb2YoIHZvaWQgKiApICk7CisjZW5kaWYgLyogS01QX09TX0xJTlVYICYmICggS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgKi8KKworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkIHNlcmlhbGl6aW5nIHBhcmFsbGVsIHJlZ2lvblxuIiwgZ3RpZCApKTsKKworICAgICAgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbChsb2MsIGd0aWQpOworCisgICAgICAgIGlmICggY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9pbnRlbCApIHsKKyAgICAgICAgICAgIC8qIFRPRE8gdGhpcyBzdWNrcywgdXNlIHRoZSBjb21waWxlciBpdHNlbGYgdG8gcGFzcyBhcmdzISA6KSAqLworICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X2lkZW50ID0gbG9jOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBpZiAoICFhcCApIHsKKyAgICAgICAgICAgICAgICAvLyByZXZlcnQgY2hhbmdlIG1hZGUgaW4gX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoKQorICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF9sZXZlbC0tOworICAgICAgICAgICAgICAgIC8vIEdldCBhcmdzIGZyb20gcGFyZW50IHRlYW0gZm9yIHRlYW1zIGNvbnN0cnVjdAorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgdm9pZCAqZHVtbXk7CisgICAgICAgICAgICAgICAgdm9pZCAqKmV4aXRfcnVudGltZV9wOworCisgICAgICAgICAgICAgICAgb21wdF9sd190YXNrdGVhbV90IGx3X3Rhc2t0ZWFtOworCisgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdCgmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVud3JhcHBlZF90YXNrLCBvbXB0X3BhcmFsbGVsX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZCA9IF9fb21wdF90YXNrX2lkX25ldyhndGlkKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmKGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2xpbmsoJmx3X3Rhc2t0ZWFtLCBtYXN0ZXJfdGgpOworCisjaWYgT01QVF9UUkFDRQorICAgICAgICAgICAgICAgICAgICBteV90YXNrX2lkID0gbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWQsIG15X3Rhc2tfaWQpOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAvKiBPTVBUIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBleGl0X3J1bnRpbWVfcCA9ICZkdW1teTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soT01QX3BhcmFsbGVsKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soSU1QTElDSVRfVEFTSyk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFzaywgZ3RpZCwgMCwgYXJnYywgcGFyZW50X3RlYW0tPnQudF9hcmd2CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAsIGV4aXRfcnVudGltZV9wCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAqZXhpdF9ydW50aW1lX3AgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX3VubGluayhtYXN0ZXJfdGgpOworICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBjbGVhciB0aGUgdGFzayBpZCBvbmx5IGFmdGVyIHVubGlua2luZyB0aGUgdGFzaworICAgICAgICAgICAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gb21wdF90YXNrX2lkX25vbmU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBvbXB0X3Rhc2tfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QVF9JTlZPS0VSKGNhbGxfY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtaWNyb3Rhc2sgPT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgICAgIHRlYW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgLy90ZWFtLT50LnRfcGtmbiA9IG1pY3JvdGFzazsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW52b2tlID0gaW52b2tlcjsKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHRlYW0sIFRSVUUgKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYXJnYyA9IGFyZ2M7CisgICAgICAgICAgICAgICAgYXJndiA9ICh2b2lkKiopIHRlYW0tPnQudF9hcmd2OworICAgICAgICAgICAgICAgIGlmICggYXAgKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8vIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NgorIyBpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisjIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoIGFwLCB2b2lkICogKTsKKyMgZW5kaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbaV0gPSBwYXJlbnRfdGVhbS0+dC50X2FyZ3ZbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFDOiByZXZlcnQgY2hhbmdlIG1hZGUgaW4gX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoKQorICAgICAgICAgICAgICAgIC8vICAgICBiZWNhdXNlIGluaXRpYWwgY29kZSBpbiB0ZWFtcyBzaG91bGQgaGF2ZSBsZXZlbD0wCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2xldmVsLS07CisgICAgICAgICAgICAgICAgLy8gQUM6IGNhbGwgc3BlY2lhbCBpbnZva2VyIGZvciBvdXRlciAicGFyYWxsZWwiIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9wYXJhbGxlbCk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgICAgICAgICAgICAgICAgICBpbnZva2VyKGd0aWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgICAgICBhcmd2ID0gYXJnczsKKyAgICAgICAgICAgICAgICBmb3IoIGk9YXJnYy0xOyBpID49IDA7IC0taSApCisvLyBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoIGFwLCB2b2lkICogKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIEtNUF9NQigpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgdm9pZCAqZHVtbXk7CisgICAgICAgICAgICAgICAgdm9pZCAqKmV4aXRfcnVudGltZV9wOworCisgICAgICAgICAgICAgICAgb21wdF9sd190YXNrdGVhbV90IGx3X3Rhc2t0ZWFtOworCisgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdCgmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVud3JhcHBlZF90YXNrLCBvbXB0X3BhcmFsbGVsX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZCA9IF9fb21wdF90YXNrX2lkX25ldyhndGlkKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmKGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2xpbmsoJmx3X3Rhc2t0ZWFtLCBtYXN0ZXJfdGgpOworCisjaWYgT01QVF9UUkFDRQorICAgICAgICAgICAgICAgICAgICAvKiBPTVBUIGltcGxpY2l0IHRhc2sgYmVnaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgbXlfdGFza19pZCA9IGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkID0gb21wdF9wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgLyogT01QVCBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmZHVtbXk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9wYXJhbGxlbCk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2ssIGd0aWQsIDAsIGFyZ2MsIGFyZ3MKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICwgZXhpdF9ydW50aW1lX3AKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICpleGl0X3J1bnRpbWVfcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV91bmxpbmsobWFzdGVyX3RoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgY2xlYXIgdGhlIHRhc2sgaWQgb25seSBhZnRlciB1bmxpbmtpbmcgdGhlIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZCA9IG9tcHRfdGFza19pZF9ub25lOworCisgICAgICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUFRfSU5WT0tFUihjYWxsX2NvbnRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9nbnUgKSB7CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IChvbXB0X2x3X3Rhc2t0ZWFtX3QgKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2Yob21wdF9sd190YXNrdGVhbV90KSk7CisgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdChsd3QsIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICB1bndyYXBwZWRfdGFzaywgb21wdF9wYXJhbGxlbF9pZCk7CisKKyAgICAgICAgICAgIGx3dC0+b21wdF90YXNrX2luZm8udGFza19pZCA9IF9fb21wdF90YXNrX2lkX25ldyhndGlkKTsKKyAgICAgICAgICAgIGx3dC0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKGx3dCwgbWFzdGVyX3RoKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyB3ZSB3ZXJlIGNhbGxlZCBmcm9tIEdOVSBuYXRpdmUgY29kZQorICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWwgZXhpdFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCBjYWxsX2NvbnRleHQgPCBmb3JrX2NvbnRleHRfbGFzdCwgIl9fa21wX2ZvcmtfY2FsbDogdW5rbm93biBmb3JrX2NvbnRleHQgcGFyYW1ldGVyIiApOworICAgICAgICB9CisKKworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkIHNlcmlhbCBleGl0XG4iLCBndGlkICkpOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIEdFSDogb25seSBtb2RpZnkgdGhlIGV4ZWN1dGluZyBmbGFnIGluIHRoZSBjYXNlIHdoZW4gbm90IHNlcmlhbGl6ZWQKKyAgICAvLyAgICAgIHNlcmlhbGl6ZWQgY2FzZSBpcyBoYW5kbGVkIGluIGttcGNfc2VyaWFsaXplZF9wYXJhbGxlbAorICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBwYXJlbnRfdGVhbV9hY2xldmVsPSVkLCBtYXN0ZXJfdGg9JXAsIGN1cnRhc2s9JXAsIGN1cnRhc2tfbWF4X2FjbGV2ZWw9JWRcbiIsCisgICAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCwgbWFzdGVyX3RoLCBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICAvLyBUT0RPOiBHRUggLSBjYW5ub3QgZG8gdGhpcyBhc3NlcnRpb24gYmVjYXVzZSByb290IHRocmVhZCBub3Qgc2V0IHVwIGFzIGV4ZWN1dGluZworICAgIC8vIEtNUF9BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMSApOworICAgIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPSAwOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayB8fCBsZXZlbCA+IHRlYW1zX2xldmVsICkKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgLyogSW5jcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiopICZyb290LT5yLnJfaW5fcGFyYWxsZWwgKTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgSUNWcy4KKyAgICBpbnQgbnRocmVhZHNfaWN2ID0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2M7CisgICAgaWYgKChsZXZlbCsxIDwgX19rbXBfbmVzdGVkX250aC51c2VkKSAmJiAoX19rbXBfbmVzdGVkX250aC5udGhbbGV2ZWwrMV0gIT0gbnRocmVhZHNfaWN2KSkgeworICAgICAgICBudGhyZWFkc19pY3YgPSBfX2ttcF9uZXN0ZWRfbnRoLm50aFtsZXZlbCsxXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG50aHJlYWRzX2ljdiA9IDA7ICAvLyBkb24ndCB1cGRhdGUKKyAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHByb2NfYmluZF9wb2xpY3kgZm9yIHRoZSBuZXcgdGVhbS4KKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gbWFzdGVyX3RoLT50aC50aF9zZXRfcHJvY19iaW5kOworICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmRfaWN2ID0gcHJvY19iaW5kX2RlZmF1bHQ7IC8vIHByb2NfYmluZF9kZWZhdWx0IG1lYW5zIGRvbid0IHVwZGF0ZQorICAgIGlmICggbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kID09IHByb2NfYmluZF9mYWxzZSApIHsKKyAgICAgICAgcHJvY19iaW5kID0gcHJvY19iaW5kX2ZhbHNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHByb2NfYmluZCA9PSBwcm9jX2JpbmRfZGVmYXVsdCkgeworICAgICAgICAgICAgLy8gTm8gcHJvY19iaW5kIGNsYXVzZSBzcGVjaWZpZWQ7IHVzZSBjdXJyZW50IHByb2MtYmluZC12YXIgZm9yIHRoaXMgcGFyYWxsZWwgcmVnaW9uCisgICAgICAgICAgICBwcm9jX2JpbmQgPSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQ7CisgICAgICAgIH0KKyAgICAgICAgLyogZWxzZTogVGhlIHByb2NfYmluZCBwb2xpY3kgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5IG9uIHBhcmFsbGVsIGNsYXVzZS4gVGhpcworICAgICAgICAgICBvdmVycmlkZXMgcHJvYy1iaW5kLXZhciBmb3IgdGhpcyBwYXJhbGxlbCByZWdpb24sIGJ1dCBkb2VzIG5vdCBjaGFuZ2UgcHJvYy1iaW5kLXZhci4gKi8KKyAgICAgICAgLy8gRmlndXJlIHRoZSB2YWx1ZSBvZiBwcm9jLWJpbmQtdmFyIGZvciB0aGUgY2hpbGQgdGhyZWFkcy4KKyAgICAgICAgaWYgKChsZXZlbCsxIDwgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkKQorICAgICAgICAgICAgJiYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tsZXZlbCsxXSAhPSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQpKSB7CisgICAgICAgICAgICBwcm9jX2JpbmRfaWN2ID0gX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzW2xldmVsKzFdOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVzZXQgZm9yIG5leHQgcGFyYWxsZWwgcmVnaW9uCisgICAgbWFzdGVyX3RoLT50aC50aF9zZXRfcHJvY19iaW5kID0gcHJvY19iaW5kX2RlZmF1bHQ7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIGlmICgobnRocmVhZHNfaWN2ID4gMCkKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICB8fCAocHJvY19iaW5kX2ljdiAhPSBwcm9jX2JpbmRfZGVmYXVsdCkKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICApIHsKKyAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCBuZXdfaWN2czsKKyAgICAgICAgY29weV9pY3ZzKCZuZXdfaWN2cywgJm1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzKTsKKyAgICAgICAgbmV3X2ljdnMubmV4dCA9IE5VTEw7CisgICAgICAgIGlmIChudGhyZWFkc19pY3YgPiAwKSB7CisgICAgICAgICAgICBuZXdfaWN2cy5ucHJvYyA9IG50aHJlYWRzX2ljdjsKKyAgICAgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKHByb2NfYmluZF9pY3YgIT0gcHJvY19iaW5kX2RlZmF1bHQpIHsKKyAgICAgICAgICAgIG5ld19pY3ZzLnByb2NfYmluZCA9IHByb2NfYmluZF9pY3Y7CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBhcmFsbGVsIHRlYW0gKi8KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBfX2ttcF9hbGxvY2F0ZV90ZWFtXG4iICkgKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwgbnRocmVhZHMsIG50aHJlYWRzLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfaWN2cywgYXJnYyBVU0VfTkVTVEVEX0hPVF9BUkcobWFzdGVyX3RoKSApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBhcmFsbGVsIHRlYW0gKi8KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBfX2ttcF9hbGxvY2F0ZV90ZWFtXG4iICkgKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwgbnRocmVhZHMsIG50aHJlYWRzLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cywgYXJnYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfTkVTVEVEX0hPVF9BUkcobWFzdGVyX3RoKSApOworICAgIH0KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogYWZ0ZXIgX19rbXBfYWxsb2NhdGVfdGVhbSAtIHRlYW0gPSAlcFxuIiwgdGVhbSApICk7CisKKyAgICAvKiBzZXR1cCB0aGUgbmV3IHRlYW0gKi8KKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9tYXN0ZXJfdGlkLCBtYXN0ZXJfdGlkKTsKKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9tYXN0ZXJfdGhpc19jb25zLCBtYXN0ZXJfdGhpc19jb25zKTsKKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9pZGVudCwgbG9jKTsKKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9wYXJlbnQsIHBhcmVudF90ZWFtKTsKKyAgICBLTVBfQ0hFQ0tfVVBEQVRFX1NZTkModGVhbS0+dC50X3BrZm4sIG1pY3JvdGFzayk7CisjaWYgT01QVF9TVVBQT1JUCisgICAgS01QX0NIRUNLX1VQREFURV9TWU5DKHRlYW0tPnQub21wdF90ZWFtX2luZm8ubWljcm90YXNrLCB1bndyYXBwZWRfdGFzayk7CisjZW5kaWYKKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9pbnZva2UsIGludm9rZXIpOyAgLyogVE9ETyBtb3ZlIHRoaXMgdG8gcm9vdCwgbWF5YmUgKi8KKyAgICAvLyBUT0RPOiBwYXJlbnRfdGVhbS0+dC50X2xldmVsID09IElOVF9NQVggPz8/CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayB8fCBsZXZlbCA+IHRlYW1zX2xldmVsICkgeworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIGludCBuZXdfbGV2ZWwgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsICsgMTsKKyAgICAgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfbGV2ZWwsIG5ld19sZXZlbCk7CisgICAgICAgIG5ld19sZXZlbCA9IHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsICsgMTsKKyAgICAgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfYWN0aXZlX2xldmVsLCBuZXdfbGV2ZWwpOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQUM6IERvIG5vdCBpbmNyZWFzZSBwYXJhbGxlbCBsZXZlbCBhdCBzdGFydCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgIGludCBuZXdfbGV2ZWwgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsOworICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9sZXZlbCwgbmV3X2xldmVsKTsKKyAgICAgICAgbmV3X2xldmVsID0gcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWw7CisgICAgICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X2FjdGl2ZV9sZXZlbCwgbmV3X2xldmVsKTsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICBrbXBfcl9zY2hlZF90IG5ld19zY2hlZCA9IGdldF9fc2NoZWRfMihwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCk7CisgICAgaWYgKHRlYW0tPnQudF9zY2hlZC5yX3NjaGVkX3R5cGUgIT0gbmV3X3NjaGVkLnJfc2NoZWRfdHlwZSB8fCB0ZWFtLT50LnRfc2NoZWQuY2h1bmsgIT0gbmV3X3NjaGVkLmNodW5rKQorICAgICAgICB0ZWFtLT50LnRfc2NoZWQgPSBuZXdfc2NoZWQ7IC8vIHNldCBtYXN0ZXIncyBzY2hlZHVsZSBhcyBuZXcgcnVuLXRpbWUgc2NoZWR1bGUKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QsIGNhbmNlbF9ub3JlcSk7CisjZW5kaWYKKworICAgIC8vIFVwZGF0ZSB0aGUgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgaW4gdGhlIHRlYW0gaWYgcmVxdWlyZWQuCisgICAgcHJvcGFnYXRlRlBDb250cm9sKHRlYW0pOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgLy8gU2V0IG1hc3RlcidzIHRhc2sgdGVhbSB0byB0ZWFtJ3MgdGFzayB0ZWFtLiBVbmxlc3MgdGhpcyBpcyBob3QgdGVhbSwgaXQgc2hvdWxkIGJlIE5VTEwuCisjaWYgMAorICAgICAgICAvLyBQYXRjaCBvdXQgYW4gYXNzZXJ0aW9uIHRoYXQgdHJpcHMgd2hpbGUgdGhlIHJ1bnRpbWUgc2VlbXMgdG8gb3BlcmF0ZSBjb3JyZWN0bHkuCisgICAgICAgIC8vIEF2b2lkaW5nIHRoZSBwcmVjb25kaXRpb25zIHRoYXQgY2F1c2UgdGhlIGFzc2VydGlvbiB0byB0cmlwIGhhcyBiZWVuIHByb21pc2VkIGFzIGEgZm9ydGhjb21pbmcgcGF0Y2guCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gcGFyZW50X3RlYW0tPnQudF90YXNrX3RlYW1bbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlXSk7CisjZW5kaWYKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9mb3JrX2NhbGw6IE1hc3RlciBUIyVkIHB1c2hpbmcgdGFza190ZWFtICVwIC8gdGVhbSAlcCwgbmV3IHRhc2tfdGVhbSAlcCAvIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLCB0ZWFtLT50LnRfdGFza190ZWFtW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV0sIHRlYW0gKSApOworCisgICAgICAgIGlmICggYWN0aXZlX2xldmVsIHx8IG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtICkgeworICAgICAgICAgICAgLy8gVGFrZSBhIG1lbW8gb2YgbWFzdGVyJ3MgdGFza19zdGF0ZQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayk7CisgICAgICAgICAgICBpZiAobWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcCA+PSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3opIHsgLy8gaW5jcmVhc2Ugc2l6ZQorICAgICAgICAgICAgICAgIGttcF91aW50MzIgbmV3X3NpemUgPSAyKm1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9zdGFja19zejsKKyAgICAgICAgICAgICAgICBrbXBfdWludDggKm9sZF9zdGFjaywgKm5ld19zdGFjazsKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGk7CisgICAgICAgICAgICAgICAgbmV3X3N0YWNrID0gKGttcF91aW50OCAqKV9fa21wX2FsbG9jYXRlKG5ld19zaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBuZXdfc3RhY2tbaV0gPSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpPW1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9zdGFja19zejsgaTxuZXdfc2l6ZTsgKytpKSB7IC8vIHplcm8taW5pdCByZXN0IG9mIHN0YWNrCisgICAgICAgICAgICAgICAgICAgIG5ld19zdGFja1tpXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9sZF9zdGFjayA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrOworICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrID0gbmV3X3N0YWNrOworICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9zdGFja19zeiA9IG5ld19zaXplOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUob2xkX3N0YWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0b3JlIG1hc3RlcidzIHRhc2tfc3RhdGUgb24gc3RhY2sKKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3BdID0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlOworICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcCsrOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICBpZiAodGVhbSA9PSBtYXN0ZXJfdGgtPnRoLnRoX2hvdF90ZWFtc1thY3RpdmVfbGV2ZWxdLmhvdF90ZWFtKSB7IC8vIFJlc3RvcmUgbWFzdGVyJ3MgbmVzdGVkIHN0YXRlIGlmIG5lc3RlZCBob3QgdGVhbQorICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3BdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSAwOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorI2lmICFLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSB8fCAodGVhbSA9PSByb290LT5yLnJfaG90X3RlYW0pKTsKKyNlbmRpZgorICAgIH0KKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6JWQpLT4oJWQ6MCkgY3JlYXRlZCBhIHRlYW0gb2YgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICBndGlkLCBwYXJlbnRfdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWFzdGVyX3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbnByb2MgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAhPSByb290LT5yLnJfaG90X3RlYW0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAoIHRlYW0tPnQudF9tYXN0ZXJfdGlkID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICggdGVhbS0+dC50X3BhcmVudCA9PSByb290LT5yLnJfcm9vdF90ZWFtIHx8IHRlYW0tPnQudF9wYXJlbnQtPnQudF9zZXJpYWxpemVkICkgKSk7CisgICAgS01QX01CKCk7CisKKyAgICAvKiBub3csIHNldHVwIHRoZSBhcmd1bWVudHMgKi8KKyAgICBhcmd2ID0gKHZvaWQqKil0ZWFtLT50LnRfYXJndjsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggYXAgKSB7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgZm9yICggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkgeworLy8gVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2CisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICB2b2lkICpuZXdfYXJndiA9IHZhX2FyZygqYXAsIHZvaWQgKik7CisjZWxzZQorICAgICAgICAgICAgdm9pZCAqbmV3X2FyZ3YgPSB2YV9hcmcoYXAsIHZvaWQgKik7CisjZW5kaWYKKyAgICAgICAgICAgIEtNUF9DSEVDS19VUERBVEUoKmFyZ3YsIG5ld19hcmd2KTsKKyAgICAgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgfQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICggaT0wOyBpIDwgYXJnYzsgKytpICkgeworICAgICAgICAgICAgLy8gR2V0IGFyZ3MgZnJvbSBwYXJlbnQgdGVhbSBmb3IgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKGFyZ3ZbaV0sIHRlYW0tPnQudF9wYXJlbnQtPnQudF9hcmd2W2ldKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgLyogbm93IGFjdHVhbGx5IGZvcmsgdGhlIHRocmVhZHMgKi8KKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9tYXN0ZXJfYWN0aXZlLCBtYXN0ZXJfYWN0aXZlKTsKKyAgICBpZiAoIXJvb3QtPnIucl9hY3RpdmUpIC8vIE9ubHkgZG8gYXNzaWdubWVudCBpZiBpdCBwcmV2ZW50cyBjYWNoZSBwaW5nLXBvbmcKKyAgICAgICAgcm9vdC0+ci5yX2FjdGl2ZSA9IFRSVUU7CisKKyAgICBfX2ttcF9mb3JrX3RlYW1fdGhyZWFkcyggcm9vdCwgdGVhbSwgbWFzdGVyX3RoLCBndGlkICk7CisgICAgX19rbXBfc2V0dXBfaWN2X2NvcHkoIHRlYW0sIG50aHJlYWRzLCAmbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsIGxvYyApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworI2VuZGlmCisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxIC8vIG9ubHkgcmVwb3J0IGZyYW1lcyBhdCBsZXZlbCAxCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICYmICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayAvLyBub3QgaW4gdGVhbXMgY29uc3RydWN0CisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKCAoIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgfHwgS01QX0lUVF9ERUJVRyApICYmCisgICAgICAgICAgICAgKCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDEgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGttcF91aW50NjQgdG1wX3RpbWUgPSAwOworICAgICAgICAgICAgaWYgKCBfX2l0dF9nZXRfdGltZXN0YW1wX3B0ciApCisgICAgICAgICAgICAgICAgdG1wX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgICAgICAgICAvLyBJbnRlcm5hbCBmb3JrIC0gcmVwb3J0IGZyYW1lIGJlZ2luCisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX2ZyYW1lX3RpbWUgID0gdG1wX3RpbWU7CisgICAgICAgICAgICBpZiAoIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgKQorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9yZWdpb25fdGltZSA9IHRtcF90aW1lOworICAgICAgICB9IGVsc2UgLy8gb25seSBvbmUgbm90aWZpY2F0aW9uIHNjaGVtZSAoZWl0aGVyICJzdWJtaXQiIG9yICJmb3JraW5nL2pvaW5lZCIsIG5vdCBib3RoKQorI2VuZGlmIC8qIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgIGlmICggKCBfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgfHwgS01QX0lUVF9ERUJVRyApICYmCisgICAgICAgICAgICAgX19rbXBfZm9ya2pvaW5fZnJhbWVzICYmICFfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSApCisgICAgICAgIHsgLy8gTWFyayBzdGFydCBvZiAicGFyYWxsZWwiIHJlZ2lvbiBmb3IgVlR1bmUuCisgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcoZ3RpZCwgdGVhbS0+dC50X25wcm9jLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAvKiBub3cgZ28gb24gYW5kIGRvIHRoZSB3b3JrICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSA9PSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtICk7CisgICAgS01QX01CKCk7CisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZm9yayA6IHJvb3Q9JXAsIHRlYW09JXAsIG1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIHJvb3QsIHRlYW0sIG1hc3Rlcl90aCwgZ3RpZCkpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIHRlYW0tPnQudF9zdGFja19pZCA9IF9fa21wX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKCk7IC8vIGNyZWF0ZSBuZXcgc3RhY2sgc3RpdGNoaW5nIGlkIGJlZm9yZSBlbnRlcmluZyBmb3JrIGJhcnJpZXIKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIGFwICkgICAvLyBBQzogc2tpcCBfX2ttcF9pbnRlcm5hbF9mb3JrIGF0IHRlYW1zIGNvbnN0cnVjdCwgbGV0IG9ubHkgbWFzdGVyIHRocmVhZHMgZXhlY3V0ZQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICBfX2ttcF9pbnRlcm5hbF9mb3JrKCBsb2MsIGd0aWQsIHRlYW0gKTsKKyAgICAgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZm9yayA6IGFmdGVyIDogcm9vdD0lcCwgdGVhbT0lcCwgbWFzdGVyX3RoPSVwLCBndGlkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJvb3QsIHRlYW0sIG1hc3Rlcl90aCwgZ3RpZCkpOworICAgIH0KKworICAgIGlmIChjYWxsX2NvbnRleHQgPT0gZm9ya19jb250ZXh0X2dudSkgeworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBwYXJhbGxlbCBleGl0IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIC8qIEludm9rZSBtaWNyb3Rhc2sgZm9yIE1BU1RFUiB0aHJlYWQgKi8KKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOjApIGludm9rZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9wa2ZuICkgKTsKKyAgICB9ICAvLyBFTkQgb2YgdGltZXIgS01QX2ZvcmtfY2FsbCBibG9jaworCisgICAgeworICAgICAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGFyYWxsZWwpOworICAgICAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhJTVBMSUNJVF9UQVNLKTsKKyAgICAgICAgaWYgKCEgdGVhbS0+dC50X2ludm9rZSggZ3RpZCApKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMiggMCwgImNhbm5vdCBpbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkIiApOworICAgICAgICB9CisgICAgfQorICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6MCkgZG9uZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfcGtmbiApICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBwYXJhbGxlbCBleGl0IFQjJWRcbiIsIGd0aWQgKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmIE9NUFRfU1VQUE9SVAorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9qb2luX3Jlc3RvcmVfc3RhdGUoCisgICAga21wX2luZm9fdCAqdGhyZWFkLAorICAgIGttcF90ZWFtX3QgKnRlYW0pCit7CisgICAgLy8gcmVzdG9yZSBzdGF0ZSBvdXRzaWRlIHRoZSByZWdpb24KKyAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSAoKHRlYW0tPnQudF9zZXJpYWxpemVkKSA/CisgICAgICAgIG9tcHRfc3RhdGVfd29ya19zZXJpYWwgOiBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2pvaW5fb21wdCgKKyAgICBrbXBfaW5mb190ICp0aHJlYWQsCisgICAga21wX3RlYW1fdCAqdGVhbSwKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgICAgZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0KQoreworICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKAorICAgICAgICAgICAgcGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCwgT01QVF9JTlZPS0VSKGZvcmtfY29udGV4dCkpOworICAgIH0KKworICAgIHRhc2tfaW5mby0+ZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgICBfX2ttcF9qb2luX3Jlc3RvcmVfc3RhdGUodGhyZWFkLHRlYW0pOworfQorI2VuZGlmCisKK3ZvaWQKK19fa21wX2pvaW5fY2FsbChpZGVudF90ICpsb2MsIGludCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAsIGVudW0gZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgLCBpbnQgZXhpdF90ZWFtcworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCispCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKEtNUF9qb2luX2NhbGwpOworICAgIGttcF90ZWFtX3QgICAgICp0ZWFtOworICAgIGttcF90ZWFtX3QgICAgICpwYXJlbnRfdGVhbTsKKyAgICBrbXBfaW5mb190ICAgICAqbWFzdGVyX3RoOworICAgIGttcF9yb290X3QgICAgICpyb290OworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfYWN0aXZlOworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2pvaW5fY2FsbDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgIC8qIHNldHVwIGN1cnJlbnQgZGF0YSAqLworICAgIG1hc3Rlcl90aCAgICAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgcm9vdCAgICAgICAgICA9IG1hc3Rlcl90aC0+dGgudGhfcm9vdDsKKyAgICB0ZWFtICAgICAgICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtOworICAgIHBhcmVudF90ZWFtICAgPSB0ZWFtLT50LnRfcGFyZW50OworCisgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICB9CisjZW5kaWYKKworI2lmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfam9pbl9jYWxsOiBUIyVkLCBvbGQgdGVhbSA9ICVwIG9sZCB0YXNrX3RlYW0gPSAlcCwgdGhfdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggbWFzdGVyX3RoICksIHRlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdLCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdICk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBpbiB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHRlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgICAgIGludCB0bGV2ZWwgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsOworICAgICAgICAgICAgaWYgKCBsZXZlbCA9PSB0bGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgLy8gQUM6IHdlIGhhdmVuJ3QgaW5jcmVtZW50ZWQgaXQgZWFybGllciBhdCBzdGFydCBvZiB0ZWFtcyBjb25zdHJ1Y3QsCisgICAgICAgICAgICAgICAgLy8gICAgIHNvIGRvIGl0IGhlcmUgLSBhdCB0aGUgZW5kIG9mIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9sZXZlbCsrOworICAgICAgICAgICAgfSBlbHNlIGlmICggbGV2ZWwgPT0gdGxldmVsICsgMSApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogd2UgYXJlIGV4aXRpbmcgcGFyYWxsZWwgaW5zaWRlIHRlYW1zLCBuZWVkIHRvIGluY3JlbWVudCBzZXJpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgLy8gICAgIGluIG9yZGVyIHRvIHJlc3RvcmUgaXQgaW4gdGhlIG5leHQgY2FsbCB0byBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfc2VyaWFsaXplZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsKCBsb2MsIGd0aWQgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBfX2ttcF9qb2luX3Jlc3RvcmVfc3RhdGUobWFzdGVyX3RoLCBwYXJlbnRfdGVhbSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtYXN0ZXJfYWN0aXZlID0gdGVhbS0+dC50X21hc3Rlcl9hY3RpdmU7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICghZXhpdF90ZWFtcykKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgLy8gQUM6IE5vIGJhcnJpZXIgZm9yIGludGVybmFsIHRlYW1zIGF0IGV4aXQgZnJvbSB0ZWFtcyBjb25zdHJ1Y3QuCisgICAgICAgIC8vICAgICBCdXQgdGhlcmUgaXMgYmFycmllciBmb3IgZXh0ZXJuYWwgdGVhbSAobGVhZ3VlKS4KKyAgICAgICAgX19rbXBfaW50ZXJuYWxfam9pbiggbG9jLCBndGlkLCB0ZWFtICk7CisgICAgfQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgZWxzZSB7CisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZSA9IDA7IC8vIEFDOiBubyB0YXNraW5nIGluIHRlYW1zIChvdXQgb2YgYW55IHBhcmFsbGVsKQorICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgS01QX01CKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQgPSB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciApIHsKKyAgICAgICAgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KCAoX19pdHRfY2FsbGVyKXRlYW0tPnQudF9zdGFja19pZCApOyAvLyBkZXN0cm95IHRoZSBzdGFjayBzdGl0Y2hpbmcgaWQgYWZ0ZXIgam9pbiBiYXJyaWVyCisgICAgfQorCisgICAgLy8gTWFyayBlbmQgb2YgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLgorICAgIGlmICggdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICYmICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayAvKiBub3QgaW4gdGVhbXMgY29uc3RydWN0ICovCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgKSB7CisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgICAgIC8vIG9ubHkgb25lIG5vdGlmaWNhdGlvbiBzY2hlbWUgKGVpdGhlciAic3VibWl0IiBvciAiZm9ya2luZy9qb2luZWQiLCBub3QgYm90aCkKKyAgICAgICAgaWYgKCAoIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgfHwgS01QX0lUVF9ERUJVRyApICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgKQorICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggZ3RpZCwgdGVhbS0+dC50X3JlZ2lvbl90aW1lLCBtYXN0ZXJfdGgtPnRoLnRoX2ZyYW1lX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBsb2MsIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYywgMSApOworICAgICAgICBlbHNlIGlmICggKCBfX2l0dF9mcmFtZV9lbmRfdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgISBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXMgKQorICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoIGd0aWQgKTsKKyAgICB9IC8vIGFjdGl2ZV9sZXZlbCA9PSAxCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICYmCisgICAgICAgICAhZXhpdF90ZWFtcyAmJgorICAgICAgICAgdGVhbS0+dC50X3BrZm4gIT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciAmJgorICAgICAgICAgdGVhbS0+dC50X2xldmVsID09IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKyAxICkgeworICAgICAgICAvLyBBQzogV2UgbmVlZCB0byBsZWF2ZSB0aGUgdGVhbSBzdHJ1Y3R1cmUgaW50YWN0IGF0IHRoZSBlbmQKKyAgICAgICAgLy8gICAgIG9mIHBhcmFsbGVsIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0LCBzbyB0aGF0IGF0IHRoZSBuZXh0CisgICAgICAgIC8vICAgICBwYXJhbGxlbCBzYW1lIChob3QpIHRlYW0gd29ya3MsIG9ubHkgYWRqdXN0IG5lc3RpbmcgbGV2ZWxzCisKKyAgICAgICAgLyogRGVjcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICAgICAgdGVhbS0+dC50X2xldmVsIC0tOworICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsIC0tOworICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworCisgICAgICAgIC8qIFJlc3RvcmUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIHRlYW0gaWYgbmVlZGVkICovCisgICAgICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jIDwgbWFzdGVyX3RoLT50aC50aF90ZWFtc19zaXplLm50aCApIHsKKyAgICAgICAgICAgIGludCBvbGRfbnVtID0gbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jOworICAgICAgICAgICAgaW50IG5ld19udW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRoOworICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9IG5ld19udW07CisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG9sZF9udW07ICsraSApIHsKKyAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtX25wcm9jID0gbmV3X251bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkanVzdCBzdGF0ZXMgb2Ygbm9uLXVzZWQgdGhyZWFkcyBvZiB0aGUgdGVhbQorICAgICAgICAgICAgZm9yICggaSA9IG9sZF9udW07IGkgPCBuZXdfbnVtOyArK2kgKSB7CisgICAgICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aHJlYWQncyBiYXJyaWVyIGRhdGEuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bIGIgXS5iYi53YWl0X2ZsYWcgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gdGVhbS0+dC50X2JhclsgYiBdLmJfdGVhbV9hcnJpdmVkOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIHRocmVhZCdzIHRhc2sgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBfX2ttcF9qb2luX29tcHQobWFzdGVyX3RoLCBwYXJlbnRfdGVhbSwgcGFyYWxsZWxfaWQsIGZvcmtfY29udGV4dCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIC8qIGRvIGNsZWFudXAgYW5kIHJlc3RvcmUgdGhlIHBhcmVudCB0ZWFtICovCisgICAgbWFzdGVyX3RoLT50aC50aF9pbmZvIC5kcy5kc190aWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0ID0gdGVhbS0+dC50X21hc3Rlcl90aGlzX2NvbnM7CisKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2Rpc3BhdGNoID0KKyAgICAgICAgICAgICAgICAmIHBhcmVudF90ZWFtLT50LnRfZGlzcGF0Y2hbIHRlYW0tPnQudF9tYXN0ZXJfdGlkIF07CisKKyAgICAvKiBqYzogVGhlIGZvbGxvd2luZyBsb2NrIGhhcyBpbnN0cnVjdGlvbnMgd2l0aCBSRUwgYW5kIEFDUSBzZW1hbnRpY3MsCisgICAgICAgc2VwYXJhdGluZyB0aGUgcGFyYWxsZWwgdXNlciBjb2RlIGNhbGxlZCBpbiB0aGlzIHBhcmFsbGVsIHJlZ2lvbgorICAgICAgIGZyb20gdGhlIHNlcmlhbCB1c2VyIGNvZGUgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAgICAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggIW1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrIHx8IHRlYW0tPnQudF9sZXZlbCA+IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICAvKiBEZWNyZW1lbnQgb3VyIG5lc3RlZCBkZXB0aCBsZXZlbCAqLworICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290LT5yLnJfaW5fcGFyYWxsZWwgPj0gMCApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZihvbXB0X2VuYWJsZWQpeworICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICBwYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkKTsKKyAgICAgICAgfQorICAgICAgICB0YXNrX2luZm8tPmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgICAgIHRhc2tfaW5mby0+dGFza19pZCA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfam9pbl9jYWxsMTogVCMlZCwgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAwLCBtYXN0ZXJfdGgsIHRlYW0gKSApOworICAgIF9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoIG1hc3Rlcl90aCApOworCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIC8vCisgICAgLy8gUmVzdG9yZSBtYXN0ZXIgdGhyZWFkJ3MgcGFydGl0aW9uLgorICAgIC8vCisgICAgbWFzdGVyX3RoLT50aC50aF9maXJzdF9wbGFjZSA9IHRlYW0tPnQudF9maXJzdF9wbGFjZTsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSB0ZWFtLT50LnRfbGFzdF9wbGFjZTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgdXBkYXRlSFdGUENvbnRyb2wgKHRlYW0pOworCisgICAgaWYgKCByb290LT5yLnJfYWN0aXZlICE9IG1hc3Rlcl9hY3RpdmUgKQorICAgICAgICByb290LT5yLnJfYWN0aXZlID0gbWFzdGVyX2FjdGl2ZTsKKworICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgdGVhbSBVU0VfTkVTVEVEX0hPVF9BUkcobWFzdGVyX3RoKSApOyAvLyB0aGlzIHdpbGwgZnJlZSB3b3JrZXIgdGhyZWFkcworCisgICAgLyogdGhpcyByYWNlIHdhcyBmdW4gdG8gZmluZC4gIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGlzIGluIHRoZSBjcml0aWNhbAorICAgICAqIHJlZ2lvbiBvdGhlcndpc2UgYXNzZXJ0aW9ucyBtYXkgZmFpbCBvY2Nhc2lvbmFsbHkgc2luY2UgdGhlIG9sZCB0ZWFtCisgICAgICogbWF5IGJlIHJlYWxsb2NhdGVkIGFuZCB0aGUgaGllcmFyY2h5IGFwcGVhcnMgaW5jb25zaXN0ZW50LiAgaXQgaXMKKyAgICAgKiBhY3R1YWxseSBzYWZlIHRvIHJ1biBhbmQgd29uJ3QgY2F1c2UgYW55IGJ1Z3MsIGJ1dCB3aWxsIGNhdXNlIHRob3NlCisgICAgICogYXNzZXJ0aW9uIGZhaWx1cmVzLiAgaXQncyBvbmx5IG9uZSBkZXJlZiZhc3NpZ24gc28gbWlnaHQgYXMgd2VsbCBwdXQgdGhpcworICAgICAqIGluIHRoZSBjcml0aWNhbCByZWdpb24gKi8KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW0gICAgICAgID0gICBwYXJlbnRfdGVhbTsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbnByb2MgID0gICBwYXJlbnRfdGVhbS0+dC50X25wcm9jOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9tYXN0ZXIgPSAgIHBhcmVudF90ZWFtLT50LnRfdGhyZWFkc1swXTsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fc2VyaWFsaXplZCA9IHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZDsKKworICAgIC8qIHJlc3RvcmUgc2VyaWFsaXplZCB0ZWFtLCBpZiBuZWVkIGJlICovCisgICAgaWYoIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZCAmJgorICAgICAgICBwYXJlbnRfdGVhbSAhPSBtYXN0ZXJfdGgtPnRoLnRoX3NlcmlhbF90ZWFtICYmCisgICAgICAgIHBhcmVudF90ZWFtICE9IHJvb3QtPnIucl9yb290X3RlYW0gKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3RlYW0oIHJvb3QsIG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0gVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICk7CisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3NlcmlhbF90ZWFtID0gcGFyZW50X3RlYW07CisgICAgfQorCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgaWYgKG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3AgPiAwKSB7IC8vIFJlc3RvcmUgdGFzayBzdGF0ZSBmcm9tIG1lbW8gc3RhY2sKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2spOworICAgICAgICAgICAgLy8gUmVtZW1iZXIgbWFzdGVyJ3Mgc3RhdGUgaWYgd2UgcmUtdXNlIHRoaXMgbmVzdGVkIGhvdCB0ZWFtCisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1ttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wXSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgIC0tbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcDsgLy8gcG9wCisgICAgICAgICAgICAvLyBOb3cgcmVzdG9yZSBzdGF0ZSBhdCB0aGlzIGxldmVsCisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1ttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wXTsKKyAgICAgICAgfQorICAgICAgICAvLyBDb3B5IHRoZSB0YXNrIHRlYW0gZnJvbSB0aGUgcGFyZW50IHRlYW0gdG8gdGhlIG1hc3RlciB0aHJlYWQKKyAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPSBwYXJlbnRfdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdOworICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2pvaW5fY2FsbDogTWFzdGVyIFQjJWQgcmVzdG9yaW5nIHRhc2tfdGVhbSAlcCAvIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCBtYXN0ZXJfdGggKSwgbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0sIHBhcmVudF90ZWFtICkgKTsKKyAgICB9CisKKyAgICAgLy8gVE9ETzogR0VIIC0gY2Fubm90IGRvIHRoaXMgYXNzZXJ0aW9uIGJlY2F1c2Ugcm9vdCB0aHJlYWQgbm90IHNldCB1cCBhcyBleGVjdXRpbmcKKyAgICAgLy8gS01QX0FTU0VSVCggbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwICk7CisgICAgIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPSAxOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgX19rbXBfam9pbl9vbXB0KG1hc3Rlcl90aCwgcGFyZW50X3RlYW0sIHBhcmFsbGVsX2lkLCBmb3JrX2NvbnRleHQpOworICAgIH0KKyNlbmRpZgorCisgICAgS01QX01CKCk7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2pvaW5fY2FsbDogZXhpdCBUIyVkXG4iLCBndGlkICkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCBwdXNoIGFuIGludGVybmFsIGNvbnRyb2wgcmVjb3JkIG9udG8gdGhlCisgICBzZXJpYWwgdGVhbSBzdGFjay4gIElmIHNvLCBkbyBpdC4gICovCit2b2lkCitfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzICgga21wX2luZm9fdCAqIHRocmVhZCApCit7CisKKyAgICBpZiAoIHRocmVhZC0+dGgudGhfdGVhbSAhPSB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkID4gMSkgeworICAgICAgICBpbnQgcHVzaCA9IDA7CisKKyAgICAgICAgaWYgKHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wID09IE5VTEwpIHsKKyAgICAgICAgICAgIHB1c2ggPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcC0+c2VyaWFsX25lc3RpbmdfbGV2ZWwgIT0KKyAgICAgICAgICAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgICAgICBwdXNoID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocHVzaCkgeyAgLyogcHVzaCBhIHJlY29yZCBvbiB0aGUgc2VyaWFsIHRlYW0ncyBzdGFjayAqLworICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIGNvbnRyb2wgPSAoa21wX2ludGVybmFsX2NvbnRyb2xfdCAqKSBfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX2ludGVybmFsX2NvbnRyb2xfdCkpOworCisgICAgICAgICAgICBjb3B5X2ljdnMoIGNvbnRyb2wsICYgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMgKTsKKworICAgICAgICAgICAgY29udHJvbC0+c2VyaWFsX25lc3RpbmdfbGV2ZWwgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkOworCisgICAgICAgICAgICBjb250cm9sLT5uZXh0ID0gdGhyZWFkLT50aC50aF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3A7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcCA9IGNvbnRyb2w7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENoYW5nZXMgc2V0X25wcm9jICovCit2b2lkCitfX2ttcF9zZXRfbnVtX3RocmVhZHMoIGludCBuZXdfbnRoLCBpbnQgZ3RpZCApCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgIGttcF9yb290X3QgKnJvb3Q7CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfc2V0X251bV90aHJlYWRzOiBuZXcgX19rbXBfbnRoID0gJWRcbiIsIG5ld19udGggKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmIChuZXdfbnRoIDwgMSkKKyAgICAgICAgbmV3X250aCA9IDE7CisgICAgZWxzZSBpZiAobmV3X250aCA+IF9fa21wX21heF9udGgpCisgICAgICAgIG5ld19udGggPSBfX2ttcF9tYXhfbnRoOworCisgICAgS01QX0NPVU5UX1ZBTFVFKE9NUF9zZXRfbnVtdGhyZWFkcywgbmV3X250aCk7CisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgc2V0X19ucHJvYyggdGhyZWFkLCBuZXdfbnRoICk7CisKKyAgICAvLworICAgIC8vIElmIHRoaXMgb21wX3NldF9udW1fdGhyZWFkcygpIGNhbGwgd2lsbCBjYXVzZSB0aGUgaG90IHRlYW0gc2l6ZSB0byBiZQorICAgIC8vIHJlZHVjZWQgKGluIHRoZSBhYnNlbmNlIG9mIGEgbnVtX3RocmVhZHMgY2xhdXNlKSwgdGhlbiByZWR1Y2UgaXQgbm93LAorICAgIC8vIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAvLworICAgIHJvb3QgPSB0aHJlYWQtPnRoLnRoX3Jvb3Q7CisgICAgaWYgKCBfX2ttcF9pbml0X3BhcmFsbGVsICYmICggISByb290LT5yLnJfYWN0aXZlICkKKyAgICAgICYmICggcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgPiBuZXdfbnRoICkKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgJiYgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCAmJiAhX19rbXBfaG90X3RlYW1zX21vZGUKKyNlbmRpZgorICAgICkgeworICAgICAgICBrbXBfdGVhbV90ICpob3RfdGVhbSA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICAgICAgaW50IGY7CisKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworICAgICAgICAvLyBSZWxlYXNlIHRoZSBleHRyYSB0aHJlYWRzIHdlIGRvbid0IG5lZWQgYW55IG1vcmUuCisgICAgICAgIGZvciAoIGYgPSBuZXdfbnRoOyAgZiA8IGhvdF90ZWFtLT50LnRfbnByb2M7IGYrKyApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSAhPSBOVUxMICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiBkZWNyZWFzaW5nIHRlYW0gc2l6ZSwgdGhyZWFkcyBubyBsb25nZXIgaW4gdGhlIHRlYW0gc2hvdWxkIHVucmVmIHRhc2sgdGVhbS4KKyAgICAgICAgICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9mcmVlX3RocmVhZCggaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdICk7CisgICAgICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0gPSAgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBob3RfdGVhbS0+dC50X25wcm9jID0gbmV3X250aDsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICBpZiggdGhyZWFkLT50aC50aF9ob3RfdGVhbXMgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBob3RfdGVhbSA9PSB0aHJlYWQtPnRoLnRoX2hvdF90ZWFtc1swXS5ob3RfdGVhbSApOworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9ob3RfdGVhbXNbMF0uaG90X3RlYW1fbnRoID0gbmV3X250aDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBVcGRhdGUgdGhlIHRfbnByb2MgZmllbGQgaW4gdGhlIHRocmVhZHMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlLgorICAgICAgICAvLworICAgICAgICBmb3IoIGY9MCA7IGYgPCBuZXdfbnRoOyBmKysgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0gIT0gTlVMTCApOworICAgICAgICAgICAgaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdLT50aC50aF90ZWFtX25wcm9jID0gbmV3X250aDsKKyAgICAgICAgfQorICAgICAgICAvLyBTcGVjaWFsIGZsYWcgaW4gY2FzZSBvbXBfc2V0X251bV90aHJlYWRzKCkgY2FsbAorICAgICAgICBob3RfdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IC0xOworICAgIH0KK30KKworLyogQ2hhbmdlcyBtYXhfYWN0aXZlX2xldmVscyAqLwordm9pZAorX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBpbnQgZ3RpZCwgaW50IG1heF9hY3RpdmVfbGV2ZWxzICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVsczogbmV3IG1heF9hY3RpdmVfbGV2ZWxzIGZvciB0aHJlYWQgJWQgPSAoJWQpXG4iLCBndGlkLCBtYXhfYWN0aXZlX2xldmVscyApICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIC8vIHZhbGlkYXRlIG1heF9hY3RpdmVfbGV2ZWxzCisgICAgaWYoIG1heF9hY3RpdmVfbGV2ZWxzIDwgMCApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFjdGl2ZUxldmVsc05lZ2F0aXZlLCBtYXhfYWN0aXZlX2xldmVscyApOworICAgICAgICAvLyBXZSBpZ25vcmUgdGhpcyBjYWxsIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgICAgICAgLy8gVGhlIGN1cnJlbnQgc2V0dGluZyB3b24ndCBiZSBjaGFuZ2VkLiBUaGUgbGFzdCB2YWxpZCBzZXR0aW5nIHdpbGwgYmUgdXNlZC4KKyAgICAgICAgLy8gQSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIChpZiB3YXJuaW5ncyBhcmUgYWxsb3dlZCBhcyBjb250cm9sbGVkIGJ5IHRoZSBLTVBfV0FSTklOR1MgZW52IHZhcikuCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzOiB0aGUgY2FsbCBpcyBpZ25vcmVkOiBuZXcgbWF4X2FjdGl2ZV9sZXZlbHMgZm9yIHRocmVhZCAlZCA9ICglZClcbiIsIGd0aWQsIG1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggbWF4X2FjdGl2ZV9sZXZlbHMgPD0gS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUICkgeworICAgICAgICAvLyBpdCdzIE9LLCB0aGUgbWF4X2FjdGl2ZV9sZXZlbHMgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZTogWyAwOyBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQgXQorICAgICAgICAvLyBXZSBhbGxvdyBhIHplcm8gdmFsdWUuIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJlaGF2aW9yKQorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBY3RpdmVMZXZlbHNFeGNlZWRMaW1pdCwgbWF4X2FjdGl2ZV9sZXZlbHMsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCAgKTsKKyAgICAgICAgbWF4X2FjdGl2ZV9sZXZlbHMgPSBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQ7CisgICAgICAgIC8vIEN1cnJlbnQgdXBwZXIgbGltaXQgaXMgTUFYX0lOVC4gKGltcGxlbWVudGF0aW9uIGRlZmluZWQgYmVoYXZpb3IpCisgICAgICAgIC8vIElmIHRoZSBpbnB1dCBleGNlZWRzIHRoZSB1cHBlciBsaW1pdCwgd2UgY29ycmVjdCB0aGUgaW5wdXQgdG8gYmUgdGhlIHVwcGVyIGxpbWl0LiAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCBiZWhhdmlvcikKKyAgICAgICAgLy8gQWN0dWFsbHksIHRoZSBmbG93IHNob3VsZCBuZXZlciBnZXQgaGVyZSB1bnRpbCB3ZSB1c2UgTUFYX0lOVCBsaW1pdC4KKyAgICB9CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IGFmdGVyIHZhbGlkYXRpb246IG5ldyBtYXhfYWN0aXZlX2xldmVscyBmb3IgdGhyZWFkICVkID0gKCVkKVxuIiwgZ3RpZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKSApOworCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX21heF9hY3RpdmVfbGV2ZWxzKCB0aHJlYWQsIG1heF9hY3RpdmVfbGV2ZWxzICk7CisKK30KKworLyogR2V0cyBtYXhfYWN0aXZlX2xldmVscyAqLworaW50CitfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVsczogdGhyZWFkICVkXG4iLCBndGlkICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrICk7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IHRocmVhZCAlZCwgY3VydGFzaz0lcCwgY3VydGFza19tYXhhY2xldmVsPSVkXG4iLAorICAgICAgICBndGlkLCB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzaywgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMgKSApOworICAgIHJldHVybiB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVsczsKK30KKworLyogQ2hhbmdlcyBkZWZfc2NoZWRfdmFyIElDViB2YWx1ZXMgKHJ1bi10aW1lIHNjaGVkdWxlIGtpbmQgYW5kIGNodW5rKSAqLwordm9pZAorX19rbXBfc2V0X3NjaGVkdWxlKCBpbnQgZ3RpZCwga21wX3NjaGVkX3Qga2luZCwgaW50IGNodW5rICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisvLyAgICBrbXBfdGVhbV90ICp0ZWFtOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3NldF9zY2hlZHVsZTogbmV3IHNjaGVkdWxlIGZvciB0aHJlYWQgJWQgPSAoJWQsICVkKVxuIiwgZ3RpZCwgKGludClraW5kLCBjaHVuayApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIGtpbmQgcGFyYW1ldGVyIGlzIHZhbGlkLCBjb3JyZWN0IGlmIG5lZWRlZC4KKyAgICAvLyBWYWxpZCBwYXJhbWV0ZXJzIHNob3VsZCBmaXQgaW4gb25lIG9mIHR3byBpbnRlcnZhbHMgLSBzdGFuZGFyZCBvciBleHRlbmRlZDoKKyAgICAvLyAgICAgICA8bG93ZXI+LCA8dmFsaWQ+LCA8dXBwZXJfc3RkPiwgPGxvd2VyX2V4dD4sIDx2YWxpZD4sIDx1cHBlcj4KKyAgICAvLyAyMDA4LTAxLTI1OiAwLCAgMSAtIDQsICAgICAgIDUsICAgICAgICAgMTAwLCAgICAgMTAxIC0gMTAyLCAxMDMKKyAgICBpZiAoIGtpbmQgPD0ga21wX3NjaGVkX2xvd2VyIHx8IGtpbmQgPj0ga21wX3NjaGVkX3VwcGVyIHx8CisgICAgICAgKCBraW5kIDw9IGttcF9zY2hlZF9sb3dlcl9leHQgJiYga2luZCA+PSBrbXBfc2NoZWRfdXBwZXJfc3RkICkgKQorICAgIHsKKyAgICAgICAgLy8gVE9ETzogSGludCBuZWVkcyBhdHRlbnRpb24gaW4gY2FzZSB3ZSBjaGFuZ2UgdGhlIGRlZmF1bHQgc2NoZWR1bGUuCisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgS01QX01TRyggU2NoZWR1bGVLaW5kT3V0T2ZSYW5nZSwga2luZCApLAorICAgICAgICAgICAgS01QX0hOVCggRGVmYXVsdFNjaGVkdWxlS2luZFVzZWQsICJzdGF0aWMsIG5vIGNodW5rIiApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICAgICAga2luZCA9IGttcF9zY2hlZF9kZWZhdWx0OworICAgICAgICBjaHVuayA9IDA7ICAgICAgICAgLy8gaWdub3JlIGNodW5rIHZhbHVlIGluIGNhc2Ugb2YgYmFkIGtpbmQKKyAgICB9CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIGlmICgga2luZCA8IGttcF9zY2hlZF91cHBlcl9zdGQgKSB7CisgICAgICAgIGlmICgga2luZCA9PSBrbXBfc2NoZWRfc3RhdGljICYmIGNodW5rIDwgS01QX0RFRkFVTFRfQ0hVTksgKSB7CisgICAgICAgICAgICAvLyBkaWZmZXIgc3RhdGljIGNodW5rZWQgdnMuIHVuY2h1bmtlZDoKKyAgICAgICAgICAgIC8vIGNodW5rIHNob3VsZCBiZSBpbnZhbGlkIHRvIGluZGljYXRlIHVuY2h1bmtlZCBzY2hlZHVsZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQpCisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZC5yX3NjaGVkX3R5cGUgPSBrbXBfc2NoX3N0YXRpYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXIgLSAxIF07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyAgICBfX2ttcF9zY2hfbWFwWyBraW5kIC0ga21wX3NjaGVkX2xvd2VyX2V4dCArIGttcF9zY2hlZF91cHBlcl9zdGQgLSBrbXBfc2NoZWRfbG93ZXIgLSAyIF07CisgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZSA9CisgICAgICAgICAgICBfX2ttcF9zY2hfbWFwWyBraW5kIC0ga21wX3NjaGVkX2xvd2VyX2V4dCArIGttcF9zY2hlZF91cHBlcl9zdGQgLSBrbXBfc2NoZWRfbG93ZXIgLSAyIF07CisgICAgfQorICAgIGlmICgga2luZCA9PSBrbXBfc2NoZWRfYXV0byApIHsKKyAgICAgICAgLy8gaWdub3JlIHBhcmFtZXRlciBjaHVuayBmb3Igc2NoZWR1bGUgYXV0bworICAgICAgICB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZC5jaHVuayA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgIH0gZWxzZSB7CisgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLmNodW5rID0gY2h1bms7CisgICAgfQorfQorCisvKiBHZXRzIGRlZl9zY2hlZF92YXIgSUNWIHZhbHVlcyAqLwordm9pZAorX19rbXBfZ2V0X3NjaGVkdWxlKCBpbnQgZ3RpZCwga21wX3NjaGVkX3QgKiBraW5kLCBpbnQgKiBjaHVuayApCit7CisgICAga21wX2luZm9fdCAgICAgKnRocmVhZDsKKyAgICBlbnVtIHNjaGVkX3R5cGUgdGhfdHlwZTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9nZXRfc2NoZWR1bGU6IHRocmVhZCAlZFxuIiwgZ3RpZCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgdGhfdHlwZSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZTsKKworICAgIHN3aXRjaCAoIHRoX3R5cGUgKSB7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9zdGF0aWM7CisgICAgICAgICpjaHVuayA9IDA7ICAgLy8gY2h1bmsgd2FzIG5vdCBzZXQsIHRyeSB0byBzaG93IHRoaXMgZmFjdCB2aWEgemVybyB2YWx1ZQorICAgICAgICByZXR1cm47CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9zdGF0aWM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX2R5bmFtaWM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfY2h1bmtlZDoKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9ndWlkZWQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9hdXRvOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9hdXRvOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX3RyYXBlem9pZGFsOworICAgICAgICBicmVhazsKKyNpZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9zdGF0aWNfc3RlYWw7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0ZBVEFMKCBVbmtub3duU2NoZWR1bGluZ1R5cGUsIHRoX3R5cGUgKTsKKyAgICB9CisKKyAgICAqY2h1bmsgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZC5jaHVuazsKK30KKworaW50CitfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggaW50IGd0aWQsIGludCBsZXZlbCApIHsKKworICAgIGludCBpaSwgZGQ7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICp0aHI7CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW06IHRocmVhZCAlZCAlZFxuIiwgZ3RpZCwgbGV2ZWwgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIC8vIHZhbGlkYXRlIGxldmVsCisgICAgaWYoIGxldmVsID09IDAgKSByZXR1cm4gMDsKKyAgICBpZiggbGV2ZWwgPCAwICkgcmV0dXJuIC0xOworICAgIHRociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGlpID0gdGVhbS0+dC50X2xldmVsOworICAgIGlmKCBsZXZlbCA+IGlpICkgcmV0dXJuIC0xOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiggdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7CisgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gdGVhbXMgcmVnaW9uIHdoZXJlIG11bHRpcGxlIG5lc3RlZCB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgaW50IHRsZXZlbCA9IHRoci0+dGgudGhfdGVhbXNfbGV2ZWw7IC8vIHRoZSBsZXZlbCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgIGlmKCBsZXZlbCA8PSB0bGV2ZWwgKSB7IC8vIG90aGVyd2lzZSB1c3VhbCBhbGdvcml0aG0gd29ya3MgKHdpbGwgbm90IHRvdWNoIHRoZSB0ZWFtcykKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGlpID49IHRsZXZlbCApOworICAgICAgICAgICAgLy8gQUM6IEFzIHdlIG5lZWQgdG8gcGFzcyBieSB0aGUgdGVhbXMgbGVhZ3VlLCB3ZSBuZWVkIHRvIGFydGlmaWNpYWxseSBpbmNyZWFzZSBpaQorICAgICAgICAgICAgaWYgKCBpaSA9PSB0bGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgaWkgKz0gMjsgLy8gdGhyZWUgdGVhbXMgaGF2ZSBzYW1lIGxldmVsCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlpICsrOyAgIC8vIHR3byB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYoIGlpID09IGxldmVsICkgcmV0dXJuIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKworICAgIGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisgICAgbGV2ZWwrKzsKKyAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgeworICAgICAgICBmb3IoIGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgaWYoICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSAmJiAoICFkZCApICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgICAgICAgICAgIGlpLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKCBkZCA+IDEgKSA/ICggMCApIDogKCB0ZWFtLT50LnRfbWFzdGVyX3RpZCApOworfQorCitpbnQKK19fa21wX2dldF90ZWFtX3NpemUoIGludCBndGlkLCBpbnQgbGV2ZWwgKSB7CisKKyAgICBpbnQgaWksIGRkOworICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqdGhyOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2dldF90ZWFtX3NpemU6IHRocmVhZCAlZCAlZFxuIiwgZ3RpZCwgbGV2ZWwgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIC8vIHZhbGlkYXRlIGxldmVsCisgICAgaWYoIGxldmVsID09IDAgKSByZXR1cm4gMTsKKyAgICBpZiggbGV2ZWwgPCAwICkgcmV0dXJuIC0xOworICAgIHRociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGlpID0gdGVhbS0+dC50X2xldmVsOworICAgIGlmKCBsZXZlbCA+IGlpICkgcmV0dXJuIC0xOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiggdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7CisgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gdGVhbXMgcmVnaW9uIHdoZXJlIG11bHRpcGxlIG5lc3RlZCB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgaW50IHRsZXZlbCA9IHRoci0+dGgudGhfdGVhbXNfbGV2ZWw7IC8vIHRoZSBsZXZlbCBvZiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgICAgIGlmKCBsZXZlbCA8PSB0bGV2ZWwgKSB7IC8vIG90aGVyd2lzZSB1c3VhbCBhbGdvcml0aG0gd29ya3MgKHdpbGwgbm90IHRvdWNoIHRoZSB0ZWFtcykKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGlpID49IHRsZXZlbCApOworICAgICAgICAgICAgLy8gQUM6IEFzIHdlIG5lZWQgdG8gcGFzcyBieSB0aGUgdGVhbXMgbGVhZ3VlLCB3ZSBuZWVkIHRvIGFydGlmaWNpYWxseSBpbmNyZWFzZSBpaQorICAgICAgICAgICAgaWYgKCBpaSA9PSB0bGV2ZWwgKSB7CisgICAgICAgICAgICAgICAgaWkgKz0gMjsgLy8gdGhyZWUgdGVhbXMgaGF2ZSBzYW1lIGxldmVsCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlpICsrOyAgIC8vIHR3byB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgd2hpbGUoIGlpID4gbGV2ZWwgKQorICAgIHsKKyAgICAgICAgZm9yKCBkZCA9IHRlYW0tPnQudF9zZXJpYWxpemVkOyAoIGRkID4gMCApICYmICggaWkgPiBsZXZlbCApOyBkZC0tLCBpaS0tICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGlmKCB0ZWFtLT50LnRfc2VyaWFsaXplZCAmJiAoICFkZCApICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgaWktLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0ZWFtLT50LnRfbnByb2M7Cit9CisKK2ttcF9yX3NjaGVkX3QKK19fa21wX2dldF9zY2hlZHVsZV9nbG9iYWwoKSB7CisvLyBUaGlzIHJvdXRpbmUgY3JlYXRlZCBiZWNhdXNlIHBhaXJzIChfX2ttcF9zY2hlZCwgX19rbXBfY2h1bmspIGFuZCAoX19rbXBfc3RhdGljLCBfX2ttcF9ndWlkZWQpCisvLyBtYXkgYmUgY2hhbmdlZCBieSBrbXBfc2V0X2RlZmF1bHRzIGluZGVwZW5kZW50bHkuIFNvIG9uZSBjYW4gZ2V0IHRoZSB1cGRhdGVkIHNjaGVkdWxlIGhlcmUuCisKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQ7CisKKyAgICAvLyBjcmVhdGUgc2NoZWR1bGUgZnJvbSA0IGdsb2JhbHM6IF9fa21wX3NjaGVkLCBfX2ttcF9jaHVuaywgX19rbXBfc3RhdGljLCBfX2ttcF9ndWlkZWQKKyAgICAvLyBfX2ttcF9zY2hlZCBzaG91bGQga2VlcCBvcmlnaW5hbCB2YWx1ZSwgc28gdGhhdCB1c2VyIGNhbiBzZXQgS01QX1NDSEVEVUxFIG11bHRpcGxlIHRpbWVzLAorICAgIC8vIGFuZCB0aHVzIGhhdmUgZGlmZmVyZW50IHJ1bi10aW1lIHNjaGVkdWxlcyBpbiBkaWZmZXJlbnQgcm9vdHMgKGV2ZW4gaW4gT01QIDIuNSkKKyAgICBpZiAoIF9fa21wX3NjaGVkID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICByX3NjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX3N0YXRpYzsgLy8gcmVwbGFjZSBTVEFUSUMgd2l0aCBtb3JlIGRldGFpbGVkIHNjaGVkdWxlIChiYWxhbmNlZCBvciBncmVlZHkpCisgICAgfSBlbHNlIGlmICggX19rbXBfc2NoZWQgPT0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCApIHsKKyAgICAgICAgcl9zY2hlZC5yX3NjaGVkX3R5cGUgPSBfX2ttcF9ndWlkZWQ7IC8vIHJlcGxhY2UgR1VJREVEIHdpdGggbW9yZSBkZXRhaWxlZCBzY2hlZHVsZSAoaXRlcmF0aXZlIG9yIGFuYWx5dGljYWwpCisgICAgfSBlbHNlIHsKKyAgICAgICAgcl9zY2hlZC5yX3NjaGVkX3R5cGUgPSBfX2ttcF9zY2hlZDsgIC8vIChTVEFUSUNfQ0hVTktFRCksIG9yIChEWU5BTUlDX0NIVU5LRUQpLCBvciBvdGhlcgorICAgIH0KKworICAgIGlmICggX19rbXBfY2h1bmsgPCBLTVBfREVGQVVMVF9DSFVOSyApIHsgLy8gX19rbXBfY2h1bmsgbWF5IGJlIHdyb25nIGhlcmUgKGlmIGl0IHdhcyBub3QgZXZlciBzZXQpCisgICAgICAgIHJfc2NoZWQuY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICB9IGVsc2UgeworICAgICAgICByX3NjaGVkLmNodW5rID0gX19rbXBfY2h1bms7CisgICAgfQorCisgICAgcmV0dXJuIHJfc2NoZWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyoKKyAqIEFsbG9jYXRlIChyZWFsbG9jID09IEZBTFNFKSAqIG9yIHJlYWxsb2NhdGUgKHJlYWxsb2MgPT0gVFJVRSkKKyAqIGF0IGxlYXN0IGFyZ2MgbnVtYmVyIG9mICp0X2FyZ3YgZW50cmllcyBmb3IgdGhlIHJlcXVlc3RlZCB0ZWFtLgorICovCitzdGF0aWMgdm9pZAorX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBpbnQgYXJnYywga21wX3RlYW1fdCAqdGVhbSwgaW50IHJlYWxsb2MgKQoreworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIGlmKCAhcmVhbGxvYyB8fCBhcmdjID4gdGVhbS0+dC50X21heF9hcmdjICkgeworCisgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2FsbG9jX2FyZ3ZfZW50cmllczogdGVhbSAlZDogbmVlZGVkIGVudHJpZXM9JWQsIGN1cnJlbnQgZW50cmllcz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGFyZ2MsICggcmVhbGxvYyApID8gdGVhbS0+dC50X21heF9hcmdjIDogMCApKTsKKyAgICAgICAgLyogaWYgcHJldmlvdXNseSBhbGxvY2F0ZWQgaGVhcCBzcGFjZSBmb3IgYXJncywgZnJlZSB0aGVtICovCisgICAgICAgIGlmICggcmVhbGxvYyAmJiB0ZWFtLT50LnRfYXJndiAhPSAmdGVhbS0+dC50X2lubGluZV9hcmd2WzBdICkKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoICh2b2lkICopIHRlYW0tPnQudF9hcmd2ICk7CisKKyAgICAgICAgaWYgKCBhcmdjIDw9IEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTICkgeworICAgICAgICAgICAgLyogdXNlIHVudXNlZCBzcGFjZSBpbiB0aGUgY2FjaGUgbGluZSBmb3IgYXJndW1lbnRzICovCisgICAgICAgICAgICB0ZWFtLT50LnRfbWF4X2FyZ2MgPSBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUzsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2FsbG9jX2FyZ3ZfZW50cmllczogdGVhbSAlZDogaW5saW5lIGFsbG9jYXRlICVkIGFyZ3YgZW50cmllc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWF4X2FyZ2MgKSk7CisgICAgICAgICAgICB0ZWFtLT50LnRfYXJndiA9ICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbMF07CisgICAgICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2lubGluZV9hcmd2WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2lubGluZV9hcmd2W0tNUF9JTkxJTkVfQVJHVl9FTlRSSUVTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZih2b2lkICopICogS01QX0lOTElORV9BUkdWX0VOVFJJRVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVhbV8lZC50X2lubGluZV9hcmd2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgYXJndW1lbnRzIGluIHRoZSBoZWFwICovCisgICAgICAgICAgICB0ZWFtLT50LnRfbWF4X2FyZ2MgPSAoIGFyZ2MgPD0gKEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyA+PiAxICkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTUlOX01BTExPQ19BUkdWX0VOVFJJRVMgOiAyICogYXJnYzsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICggIl9fa21wX2FsbG9jX2FyZ3ZfZW50cmllczogdGVhbSAlZDogZHluYW1pYyBhbGxvY2F0ZSAlZCBhcmd2IGVudHJpZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X21heF9hcmdjICkpOworICAgICAgICAgICAgdGVhbS0+dC50X2FyZ3YgICAgID0gKHZvaWQqKikgX19rbXBfcGFnZV9hbGxvY2F0ZSggc2l6ZW9mKHZvaWQqKSAqIHRlYW0tPnQudF9tYXhfYXJnYyApOworICAgICAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9hcmd2WzBdLCAmdGVhbS0+dC50X2FyZ3ZbdGVhbS0+dC50X21heF9hcmdjXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQgKikgKiB0ZWFtLT50LnRfbWF4X2FyZ2MsICJ0ZWFtXyVkLnRfYXJndiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWxsb2NhdGVfdGVhbV9hcnJheXMoa21wX3RlYW1fdCAqdGVhbSwgaW50IG1heF9udGgpCit7CisgICAgaW50IGk7CisgICAgaW50IG51bV9kaXNwX2J1ZmYgPSBtYXhfbnRoID4gMSA/IF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzIDogMjsKKyAgICB0ZWFtLT50LnRfdGhyZWFkcyA9IChrbXBfaW5mb190KiopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCopICogbWF4X250aCApOworICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9zaGFyZWRfaW5mb190KikKKyAgICAgICAgX19rbXBfYWxsb2NhdGUoIHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSAqIG51bV9kaXNwX2J1ZmYgKTsKKyAgICB0ZWFtLT50LnRfZGlzcGF0Y2ggPSAoa21wX2Rpc3BfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2Rpc3BfdCkgKiBtYXhfbnRoICk7CisgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF90YXNrZGF0YV90KSAqIG1heF9udGggKTsKKyAgICB0ZWFtLT50LnRfbWF4X25wcm9jID0gbWF4X250aDsKKworICAgIC8qIHNldHVwIGRpc3BhdGNoIGJ1ZmZlcnMgKi8KKyAgICBmb3IoaSA9IDAgOyBpIDwgbnVtX2Rpc3BfYnVmZjsgKytpKSB7CisgICAgICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlcltpXS5idWZmZXJfaW5kZXggPSBpOworI2lmIE9NUF80NV9FTkFCTEVECisgICAgICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlcltpXS5kb2Fjcm9zc19idWZfaWR4ID0gaTsKKyNlbmRpZgorICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGVhbV9hcnJheXMoa21wX3RlYW1fdCAqdGVhbSkgeworICAgIC8qIE5vdGU6IHRoaXMgZG9lcyBub3QgZnJlZSB0aGUgdGhyZWFkcyBpbiB0X3RocmVhZHMgKF9fa21wX2ZyZWVfdGhyZWFkcykgKi8KKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IHRlYW0tPnQudF9tYXhfbnByb2M7ICsrIGkgKSB7CisgICAgICAgIGlmICggdGVhbS0+dC50X2Rpc3BhdGNoWyBpIF0udGhfZGlzcF9idWZmZXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIHRlYW0tPnQudF9kaXNwYXRjaFsgaSBdLnRoX2Rpc3BfYnVmZmVyICk7CisgICAgICAgICAgICB0ZWFtLT50LnRfZGlzcGF0Y2hbIGkgXS50aF9kaXNwX2J1ZmZlciA9IE5VTEw7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gZm9yCisgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfdGhyZWFkcyk7CisgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcF9idWZmZXIpOworICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X2Rpc3BhdGNoKTsKKyAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhKTsKKyAgICB0ZWFtLT50LnRfdGhyZWFkcyAgICAgPSBOVUxMOworICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlciA9IE5VTEw7CisgICAgdGVhbS0+dC50X2Rpc3BhdGNoICAgID0gTlVMTDsKKyAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZWFsbG9jYXRlX3RlYW1fYXJyYXlzKGttcF90ZWFtX3QgKnRlYW0sIGludCBtYXhfbnRoKSB7CisgICAga21wX2luZm9fdCAqKm9sZFRocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X2Rpc3BfYnVmZmVyKTsKKyAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSk7CisgICAgX19rbXBfYWxsb2NhdGVfdGVhbV9hcnJheXModGVhbSwgbWF4X250aCk7CisKKyAgICBLTVBfTUVNQ1BZKHRlYW0tPnQudF90aHJlYWRzLCBvbGRUaHJlYWRzLCB0ZWFtLT50LnRfbnByb2MgKiBzaXplb2YgKGttcF9pbmZvX3QqKSk7CisKKyAgICBfX2ttcF9mcmVlKG9sZFRocmVhZHMpOworfQorCitzdGF0aWMga21wX2ludGVybmFsX2NvbnRyb2xfdAorX19rbXBfZ2V0X2dsb2JhbF9pY3ZzKCB2b2lkICkgeworCisgICAga21wX3Jfc2NoZWRfdCByX3NjaGVkID0gX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCgpOyAvLyBnZXQgY3VycmVudCBzdGF0ZSBvZiBzY2hlZHVsaW5nIGdsb2JhbHMKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID4gMCApOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IGdfaWN2cyA9IHsKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaW50IHNlcmlhbF9uZXN0aW5nX2xldmVsOyAvL2NvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdGhfdGVhbV9zZXJpYWxpemVkIGZpZWxkCisgICAgICAoa21wX2ludDgpX19rbXBfZGZsdF9uZXN0ZWQsICAgICAgICAgICAgLy9pbnQgbmVzdGVkOyAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgbmVzdGVkIHBhcmFsbGVsaXNtIChwZXIgdGhyZWFkKQorICAgICAgKGttcF9pbnQ4KV9fa21wX2dsb2JhbC5nLmdfZHluYW1pYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aHJlYWRzIChwZXIgdGhyZWFkKQorICAgICAgKGttcF9pbnQ4KV9fa21wX2Vudl9ibG9ja3RpbWUsICAgICAgICAgIC8vaW50IGJ0X3NldDsgICAgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIHdoZXRoZXIgYmxvY2t0aW1lIGlzIGV4cGxpY2l0bHkgc2V0CisgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgICAgICAgICAvL2ludCBibG9ja3RpbWU7ICAgICAgICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBibG9ja3RpbWUKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgICAgIF9fa21wX2J0X2ludGVydmFscywgICAgICAgICAgIC8vaW50IGJ0X2ludGVydmFsczsgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZSBpbnRlcnZhbHMKKyNlbmRpZgorICAgICAgX19rbXBfZGZsdF90ZWFtX250aCwgICAgICAgICAgLy9pbnQgbnByb2M7ICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgIyBvZiB0aHJlYWRzIGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAocGVyIHRocmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2UgYSBtYXggdWIgb24gdmFsdWUgaWYgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSBub3QgY2FsbGVkIHlldCkKKyAgICAgIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHMsIC8vaW50IG1heF9hY3RpdmVfbGV2ZWxzOyAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIG1heF9hY3RpdmVfbGV2ZWxzCisgICAgICByX3NjaGVkLCAgICAgICAgICAgICAgICAgICAgICAvL2ttcF9yX3NjaGVkX3Qgc2NoZWQ7ICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBydW50aW1lIHNjaGVkdWxlIHtzY2hlZCxjaHVua30gcGFpcgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0sCisgICAgICBfX2ttcF9kZWZhdWx0X2RldmljZSwKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdHJ1Y3Qga21wX2ludGVybmFsX2NvbnRyb2wgKm5leHQ7CisgICAgfTsKKworICAgIHJldHVybiBnX2ljdnM7Cit9CisKK3N0YXRpYyBrbXBfaW50ZXJuYWxfY29udHJvbF90CitfX2ttcF9nZXRfeF9nbG9iYWxfaWN2cyggY29uc3Qga21wX3RlYW1fdCAqdGVhbSApIHsKKworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgZ3hfaWN2czsKKyAgICBneF9pY3ZzLnNlcmlhbF9uZXN0aW5nX2xldmVsID0gMDsgLy8gcHJvYmFibHkgPXRlYW0tPnQudF9zZXJpYWwgbGlrZSBpbiBzYXZlX2ludGVyX2NvbnRyb2xzCisgICAgY29weV9pY3ZzKCAmIGd4X2ljdnMsICYgdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cyApOworICAgIGd4X2ljdnMubmV4dCA9IE5VTEw7CisKKyAgICByZXR1cm4gZ3hfaWN2czsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRpYWxpemVfcm9vdCgga21wX3Jvb3RfdCAqcm9vdCApCit7CisgICAgaW50ICAgICAgICAgICBmOworICAgIGttcF90ZWFtX3QgICAqcm9vdF90ZWFtOworICAgIGttcF90ZWFtX3QgICAqaG90X3RlYW07CisgICAgaW50ICAgICAgICAgICBob3RfdGVhbV9tYXhfbnRoOworICAgIGttcF9yX3NjaGVkX3Qgcl9zY2hlZCA9IF9fa21wX2dldF9zY2hlZHVsZV9nbG9iYWwoKTsgLy8gZ2V0IGN1cnJlbnQgc3RhdGUgb2Ygc2NoZWR1bGluZyBnbG9iYWxzCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICk7CisgICAgS01QX0FTU0VSVCggISByb290LT5yLnJfYmVnaW4gKTsKKworICAgIC8qIHNldHVwIHRoZSByb290IHN0YXRlIHN0cnVjdHVyZSAqLworICAgIF9fa21wX2luaXRfbG9jayggJnJvb3QtPnIucl9iZWdpbl9sb2NrICk7CisgICAgcm9vdC0+ci5yX2JlZ2luICAgICAgICA9IEZBTFNFOworICAgIHJvb3QtPnIucl9hY3RpdmUgICAgICAgPSBGQUxTRTsKKyAgICByb290LT5yLnJfaW5fcGFyYWxsZWwgID0gMDsKKyAgICByb290LT5yLnJfYmxvY2t0aW1lICAgID0gX19rbXBfZGZsdF9ibG9ja3RpbWU7CisgICAgcm9vdC0+ci5yX25lc3RlZCAgICAgICA9IF9fa21wX2RmbHRfbmVzdGVkOworCisgICAgLyogc2V0dXAgdGhlIHJvb3QgdGVhbSBmb3IgdGhpcyB0YXNrICovCisgICAgLyogYWxsb2NhdGUgdGhlIHJvb3QgdGVhbSBzdHJ1Y3R1cmUgKi8KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYmVmb3JlIHJvb3RfdGVhbVxuIiApICk7CisKKyAgICByb290X3RlYW0gPQorICAgICAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtKAorICAgICAgICAgICAgcm9vdCwKKyAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3X25wcm9jCisgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heF9ucHJvYworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgMCwgLy8gcm9vdCBwYXJhbGxlbCBpZAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSwKKyNlbmRpZgorICAgICAgICAgICAgJnJfaWN2cywKKyAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJnYworICAgICAgICAgICAgVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXN0ZXIgdGhyZWFkIGlzIHVua25vd24KKyAgICAgICAgKTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAvLyBOb24tTlVMTCB2YWx1ZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gbWFrZSB0aGUgZGVidWdnZXIgZGlzcGxheSB0aGUgcm9vdCB0ZWFtLgorICAgIFRDV19TWU5DX1BUUihyb290X3RlYW0tPnQudF9wa2ZuLCAobWljcm90YXNrX3QpKCB+IDAgKSk7CisjZW5kaWYKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBhZnRlciByb290X3RlYW0gPSAlcFxuIiwgcm9vdF90ZWFtICkgKTsKKworICAgIHJvb3QtPnIucl9yb290X3RlYW0gPSByb290X3RlYW07CisgICAgcm9vdF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPSBOVUxMOworCisgICAgLyogaW5pdGlhbGl6ZSByb290IHRlYW0gKi8KKyAgICByb290X3RlYW0tPnQudF90aHJlYWRzWzBdID0gTlVMTDsKKyAgICByb290X3RlYW0tPnQudF9ucHJvYyAgICAgID0gMTsKKyAgICByb290X3RlYW0tPnQudF9zZXJpYWxpemVkID0gMTsKKyAgICAvLyBUT0RPPz8/OiByb290X3RlYW0tPnQudF9tYXhfYWN0aXZlX2xldmVscyA9IF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgcm9vdF90ZWFtLT50LnRfc2NoZWQucl9zY2hlZF90eXBlID0gcl9zY2hlZC5yX3NjaGVkX3R5cGU7CisgICAgcm9vdF90ZWFtLT50LnRfc2NoZWQuY2h1bmsgICAgICAgID0gcl9zY2hlZC5jaHVuazsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBpbml0IHJvb3QgdGVhbSAlZCBhcnJpdmVkOiBqb2luPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcm9vdF90ZWFtLT50LnRfaWQsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSk7CisKKyAgICAvKiBzZXR1cCB0aGUgIGhvdCB0ZWFtIGZvciB0aGlzIHRhc2sgKi8KKyAgICAvKiBhbGxvY2F0ZSB0aGUgaG90IHRlYW0gc3RydWN0dXJlICovCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX3Jvb3Q6IGJlZm9yZSBob3RfdGVhbVxuIiApICk7CisKKyAgICBob3RfdGVhbSA9CisgICAgICAgIF9fa21wX2FsbG9jYXRlX3RlYW0oCisgICAgICAgICAgICByb290LAorICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdfbnByb2MKKyAgICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4X25wcm9jCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAwLCAvLyByb290IHBhcmFsbGVsIGlkCisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdLAorI2VuZGlmCisgICAgICAgICAgICAmcl9pY3ZzLAorICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmdjCisgICAgICAgICAgICBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hc3RlciB0aHJlYWQgaXMgdW5rbm93bgorICAgICAgICApOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBhZnRlciBob3RfdGVhbSA9ICVwXG4iLCBob3RfdGVhbSApICk7CisKKyAgICByb290LT5yLnJfaG90X3RlYW0gPSBob3RfdGVhbTsKKyAgICByb290X3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcCA9IE5VTEw7CisKKyAgICAvKiBmaXJzdC10aW1lIGluaXRpYWxpemF0aW9uICovCisgICAgaG90X3RlYW0tPnQudF9wYXJlbnQgPSByb290X3RlYW07CisKKyAgICAvKiBpbml0aWFsaXplIGhvdCB0ZWFtICovCisgICAgaG90X3RlYW1fbWF4X250aCA9IGhvdF90ZWFtLT50LnRfbWF4X25wcm9jOworICAgIGZvciAoIGYgPSAwOyBmIDwgaG90X3RlYW1fbWF4X250aDsgKysgZiApIHsKKyAgICAgICAgaG90X3RlYW0tPnQudF90aHJlYWRzWyBmIF0gPSBOVUxMOworICAgIH07IC8vIGZvcgorICAgIGhvdF90ZWFtLT50LnRfbnByb2MgPSAxOworICAgIC8vIFRPRE8/Pz86IGhvdF90ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOworICAgIGhvdF90ZWFtLT50LnRfc2NoZWQucl9zY2hlZF90eXBlID0gcl9zY2hlZC5yX3NjaGVkX3R5cGU7CisgICAgaG90X3RlYW0tPnQudF9zY2hlZC5jaHVuayAgICAgICAgPSByX3NjaGVkLmNodW5rOworICAgIGhvdF90ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gMDsKK30KKworI2lmZGVmIEtNUF9ERUJVRworCisKK3R5cGVkZWYgc3RydWN0IGttcF90ZWFtX2xpc3RfaXRlbSB7CisgICAga21wX3RlYW1fcCBjb25zdCAqICAgICAgICAgICBlbnRyeTsKKyAgICBzdHJ1Y3Qga21wX3RlYW1fbGlzdF9pdGVtICogIG5leHQ7Cit9IGttcF90ZWFtX2xpc3RfaXRlbV90OwordHlwZWRlZiBrbXBfdGVhbV9saXN0X2l0ZW1fdCAqIGttcF90ZWFtX2xpc3RfdDsKKworCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oICAgIC8vIEFkZCB0ZWFtIHRvIGxpc3Qgb2YgdGVhbXMuCisgICAga21wX3RlYW1fbGlzdF90ICAgICBsaXN0LCAgICAgICAgLy8gTGlzdCBvZiB0ZWFtcy4KKyAgICBrbXBfdGVhbV9wIGNvbnN0ICogIHRlYW0gICAgICAgICAvLyBUZWFtIHRvIGFkZC4KKykgeworCisgICAgLy8gTGlzdCBtdXN0IHRlcm1pbmF0ZSB3aXRoIGl0ZW0gd2hlcmUgYm90aCBlbnRyeSBhbmQgbmV4dCBhcmUgTlVMTC4KKyAgICAvLyBUZWFtIGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9ubHkgb25jZS4KKyAgICAvLyBMaXN0IGlzIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGVhbSBpZC4KKyAgICAvLyBUZWFtIGlkIGlzICpub3QqIGEga2V5LgorCisgICAga21wX3RlYW1fbGlzdF90IGw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsaXN0ICE9IE5VTEwgKTsKKyAgICBpZiAoIHRlYW0gPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGVhbS0+dC50X3BhcmVudCApOworICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCB0ZWFtLT50LnRfbmV4dF9wb29sICk7CisKKyAgICAvLyBTZWFyY2ggbGlzdCBmb3IgdGhlIHRlYW0uCisgICAgbCA9IGxpc3Q7CisgICAgd2hpbGUgKCBsLT5uZXh0ICE9IE5VTEwgJiYgbC0+ZW50cnkgIT0gdGVhbSApIHsKKyAgICAgICAgbCA9IGwtPm5leHQ7CisgICAgfTsgLy8gd2hpbGUKKyAgICBpZiAoIGwtPm5leHQgIT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuOyAgLy8gVGVhbSBoYXMgYmVlbiBhZGRlZCBiZWZvcmUsIGV4aXQuCisgICAgfTsgLy8gaWYKKworICAgIC8vIFRlYW0gaXMgbm90IGZvdW5kLiBTZWFyY2ggbGlzdCBhZ2FpbiBmb3IgaW5zZXJ0aW9uIHBvaW50LgorICAgIGwgPSBsaXN0OworICAgIHdoaWxlICggbC0+bmV4dCAhPSBOVUxMICYmIGwtPmVudHJ5LT50LnRfaWQgPD0gdGVhbS0+dC50X2lkICkgeworICAgICAgICBsID0gbC0+bmV4dDsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gSW5zZXJ0IHRlYW0uCisgICAgeworICAgICAgICBrbXBfdGVhbV9saXN0X2l0ZW1fdCAqIGl0ZW0gPQorICAgICAgICAgICAgKGttcF90ZWFtX2xpc3RfaXRlbV90ICopS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCAga21wX3RlYW1fbGlzdF9pdGVtX3QgKSApOworICAgICAgICAqIGl0ZW0gPSAqIGw7CisgICAgICAgIGwtPmVudHJ5ID0gdGVhbTsKKyAgICAgICAgbC0+bmV4dCAgPSBpdGVtOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oCisgICAgY2hhciBjb25zdCAqICAgICAgIHRpdGxlLAorICAgIGttcF90ZWFtX3AgY29uc3QgKiB0ZWFtCisKKykgeworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgdGl0bGUgKTsKKyAgICBpZiAoIHRlYW0gIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiJTJ4ICVwXG4iLCB0ZWFtLT50LnRfaWQsIHRlYW0gKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICIgLSAobmlsKVxuIiApOworICAgIH07IC8vIGlmCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKAorICAgIGNoYXIgY29uc3QgKiAgICAgICB0aXRsZSwKKyAgICBrbXBfaW5mb19wIGNvbnN0ICogdGhyZWFkCisKKykgeworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgdGl0bGUgKTsKKyAgICBpZiAoIHRocmVhZCAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9wcmludGYoICIlMmQgJXBcbiIsIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc19ndGlkLCB0aHJlYWQgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICIgLSAobmlsKVxuIiApOworICAgIH07IC8vIGlmCit9CisKK3ZvaWQKK19fa21wX3ByaW50X3N0cnVjdHVyZSgKKyAgICB2b2lkCispIHsKKworICAgIGttcF90ZWFtX2xpc3RfdCBsaXN0OworCisgICAgLy8gSW5pdGlhbGl6ZSBsaXN0IG9mIHRlYW1zLgorICAgIGxpc3QgPSAoa21wX3RlYW1fbGlzdF9pdGVtX3QgKilLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplb2YoIGttcF90ZWFtX2xpc3RfaXRlbV90ICkgKTsKKyAgICBsaXN0LT5lbnRyeSA9IE5VTEw7CisgICAgbGlzdC0+bmV4dCAgPSBOVUxMOworCisgICAgX19rbXBfcHJpbnRmKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkdsb2JhbCBUaHJlYWQgVGFibGVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIHsKKyAgICAgICAgaW50IGd0aWQ7CisgICAgICAgIGZvciAoIGd0aWQgPSAwOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKysgZ3RpZCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIiUyZCIsIGd0aWQgKTsKKyAgICAgICAgICAgIGlmICggX19rbXBfdGhyZWFkcyAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIiAlcCIsIF9fa21wX3RocmVhZHNbIGd0aWQgXSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggX19rbXBfcm9vdCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIiAlcCIsIF9fa21wX3Jvb3RbIGd0aWQgXSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICB9OyAvLyBmb3IgZ3RpZAorICAgIH0KKworICAgIC8vIFByaW50IG91dCBfX2ttcF90aHJlYWRzIGFycmF5LgorICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5UaHJlYWRzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICBpZiAoIF9fa21wX3RocmVhZHMgIT0gTlVMTCApIHsKKyAgICAgICAgaW50IGd0aWQ7CisgICAgICAgIGZvciAoIGd0aWQgPSAwOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKysgZ3RpZCApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgY29uc3QgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgICAgICBpZiAoIHRocmVhZCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIkdUSUQgJTJkICVwOlxuIiwgZ3RpZCwgdGhyZWFkICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBPdXIgUm9vdDogICAgICAgICVwXG4iLCB0aHJlYWQtPnRoLnRoX3Jvb3QgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIE91ciBUZWFtOiAgICAgIiwgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbSApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICIgICAgU2VyaWFsIFRlYW06ICAiLCAgICAgICAgdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgVGhyZWFkczogICAgICAlMmRcbiIsICAgdGhyZWFkLT50aC50aF90ZWFtX25wcm9jICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiAgICBNYXN0ZXI6ICAgICAgICIsICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW1fbWFzdGVyICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBTZXJpYWxpemVkPzogICUyZFxuIiwgICB0aHJlYWQtPnRoLnRoX3RlYW1fc2VyaWFsaXplZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgU2V0IE5Qcm9jOiAgICAlMmRcbiIsICAgdGhyZWFkLT50aC50aF9zZXRfbnByb2MgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgU2V0IFByb2MgQmluZDogJTJkXG4iLCAgdGhyZWFkLT50aC50aF9zZXRfcHJvY19iaW5kICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAiICAgIE5leHQgaW4gcG9vbDogIiwgICAgICAgIHRocmVhZC0+dGgudGhfbmV4dF9wb29sICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiXG4iICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHRocmVhZC0+dGgudGhfdGVhbSApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBmb3IgZ3RpZAorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3ByaW50ZiggIlRocmVhZHMgYXJyYXkgaXMgbm90IGFsbG9jYXRlZC5cbiIgKTsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gUHJpbnQgb3V0IF9fa21wX3Jvb3QgYXJyYXkuCisgICAgX19rbXBfcHJpbnRmKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblViZXJzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICBpZiAoIF9fa21wX3Jvb3QgIT0gTlVMTCApIHsKKyAgICAgICAgaW50IGd0aWQ7CisgICAgICAgIGZvciAoIGd0aWQgPSAwOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKysgZ3RpZCApIHsKKyAgICAgICAgICAgIGttcF9yb290X3QgY29uc3QgKiByb290ID0gX19rbXBfcm9vdFsgZ3RpZCBdOworICAgICAgICAgICAgaWYgKCByb290ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiR1RJRCAlMmQgJXA6XG4iLCBndGlkLCByb290ICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICAgIiAgICBSb290IFRlYW06ICAgICIsICAgICAgcm9vdC0+ci5yX3Jvb3RfdGVhbSApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICIgICAgSG90IFRlYW06ICAgICAiLCAgICAgIHJvb3QtPnIucl9ob3RfdGVhbSApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoICIgICAgVWJlciBUaHJlYWQ6ICAiLCAgICAgIHJvb3QtPnIucl91YmVyX3RocmVhZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgQWN0aXZlPzogICAgICAlMmRcbiIsIHJvb3QtPnIucl9hY3RpdmUgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIE5lc3RlZD86ICAgICAgJTJkXG4iLCByb290LT5yLnJfbmVzdGVkICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBJbiBQYXJhbGxlbDogICUyZFxuIiwgcm9vdC0+ci5yX2luX3BhcmFsbGVsICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiXG4iICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHJvb3QtPnIucl9yb290X3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgcm9vdC0+ci5yX2hvdF90ZWFtICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBmb3IgZ3RpZAorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3ByaW50ZiggIlViZXJzIGFycmF5IGlzIG5vdCBhbGxvY2F0ZWQuXG4iICk7CisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5UZWFtc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgd2hpbGUgKCBsaXN0LT5uZXh0ICE9IE5VTEwgKSB7CisgICAgICAgIGttcF90ZWFtX3AgY29uc3QgKiB0ZWFtID0gbGlzdC0+ZW50cnk7CisgICAgICAgIGludCBpOworICAgICAgICBfX2ttcF9wcmludGYoICJUZWFtICUyeCAlcDpcbiIsIHRlYW0tPnQudF9pZCwgdGVhbSApOworICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggIiAgICBQYXJlbnQgVGVhbTogICAgICAiLCAgICAgIHRlYW0tPnQudF9wYXJlbnQgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICIgICAgTWFzdGVyIFRJRDogICAgICAgJTJkXG4iLCB0ZWFtLT50LnRfbWFzdGVyX3RpZCApOworICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgIiAgICBNYXggdGhyZWFkczogICAgICAlMmRcbiIsIHRlYW0tPnQudF9tYXhfbnByb2MgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICIgICAgTGV2ZWxzIG9mIHNlcmlhbDogJTJkXG4iLCB0ZWFtLT50LnRfc2VyaWFsaXplZCApOworICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgIiAgICBOdW1iZXIgdGhyZWFkczogICAlMmRcbiIsIHRlYW0tPnQudF9ucHJvYyApOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHRlYW0tPnQudF9ucHJvYzsgKysgaSApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICIgICAgVGhyZWFkICUyZDogICAgICAiLCBpICk7CisgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAiIiwgdGVhbS0+dC50X3RocmVhZHNbIGkgXSApOworICAgICAgICB9OyAvLyBmb3IgaQorICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggIiAgICBOZXh0IGluIHBvb2w6ICAgICAiLCAgICAgIHRlYW0tPnQudF9uZXh0X3Bvb2wgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiXG4iICk7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH07IC8vIHdoaWxlCisKKyAgICAvLyBQcmludCBvdXQgX19rbXBfdGhyZWFkX3Bvb2wgYW5kIF9fa21wX3RlYW1fcG9vbC4KKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuUG9vbHNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoICAgIlRocmVhZCBwb29sOiAgICAgICAgICAiLCAoa21wX2luZm9fdCAqKV9fa21wX3RocmVhZF9wb29sICk7CisgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICAgICAiVGVhbSBwb29sOiAgICAgICAgICAgICIsIChrbXBfdGVhbV90ICopX19rbXBfdGVhbV9wb29sICk7CisgICAgX19rbXBfcHJpbnRmKCAiXG4iICk7CisKKyAgICAvLyBGcmVlIHRlYW0gbGlzdC4KKyAgICB3aGlsZSAoIGxpc3QgIT0gTlVMTCApIHsKKyAgICAgICAga21wX3RlYW1fbGlzdF9pdGVtX3QgKiBpdGVtID0gbGlzdDsKKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBpdGVtICk7CisgICAgfTsgLy8gd2hpbGUKKworfQorCisjZW5kaWYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFN0dWZmIGZvciBwZXItdGhyZWFkIGZhc3QgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKy8vICBUYWJsZSBvZiBwcmltZXMKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIF9fa21wX3ByaW1lc1tdID0geworICAweDllMzc3OWIxLCAweGZmZTZjYzU5LCAweDIxMDlmNmRkLCAweDQzOTc3YWI1LAorICAweGJhNTcwM2Y1LCAweGI0OTVhODc3LCAweGUxNjI2NzQxLCAweDc5Njk1ZTZiLAorICAweGJjOThjMDlmLCAweGQ1YmVlMmIzLCAweDI4NzQ4OGY5LCAweDNhZjE4MjMxLAorICAweDk2NzdjZDRkLCAweGJlM2E2OTI5LCAweGFkYzZhODc3LCAweGRjZjA2NzRiLAorICAweGJlNGQ2ZmU5LCAweDVmMTVlMjAxLCAweDk5YWZjM2ZkLCAweGYzZjE2ODAxLAorICAweGUyMjJjZmZmLCAweDI0YmE1ZmRiLCAweDA2MjA0NTJkLCAweDc5ZjE0OWUzLAorICAweGM4YjkzZjQ5LCAweDk3MjcwMmNkLCAweGIwN2RkODI3LCAweDZjOTdkNWVkLAorICAweDA4NWEzZDYxLCAweDQ2ZWI1ZWE3LCAweDNkOTkxMGVkLCAweDJlNjg3YjViLAorICAweDI5NjA5MjI3LCAweDZlYjA4MWYxLCAweDA5NTRjNGUxLCAweDlkMTE0ZGI5LAorICAweDU0MmFjZmE5LCAweGIzZTZiZDdiLCAweDA3NDJkOTE3LCAweGU5ZjNmZmE3LAorICAweDU0NTgxZWRiLCAweGYyNDgwZjQ1LCAweDBiYjkyODhmLCAweGVmMWFmZmM3LAorICAweDg1ZmEwY2E3LCAweDNjY2MxNGRiLCAweGU2YmFmMzRiLCAweDM0MzM3N2Y3LAorICAweDVjYTE5MDMxLCAweGU2ZDkyOTNiLCAweGYwYTlmMzkxLCAweDVkMmU5ODBiLAorICAweGZjNDExMDczLCAweGMzNzQ5MzYzLCAweGI4OTJkODI5LCAweDM1NDkzNjZiLAorICAweDYyOTc1MGFkLCAweGI5ODI5NGU1LCAweDg5MmQ5NDgzLCAweGMyMzViYWYzLAorICAweDNkMjQwMmEzLCAweDZiZGVmM2M5LCAweGJlYzMzM2NkLCAweDQwYzk1MjBmCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX2dldF9yYW5kb206IEdldCBhIHJhbmRvbSBudW1iZXIgdXNpbmcgYSBsaW5lYXIgY29uZ3J1ZW50aWFsIG1ldGhvZC4KKwordW5zaWduZWQgc2hvcnQKK19fa21wX2dldF9yYW5kb20oIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworICB1bnNpZ25lZCB4ID0gdGhyZWFkLT50aC50aF94OworICB1bnNpZ25lZCBzaG9ydCByID0geD4+MTY7CisKKyAgdGhyZWFkLT50aC50aF94ID0geCp0aHJlYWQtPnRoLnRoX2ErMTsKKworICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9nZXRfcmFuZG9tOiBUSFJFQUQ6ICVkLCBSRVRVUk46ICV1XG4iLAorICAgICAgICAgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZCwgcikgKTsKKworICByZXR1cm4gcjsKK30KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2luaXRfcmFuZG9tOiBJbml0aWFsaXplIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKwordm9pZAorX19rbXBfaW5pdF9yYW5kb20oIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworICB1bnNpZ25lZCBzZWVkID0gdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKworICB0aHJlYWQtPnRoLnRoX2EgPSBfX2ttcF9wcmltZXNbc2VlZCUoc2l6ZW9mKF9fa21wX3ByaW1lcykvc2l6ZW9mKF9fa21wX3ByaW1lc1swXSkpXTsKKyAgdGhyZWFkLT50aC50aF94ID0gKHNlZWQrMSkqdGhyZWFkLT50aC50aF9hKzE7CisgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2luaXRfcmFuZG9tOiBUSFJFQUQ6ICV1OyBBOiAldVxuIiwgc2VlZCwgdGhyZWFkLT50aC50aF9hKSApOworfQorCisKKyNpZiBLTVBfT1NfV0lORE9XUworLyogcmVjbGFpbSBhcnJheSBlbnRyaWVzIGZvciByb290IHRocmVhZHMgdGhhdCBhcmUgYWxyZWFkeSBkZWFkLCByZXR1cm5zIG51bWJlciByZWNsYWltZWQgKi8KK3N0YXRpYyBpbnQKK19fa21wX3JlY2xhaW1fZGVhZF9yb290cyh2b2lkKSB7CisgICAgaW50IGksIHIgPSAwOworCisgICAgZm9yKGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKytpKSB7CisgICAgICAgIGlmKCBLTVBfVUJFUl9HVElEKCBpICkgJiYKKyAgICAgICAgICAhX19rbXBfc3RpbGxfcnVubmluZygoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihfX2ttcF90aHJlYWRzW2ldKSkgJiYKKyAgICAgICAgICAhX19rbXBfcm9vdFtpXS0+ci5yX2FjdGl2ZSApIHsgLy8gQUM6IHJlY2xhaW0gb25seSByb290cyBkaWVkIGluIG5vbi1hY3RpdmUgc3RhdGUKKyAgICAgICAgICAgIHIgKz0gX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKgorICAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBjcmVhdGUgZnJlZSBlbnRyaWVzIGluIF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3QsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIGZyZWUgZW50cmllcyBnZW5lcmF0ZWQuCisKKyAgIEZvciBXaW5kb3dzKiBPUyBzdGF0aWMgbGlicmFyeSwgdGhlIGZpcnN0IG1lY2hhbmlzbSB1c2VkIGlzIHRvIHJlY2xhaW0gYXJyYXkgZW50cmllcyBmb3Igcm9vdCB0aHJlYWRzIHRoYXQgYXJlCisgICBhbHJlYWR5IGRlYWQuCisKKyAgIE9uIGFsbCBwbGF0Zm9ybXMsIGV4cGFuc2lvbiBpcyBhdHRlbXB0ZWQgb24gdGhlIGFycmF5cyBfX2ttcF90aHJlYWRzXyBhbmQgX19rbXBfcm9vdCwgd2l0aCBhcHByb3ByaWF0ZQorICAgdXBkYXRlIHRvIF9fa21wX3RocmVhZHNfY2FwYWNpdHkuICBBcnJheSBjYXBhY2l0eSBpcyBpbmNyZWFzZWQgYnkgZG91Ymxpbmcgd2l0aCBjbGlwcGluZyB0bworICAgIF9fa21wX3RwX2NhcGFjaXR5LCBpZiB0aHJlYWRwcml2YXRlIGNhY2hlIGFycmF5IGhhcyBiZWVuIGNyZWF0ZWQuCisgICBTeW5jaHJvbml6YXRpb24gd2l0aCBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgaXMgZG9uZSB1c2luZyBfX2ttcF90cF9jYWNoZWRfbG9jay4KKworICAgQWZ0ZXIgYW55IGRlYWQgcm9vdCByZWNsYW1hdGlvbiwgaWYgdGhlIGNsaXBwaW5nIHZhbHVlIGFsbG93cyBhcnJheSBleHBhbnNpb24gdG8gcmVzdWx0IGluIHRoZSBnZW5lcmF0aW9uCisgICBvZiBhIHRvdGFsIG9mIG5XaXNoIGZyZWUgc2xvdHMsIHRoZSBmdW5jdGlvbiBkb2VzIHRoYXQgZXhwYW5zaW9uLiAgSWYgbm90LCBidXQgdGhlIGNsaXBwaW5nIHZhbHVlIGFsbG93cworICAgYXJyYXkgZXhwYW5zaW9uIHRvIHJlc3VsdCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhIHRvdGFsIG9mIG5OZWVkIGZyZWUgc2xvdHMsIHRoZSBmdW5jdGlvbiBkb2VzIHRoYXQgZXhwYW5zaW9uLgorICAgT3RoZXJ3aXNlLCBub3RoaW5nIGlzIGRvbmUgYmV5b25kIHRoZSBwb3NzaWJsZSBpbml0aWFsIHJvb3QgdGhyZWFkIHJlY2xhbWF0aW9uLiAgSG93ZXZlciwgaWYgbk5lZWQgaXMgemVybywKKyAgIGEgYmVzdC1lZmZvcnQgYXR0ZW1wdCBpcyBtYWRlIHRvIGZ1bGZpbCBuV2lzaCBhcyBmYXIgYXMgcG9zc2libGUsIGkuZS4gdGhlIGZ1bmN0aW9uIHdpbGwgYXR0ZW1wdCB0byBjcmVhdGUKKyAgIGFzIG1hbnkgZnJlZSBzbG90cyBhcyBwb3NzaWJsZSB1cCB0byBuV2lzaC4KKworICAgSWYgYW55IGFyZ3VtZW50IGlzIG5lZ2F0aXZlLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorKi8KK3N0YXRpYyBpbnQKK19fa21wX2V4cGFuZF90aHJlYWRzKGludCBuV2lzaCwgaW50IG5OZWVkKSB7CisgICAgaW50IGFkZGVkID0gMDsKKyAgICBpbnQgb2xkX3RwX2NhY2hlZDsKKyAgICBpbnQgX19rbXBfYWN0dWFsX21heF9udGg7CisKKyAgICBpZihuTmVlZCA+IG5XaXNoKSAvKiBub3JtYWxpemUgdGhlIGFyZ3VtZW50cyAqLworICAgICAgICBuV2lzaCA9IG5OZWVkOworI2lmIEtNUF9PU19XSU5ET1dTICYmICFkZWZpbmVkIEtNUF9EWU5BTUlDX0xJQgorLyogb25seSBmb3IgV2luZG93cyBzdGF0aWMgbGlicmFyeSAqLworICAgIC8qIHJlY2xhaW0gYXJyYXkgZW50cmllcyBmb3Igcm9vdCB0aHJlYWRzIHRoYXQgYXJlIGFscmVhZHkgZGVhZCAqLworICAgIGFkZGVkID0gX19rbXBfcmVjbGFpbV9kZWFkX3Jvb3RzKCk7CisKKyAgICBpZihuTmVlZCkgeworICAgICAgICBuTmVlZCAtPSBhZGRlZDsKKyAgICAgICAgaWYobk5lZWQgPCAwKQorICAgICAgICAgICAgbk5lZWQgPSAwOworICAgIH0KKyAgICBpZihuV2lzaCkgeworICAgICAgICBuV2lzaCAtPSBhZGRlZDsKKyAgICAgICAgaWYobldpc2ggPCAwKQorICAgICAgICAgICAgbldpc2ggPSAwOworICAgIH0KKyNlbmRpZgorICAgIGlmKG5XaXNoIDw9IDApCisgICAgICAgIHJldHVybiBhZGRlZDsKKworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgaW50IG5UYXJnZXQ7CisgICAgICAgIGludCBtaW5pbXVtUmVxdWlyZWRDYXBhY2l0eTsKKyAgICAgICAgaW50IG5ld0NhcGFjaXR5OworICAgICAgICBrbXBfaW5mb190ICoqbmV3VGhyZWFkczsKKyAgICAgICAga21wX3Jvb3RfdCAqKm5ld1Jvb3Q7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZSB0aGF0IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgaXMgbm90IGJvdW5kZWQgYnkgX19rbXBfbWF4X250aC4KKyAgICAgICAgLy8gSWYgX19rbXBfbWF4X250aCBpcyBzZXQgdG8gc29tZSB2YWx1ZSBsZXNzIHRoYW4gX19rbXBfc3lzX21heF9udGgKKyAgICAgICAgLy8gYnkgdGhlIHVzZXIgdmlhIE9NUF9USFJFQURfTElNSVQsIHRoZW4gX19rbXBfdGhyZWFkc19jYXBhY2l0eSBtYXkKKyAgICAgICAgLy8gYmVjb21lID4gX19rbXBfbWF4X250aCBpbiBvbmUgb2YgdHdvIHdheXM6CisgICAgICAgIC8vCisgICAgICAgIC8vIDEpIFRoZSBpbml0aWFsaXphdGlvbiB0aHJlYWQgKGd0aWQgPSAwKSBleGl0cy4gIF9fa21wX3RocmVhZHNbMF0KKyAgICAgICAgLy8gICAgbWF5IG5vdCBiZSByZXN1c2VkIGJ5IGFub3RoZXIgdGhyZWFkLCBzbyB3ZSBtYXkgbmVlZCB0byBpbmNyZWFzZQorICAgICAgICAvLyAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IHRvIF9fa21wX21heF90aHJlYWRzICsgMS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gMikgTmV3IGZvcmVpZ24gcm9vdChzKSBhcmUgZW5jb3VudGVyZWQuICBXZSBhbHdheXMgcmVnaXN0ZXIgbmV3CisgICAgICAgIC8vICAgIGZvcmVpZ24gcm9vdHMuICBUaGlzIG1heSBjYXVzZSBhIHNtYWxsZXIgIyBvZiB0aHJlYWRzIHRvIGJlCisgICAgICAgIC8vICAgIGFsbG9jYXRlZCBhdCBzdWJzZXF1ZW50IHBhcmFsbGVsIHJlZ2lvbnMsIGJ1dCB0aGUgd29ya2VyIHRocmVhZHMKKyAgICAgICAgLy8gICAgaGFuZyBhcm91bmQgKGFuZCBldmVudHVhbGx5IGdvIHRvIHNsZWVwKSBhbmQgbmVlZCBzbG90cyBpbiB0aGUKKyAgICAgICAgLy8gICAgX19rbXBfdGhyZWFkc1tdIGFycmF5LgorICAgICAgICAvLworICAgICAgICAvLyBBbnl3YXksIHRoYXQgaXMgdGhlIHJlYXNvbiBmb3IgbW92aW5nIHRoZSBjaGVjayB0byBzZWUgaWYKKyAgICAgICAgLy8gX19rbXBfbWF4X3RocmVhZHMgd2FzIGV4Y2VlZGVkIGludG8gX19rbXBfcmVzZWVydmVfdGhyZWFkcygpCisgICAgICAgIC8vIGluc3RlYWQgb2YgaGF2aW5nIGl0IHBlcmZvcm1lZCBoZXJlLiAtQkIKKyAgICAgICAgLy8KKyAgICAgICAgb2xkX3RwX2NhY2hlZCA9IF9fa21wX3RwX2NhY2hlZDsKKyAgICAgICAgX19rbXBfYWN0dWFsX21heF9udGggPSBvbGRfdHBfY2FjaGVkID8gX19rbXBfdHBfY2FwYWNpdHkgOiBfX2ttcF9zeXNfbWF4X250aDsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hY3R1YWxfbWF4X250aCA+PSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5KTsKKworICAgICAgICAvKiBjb21wdXRlIGV4cGFuc2lvbiBoZWFkcm9vbSB0byBjaGVjayBpZiB3ZSBjYW4gZXhwYW5kIGFuZCB3aGV0aGVyIHRvIGFpbSBmb3Igbldpc2ggb3Igbk5lZWQgKi8KKyAgICAgICAgblRhcmdldCA9IG5XaXNoOworICAgICAgICBpZihfX2ttcF9hY3R1YWxfbWF4X250aCAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPCBuVGFyZ2V0KSB7CisgICAgICAgICAgICAvKiBjYW4ndCBmdWxmaWwgbldpc2gsIHNvIHRyeSBuTmVlZCAqLworICAgICAgICAgICAgaWYobk5lZWQpIHsKKyAgICAgICAgICAgICAgICBuVGFyZ2V0ID0gbk5lZWQ7CisgICAgICAgICAgICAgICAgaWYoX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDwgblRhcmdldCkgeworICAgICAgICAgICAgICAgICAgICAvKiBwb3NzaWJsZSBleHBhbnNpb24gdG9vIHNtYWxsIC0tIGdpdmUgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBiZXN0LWVmZm9ydCAqLworICAgICAgICAgICAgICAgIG5UYXJnZXQgPSBfX2ttcF9hY3R1YWxfbWF4X250aCAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgICAgICAgICAgaWYoIW5UYXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2FuIGV4cGFuZCBhdCBhbGwgLS0gZ2l2ZSB1cCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWluaW11bVJlcXVpcmVkQ2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICsgblRhcmdldDsKKworICAgICAgICBuZXdDYXBhY2l0eSA9IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgIGRveworICAgICAgICAgICAgbmV3Q2FwYWNpdHkgPQorICAgICAgICAgICAgICAgIG5ld0NhcGFjaXR5IDw9IChfX2ttcF9hY3R1YWxfbWF4X250aCA+PiAxKSA/CisgICAgICAgICAgICAgICAgKG5ld0NhcGFjaXR5IDw8IDEpIDoKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3R1YWxfbWF4X250aDsKKyAgICAgICAgfSB3aGlsZShuZXdDYXBhY2l0eSA8IG1pbmltdW1SZXF1aXJlZENhcGFjaXR5KTsKKyAgICAgICAgbmV3VGhyZWFkcyA9IChrbXBfaW5mb190KiopIF9fa21wX2FsbG9jYXRlKChzaXplb2Yoa21wX2luZm9fdCopICsgc2l6ZW9mKGttcF9yb290X3QqKSkgKiBuZXdDYXBhY2l0eSArIENBQ0hFX0xJTkUpOworICAgICAgICBuZXdSb290ID0gKGttcF9yb290X3QqKikgKChjaGFyKiluZXdUaHJlYWRzICsgc2l6ZW9mKGttcF9pbmZvX3QqKSAqIG5ld0NhcGFjaXR5ICk7CisgICAgICAgIEtNUF9NRU1DUFkobmV3VGhyZWFkcywgX19rbXBfdGhyZWFkcywgX19rbXBfdGhyZWFkc19jYXBhY2l0eSAqIHNpemVvZihrbXBfaW5mb190KikpOworICAgICAgICBLTVBfTUVNQ1BZKG5ld1Jvb3QsIF9fa21wX3Jvb3QsIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKiBzaXplb2Yoa21wX3Jvb3RfdCopKTsKKyAgICAgICAgbWVtc2V0KG5ld1RocmVhZHMgKyBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LCAwLAorICAgICAgICAgICAgICAgKG5ld0NhcGFjaXR5IC0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSkgKiBzaXplb2Yoa21wX2luZm9fdCopKTsKKyAgICAgICAgbWVtc2V0KG5ld1Jvb3QgKyBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LCAwLAorICAgICAgICAgICAgICAgKG5ld0NhcGFjaXR5IC0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSkgKiBzaXplb2Yoa21wX3Jvb3RfdCopKTsKKworICAgICAgICBpZighb2xkX3RwX2NhY2hlZCAmJiBfX2ttcF90cF9jYWNoZWQgJiYgbmV3Q2FwYWNpdHkgPiBfX2ttcF90cF9jYXBhY2l0eSkgeworICAgICAgICAgICAgLyogX19rbXBfdHBfY2FjaGVkIGhhcyBjaGFuZ2VkLCBpLmUuIF9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCBoYXMgYWxsb2NhdGVkIGEgdGhyZWFkcHJpdmF0ZSBjYWNoZQorICAgICAgICAgICAgICAgd2hpbGUgd2Ugd2VyZSBhbGxvY2F0aW5nIHRoZSBleHBhbmRlZCBhcnJheSwgYW5kIG91ciBuZXcgY2FwYWNpdHkgaXMgbGFyZ2VyIHRoYW4gdGhlIHRocmVhZHByaXZhdGUKKyAgICAgICAgICAgICAgIGNhY2hlIGNhcGFjaXR5LCBzbyB3ZSBzaG91bGQgZGVhbGxvY2F0ZSB0aGUgZXhwYW5kZWQgYXJyYXlzIGFuZCB0cnkgYWdhaW4uICBUaGlzIGlzIHRoZSBmaXJzdCBjaGVjaworICAgICAgICAgICAgICAgb2YgYSBkb3VibGUtY2hlY2sgcGFpci4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBfX2ttcF9mcmVlKG5ld1RocmVhZHMpOworICAgICAgICAgICAgY29udGludWU7IC8qIHN0YXJ0IG92ZXIgYW5kIHRyeSBhZ2FpbiAqLworICAgICAgICB9CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgaWYoIW9sZF90cF9jYWNoZWQgJiYgX19rbXBfdHBfY2FjaGVkICYmIG5ld0NhcGFjaXR5ID4gX19rbXBfdHBfY2FwYWNpdHkpIHsKKyAgICAgICAgICAgIC8qIFNhbWUgY2hlY2sgYXMgYWJvdmUsIGJ1dCB0aGlzIHRpbWUgd2l0aCB0aGUgbG9jayBzbyB3ZSBjYW4gYmUgc3VyZSBpZiB3ZSBjYW4gc3VjY2VlZC4gKi8KKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUobmV3VGhyZWFkcyk7CisgICAgICAgICAgICBjb250aW51ZTsgLyogc3RhcnQgb3ZlciBhbmQgdHJ5IGFnYWluICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBzdWNjZXNzICovCisgICAgICAgICAgICAvLyBfX2ttcF9mcmVlKCBfX2ttcF90aHJlYWRzICk7IC8vIEFUVDogSXQgbGVhZHMgdG8gY3Jhc2guIE5lZWQgdG8gYmUgaW52ZXN0aWdhdGVkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICooa21wX2luZm9fdCoqdm9sYXRpbGUqKSZfX2ttcF90aHJlYWRzID0gbmV3VGhyZWFkczsKKyAgICAgICAgICAgICooa21wX3Jvb3RfdCoqdm9sYXRpbGUqKSZfX2ttcF9yb290ID0gbmV3Um9vdDsKKyAgICAgICAgICAgIGFkZGVkICs9IG5ld0NhcGFjaXR5IC0gX19rbXBfdGhyZWFkc19jYXBhY2l0eTsKKyAgICAgICAgICAgICoodm9sYXRpbGUgaW50KikmX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9IG5ld0NhcGFjaXR5OworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfdHBfY2FjaGVkX2xvY2spOworICAgICAgICAgICAgYnJlYWs7IC8qIHN1Y2NlZWRlZCwgc28gd2UgY2FuIGV4aXQgdGhlIGxvb3AgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWRkZWQ7Cit9CisKKy8qIHJlZ2lzdGVyIHRoZSBjdXJyZW50IHRocmVhZCBhcyBhIHJvb3QgdGhyZWFkIGFuZCBvYnRhaW4gb3VyIGd0aWQgKi8KKy8qIHdlIG11c3QgaGF2ZSB0aGUgX19rbXBfaW5pdHpfbG9jayBoZWxkIGF0IHRoaXMgcG9pbnQgKi8KKy8qIEFyZ3VtZW50IFRSVUUgb25seSBpZiBhcmUgdGhlIHRocmVhZCB0aGF0IGNhbGxzIGZyb20gX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKSAqLworaW50CitfX2ttcF9yZWdpc3Rlcl9yb290KCBpbnQgaW5pdGlhbF90aHJlYWQgKQoreworICAgIGttcF9pbmZvX3QgKnJvb3RfdGhyZWFkOworICAgIGttcF9yb290X3QgKnJvb3Q7CisgICAgaW50ICAgICAgICAgZ3RpZDsKKyAgICBpbnQgICAgICAgICBjYXBhY2l0eTsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBlbnRlcmVkXG4iKSk7CisgICAgS01QX01CKCk7CisKKworICAgIC8qCisgICAgICAgIDIwMDctMDMtMDI6CisKKyAgICAgICAgSWYgaW5pdGlhbCB0aHJlYWQgZGlkIG5vdCBpbnZva2UgT3Blbk1QIFJUTCB5ZXQsIGFuZCB0aGlzIHRocmVhZCBpcyBub3QgYW4gaW5pdGlhbCBvbmUsCisgICAgICAgICJfX2ttcF9hbGxfbnRoID49IF9fa21wX3RocmVhZHNfY2FwYWNpdHkiIGNvbmRpdGlvbiBkb2VzIG5vdCB3b3JrIGFzIGV4cGVjdGVkIC0tIGl0IG1heQorICAgICAgICByZXR1cm4gZmFsc2UgKHRoYXQgbWVhbnMgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgaW4gX19rbXBfdGhyZWFkcyBhcnJheSksIGJ1dCBpdAorICAgICAgICBpcyBwb3NzaWJsZSB0aGUgb25seSBmcmVlIHNsb3QgaXMgIzAsIHdoaWNoIGlzIHJlc2VydmVkIGZvciBpbml0aWFsIHRocmVhZCBhbmQgc28gY2Fubm90IGJlCisgICAgICAgIHVzZWQgZm9yIHRoaXMgb25lLiBGb2xsb3dpbmcgY29kZSB3b3JrYXJvdW5kcyB0aGlzIGJ1Zy4KKworICAgICAgICBIb3dldmVyLCByaWdodCBzb2x1dGlvbiBzZWVtcyB0byBiZSBub3QgcmVzZXJ2aW5nIHNsb3QgIzAgZm9yIGluaXRpYWwgdGhyZWFkIGJlY2F1c2U6CisgICAgICAgICAgICAoMSkgdGhlcmUgaXMgbm8gbWFnaWMgaW4gc2xvdCAjMCwKKyAgICAgICAgICAgICgyKSB3ZSBjYW5ub3QgZGV0ZWN0IGluaXRpYWwgdGhyZWFkIHJlbGlhYmx5ICh0aGUgZmlyc3QgdGhyZWFkIHdoaWNoIGRvZXMgc2VyaWFsCisgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gbWF5IGJlIG5vdCBhIHJlYWwgaW5pdGlhbCB0aHJlYWQpLgorICAgICovCisgICAgY2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgIGlmICggISBpbml0aWFsX3RocmVhZCAmJiBUQ1JfUFRSKF9fa21wX3RocmVhZHNbMF0pID09IE5VTEwgKSB7CisgICAgICAgIC0tIGNhcGFjaXR5OworICAgIH07IC8vIGlmCisKKyAgICAvKiBzZWUgaWYgdGhlcmUgYXJlIHRvbyBtYW55IHRocmVhZHMgKi8KKyAgICBpZiAoIF9fa21wX2FsbF9udGggPj0gY2FwYWNpdHkgJiYgIV9fa21wX2V4cGFuZF90aHJlYWRzKCAxLCAxICkgKSB7CisgICAgICAgIGlmICggX19rbXBfdHBfY2FjaGVkICkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50UmVnaXN0ZXJOZXdUaHJlYWQgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBTZXRfQUxMX1RIUkVBRFBSSVZBVEUsIF9fa21wX3RwX2NhcGFjaXR5ICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggUG9zc2libGVTeXN0ZW1MaW1pdE9uVGhyZWFkcyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50UmVnaXN0ZXJOZXdUaHJlYWQgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBTeXN0ZW1MaW1pdE9uVGhyZWFkcyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfTsgLy8gaWYKKworICAgIC8qIGZpbmQgYW4gYXZhaWxhYmxlIHRocmVhZCBzbG90ICovCisgICAgLyogRG9uJ3QgcmVhc3NpZ24gdGhlIHplcm8gc2xvdCBzaW5jZSB3ZSBuZWVkIHRoYXQgdG8gb25seSBiZSB1c2VkIGJ5IGluaXRpYWwKKyAgICAgICB0aHJlYWQgKi8KKyAgICBmb3IoIGd0aWQ9KGluaXRpYWxfdGhyZWFkID8gMCA6IDEpIDsgVENSX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdKSAhPSBOVUxMIDsgZ3RpZCsrICkKKyAgICAgICAgOworICAgIEtBX1RSQUNFKCAxLCAoIl9fa21wX3JlZ2lzdGVyX3Jvb3Q6IGZvdW5kIHNsb3QgaW4gdGhyZWFkcyBhcnJheTogVCMlZFxuIiwgZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworCisgICAgLyogdXBkYXRlIGdsb2JhbCBhY2NvdW50aW5nICovCisgICAgX19rbXBfYWxsX250aCArKzsKKyAgICBUQ1dfNChfX2ttcF9udGgsIF9fa21wX250aCArIDEpOworCisgICAgLy8KKyAgICAvLyBpZiBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlIGlzIHNldCwgdGhlbiB3ZSB1c2UgbWV0aG9kICMxIChzcCBzZWFyY2gpCisgICAgLy8gZm9yIGxvdyBudW1iZXJzIG9mIHByb2NzLCBhbmQgbWV0aG9kICMyIChrZXllZCBBUEkgY2FsbCkgZm9yIGhpZ2hlcgorICAgIC8vIG51bWJlcnMgb2YgcHJvY3MuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX2FkanVzdF9ndGlkX21vZGUgKSB7CisgICAgICAgIGlmICggX19rbXBfYWxsX250aCA+PSBfX2ttcF90bHNfZ3RpZF9taW4gKSB7CisgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgIT0gMikgeworICAgICAgICAgICAgICAgIFRDV180KF9fa21wX2d0aWRfbW9kZSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoVENSXzQoX19rbXBfZ3RpZF9tb2RlKSAhPSAxICkgeworICAgICAgICAgICAgICAgIFRDV180KF9fa21wX2d0aWRfbW9kZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgIC8qIEFkanVzdCBibG9ja3RpbWUgdG8gemVybyBpZiBuZWNlc3NhcnkgICAgICAgICAgICAqLworICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBub3QgaGF2ZSBvY2N1cnJlZCB5ZXQgKi8KKyAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9udGggPiBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgX19rbXBfemVyb19idCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIC8qIHNldHVwIHRoaXMgbmV3IGhpZXJhcmNoeSAqLworICAgIGlmKCAhICggcm9vdCA9IF9fa21wX3Jvb3RbZ3RpZF0gKSkgeworICAgICAgICByb290ID0gX19rbXBfcm9vdFtndGlkXSA9IChrbXBfcm9vdF90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfcm9vdF90KSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAhIHJvb3QtPnIucl9yb290X3RlYW0gKTsKKyAgICB9CisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIC8vIEluaXRpYWxpemUgc3RhdHMgYXMgc29vbiBhcyBwb3NzaWJsZSAocmlnaHQgYWZ0ZXIgZ3RpZCBhc3NpZ25tZW50KS4KKyAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyID0gX19rbXBfc3RhdHNfbGlzdC0+cHVzaF9iYWNrKGd0aWQpOworICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfd29ya2VyX3RocmVhZF9saWZlKTsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURShTRVJJQUxfUkVHSU9OKTsKKyAgICBLTVBfSU5JVF9QQVJUSVRJT05FRF9USU1FUlMoT01QX3NlcmlhbCk7CisjZW5kaWYKKyAgICBfX2ttcF9pbml0aWFsaXplX3Jvb3QoIHJvb3QgKTsKKworICAgIC8qIHNldHVwIG5ldyByb290IHRocmVhZCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiggcm9vdC0+ci5yX3ViZXJfdGhyZWFkICkgeworICAgICAgICByb290X3RocmVhZCA9IHJvb3QtPnIucl91YmVyX3RocmVhZDsKKyAgICB9IGVsc2UgeworICAgICAgICByb290X3RocmVhZCA9IChrbXBfaW5mb190KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfaW5mb190KSApOworICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRfdGhyZWFkX3N0b3JhZ2VfbWFwKCByb290X3RocmVhZCwgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9pbmZvIC5kcy5kc19ndGlkID0gZ3RpZDsKKyAgICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX3Jvb3QgPSAgcm9vdDsKKyAgICAgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9jb25zID0gX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggZ3RpZCApOworICAgICAgICB9CisgICAgICAgICNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgICAgIF9fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnkoIHJvb3RfdGhyZWFkICk7CisgICAgICAgICNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKworICAgICAgICAjaWYgS01QX1VTRV9CR0VUCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCByb290X3RocmVhZC0+dGgudGhfbG9jYWwuYmdldF9kYXRhID09IE5VTEwgKTsKKyAgICAgICAgICAgIF9fa21wX2luaXRpYWxpemVfYmdldCggcm9vdF90aHJlYWQgKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIF9fa21wX2luaXRfcmFuZG9tKCByb290X3RocmVhZCApOyAgLy8gSW5pdGlhbGl6ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgIH0KKworICAgIC8qIHNldHVwIHRoZSBzZXJpYWwgdGVhbSBoZWxkIGluIHJlc2VydmUgYnkgdGhlIHJvb3QgdGhyZWFkICovCisgICAgaWYoICEgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICkgeworICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IHJfaWN2cyA9IF9fa21wX2dldF9nbG9iYWxfaWN2cygpOworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3JlZ2lzdGVyX3Jvb3Q6IGJlZm9yZSBzZXJpYWxfdGVhbVxuIiApICk7CisKKyAgICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbSggcm9vdCwgMSwgMSwKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAwLCAvLyByb290IHBhcmFsbGVsIGlkCisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgIHByb2NfYmluZF9kZWZhdWx0LAorI2VuZGlmCisgICAgICAgICAgJnJfaWN2cywKKyAgICAgICAgICAwIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSApOworICAgIH0KKyAgICBLTVBfQVNTRVJUKCByb290X3RocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3JlZ2lzdGVyX3Jvb3Q6IGFmdGVyIHNlcmlhbF90ZWFtID0gJXBcbiIsCisgICAgICByb290X3RocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKSApOworCisgICAgLyogZHJvcCByb290X3RocmVhZCBpbnRvIHBsYWNlICovCisgICAgVENXX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0sIHJvb3RfdGhyZWFkKTsKKworICAgIHJvb3QtPnIucl9yb290X3RlYW0tPnQudF90aHJlYWRzWzBdID0gcm9vdF90aHJlYWQ7CisgICAgcm9vdC0+ci5yX2hvdF90ZWFtIC0+dC50X3RocmVhZHNbMF0gPSByb290X3RocmVhZDsKKyAgICByb290X3RocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzWzBdID0gcm9vdF90aHJlYWQ7CisgICAgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCA9IDA7IC8vIEFDOiB0aGUgdGVhbSBjcmVhdGVkIGluIHJlc2VydmUsIG5vdCBmb3IgZXhlY3V0aW9uIChpdCBpcyB1bnVzZWQgZm9yIG5vdykuCisgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkID0gcm9vdF90aHJlYWQ7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSB0aHJlYWQsIGdldCBpdCByZWFkeSB0byBnbyAqLworICAgIF9fa21wX2luaXRpYWxpemVfaW5mbyggcm9vdF90aHJlYWQsIHJvb3QtPnIucl9yb290X3RlYW0sIDAsIGd0aWQgKTsKKyAgICBUQ1dfNChfX2ttcF9pbml0X2d0aWQsIFRSVUUpOworCisgICAgLyogcHJlcGFyZSB0aGUgbWFzdGVyIHRocmVhZCBmb3IgZ2V0X2d0aWQoKSAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9uYW1lKCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgIF9fa21wX2d0aWQgPSBndGlkOworICAgICNlbmRpZgorICAgIF9fa21wX2NyZWF0ZV93b3JrZXIoIGd0aWQsIHJvb3RfdGhyZWFkLCBfX2ttcF9zdGtzaXplICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSA9PSBndGlkICk7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVnaXN0ZXJfcm9vdDogVCMlZCBpbml0IFQjJWQoJWQ6JWQpIGFycml2ZWQ6IGpvaW49JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKCAwLCByb290LT5yLnJfaG90X3RlYW0gKSwKKyAgICAgICAgICAgICAgICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfaWQsIDAsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSApOworICAgIHsgLy8gSW5pdGlhbGl6ZSBiYXJyaWVyIGRhdGEuCisgICAgICAgIGludCBiOworICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9iYXJbIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gS01QX0lOSVRfQkFSUklFUl9TVEFURTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9iYXJbIGIgXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gMDsKKyNlbmRpZgorICAgICAgICB9OyAvLyBmb3IKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYl9hcnJpdmVkID09IEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKTsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICByb290X3RocmVhZC0+dGgudGhfY3VycmVudF9wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgcm9vdF90aHJlYWQtPnRoLnRoX25ld19wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgcm9vdF90aHJlYWQtPnRoLnRoX2ZpcnN0X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgICByb290X3RocmVhZC0+dGgudGhfbGFzdF9wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisjIGVuZGlmCisKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayggZ3RpZCwgVFJVRSApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBfX2ttcF9yb290X2NvdW50ZXIgKys7CisKKyAgICBLTVBfTUIoKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworc3RhdGljIGludAorX19rbXBfZnJlZV9ob3RfdGVhbXMoIGttcF9yb290X3QgKnJvb3QsIGttcF9pbmZvX3QgKnRociwgaW50IGxldmVsLCBjb25zdCBpbnQgbWF4X2xldmVsICkKK3sKKyAgICBpbnQgaSwgbiwgbnRoOworICAgIGttcF9ob3RfdGVhbV9wdHJfdCAqaG90X3RlYW1zID0gdGhyLT50aC50aF9ob3RfdGVhbXM7CisgICAgaWYoICFob3RfdGVhbXMgfHwgIWhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsZXZlbCA8IG1heF9sZXZlbCApOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtOworICAgIG50aCA9IGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoOworICAgIG4gPSBudGggLSAxOyAgICAgICAgICAgICAgICAgICAvLyBtYXN0ZXIgaXMgbm90IGZyZWVkCisgICAgaWYoIGxldmVsIDwgbWF4X2xldmVsIC0gMSApIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG50aDsgKytpICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tpXTsKKyAgICAgICAgICAgIG4gKz0gX19rbXBfZnJlZV9ob3RfdGVhbXMoIHJvb3QsIHRoLCBsZXZlbCArIDEsIG1heF9sZXZlbCApOworICAgICAgICAgICAgaWYoIGkgPiAwICYmIHRoLT50aC50aF9ob3RfdGVhbXMgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSggdGgtPnRoLnRoX2hvdF90ZWFtcyApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9ob3RfdGVhbXMgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgdGVhbSwgTlVMTCApOworICAgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qIFJlc2V0cyBhIHJvb3QgdGhyZWFkIGFuZCBjbGVhciBpdHMgcm9vdCBhbmQgaG90IHRlYW1zLgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIF9fa21wX3RocmVhZHMgZW50cmllcyBkaXJlY3RseSBhbmQgaW5kaXJlY3RseSBmcmVlZC4KKyovCitzdGF0aWMgaW50CitfX2ttcF9yZXNldF9yb290KGludCBndGlkLCBrbXBfcm9vdF90ICpyb290KQoreworICAgIGttcF90ZWFtX3QgKiByb290X3RlYW0gPSByb290LT5yLnJfcm9vdF90ZWFtOworICAgIGttcF90ZWFtX3QgKiBob3RfdGVhbSAgPSByb290LT5yLnJfaG90X3RlYW07CisgICAgaW50ICAgICAgICAgIG4gICAgICAgICA9IGhvdF90ZWFtLT50LnRfbnByb2M7CisgICAgaW50IGk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhIHJvb3QtPnIucl9hY3RpdmUgKTsKKworICAgIHJvb3QtPnIucl9yb290X3RlYW0gPSBOVUxMOworICAgIHJvb3QtPnIucl9ob3RfdGVhbSAgPSBOVUxMOworICAgICAgICAvLyBfX2ttcF9mcmVlX3RlYW0oKSBkb2VzIG5vdCBmcmVlIGhvdCB0ZWFtcywgc28gd2UgaGF2ZSB0byBjbGVhciByX2hvdF90ZWFtIGJlZm9yZSBjYWxsCisgICAgICAgIC8vIHRvIF9fa21wX2ZyZWVfdGVhbSgpLgorICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgcm9vdF90ZWFtIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSApOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgaWYoIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgPiAwICkgeyAgLy8gbmVlZCB0byBmcmVlIG5lc3RlZCBob3QgdGVhbXMgYW5kIHRoZWlyIHRocmVhZHMgaWYgYW55CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBob3RfdGVhbS0+dC50X25wcm9jOyArK2kgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IGhvdF90ZWFtLT50LnRfdGhyZWFkc1tpXTsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsID4gMSApIHsKKyAgICAgICAgICAgICAgICBuICs9IF9fa21wX2ZyZWVfaG90X3RlYW1zKCByb290LCB0aCwgMSwgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHRoLT50aC50aF9ob3RfdGVhbXMgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSggdGgtPnRoLnRoX2hvdF90ZWFtcyApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9ob3RfdGVhbXMgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCBob3RfdGVhbSBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKworICAgIC8vCisgICAgLy8gQmVmb3JlIHdlIGNhbiByZWFwIHRoZSB0aHJlYWQsIHdlIG5lZWQgdG8gbWFrZSBjZXJ0YWluIHRoYXQgYWxsCisgICAgLy8gb3RoZXIgdGhyZWFkcyBpbiB0aGUgdGVhbXMgdGhhdCBoYWQgdGhpcyByb290IGFzIGFuY2VzdG9yIGhhdmUgc3RvcHBlZCB0cnlpbmcgdG8gc3RlYWwgdGFza3MuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICBfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbXMoKTsKKyAgICB9CisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLyogQ2xvc2UgSGFuZGxlIG9mIHJvb3QgZHVwbGljYXRlZCBpbiBfX2ttcF9jcmVhdGVfd29ya2VyICh0ciAjNjI5MTkpICovCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZXNldF9yb290OiBmcmVlIGhhbmRsZSwgdGggPSAlcCwgaGFuZGxlID0gJSIgS01QX1VJTlRQVFJfU1BFQyAiXG4iLAorICAgICAgICAgICAgKExQVk9JRCkmKHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgpLAorICAgICAgICAgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisgICAgICAgIF9fa21wX2ZyZWVfaGFuZGxlKCByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICk7CisgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfZW5kKSkgeworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgICAgIF9fb21wdF90aHJlYWRfZW5kKG9tcHRfdGhyZWFkX2luaXRpYWwsIGd0aWQpOworICAgIH0KKyNlbmRpZgorCisgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggLSAxKTsgLy8gX19rbXBfcmVhcF90aHJlYWQgd2lsbCBkZWNyZW1lbnQgX19rbXBfYWxsX250aC4KKyAgICBfX2ttcF9yZWFwX3RocmVhZCggcm9vdC0+ci5yX3ViZXJfdGhyZWFkLCAxICk7CisKKyAgICAgICAgLy8gV2UgY2Fub3QgcHV0IHJvb3QgdGhyZWFkIHRvIF9fa21wX3RocmVhZF9wb29sLCBzbyB3ZSBoYXZlIHRvIHJlYXAgaXQgaXN0ZWFkIG9mIGZyZWVpbmcuCisgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkID0gTlVMTDsKKyAgICAvKiBtYXJrIHJvb3QgYXMgbm8gbG9uZ2VyIGluIHVzZSAqLworICAgIHJvb3QtPnIucl9iZWdpbiA9IEZBTFNFOworCisgICAgcmV0dXJuIG47Cit9CisKK3ZvaWQKK19fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZCggaW50IGd0aWQgKQoreworICAgIEtBX1RSQUNFKCAxLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZDogZW50ZXIgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAvKiB0aGlzIGxvY2sgc2hvdWxkIGJlIG9rLCBzaW5jZSB1bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQgaXMgbmV2ZXIgY2FsbGVkIGR1cmluZworICAgICAqIGFuZCBhYm9ydCwgb25seSBkdXJpbmcgYSBub3JtYWwgY2xvc2UuICBmdXJ0aGVybW9yZSwgaWYgeW91IGhhdmUgdGhlCisgICAgICogZm9ya2pvaW4gbG9jaywgeW91IHNob3VsZCBuZXZlciB0cnkgdG8gZ2V0IHRoZSBpbml0eiBsb2NrICovCisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZDogYWxyZWFkeSBmaW5pc2hlZCwgZXhpdGluZyBUIyVkXG4iLCBndGlkICkpOworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGttcF9yb290X3QgKnJvb3QgPSBfX2ttcF9yb290W2d0aWRdOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkcyAmJiBfX2ttcF90aHJlYWRzW2d0aWRdICk7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCByb290ID09IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Jvb3QgKTsKKyAgICBLTVBfQVNTRVJUKCByb290LT5yLnJfYWN0aXZlID09IEZBTFNFICk7CisKKworICAgIEtNUF9NQigpOworCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgIGttcF9pbmZvX3QgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAga21wX3RlYW1fdCAqIHRlYW0gPSB0aHJlYWQtPnRoLnRoX3RlYW07CisgICBrbXBfdGFza190ZWFtX3QgKiAgIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworCisgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBwcm94eSB0YXNrcyBiZWZvcmUgZmluaXNoaW5nIHRoZSB0aHJlYWQKKyAgIGlmICggdGFza190ZWFtICE9IE5VTEwgJiYgdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyApIHsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgLy8gdGhlIHJ1bnRpbWUgaXMgc2h1dHRpbmcgZG93biBzbyB3ZSB3b24ndCByZXBvcnQgYW55IGV2ZW50cworICAgICAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3VuZGVmaW5lZDsKKyNlbmRpZgorICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aHJlYWQsIHRlYW0gVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkpOworICAgfQorI2VuZGlmCisKKyAgICBfX2ttcF9yZXNldF9yb290KGd0aWQsIHJvb3QpOworCisgICAgLyogZnJlZSB1cCB0aGlzIHRocmVhZCBzbG90ICovCisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIEtNUF9HVElEX0RORSApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgX19rbXBfZ3RpZCA9IEtNUF9HVElEX0RORTsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZDogVCMlZCB1bnJlZ2lzdGVyZWRcbiIsIGd0aWQgKSk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworfQorCisjaWYgS01QX09TX1dJTkRPV1MKKy8qIF9fa21wX2Zvcmtqb2luX2xvY2sgbXVzdCBiZSBhbHJlYWR5IGhlbGQKKyAgIFVucmVnaXN0ZXJzIGEgcm9vdCB0aHJlYWQgdGhhdCBpcyBub3QgdGhlIGN1cnJlbnQgdGhyZWFkLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICBfX2ttcF90aHJlYWRzIGVudHJpZXMgZnJlZWQgYXMgYSByZXN1bHQuCisgKi8KK3N0YXRpYyBpbnQKK19fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBrbXBfcm9vdF90ICpyb290ID0gX19rbXBfcm9vdFtndGlkXTsKKyAgICBpbnQgcjsKKworICAgIEtBX1RSQUNFKCAxLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQ6IGVudGVyIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkcyAmJiBfX2ttcF90aHJlYWRzW2d0aWRdICk7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApKTsKKyAgICBLTVBfQVNTRVJUKCByb290ID09IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Jvb3QgKTsKKyAgICBLTVBfQVNTRVJUKCByb290LT5yLnJfYWN0aXZlID09IEZBTFNFICk7CisKKyAgICByID0gX19rbXBfcmVzZXRfcm9vdChndGlkLCByb290KTsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X290aGVyX3RocmVhZDogVCMlZCB1bnJlZ2lzdGVyZWRcbiIsIGd0aWQgKSk7CisgICAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworI2lmIEtNUF9ERUJVRwordm9pZCBfX2ttcF90YXNrX2luZm8oKSB7CisKKyAgICBrbXBfaW50MzIgZ3RpZCAgICAgICA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBrbXBfaW50MzIgdGlkICAgICAgICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICpzdGVhbSAgICA9IHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtICAgICA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworCisgICAgX19rbXBfcHJpbnRmKCAiX19rbXBfdGFza19pbmZvOiBndGlkPSVkIHRpZD0lZCB0X3RocmVhZD0lcCB0ZWFtPSVwIGN1cnRhc2s9JXAgcHRhc2s9JXBcbiIsCisgICAgICAgIGd0aWQsIHRpZCwgdGhpc190aHIsIHRlYW0sIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfcGFyZW50ICk7Cit9CisjZW5kaWYgLy8gS01QX0RFQlVHCisKKy8qIFRPRE8gb3B0aW1pemUgd2l0aCBvbmUgYmlnIG1lbWNsciwgdGFrZSBvdXQgd2hhdCBpc24ndCBuZWVkZWQsCisgKiBzcGxpdCByZXNwb25zaWJpbGl0eSB0byB3b3JrZXJzIGFzIG11Y2ggYXMgcG9zc2libGUsIGFuZCBkZWxheQorICogaW5pdGlhbGl6YXRpb24gb2YgZmVhdHVyZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSAgKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0aWFsaXplX2luZm8oIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkLCBpbnQgZ3RpZCApCit7CisgICAgLyogdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCBpcyBzZXR1cCBpbiBrbXBfYWxsb2NhdGVfdGhyZWFkL2NyZWF0ZV93b3JrZXIKKyAgICAgKiB0aGlzX3Roci0+dGgudGhfc2VyaWFsX3RlYW0gaXMgc2V0dXAgaW4gX19rbXBfYWxsb2NhdGVfdGhyZWFkICovCisgICAga21wX2luZm9fdCAqbWFzdGVyID0gdGVhbS0+dC50X3RocmVhZHNbMF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkcyAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfZGlzcGF0Y2ggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXItPnRoLnRoX3Jvb3QgKTsKKworICAgIEtNUF9NQigpOworCisgICAgVENXX1NZTkNfUFRSKHRoaXNfdGhyLT50aC50aF90ZWFtLCB0ZWFtKTsKKworICAgIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCAgPSB0aWQ7CisgICAgdGhpc190aHItPnRoLnRoX3NldF9ucHJvYyAgICAgICA9IDA7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0aGlzX3Roci0+dGgudGhfc2V0X3Byb2NfYmluZCAgID0gcHJvY19iaW5kX2RlZmF1bHQ7CisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICB0aGlzX3Roci0+dGgudGhfbmV3X3BsYWNlICAgICAgID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfcGxhY2U7CisjIGVuZGlmCisjZW5kaWYKKyAgICB0aGlzX3Roci0+dGgudGhfcm9vdCAgICAgICAgICAgID0gbWFzdGVyLT50aC50aF9yb290OworCisgICAgLyogc2V0dXAgdGhlIHRocmVhZCdzIGNhY2hlIG9mIHRoZSB0ZWFtIHN0cnVjdHVyZSAqLworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jICAgICAgPSB0ZWFtLT50LnRfbnByb2M7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyICAgICA9IG1hc3RlcjsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfc2xlZXBfbG9jLCBOVUxMKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhICk7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfaW5mbzE6IFQjJWQ6JWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCBndGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayApICk7CisKKyAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIHRoaXNfdGhyLT50aC50aF90ZWFtX21hc3Rlci0+dGgudGhfaWRlbnQsIHRoaXNfdGhyLCB0ZWFtLCB0aWQsIFRSVUUgKTsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9pbmZvMjogVCMlZDolZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWQsIGd0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICkgKTsKKyAgICAvLyBUT0RPOiBJbml0aWFsaXplIElDVnMgZnJvbSBwYXJlbnQ7IEdFSCAtIGlzbid0IHRoYXQgYWxyZWFkeSBkb25lIGluIF9fa21wX2luaXRpYWxpemVfdGVhbSgpPworCisgICAgLyogVE9ETyBubyB3b3Jrc2hhcmluZyBpbiBzcGVjdWxhdGl2ZSB0aHJlYWRzICovCisgICAgdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoICAgICAgPSAmdGVhbS0+dC50X2Rpc3BhdGNoWyB0aWQgXTsKKworICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCA9IDA7CisKKyNpZmRlZiBCVUlMRF9UVgorICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50dl9kYXRhID0gMDsKKyNlbmRpZgorCisgICAgaWYgKCAhIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uICkgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbiA9IChzdHJ1Y3QgY29tbW9uX3RhYmxlICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoc3RydWN0IGNvbW1vbl90YWJsZSkgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoCisgICAgICAgICAgICAgICAgZ3RpZCwgdGhpc190aHItPnRoLnRoX3ByaV9jb21tb24sIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uICsgMSwKKyAgICAgICAgICAgICAgICBzaXplb2YoIHN0cnVjdCBjb21tb25fdGFibGUgKSwgInRoXyVkLnRoX3ByaV9jb21tb25cbiIsIGd0aWQKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHRoaXNfdGhyLT50aC50aF9wcmlfaGVhZCA9IE5VTEw7CisgICAgfTsgLy8gaWYKKworICAgIC8qIEluaXRpYWxpemUgZHluYW1pYyBkaXNwYXRjaCAqLworICAgIHsKKyAgICAgICAgdm9sYXRpbGUga21wX2Rpc3BfdCAqZGlzcGF0Y2ggPSB0aGlzX3Roci0+dGgudGhfZGlzcGF0Y2g7CisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSB0ZWFtIG1heF9ucHJvYyBzaW5jZSB0aGlzIHdpbGwgbmV2ZXIgY2hhbmdlIGZvciB0aGUgdGVhbS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBkaXNwX3NpemUgPSBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICkgKgorICAgICAgICAgICAgKCB0ZWFtLT50LnRfbWF4X25wcm9jID09IDEgPyAxIDogX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMgKTsKKyAgICAgICAgS0RfVFJBQ0UoIDEwLCAoIl9fa21wX2luaXRpYWxpemVfaW5mbzogVCMlZCBtYXhfbnByb2M6ICVkXG4iLCBndGlkLCB0ZWFtLT50LnRfbWF4X25wcm9jICkgKTsKKyAgICAgICAgS01QX0FTU0VSVCggZGlzcGF0Y2ggKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2Rpc3BhdGNoICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGRpc3BhdGNoID09ICZ0ZWFtLT50LnRfZGlzcGF0Y2hbIHRpZCBdICk7CisKKyAgICAgICAgZGlzcGF0Y2gtPnRoX2Rpc3BfaW5kZXggPSAwOworI2lmIE9NUF80NV9FTkFCTEVECisgICAgICAgIGRpc3BhdGNoLT50aF9kb2Fjcm9zc19idWZfaWR4ID0gMDsKKyNlbmRpZgorICAgICAgICBpZiggISBkaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgKSAgeworICAgICAgICAgICAgZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyID0gKGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICopIF9fa21wX2FsbG9jYXRlKCBkaXNwX3NpemUgKTsKKworICAgICAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyWyAwIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaC0+dGhfZGlzcF9idWZmZXJbIHRlYW0tPnQudF9tYXhfbnByb2MgPT0gMSA/IDEgOiBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVycyBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwX3NpemUsICJ0aF8lZC50aF9kaXNwYXRjaC50aF9kaXNwX2J1ZmZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIodGVhbV8lZC50X2Rpc3BhdGNoWyVkXS50aF9kaXNwX2J1ZmZlcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldCggJiBkaXNwYXRjaC0+dGhfZGlzcF9idWZmZXJbMF0sICdcMCcsIGRpc3Bfc2l6ZSApOworICAgICAgICB9CisKKyAgICAgICAgZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSAwOworICAgICAgICBkaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCA9IDA7CisKKyAgICAgICAgZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSAwOyAgICAgICAgICAgICAvKiBPUkRFUkVEICAgICAqLworICAgICAgICBkaXNwYXRjaC0+dGhfZHhvX2ZjbiA9IDA7ICAgICAgICAgICAgIC8qIEVORCBPUkRFUkVEICovCisgICAgfQorCisgICAgdGhpc190aHItPnRoLnRoX25leHRfcG9vbCA9IE5VTEw7CisKKyAgICBpZiAoIXRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2spIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2sgPSAoa21wX3VpbnQ4ICopIF9fa21wX2FsbG9jYXRlKCA0KnNpemVvZihrbXBfdWludDgpICk7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX3RvcCA9IDA7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6ID0gNDsKKyAgICAgICAgZm9yIChpPTA7IGk8dGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7ICsraSkgLy8gemVybyBpbml0IHRoZSBzdGFjaworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1tpXSA9IDA7CisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggIXRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDAgKTsKKworICAgIEtNUF9NQigpOworfQorCisKKy8qIGFsbG9jYXRlIGEgbmV3IHRocmVhZCBmb3IgdGhlIHJlcXVlc3RpbmcgdGVhbS4gIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSB3aXRoaW4gYQorICogZm9ya2pvaW4gY3JpdGljYWwgc2VjdGlvbi4gIHdlIHdpbGwgZmlyc3QgdHJ5IHRvIGdldCBhbiBhdmFpbGFibGUgdGhyZWFkIGZyb20gdGhlCisgKiB0aHJlYWQgcG9vbC4gIGlmIG5vbmUgaXMgYXZhaWxhYmxlLCB3ZSB3aWxsIGZvcmsgYSBuZXcgb25lIGFzc3VtaW5nIHdlIGFyZSBhYmxlCisgKiB0byBjcmVhdGUgYSBuZXcgb25lLiAgdGhpcyBzaG91bGQgYmUgYXNzdXJlZCwgYXMgdGhlIGNhbGxlciBzaG91bGQgY2hlY2sgb24gdGhpcworICogZmlyc3QuCisgKi8KK2ttcF9pbmZvX3QgKgorX19rbXBfYWxsb2NhdGVfdGhyZWFkKCBrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbmV3X3RpZCApCit7CisgICAga21wX3RlYW1fdCAgKnNlcmlhbF90ZWFtOworICAgIGttcF9pbmZvX3QgICpuZXdfdGhyOworICAgIGludCAgICAgICAgICBuZXdfZ3RpZDsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWRcbiIsIF9fa21wX2dldF9ndGlkKCkgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdCAmJiB0ZWFtICk7CisjaWYgIUtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgS01QX0RFQlVHX0FTU0VSVCggS01QX01BU1RFUl9HVElEKCBfX2ttcF9nZXRfZ3RpZCgpICkpOworI2VuZGlmCisgICAgS01QX01CKCk7CisKKyAgICAvKiBmaXJzdCwgdHJ5IHRvIGdldCBvbmUgZnJvbSB0aGUgdGhyZWFkIHBvb2wgKi8KKyAgICBpZiAoIF9fa21wX3RocmVhZF9wb29sICkgeworCisgICAgICAgIG5ld190aHIgPSAoa21wX2luZm9fdCopX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgICAgIF9fa21wX3RocmVhZF9wb29sID0gKHZvbGF0aWxlIGttcF9pbmZvX3QgKikgbmV3X3Roci0+dGgudGhfbmV4dF9wb29sOworICAgICAgICBpZiAoIG5ld190aHIgPT0gX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ICkgeworICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBUQ1dfNChuZXdfdGhyLT50aC50aF9pbl9wb29sLCBGQUxTRSk7CisgICAgICAgIC8vCisgICAgICAgIC8vIERvbid0IHRvdWNoIHRoX2FjdGl2ZV9pbl9wb29sIG9yIHRoX2FjdGl2ZS4KKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgYWRqdXN0cyB0aG9zZSBmbGFncyBhcyBpdCBzbGVlcHMvYXdha2Vucy4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoLS07CisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZCB1c2luZyB0aHJlYWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgbmV3X3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkICkpOworICAgICAgICBLTVBfQVNTRVJUKCAgICAgICAhIG5ld190aHItPnRoLnRoX3RlYW0gKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfbnRoIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbF9udGggPj0gMCApOworCisgICAgICAgIC8qIHNldHVwIHRoZSB0aHJlYWQgc3RydWN0dXJlICovCisgICAgICAgIF9fa21wX2luaXRpYWxpemVfaW5mbyggbmV3X3RociwgdGVhbSwgbmV3X3RpZCwgbmV3X3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld190aHItPnRoLnRoX3NlcmlhbF90ZWFtICk7CisKKyAgICAgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggKyAxKTsKKworICAgICAgICBuZXdfdGhyLT50aC50aF90YXNrX3N0YXRlID0gMDsKKyAgICAgICAgbmV3X3Roci0+dGgudGhfdGFza19zdGF0ZV90b3AgPSAwOworICAgICAgICBuZXdfdGhyLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6ID0gNDsKKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgICAgIC8qIEFkanVzdCBibG9ja3RpbWUgYmFjayB0byB6ZXJvIGlmIG5lY2Vzc2FyICAgICAgeSAqLworICAgICAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgICAgICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICAgICAgaWYgKCBfX2ttcF9udGggPiBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworI2lmIEtNUF9ERUJVRworICAgICAgICAvLyBJZiB0aHJlYWQgZW50ZXJlZCBwb29sIHZpYSBfX2ttcF9mcmVlX3RocmVhZCwgd2FpdF9mbGFnIHNob3VsZCAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRy4KKyAgICAgICAgaW50IGI7CisgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IG5ld190aHItPnRoLnRoX2JhcjsKKyAgICAgICAgZm9yKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJhbGlnbltiXS5iYi53YWl0X2ZsYWcgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpOworI2VuZGlmCisKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZCB1c2luZyB0aHJlYWQgJXAgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgbmV3X3RociwgbmV3X3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkICkpOworCisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR1cm4gbmV3X3RocjsKKyAgICB9CisKKworICAgIC8qIG5vLCB3ZWxsIGZvcmsgYSBuZXcgb25lICovCisgICAgS01QX0FTU0VSVCggX19rbXBfbnRoICAgID09IF9fa21wX2FsbF9udGggKTsKKyAgICBLTVBfQVNTRVJUKCBfX2ttcF9hbGxfbnRoIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworCisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB3b3JrZXIgdGhyZWFkIHRoZSBSVEwgaXMgY3JlYXRpbmcsIHRoZW4gYWxzbworICAgIC8vIGxhdW5jaCB0aGUgbW9uaXRvciB0aHJlYWQuICBXZSB0cnkgdG8gZG8gdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZS4KKyAgICAvLworICAgIGlmICggISBUQ1JfNCggX19rbXBfaW5pdF9tb25pdG9yICkgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIGlmICggISBUQ1JfNCggX19rbXBfaW5pdF9tb25pdG9yICkgKSB7CisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICggImJlZm9yZSBfX2ttcF9jcmVhdGVfbW9uaXRvclxuIiApICk7CisgICAgICAgICAgICBUQ1dfNCggX19rbXBfaW5pdF9tb25pdG9yLCAxICk7CisgICAgICAgICAgICBfX2ttcF9jcmVhdGVfbW9uaXRvciggJiBfX2ttcF9tb25pdG9yICk7CisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICggImFmdGVyIF9fa21wX2NyZWF0ZV9tb25pdG9yXG4iICkgKTsKKyAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgIC8vIEFDOiB3YWl0IHVudGlsIG1vbml0b3IgaGFzIHN0YXJ0ZWQuIFRoaXMgaXMgYSBmaXggZm9yIENRMjMyODA4LgorICAgICAgICAgICAgICAgIC8vICAgICBUaGUgcmVhc29uIGlzIHRoYXQgaWYgdGhlIGxpYnJhcnkgaXMgbG9hZGVkL3VubG9hZGVkIGluIGEgbG9vcCB3aXRoIHNtYWxsIChwYXJhbGxlbCkKKyAgICAgICAgICAgICAgICAvLyAgICAgd29yayBpbiBiZXR3ZWVuLCB0aGVuIHRoZXJlIGlzIGhpZ2ggcHJvYmFiaWxpdHkgdGhhdCBtb25pdG9yIHRocmVhZCBzdGFydGVkIGFmdGVyCisgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBsaWJyYXJ5IHNodXRkb3duLiBBdCBzaHV0ZG93biBpdCBpcyB0b28gbGF0ZSB0byBjb3BlIHdpdGggdGhlIHByb2JsZW0sIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyAgICAgd2hlbiB0aGUgbWFzdGVyIGlzIGluIERsbE1haW4gKHByb2Nlc3MgZGV0YWNoKSB0aGUgbW9uaXRvciBoYXMgbm8gY2hhbmNlcyB0byBzdGFydAorICAgICAgICAgICAgICAgIC8vICAgICAoaXQgaXMgYmxvY2tlZCksIGFuZCBtYXN0ZXIgaGFzIG5vIG1lYW5zIHRvIGluZm9ybSB0aGUgbW9uaXRvciB0aGF0IHRoZSBsaWJyYXJ5IGhhcyBnb25lLAorICAgICAgICAgICAgICAgIC8vICAgICBiZWNhdXNlIGFsbCB0aGUgbWVtb3J5IHdoaWNoIHRoZSBtb25pdG9yIGNhbiBhY2Nlc3MgaXMgZ29pbmcgdG8gYmUgcmVsZWFzZWQvcmVzZXQuCisgICAgICAgICAgICAgICAgd2hpbGUgKCBUQ1JfNChfX2ttcF9pbml0X21vbml0b3IpIDwgMiApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiYWZ0ZXIgbW9uaXRvciB0aHJlYWQgaGFzIHN0YXJ0ZWRcbiIgKSApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICB9CisjZW5kaWYKKworICAgIEtNUF9NQigpOworICAgIGZvciggbmV3X2d0aWQ9MSA7IFRDUl9QVFIoX19rbXBfdGhyZWFkc1tuZXdfZ3RpZF0pICE9IE5VTEw7ICsrbmV3X2d0aWQgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBpdC4gKi8KKyAgICBuZXdfdGhyID0gKGttcF9pbmZvX3QqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF9pbmZvX3QpICk7CisKKyAgICBUQ1dfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tuZXdfZ3RpZF0sIG5ld190aHIpOworCisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdGhyZWFkX3N0b3JhZ2VfbWFwKCBuZXdfdGhyLCBuZXdfZ3RpZCApOworICAgIH0KKworICAgIC8qIGFkZCB0aGUgcmVzZXJ2ZSBzZXJpYWxpemVkIHRlYW0sIGluaXRpYWxpemVkIGZyb20gdGhlIHRlYW0ncyBtYXN0ZXIgdGhyZWFkICovCisgICAgeworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3Qgcl9pY3ZzID0gX19rbXBfZ2V0X3hfZ2xvYmFsX2ljdnMoIHRlYW0gKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2FsbG9jYXRlX3RocmVhZDogYmVmb3JlIHRoX3NlcmlhbC9zZXJpYWxfdGVhbVxuIiApICk7CisKKyAgICBuZXdfdGhyLT50aC50aF9zZXJpYWxfdGVhbSA9IHNlcmlhbF90ZWFtID0KKyAgICAgICAgKGttcF90ZWFtX3QqKSBfX2ttcF9hbGxvY2F0ZV90ZWFtKCByb290LCAxLCAxLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHJvb3QgcGFyYWxsZWwgaWQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kX2RlZmF1bHQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcl9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICk7CisgICAgfQorICAgIEtNUF9BU1NFUlQgKCBzZXJpYWxfdGVhbSApOworICAgIHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCA9IDA7ICAgLy8gQUM6IHRoZSB0ZWFtIGNyZWF0ZWQgaW4gcmVzZXJ2ZSwgbm90IGZvciBleGVjdXRpb24gKGl0IGlzIHVudXNlZCBmb3Igbm93KS4KKyAgICBzZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPSBuZXdfdGhyOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBhZnRlciB0aF9zZXJpYWwvc2VyaWFsX3RlYW0gOiBuZXdfdGhyPSVwXG4iLAorICAgICAgbmV3X3RociApICk7CisKKyAgICAvKiBzZXR1cCB0aGUgdGhyZWFkIHN0cnVjdHVyZXMgKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIG5ld190aHIsIHRlYW0sIG5ld190aWQsIG5ld19ndGlkICk7CisKKyAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnkoIG5ld190aHIgKTsKKyAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICAjaWYgS01QX1VTRV9CR0VUCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld190aHItPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9PSBOVUxMICk7CisgICAgICAgIF9fa21wX2luaXRpYWxpemVfYmdldCggbmV3X3RociApOworICAgICNlbmRpZgorCisgICAgX19rbXBfaW5pdF9yYW5kb20oIG5ld190aHIgKTsgIC8vIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKworICAgIC8qIEluaXRpYWxpemUgdGhlc2Ugb25seSBvbmNlIHdoZW4gdGhyZWFkIGlzIGdyYWJiZWQgZm9yIGEgdGVhbSBhbGxvY2F0aW9uICovCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZCBpbml0IGdvIGZvcms9JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkpOworCisgICAgaW50IGI7CisgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gbmV3X3Roci0+dGgudGhfYmFyOworICAgIGZvcihiPTA7IGI8YnNfbGFzdF9iYXJyaWVyOyArK2IpIHsKKyAgICAgICAgYmFsaWduW2JdLmJiLmJfZ28gPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworICAgICAgICBiYWxpZ25bYl0uYmIudGVhbSA9IE5VTEw7CisgICAgICAgIGJhbGlnbltiXS5iYi53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9OT1RfV0FJVElORzsKKyAgICAgICAgYmFsaWduW2JdLmJiLnVzZV9vbmNvcmVfYmFycmllciA9IDA7CisgICAgfQorCisgICAgbmV3X3Roci0+dGgudGhfc3Bpbl9oZXJlID0gRkFMU0U7CisgICAgbmV3X3Roci0+dGgudGhfbmV4dF93YWl0aW5nID0gMDsKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBuZXdfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgICBuZXdfdGhyLT50aC50aF9uZXdfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIG5ld190aHItPnRoLnRoX2ZpcnN0X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgICBuZXdfdGhyLT50aC50aF9sYXN0X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyNlbmRpZgorCisgICAgVENXXzQobmV3X3Roci0+dGgudGhfaW5fcG9vbCwgRkFMU0UpOworICAgIG5ld190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgVENXXzQobmV3X3Roci0+dGgudGhfYWN0aXZlLCBUUlVFKTsKKworICAgIC8qIGFkanVzdCB0aGUgZ2xvYmFsIGNvdW50ZXJzICovCisgICAgX19rbXBfYWxsX250aCArKzsKKyAgICBfX2ttcF9udGggKys7CisKKyAgICAvLworICAgIC8vIGlmIF9fa21wX2FkanVzdF9ndGlkX21vZGUgaXMgc2V0LCB0aGVuIHdlIHVzZSBtZXRob2QgIzEgKHNwIHNlYXJjaCkKKyAgICAvLyBmb3IgbG93IG51bWJlcnMgb2YgcHJvY3MsIGFuZCBtZXRob2QgIzIgKGtleWVkIEFQSSBjYWxsKSBmb3IgaGlnaGVyCisgICAgLy8gbnVtYmVycyBvZiBwcm9jcy4KKyAgICAvLworICAgIGlmICggX19rbXBfYWRqdXN0X2d0aWRfbW9kZSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hbGxfbnRoID49IF9fa21wX3Rsc19ndGlkX21pbiApIHsKKyAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgVENXXzQoX19rbXBfZ3RpZF9tb2RlLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDEgKSB7CisgICAgICAgICAgICAgICAgVENXXzQoX19rbXBfZ3RpZF9tb2RlLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgLyogQWRqdXN0IGJsb2NrdGltZSBiYWNrIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICAgICAgICovCisgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5vdCBoYXZlIG9jY3VycmVkIHlldCAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBpZiAoIF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgLyogYWN0dWFsbHkgZm9yayBpdCBhbmQgY3JlYXRlIHRoZSBuZXcgd29ya2VyIHRocmVhZCAqLworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGJlZm9yZSBfX2ttcF9jcmVhdGVfd29ya2VyOiAlcFxuIiwgbmV3X3RociApKTsKKyAgICBfX2ttcF9jcmVhdGVfd29ya2VyKCBuZXdfZ3RpZCwgbmV3X3RociwgX19rbXBfc3Rrc2l6ZSApOworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGFmdGVyIF9fa21wX2NyZWF0ZV93b3JrZXI6ICVwXG4iLCBuZXdfdGhyICkpOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZCBmb3JrZWQgVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSwgbmV3X2d0aWQgKSk7CisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIG5ld190aHI7Cit9CisKKy8qCisgKiByZWluaXRpYWxpemUgdGVhbSBmb3IgcmV1c2UuCisgKgorICogVGhlIGhvdCB0ZWFtIGNvZGUgY2FsbHMgdGhpcyBjYXNlIGF0IGV2ZXJ5IGZvcmsgYmFycmllciwgc28gRVBDQyBiYXJyaWVyCisgKiB0ZXN0IGFyZSBleHRyZW1lbHkgc2Vuc2l0aXZlIHRvIGNoYW5nZXMgaW4gaXQsIGVzcC4gd3JpdGVzIHRvIHRoZSB0ZWFtCisgKiBzdHJ1Y3QsIHdoaWNoIGNhdXNlIGEgY2FjaGUgaW52YWxpZGF0aW9uIGluIGFsbCB0aHJlYWRzLgorICoKKyAqIElGIFlPVSBUT1VDSCBUSElTIFJPVVRJTkUsIFJVTiBFUENDIEMgU1lOQ0JFTkNIIE9OIEEgQklHLUlST04gTUFDSElORSEhIQorICovCitzdGF0aWMgdm9pZAorX19rbXBfcmVpbml0aWFsaXplX3RlYW0oIGttcF90ZWFtX3QgKnRlYW0sIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKm5ld19pY3ZzLCBpZGVudF90ICpsb2MgKSB7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWluaXRpYWxpemVfdGVhbTogZW50ZXIgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0gKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gJiYgbmV3X2ljdnMpOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHx8IG5ld19pY3ZzLT5ucHJvYyApOworICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X2lkZW50LCBsb2MpOworCisgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfaWQsIEtNUF9HRU5fVEVBTV9JRCgpKTsKKworICAgIC8vIENvcHkgSUNWcyB0byB0aGUgbWFzdGVyIHRocmVhZCdzIGltcGxpY2l0IHRhc2tkYXRhCisgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCBsb2MsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtLCAwLCBGQUxTRSApOworICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cywgbmV3X2ljdnMpOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWluaXRpYWxpemVfdGVhbTogZXhpdCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSApICk7Cit9CisKKworLyogaW5pdGlhbGl6ZSB0aGUgdGVhbSBkYXRhIHN0cnVjdHVyZQorICogdGhpcyBhc3N1bWVzIHRoZSB0X3RocmVhZHMgYW5kIHRfbWF4X25wcm9jIGFyZSBhbHJlYWR5IHNldAorICogYWxzbywgd2UgZG9uJ3QgdG91Y2ggdGhlIGFyZ3VtZW50cyAqLworc3RhdGljIHZvaWQKK19fa21wX2luaXRpYWxpemVfdGVhbSgKKyAgICBrbXBfdGVhbV90ICogdGVhbSwKKyAgICBpbnQgICAgICAgICAgbmV3X25wcm9jLAorICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKiBuZXdfaWN2cywKKyAgICBpZGVudF90ICogICAgICAgICAgICAgICAgbG9jCispIHsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfdGVhbTogZW50ZXI6IHRlYW09JXBcbiIsIHRlYW0gKSApOworCisgICAgLyogdmVyaWZ5ICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ucHJvYyA8PSB0ZWFtLT50LnRfbWF4X25wcm9jICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHMgKTsKKyAgICBLTVBfTUIoKTsKKworICAgIHRlYW0tPnQudF9tYXN0ZXJfdGlkICA9IDA7ICAgIC8qIG5vdCBuZWVkZWQgKi8KKyAgICAvKiB0ZWFtLT50LnRfbWFzdGVyX2JhcjsgICAgICAgIG5vdCBuZWVkZWQgKi8KKyAgICB0ZWFtLT50LnRfc2VyaWFsaXplZCAgPSBuZXdfbnByb2MgPiAxID8gMCA6IDE7CisgICAgdGVhbS0+dC50X25wcm9jICAgICAgID0gbmV3X25wcm9jOworCisgICAgLyogdGVhbS0+dC50X3BhcmVudCAgICAgPSBOVUxMOyBUT0RPIG5vdCBuZWVkZWQgJiB3b3VsZCBtZXNzIHVwIGhvdCB0ZWFtICovCisgICAgdGVhbS0+dC50X25leHRfcG9vbCAgID0gTlVMTDsKKyAgICAvKiBtZW1zZXQoIHRlYW0tPnQudF90aHJlYWRzLCAwLCBzaXplb2Yoa21wX2luZm9fdCopKm5ld19ucHJvYyApOyB3b3VsZCBtZXNzIHVwIGhvdCB0ZWFtICovCisKKyAgICBUQ1dfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4sIE5VTEwpOyAvKiBub3QgbmVlZGVkICovCisgICAgdGVhbS0+dC50X2ludm9rZSAgICAgID0gTlVMTDsgLyogbm90IG5lZWRlZCAqLworCisgICAgLy8gVE9ETz8/PzogdGVhbS0+dC50X21heF9hY3RpdmVfbGV2ZWxzICAgICAgID0gbmV3X21heF9hY3RpdmVfbGV2ZWxzOworICAgIHRlYW0tPnQudF9zY2hlZCAgICAgICA9IG5ld19pY3ZzLT5zY2hlZDsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICB0ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCA9IEZBTFNFOyAvKiBub3QgbmVlZGVkICovCisgICAgdGVhbS0+dC50X3g4N19mcHVfY29udHJvbF93b3JkID0gMDsgLyogbm90IG5lZWRlZCAqLworICAgIHRlYW0tPnQudF9teGNzciA9IDA7ICAgICAgICAgICAgICAgIC8qIG5vdCBuZWVkZWQgKi8KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICB0ZWFtLT50LnRfY29uc3RydWN0ICAgPSAwOworICAgIF9fa21wX2luaXRfbG9jayggJiB0ZWFtLT50LnRfc2luZ2xlX2xvY2sgKTsKKworICAgIHRlYW0tPnQudF9vcmRlcmVkIC5kdC50X3ZhbHVlID0gMDsKKyAgICB0ZWFtLT50LnRfbWFzdGVyX2FjdGl2ZSA9IEZBTFNFOworCisgICAgbWVtc2V0KCAmIHRlYW0tPnQudF90YXNrcSwgJ1wwJywgc2l6ZW9mKCBrbXBfdGFza3FfdCApKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHRlYW0tPnQudF9jb3B5cHJpdl9kYXRhID0gTlVMTDsgIC8qIG5vdCBuZWNlc3NhcnksIGJ1dCBuaWNlIGZvciBkZWJ1Z2dpbmcgKi8KKyNlbmRpZgorICAgIHRlYW0tPnQudF9jb3B5aW5fY291bnRlciA9IDA7ICAgIC8qIGZvciBiYXJyaWVyLWZyZWUgY29weWluIGltcGxlbWVudGF0aW9uICovCisKKyAgICB0ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPSBOVUxMOworCisgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19pY3ZzLCBsb2MgKTsKKworICAgIEtNUF9NQigpOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV90ZWFtOiBleGl0OiB0ZWFtPSVwXG4iLCB0ZWFtICkgKTsKK30KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisvKiBTZXRzIGZ1bGwgbWFzayBmb3IgdGhyZWFkIGFuZCByZXR1cm5zIG9sZCBtYXNrLCBubyBjaGFuZ2VzIHRvIHN0cnVjdHVyZXMuICovCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3RocmVhZF9hZmZpbml0eV9tYXNrX2Z1bGxfdG1wKCBrbXBfYWZmaW5fbWFza190ICpvbGRfbWFzayApCit7CisgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBpZiAoIG9sZF9tYXNrICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCBvbGRfbWFzaywgVFJVRSApOworICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDaGFuZ2VUaHJlYWRBZmZNYXNrRXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIF9fa21wX2FmZmluX2Z1bGxNYXNrLCBUUlVFICk7CisgICAgfQorfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKy8vCisvLyBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCkgaXMgdGhlIGhlYXJ0IG9mIHRoZSBPcGVuTVAgNC4wIGFmZmluaXR5IG1lY2hhbmlzbS4KKy8vIEl0IGNhbGN1bGF0cyB0aGUgd29ya2VyICsgbWFzdGVyIHRocmVhZCdzIHBhcnRpdGlvbiBiYXNlZCB1cG9uIHRoZSBwYXJlbnQKKy8vIHRocmVhZCdzIHBhcnRpdGlvbiwgYW5kIGJpbmRzIGVhY2ggd29ya2VyIHRvIGEgdGhyZWFkIGluIHRoZWlyIHBhcnRpdGlvbi4KKy8vIFRoZSBtYXN0ZXIgdGhyZWFkJ3MgcGFydGl0aW9uIHNob3VsZCBhbHJlYWR5IGluY2x1ZGUgaXRzIGN1cnJlbnQgYmluZGluZy4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfcGFydGl0aW9uX3BsYWNlcygga21wX3RlYW1fdCAqdGVhbSwgaW50IHVwZGF0ZV9tYXN0ZXJfb25seSApCit7CisgICAgLy8KKyAgICAvLyBDb3B5IHRoZSBtYXN0ZXIgdGhyZWFkJ3MgcGxhY2UgcGFydGlvbiB0byB0aGUgdGVhbSBzdHJ1Y3QKKyAgICAvLworICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCA9IHRlYW0tPnQudF90aHJlYWRzWzBdOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlcl90aCAhPSBOVUxMICk7CisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCA9IHRlYW0tPnQudF9wcm9jX2JpbmQ7CisgICAgaW50IGZpcnN0X3BsYWNlID0gbWFzdGVyX3RoLT50aC50aF9maXJzdF9wbGFjZTsKKyAgICBpbnQgbGFzdF9wbGFjZSA9IG1hc3Rlcl90aC0+dGgudGhfbGFzdF9wbGFjZTsKKyAgICBpbnQgbWFzdGVyc19wbGFjZSA9IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF9wbGFjZTsKKyAgICB0ZWFtLT50LnRfZmlyc3RfcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICB0ZWFtLT50LnRfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogZW50ZXI6IHByb2NfYmluZCA9ICVkIFQjJWQoJWQ6MCkgYm91bmQgdG8gcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICBwcm9jX2JpbmQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWzBdICksIHRlYW0tPnQudF9pZCwKKyAgICAgICBtYXN0ZXJzX3BsYWNlLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSApICk7CisKKyAgICBzd2l0Y2ggKCBwcm9jX2JpbmQgKSB7CisKKyAgICAgICAgY2FzZSBwcm9jX2JpbmRfZGVmYXVsdDoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gc2VyaWFsIHRlYW1zIG1pZ2h0IGhhdmUgdGhlIHByb2NfYmluZCBwb2xpY3kgc2V0IHRvCisgICAgICAgIC8vIHByb2NfYmluZF9kZWZhdWx0LiAgSXQgZG9lc24ndCBtYXR0ZXIsIGFzIHdlIGRvbid0CisgICAgICAgIC8vIHJlYmluZCB0aGUgbWFzdGVyIHRocmVhZCBmb3IgYW55IHByb2NfYmluZCBwb2xpY3kuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9ucHJvYyA9PSAxICk7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgcHJvY19iaW5kX21hc3RlcjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGY7CisgICAgICAgICAgICBpbnQgbl90aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIGZvciAoIGYgPSAxOyBmIDwgbl90aDsgZisrICkgeworICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gbGFzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gbWFzdGVyc19wbGFjZTsKKworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogbWFzdGVyOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgbWFzdGVyc19wbGFjZSwgZmlyc3RfcGxhY2UsIGxhc3RfcGxhY2UgKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgcHJvY19iaW5kX2Nsb3NlOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZjsKKyAgICAgICAgICAgIGludCBuX3RoID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgaW50IG5fcGxhY2VzOworICAgICAgICAgICAgaWYgKCBmaXJzdF9wbGFjZSA8PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgIG5fcGxhY2VzID0gbGFzdF9wbGFjZSAtIGZpcnN0X3BsYWNlICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG5fcGxhY2VzID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gZmlyc3RfcGxhY2UgKyBsYXN0X3BsYWNlICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbl90aCA8PSBuX3BsYWNlcyApIHsKKyAgICAgICAgICAgICAgICBpbnQgcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAxOyBmIDwgbl90aDsgZisrICkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSBOVUxMICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IGNsb3NlOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGYsIHBsYWNlLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IFMsIHJlbSwgZ2FwLCBzX2NvdW50OworICAgICAgICAgICAgICAgIFMgPSBuX3RoIC8gbl9wbGFjZXM7CisgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcmVtID0gbl90aCAtICggUyAqIG5fcGxhY2VzICk7CisgICAgICAgICAgICAgICAgZ2FwID0gcmVtID4gMCA/IG5fcGxhY2VzL3JlbSA6IG5fcGxhY2VzOworICAgICAgICAgICAgICAgIGludCBwbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisgICAgICAgICAgICAgICAgaW50IGdhcF9jdCA9IGdhcDsKKyAgICAgICAgICAgICAgICBmb3IgKCBmID0gMDsgZiA8IG5fdGg7IGYrKyApIHsKKyAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworCisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgc19jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHNfY291bnQgPT0gUykgJiYgcmVtICYmIChnYXBfY3QgPT0gZ2FwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIGFkZCBhbiBleHRyYSB0aHJlYWQgdG8gcGxhY2Ugb24gbmV4dCBpdGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHNfY291bnQgPT0gUysxKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWRkZWQgYW4gZXh0cmEgdGhyZWFkIHRvIHRoaXMgcGxhY2U7IG1vdmUgdG8gbmV4dCBwbGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZ2FwX2N0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbS0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNfY291bnQgPT0gUykgeyAvLyBwbGFjZSBmdWxsOyBkb24ndCBhZGQgZXh0cmEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IChpbnQpKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnYXBfY3QrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBjbG9zZTogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgdGgtPnRoLnRoX25ld19wbGFjZSwgZmlyc3RfcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBsYWNlID09IG1hc3RlcnNfcGxhY2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHByb2NfYmluZF9zcHJlYWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmOworICAgICAgICAgICAgaW50IG5fdGggPSB0ZWFtLT50LnRfbnByb2M7CisgICAgICAgICAgICBpbnQgbl9wbGFjZXM7CisgICAgICAgICAgICBpbnQgdGhpZHg7CisgICAgICAgICAgICBpZiAoIGZpcnN0X3BsYWNlIDw9IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgbl9wbGFjZXMgPSBsYXN0X3BsYWNlIC0gZmlyc3RfcGxhY2UgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbl9wbGFjZXMgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSBmaXJzdF9wbGFjZSArIGxhc3RfcGxhY2UgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBuX3RoIDw9IG5fcGxhY2VzICkgeworICAgICAgICAgICAgICAgIGludCBwbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisgICAgICAgICAgICAgICAgaW50IFMgPSBuX3BsYWNlcy9uX3RoOworICAgICAgICAgICAgICAgIGludCBzX2NvdW50LCByZW0sIGdhcCwgZ2FwX2N0OworICAgICAgICAgICAgICAgIHJlbSA9IG5fcGxhY2VzIC0gbl90aCpTOworICAgICAgICAgICAgICAgIGdhcCA9IHJlbSA/IG5fdGgvcmVtIDogMTsKKyAgICAgICAgICAgICAgICBnYXBfY3QgPSBnYXA7CisgICAgICAgICAgICAgICAgdGhpZHggPSBuX3RoOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVfbWFzdGVyX29ubHkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgdGhpZHggPSAxOworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAwOyBmIDwgdGhpZHg7IGYrKyApIHsKKyAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworCisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc19jb3VudCA8IFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IChpbnQpKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbSAmJiAoZ2FwX2N0ID09IGdhcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IChpbnQpKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZW0tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgZ2FwX2N0Kys7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBzcHJlYWQ6IFQjJWQoJWQ6JWQpIHBsYWNlICVkIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGYsIHRoLT50aC50aF9uZXdfcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlLCB0aC0+dGgudGhfbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHVwZGF0ZV9tYXN0ZXJfb25seSB8fCBwbGFjZSA9PSBtYXN0ZXJzX3BsYWNlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgUywgcmVtLCBnYXAsIHNfY291bnQ7CisgICAgICAgICAgICAgICAgUyA9IG5fdGggLyBuX3BsYWNlczsKKyAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICByZW0gPSBuX3RoIC0gKCBTICogbl9wbGFjZXMgKTsKKyAgICAgICAgICAgICAgICBnYXAgPSByZW0gPiAwID8gbl9wbGFjZXMvcmVtIDogbl9wbGFjZXM7CisgICAgICAgICAgICAgICAgaW50IHBsYWNlID0gbWFzdGVyc19wbGFjZTsKKyAgICAgICAgICAgICAgICBpbnQgZ2FwX2N0ID0gZ2FwOworICAgICAgICAgICAgICAgIHRoaWR4ID0gbl90aDsKKyAgICAgICAgICAgICAgICBpZiAodXBkYXRlX21hc3Rlcl9vbmx5ID09IDEpCisgICAgICAgICAgICAgICAgICAgIHRoaWR4ID0gMTsKKyAgICAgICAgICAgICAgICBmb3IgKCBmID0gMDsgZiA8IHRoaWR4OyBmKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IE5VTEwgKTsKKworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICBzX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc19jb3VudCA9PSBTKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZywgYWRkIGFuIGV4dHJhIHRocmVhZCB0byBwbGFjZSBvbiBuZXh0IGl0ZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc19jb3VudCA9PSBTKzEpICYmIHJlbSAmJiAoZ2FwX2N0ID09IGdhcCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhZGRlZCBhbiBleHRyYSB0aHJlYWQgdG8gdGhpcyBwbGFjZTsgbW92ZSBvbiB0byBuZXh0IHBsYWNlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBnYXBfY3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc19jb3VudCA9PSBTKSB7IC8vIHBsYWNlIGlzIGZ1bGw7IGRvbid0IGFkZCBleHRyYSB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IChpbnQpKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnYXBfY3QrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBzcHJlYWQ6IFQjJWQoJWQ6JWQpIHBsYWNlICVkIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICksCisgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgdGgtPnRoLnRoX25ld19wbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlLCB0aC0+dGgudGhfbGFzdF9wbGFjZSkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdXBkYXRlX21hc3Rlcl9vbmx5IHx8IHBsYWNlID09IG1hc3RlcnNfcGxhY2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogZXhpdCBUIyVkXG4iLCB0ZWFtLT50LnRfaWQgKSApOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisvKiBhbGxvY2F0ZSBhIG5ldyB0ZWFtIGRhdGEgc3RydWN0dXJlIHRvIHVzZS4gIHRha2Ugb25lIG9mZiBvZiB0aGUgZnJlZSBwb29sIGlmIGF2YWlsYWJsZSAqLwora21wX3RlYW1fdCAqCitfX2ttcF9hbGxvY2F0ZV90ZWFtKCBrbXBfcm9vdF90ICpyb290LCBpbnQgbmV3X25wcm9jLCBpbnQgbWF4X25wcm9jLAorI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgbmV3X3Byb2NfYmluZCwKKyNlbmRpZgorICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKm5ld19pY3ZzLAorICAgIGludCBhcmdjIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICptYXN0ZXIpICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soS01QX2FsbG9jYXRlX3RlYW0pOworICAgIGludCBmOworICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAgaW50IHVzZV9ob3RfdGVhbSA9ICEgcm9vdC0+ci5yX2FjdGl2ZTsKKyAgICBpbnQgbGV2ZWwgPSAwOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGNhbGxlZFxuIikpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ucHJvYyA+PTEgJiYgYXJnYyA+PTAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXhfbnByb2MgPj0gbmV3X25wcm9jICk7CisgICAgS01QX01CKCk7CisKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGttcF9ob3RfdGVhbV9wdHJfdCAqaG90X3RlYW1zOworICAgIGlmKCBtYXN0ZXIgKSB7CisgICAgICAgIHRlYW0gPSBtYXN0ZXItPnRoLnRoX3RlYW07CisgICAgICAgIGxldmVsID0gdGVhbS0+dC50X2FjdGl2ZV9sZXZlbDsKKyAgICAgICAgaWYoIG1hc3Rlci0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0ZWFtcyBjb25zdHJ1Y3Q/CisgICAgICAgICAgICBpZiggbWFzdGVyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+IDEgJiYgKCAgICAgICAgICAgICAvLyAjdGVhbXMgPiAxCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3BrZm4gPT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciB8fCAvLyBpbm5lciBmb3JrIG9mIHRoZSB0ZWFtcworICAgICAgICAgICAgICAgIG1hc3Rlci0+dGgudGhfdGVhbXNfbGV2ZWwgPCB0ZWFtLT50LnRfbGV2ZWwgKSApIHsgICAgLy8gb3IgbmVzdGVkIHBhcmFsbGVsIGluc2lkZSB0aGUgdGVhbXMKKyAgICAgICAgICAgICAgICArK2xldmVsOyAvLyBub3QgaW5jcmVtZW50IGlmICN0ZWFtcz09MSwgb3IgZm9yIG91dGVyIGZvcmsgb2YgdGhlIHRlYW1zOyBpbmNyZW1lbnQgb3RoZXJ3aXNlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaG90X3RlYW1zID0gbWFzdGVyLT50aC50aF9ob3RfdGVhbXM7CisgICAgICAgIGlmKCBsZXZlbCA8IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgJiYgaG90X3RlYW1zICYmIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gKQorICAgICAgICB7ICAgLy8gaG90IHRlYW0gaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgZm9yIGdpdmVuIGxldmVsCisgICAgICAgICAgICB1c2VfaG90X3RlYW0gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXNlX2hvdF90ZWFtID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8vIE9wdGltaXphdGlvbiB0byB1c2UgYSAiaG90IiB0ZWFtCisgICAgaWYoIHVzZV9ob3RfdGVhbSAmJiBuZXdfbnByb2MgPiAxICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfbnByb2MgPT0gbWF4X25wcm9jICk7CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgdGVhbSA9IGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW07CisjZWxzZQorICAgICAgICB0ZWFtID0gIHJvb3QtPnIucl9ob3RfdGVhbTsKKyNlbmRpZgorI2lmIEtNUF9ERUJVRworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGhvdCB0ZWFtIHRhc2tfdGVhbVswXSA9ICVwIHRhc2tfdGVhbVsxXSA9ICVwIGJlZm9yZSByZWluaXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtWzBdLCB0ZWFtLT50LnRfdGFza190ZWFtWzFdICkpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvLyBIYXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIGNoYW5nZWQ/CisgICAgICAgIC8qIExldCdzIGFzc3VtZSB0aGUgbW9zdCBjb21tb24gY2FzZSBpcyB0aGF0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpcyB1bmNoYW5nZWQsIGFuZAorICAgICAgICAgICBwdXQgdGhhdCBjYXNlIGZpcnN0LiAqLworICAgICAgICBpZiAodGVhbS0+dC50X25wcm9jID09IG5ld19ucHJvYykgeyAvLyBDaGVjayBjaGFuZ2VzIGluIG51bWJlciBvZiB0aHJlYWRzCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogcmV1c2luZyBob3QgdGVhbVxuIiApKTsKKyAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBjYW4gbWVhbiB0aGF0IG9tcF9zZXRfbnVtX3RocmVhZHMoKSB3YXMgY2FsbGVkIGFuZCB0aGUgaG90IHRlYW0gc2l6ZQorICAgICAgICAgICAgLy8gd2FzIGFscmVhZHkgcmVkdWNlZCwgc28gd2UgY2hlY2sgdGhlIHNwZWNpYWwgZmxhZworICAgICAgICAgICAgaWYgKCB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID09IC0xICkgeworICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zaXplX2NoYW5nZWQgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9zaXplX2NoYW5nZWQsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPPz8/OiB0ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBuZXdfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgICAgICAgICBrbXBfcl9zY2hlZF90IG5ld19zY2hlZCA9IG5ld19pY3ZzLT5zY2hlZDsKKyAgICAgICAgICAgIGlmICh0ZWFtLT50LnRfc2NoZWQucl9zY2hlZF90eXBlICE9IG5ld19zY2hlZC5yX3NjaGVkX3R5cGUgfHwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfc2NoZWQuY2h1bmsgIT0gbmV3X3NjaGVkLmNodW5rKQorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zY2hlZCA9IG5ld19zY2hlZDsgLy8gc2V0IG1hc3RlcidzIHNjaGVkdWxlIGFzIG5ldyBydW4tdGltZSBzY2hlZHVsZQorCisgICAgICAgICAgICBfX2ttcF9yZWluaXRpYWxpemVfdGVhbSggdGVhbSwgbmV3X2ljdnMsIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaWRlbnQgKTsKKworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW0yOiBUIyVkLCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0gKSApOworICAgICAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1sgMCBdLCB0ZWFtLCAwICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBpZiAoICggdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9PSAwICkKKyAgICAgICAgICAgICAgJiYgKCB0ZWFtLT50LnRfcHJvY19iaW5kID09IG5ld19wcm9jX2JpbmQgKSApIHsKKyAgICAgICAgICAgICAgICBpZiAobmV3X3Byb2NfYmluZCA9PSBwcm9jX2JpbmRfc3ByZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3BhcnRpdGlvbl9wbGFjZXModGVhbSwgMSk7IC8vIGFkZCBmbGFnIHRvIHVwZGF0ZSBvbmx5IG1hc3RlciBmb3Igc3ByZWFkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMDAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogcmV1c2luZyBob3QgdGVhbSAjJWQgYmluZGluZ3M6IHByb2NfYmluZCA9ICVkLCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBuZXdfcHJvY19iaW5kLCB0ZWFtLT50LnRfZmlyc3RfcGxhY2UsCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9wcm9jX2JpbmQsIG5ld19wcm9jX2JpbmQpOworICAgICAgICAgICAgICAgIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoIHRlYW0gKTsKKyAgICAgICAgICAgIH0KKyMgZWxzZQorICAgICAgICAgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfcHJvY19iaW5kLCBuZXdfcHJvY19iaW5kKTsKKyMgZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggdGVhbS0+dC50X25wcm9jID4gbmV3X25wcm9jICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGRlY3JlYXNpbmcgaG90IHRlYW0gdGhyZWFkIGNvdW50IHRvICVkXG4iLCBuZXdfbnByb2MgKSk7CisKKyAgICAgICAgICAgIHRlYW0tPnQudF9zaXplX2NoYW5nZWQgPSAxOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICBpZiggX19rbXBfaG90X3RlYW1zX21vZGUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogc2F2ZWQgbnVtYmVyIG9mIHRocmVhZHMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGVhbSdzIHZhbHVlIGluIHRoaXMgbW9kZSwKKyAgICAgICAgICAgICAgICAvLyBjYW4gYmUgYmlnZ2VyIGluIG1vZGUgMSwgd2hlbiBob3QgdGVhbSBoYXMgc29tZSB0aHJlYWRzIGluIHJlc2VydmUKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoID09IHRlYW0tPnQudF9ucHJvYyk7CisgICAgICAgICAgICAgICAgaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGggPSBuZXdfbnByb2M7CisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgICAgICAvKiByZWxlYXNlIHRoZSBleHRyYSB0aHJlYWRzIHdlIGRvbid0IG5lZWQgYW55IG1vcmUgKi8KKyAgICAgICAgICAgICAgICBmb3IoIGYgPSBuZXdfbnByb2MgIDsgIGYgPCB0ZWFtLT50LnRfbnByb2MgIDsgIGYrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGRlY3JlYXNpbmcgdGVhbSBzaXplLCB0aHJlYWRzIG5vIGxvbmdlciBpbiB0aGUgdGVhbSBzaG91bGQgdW5yZWYgdGFzayB0ZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZnJlZV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWyBmIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbIGYgXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICB9IC8vIChfX2ttcF9ob3RfdGVhbXNfbW9kZSA9PSAwKQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiBrZWVwaW5nIGV4dHJhIHRocmVhZHMgaW4gdGVhbSwgc3dpdGNoIHRocmVhZHMgdG8gd2FpdCBvbiBvd24gYl9nbyBmbGFnCisgICAgICAgICAgICAgICAgZm9yIChmPW5ld19ucHJvYzsgZjx0ZWFtLT50LnRfbnByb2M7ICsrZikgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF90aHJlYWRzW2ZdKTsKKyAgICAgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICpiYWxpZ24gPSB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiPTA7IGI8YnNfbGFzdF9iYXJyaWVyOyArK2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWxpZ25bYl0uYmIud2FpdF9mbGFnID09IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsaWduW2JdLmJiLndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX1NXSVRDSF9UT19PV05fRkxBRzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DSEVDS19VUERBVEUoYmFsaWduW2JdLmJiLmxlYWZfa2lkcywgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9ICBuZXdfbnByb2M7CisgICAgICAgICAgICAvLyBUT0RPPz8/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+dGgudGhfYmFyOworICAgIGZvciAoYj0wOyBiPGJzX2xhc3RfYmFycmllcjsgKytiKSB7CisgICAgICAgIGlmIChiYWxpZ25bYl0uYmIud2FpdF9mbGFnID09IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKQorICAgICAgICAgICAgYmFsaWduW2JdLmJiLndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX1NXSVRDSF9UT19PV05fRkxBRzsKKyAgICAgICAgYmFsaWduW2JdLmJiLnRlYW0gPSBOVUxMOworICAgICAgICBiYWxpZ25bYl0uYmIubGVhZl9raWRzID0gMDsKKyAgICB9CisgICAgdGhpc190aC0+dGgudGhfdGFza19zdGF0ZSA9IDA7CisKKyAgICAvKiBwdXQgdGhyZWFkIGJhY2sgb24gdGhlIGZyZWUgcG9vbCAqLworICAgIFRDV19QVFIodGhpc190aC0+dGgudGhfdGVhbSwgTlVMTCk7CisgICAgVENXX1BUUih0aGlzX3RoLT50aC50aF9yb290LCBOVUxMKTsKKyAgICBUQ1dfUFRSKHRoaXNfdGgtPnRoLnRoX2Rpc3BhdGNoLCBOVUxMKTsgICAgICAgICAgICAgICAvKiBOT1QgTkVFREVEICovCisKKyAgICAvLworICAgIC8vIElmIHRoZSBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgaXMgYWxyZWFkeSBwYXN0IHRoZSBuZXcgaW5zZXJ0CisgICAgLy8gcG9pbnQsIHRoZW4gd2UgbmVlZCB0byByZS1zY2FuIHRoZSBlbnRpcmUgbGlzdC4KKyAgICAvLworICAgIGd0aWQgPSB0aGlzX3RoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgaWYgKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgIT0gTlVMTCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2wgIT0gTlVMTCApOworICAgICAgICBpZiAoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdC0+dGgudGhfaW5mby5kcy5kc19ndGlkID4gZ3RpZCApIHsKKyAgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTY2FuIGRvd24gdGhlIGxpc3QgdG8gZmluZCB0aGUgcGxhY2UgdG8gaW5zZXJ0IHRoZSB0aHJlYWQuCisgICAgLy8gc2NhbiBpcyB0aGUgYWRkcmVzcyBvZiBhIGxpbmsgaW4gdGhlIGxpc3QsIHBvc3NpYmx5IHRoZSBhZGRyZXNzIG9mCisgICAgLy8gX19rbXBfdGhyZWFkX3Bvb2wgaXRzZWxmLgorICAgIC8vCisgICAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgbmVzdGVkIHBhcmFsbGlzbSwgdGhlIGZvciBsb29wIHdpbGwgaGF2ZSAwIGl0ZXJhdGlvbnMuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCAhPSBOVUxMICkgeworICAgICAgICBzY2FuID0gJiggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0LT50aC50aF9uZXh0X3Bvb2wgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNjYW4gPSAoa21wX2luZm9fdCAqKikmX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgfQorICAgIGZvciAoOyAoICpzY2FuICE9IE5VTEwgKSAmJiAoICgqc2NhbiktPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA8IGd0aWQgKTsKKyAgICAgIHNjYW4gPSAmKCAoKnNjYW4pLT50aC50aF9uZXh0X3Bvb2wgKSApOworCisgICAgLy8KKyAgICAvLyBJbnNlcnQgdGhlIG5ldyBlbGVtZW50IG9uIHRoZSBsaXN0LCBhbmQgc2V0IF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdAorICAgIC8vIHRvIGl0cyBhZGRyZXNzLgorICAgIC8vCisgICAgVENXX1BUUih0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wsICpzY2FuKTsKKyAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSAqc2NhbiA9IHRoaXNfdGg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCB0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wgPT0gTlVMTCApCisgICAgICB8fCAoIHRoaXNfdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZAorICAgICAgPCB0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisgICAgVENXXzQodGhpc190aC0+dGgudGhfaW5fcG9vbCwgVFJVRSk7CisgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoKys7CisKKyAgICBUQ1dfNChfX2ttcF9udGgsIF9fa21wX250aCAtIDEpOworCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gdXNlciBzZXR0aW5nIG9yIGRlZmF1bHQgaWYgbmVjZXNzYXJ5ICovCisgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5ldmVyIGhhdmUgb2NjdXJyZWQgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYXZhaWxfcHJvYyA+IDAgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9udGggPD0gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgS01QX01CKCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKgorX19rbXBfbGF1bmNoX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIgKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICBndGlkID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKy8qICAgIHZvaWQgICAgICAgICAgICAgICAgICpzdGFja19kYXRhOyovCisgICAga21wX3RlYW1fdCAqKCp2b2xhdGlsZSBwdGVhbSk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCBzdGFydFxuIiwgZ3RpZCApICk7CisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfY29ucyA9IF9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soIGd0aWQgKTsgIC8vIEFUVDogTWVtb3J5IGxlYWs/CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAwOworICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5pZGxlX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luKSkgeworICAgICAgICAgICAgX19vbXB0X3RocmVhZF9iZWdpbihvbXB0X3RocmVhZF93b3JrZXIsIGd0aWQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSB0aHJlYWRzIHdhaXQgZm9yIHdvcmsgKi8KKyAgICB3aGlsZSggISBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RociA9PSBfX2ttcF90aHJlYWRzWyBndGlkIF0gKTsKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgLyogd2FpdCBmb3Igd29yayB0byBkbyAqLworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCB3YWl0aW5nIGZvciB3b3JrXG4iLCBndGlkICkpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9pZGxlOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvKiBObyB0aWQgeWV0IHNpbmNlIG5vdCBwYXJ0IG9mIGEgdGVhbSAqLworICAgICAgICBfX2ttcF9mb3JrX2JhcnJpZXIoIGd0aWQsIEtNUF9HVElEX0RORSApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHRlYW0gPSAoa21wX3RlYW1fdCAqKCopKSgmIHRoaXNfdGhyLT50aC50aF90ZWFtKTsKKworICAgICAgICAvKiBoYXZlIHdlIGJlZW4gYWxsb2NhdGVkPyAqLworICAgICAgICBpZiAoIFRDUl9TWU5DX1BUUigqcHRlYW0pICYmICFUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvOworICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG15X3BhcmFsbGVsX2lkOworICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQgPSAoKnB0ZWFtKS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLyogd2Ugd2VyZSBqdXN0IHdva2VuIHVwLCBzbyBydW4gb3VyIG5ldyB0YXNrICovCisgICAgICAgICAgICBpZiAoIFRDUl9TWU5DX1BUUigoKnB0ZWFtKS0+dC50X3BrZm4pICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgaW50IHJjOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQoJWQ6JWQpIGludm9rZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsICgqcHRlYW0pLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksICgqcHRlYW0pLT50LnRfcGtmbikpOworCisgICAgICAgICAgICAgICAgdXBkYXRlSFdGUENvbnRyb2wgKCpwdGVhbSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIE9NUFQgdGFzayBpZCBmb3IgaW1wbGljaXQgdGFzay4KKyAgICAgICAgICAgICAgICAgICAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgICAgICAgICAgICAgIHRhc2tfaW5mby0+dGFza19pZCA9IF9fb21wdF90YXNrX2lkX25ldyh0aWQpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGFyYWxsZWwpOworICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhJTVBMSUNJVF9UQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSAoKnB0ZWFtKS0+dC50X2ludm9rZSggZ3RpZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCByYyApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAvKiBubyBmcmFtZSBzZXQgd2hpbGUgb3V0c2lkZSB0YXNrICovCisgICAgICAgICAgICAgICAgICAgIHRhc2tfaW5mby0+ZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCglZDolZCkgZG9uZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsICgqcHRlYW0pLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksICgqcHRlYW0pLT50LnRfcGtmbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogam9pbiBiYXJyaWVyIGFmdGVyIHBhcmFsbGVsIHJlZ2lvbiAqLworICAgICAgICAgICAgX19rbXBfam9pbl9iYXJyaWVyKCBndGlkICk7CisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhY2Nlc3MgKnB0ZWFtIGhlcmU6IGl0IG1heSBoYXZlIGFscmVhZHkgYmVlbiBmcmVlZAorICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgbWFzdGVyIHRocmVhZCBiZWhpbmQgdGhlIGJhcnJpZXIgKHBvc3NpYmxlIHJhY2UpCisgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGFza19pbmZvLT5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgICAgICAgICAgICAgIHRhc2tfaW5mby0+dGFza19pZCA9IDA7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyAgICBUQ1JfU1lOQ19QVFIoKGludHB0cl90KV9fa21wX2dsb2JhbC5nLmdfZG9uZSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfZW5kKSkgeworICAgICAgICBfX29tcHRfdGhyZWFkX2VuZChvbXB0X3RocmVhZF93b3JrZXIsIGd0aWQpOworICAgIH0KKyNlbmRpZgorCisgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgLyogcnVuIHRoZSBkZXN0cnVjdG9ycyBmb3IgdGhlIHRocmVhZHByaXZhdGUgZGF0YSBmb3IgdGhpcyB0aHJlYWQgKi8KKyAgICBfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkKCBndGlkICk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCBkb25lXG4iLCBndGlkICkgKTsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gdGhpc190aHI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9kZXN0KCB2b2lkICpzcGVjaWZpY19ndGlkICkKK3sKKyAgICAjaWYgS01QX0NPTVBJTEVSX0lDQworICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6ICA4MTAgKSAvLyBjb252ZXJzaW9uIGZyb20gInZvaWQgKiIgdG8gImludCIgbWF5IGxvc2Ugc2lnbmlmaWNhbnQgYml0cworICAgICNlbmRpZgorICAgIC8vIE1ha2Ugc3VyZSBubyBzaWduaWZpY2FudCBiaXRzIGFyZSBsb3N0CisgICAgaW50IGd0aWQgPSAoa21wX2ludHB0cl90KXNwZWNpZmljX2d0aWQgLSAxOworICAgICNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICNwcmFnbWEgd2FybmluZyggcG9wICkKKyAgICAjZW5kaWYKKworICAgIEtBX1RSQUNFKCAzMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfZGVzdDogVCMlZFxuIiwgZ3RpZCkpOworICAgIC8qIE5PVEU6IHRoZSBndGlkIGlzIHN0b3JlZCBhcyBnaXRkKzEgaW4gdGhlIHRocmVhZC1sb2NhbC1zdG9yYWdlCisgICAgICogdGhpcyBpcyBiZWNhdXNlIDAgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBub3RoaW5nLXN0b3JlZCBjYXNlICovCisKKyAgICAvKiBqb3NoOiBPbmUgcmVhc29uIGZvciBzZXR0aW5nIHRoZSBndGlkIHNwZWNpZmljIGRhdGEgZXZlbiB3aGVuIGl0IGlzIGJlaW5nCisgICAgICAgZGVzdHJveWVkIGJ5IHB0aHJlYWQgaXMgdG8gYWxsb3cgZ3RpZCBsb29rdXAgdGhyb3VnaCB0aHJlYWQgc3BlY2lmaWMgZGF0YQorICAgICAgIChfX2ttcF9ndGlkX2dldF9zcGVjaWZpYykuICBTb21lIG9mIHRoZSBjb2RlLCBlc3BlY2lhbGx5IHN0YXQgY29kZSwKKyAgICAgICB0aGF0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGNhbGwgdG8gX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCwgYWN0dWFsbHkKKyAgICAgICBnZXRzIHRoZSBndGlkIHRocm91Z2ggdGhlIHRocmVhZCBzcGVjaWZpYyBkYXRhLiAgU2V0dGluZyBpdCBoZXJlIHNlZW1zCisgICAgICAgcmF0aGVyIGluZWxlZ2FudCBhbmQgcGVyaGFwcyB3cm9uZywgYnV0IGFsbG93cyBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkCisgICAgICAgdG8gcnVuIHNtb290aGx5LgorICAgICAgIHRvZG86IGdldCByaWQgb2YgdGhpcyBhZnRlciB3ZSByZW1vdmUgdGhlIGRlcGVuZGVuY2Ugb24KKyAgICAgICBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYworICAgICovCisgICAgaWYoZ3RpZCA+PSAwICYmIEtNUF9VQkVSX0dUSUQoZ3RpZCkpCisgICAgICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgIF9fa21wX2d0aWQgPSBndGlkOworICAgICNlbmRpZgorICAgIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIGd0aWQgKTsKK30KKworI2lmIEtNUF9PU19VTklYICYmIEtNUF9EWU5BTUlDX0xJQgorCisvLyAyMDA5LTA5LTA4IChsZXYpOiBJdCBsb29rcyB0aGUgZGVzdHJ1Y3RvciBkb2VzIG5vdCB3b3JrLiBJbiBzaW1wbGUgdGVzdCBjYXNlcyBkZXN0cnVjdG9ycyB3b3JrCisvLyBwZXJmZWN0bHksIGJ1dCBpbiByZWFsIGxpYm9tcC5zbyBJIGhhdmUgbm8gZXZpZGVuY2UgaXQgaXMgZXZlciBjYWxsZWQuIEhvd2V2ZXIsIC1maW5pIGxpbmtlcgorLy8gb3B0aW9uIGluIG1ha2VmaWxlLm1rIHdvcmtzIGZpbmUuCisKK19fYXR0cmlidXRlX18oKCBkZXN0cnVjdG9yICkpCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfZHRvciggdm9pZCApCit7CisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCgpOworfQorCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfZmluaSggdm9pZCApCit7CisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCgpOworfQorCisjZW5kaWYKKworLyogW1dpbmRvd3NdIGpvc2g6IHdoZW4gdGhlIGF0ZXhpdCBoYW5kbGVyIGlzIGNhbGxlZCwgdGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGFsaXZlICovCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCB2b2lkICkKK3sKKyAgICBLQV9UUkFDRSggMzAsICggIl9fa21wX2ludGVybmFsX2VuZF9hdGV4aXRcbiIgKSApOworICAgIC8qIFtXaW5kb3dzXQorICAgICAgIGpvc2g6IGlkZWFsbHksIHdlIHdhbnQgdG8gY29tcGxldGVseSBzaHV0ZG93biB0aGUgbGlicmFyeSBpbiB0aGlzIGF0ZXhpdCBoYW5kbGVyLCBidXQKKyAgICAgICBzdGF0IGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRocmVhZCBzcGVjaWZpYyBkYXRhIGZvciBndGlkIGZhaWxzIGJlY2F1c2UgdGhhdCBkYXRhIGJlY29tZXMKKyAgICAgICB1bmF2YWlsYWJsZSBhdCBzb21lIHBvaW50IGR1cmluZyB0aGUgc2h1dGRvd24sIHNvIHdlIGNhbGwgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZAorICAgICAgIGluc3RlYWQuICBXZSBzaG91bGQgZXZlbnR1YWxseSByZW1vdmUgdGhlIGRlcGVuZGVuY3kgb24gX19rbXBfZ2V0X3NwZWNpZmljX2d0aWQgaW4gdGhlCisgICAgICAgc3RhdCBjb2RlIGFuZCB1c2UgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkgdG8gY2xlYW5seSBzaHV0ZG93biB0aGUgbGlicmFyeS4KKworLy8gVE9ETzogQ2FuIHNvbWUgb2YgdGhpcyBjb21tZW50IGFib3V0IEdWUyBiZSByZW1vdmVkPworICAgICAgIEkgc3VzcGVjdCB0aGF0IHRoZSBvZmZlbmRpbmcgc3RhdCBjb2RlIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGxpbmcgdGhyZWFkIHRyaWVzIHRvCisgICAgICAgY2xlYW4gdXAgYSBkZWFkIHJvb3QgdGhyZWFkJ3MgZGF0YSBzdHJ1Y3R1cmVzLCByZXN1bHRpbmcgaW4gR1ZTIGNvZGUgdHJ5aW5nIHRvIGNsb3NlCisgICAgICAgdGhlIEdWUyBzdHJ1Y3R1cmVzIGZvciB0aGF0IHRocmVhZCwgYnV0IHNpbmNlIHRoZSBzdGF0IGNvZGUgdXNlcworICAgICAgIF9fa21wX2dldF9zcGVjaWZpY19ndGlkIHRvIGdldCB0aGUgZ3RpZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGNhbGxpbmcgdGhyZWFkIGlzCisgICAgICAgY2xlYW5pbmcgdXAgaXRzZWxmIGluc3RlYWQgb2YgYW5vdGhlciB0aHJlYWQsIGl0IGdldHMgY29uZnVzZWQuICBUaGlzIGhhcHBlbnMgYmVjYXVzZQorICAgICAgIGFsbG93aW5nIGEgdGhyZWFkIHRvIHVucmVnaXN0ZXIgYW5kIGNsZWFudXAgYW5vdGhlciB0aHJlYWQgaXMgYSByZWNlbnQgbW9kaWZpY2F0aW9uIGZvcgorICAgICAgIGFkZHJlc3NpbmcgYW4gaXNzdWUgd2l0aCBNYXhvbiBDaW5lbWE0RC4gIEJhc2VkIG9uIHRoZSBjdXJyZW50IGRlc2lnbiAoMjAwNTA3MjIpLCBhCisgICAgICAgdGhyZWFkIG1heSBlbmQgdXAgdHJ5aW5nIHRvIHVucmVnaXN0ZXIgYW5vdGhlciB0aHJlYWQgb25seSBpZiB0aHJlYWQgZGVhdGggZG9lcyBub3QKKyAgICAgICB0cmlnZ2VyIHRoZSBjYWxsaW5nIG9mIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQuICBGb3IgTGludXgqIE9TLCB0aGVyZSBpcyB0aGUgdGhyZWFkCisgICAgICAgc3BlY2lmaWMgZGF0YSBkZXN0cnVjdG9yIGZ1bmN0aW9uIHRvIGRldGVjdCB0aHJlYWQgZGVhdGguICBGb3IgV2luZG93cyBkeW5hbWljLCB0aGVyZQorICAgICAgIGlzIERsbE1haW4oVEhSRUFEX0RFVEFDSCkuICBGb3IgV2luZG93cyBzdGF0aWMsIHRoZXJlIGlzIG5vdGhpbmcuICBUaHVzLCB0aGUKKyAgICAgICB3b3JrYXJvdW5kIGlzIGFwcGxpY2FibGUgb25seSBmb3IgV2luZG93cyBzdGF0aWMgc3RhdCBsaWJyYXJ5LgorICAgICovCisgICAgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoIC0xICk7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICAjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlYXBfdGhyZWFkKAorICAgIGttcF9pbmZvX3QgKiB0aHJlYWQsCisgICAgaW50IGlzX3Jvb3QKKykgeworCisgICAgLy8gSXQgaXMgYXNzdW1lZCBfX2ttcF9mb3Jram9pbl9sb2NrIGlzIGFjcXVpcmVkLgorCisgICAgaW50IGd0aWQ7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWQgIT0gTlVMTCApOworCisgICAgZ3RpZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc19ndGlkOworCisgICAgaWYgKCAhIGlzX3Jvb3QgKSB7CisKKyAgICAgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgICAgIC8qIEFzc3VtZSB0aGUgdGhyZWFkcyBhcmUgYXQgdGhlIGZvcmsgYmFycmllciBoZXJlICovCisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVhcF90aHJlYWQ6IHJlbGVhc2luZyBUIyVkIGZyb20gZm9yayBiYXJyaWVyIGZvciByZWFwXG4iLCBndGlkICkgKTsKKyAgICAgICAgICAgIC8qIE5lZWQgcmVsZWFzZSBmZW5jZSBoZXJlIHRvIHByZXZlbnQgc2VnIGZhdWx0cyBmb3IgdHJlZSBmb3Jram9pbiBiYXJyaWVyIChHRUgpICovCisgICAgICAgICAgICBBTk5PVEFURV9IQVBQRU5TX0JFRk9SRSh0aHJlYWQpOworICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyZWFkLT50aC50aF9iYXJbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXS5iYi5iX2dvLCB0aHJlYWQpOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV82NCgmZmxhZyk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gVGVybWluYXRlIE9TIHRocmVhZC4KKyAgICAgICAgX19rbXBfcmVhcF93b3JrZXIoIHRocmVhZCApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSB0aHJlYWQgd2FzIGtpbGxlZCBhc3luY2hyb25vdXNseS4gIElmIGl0IHdhcyBhY3RpdmVseQorICAgICAgICAvLyBzcGlubmluZyBpbiB0aGUgdGhyZWFkIHBvb2wsIGRlY3JlbWVudCB0aGUgZ2xvYmFsIGNvdW50LgorICAgICAgICAvLworICAgICAgICAvLyBUaGVyZSBpcyBhIHNtYWxsIHRpbWluZyBob2xlIGhlcmUgLSBpZiB0aGUgd29ya2VyIHRocmVhZCB3YXMKKyAgICAgICAgLy8ganVzdCB3YWtpbmcgdXAgYWZ0ZXIgc2xlZXBpbmcgaW4gdGhlIHBvb2wsIGhhZCByZXNldCBpdCdzCisgICAgICAgIC8vIHRoX2FjdGl2ZV9pbl9wb29sIGZsYWcgYnV0IG5vdCBkZWNyZW1lbnRlZCB0aGUgZ2xvYmFsIGNvdW50ZXIKKyAgICAgICAgLy8gX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCB5ZXQsIHRoZW4gdGhlIGdsb2JhbCBjb3VudGVyCisgICAgICAgIC8vIG1pZ2h0IG5vdCBnZXQgdXBkYXRlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ3VycmVudGx5LCB0aGlzIGNhbiBvbmx5IGhhcHBlbiBhcyB0aGUgbGlicmFyeSBpcyB1bmxvYWRlZCwKKyAgICAgICAgLy8gc28gdGhlcmUgYXJlIG5vIGhhcm1mdWwgc2lkZSBlZmZlY3RzLgorICAgICAgICAvLworICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgKSB7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKAorICAgICAgICAgICAgICAoa21wX2ludDMyICopICZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWNyZW1lbnQgIyBvZiBbd29ya2VyXSB0aHJlYWRzIGluIHRoZSBwb29sLgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbF9udGggPiAwICk7CisgICAgICAgIC0tX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9mcmVlX2ltcGxpY2l0X3Rhc2sodGhyZWFkKTsKKworICAgIC8vIEZyZWUgdGhlIGZhc3QgbWVtb3J5IGZvciB0YXNraW5nCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5KCB0aHJlYWQgKTsKKyAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICBfX2ttcF9zdXNwZW5kX3VuaW5pdGlhbGl6ZV90aHJlYWQoIHRocmVhZCApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1sgZ3RpZCBdID09IHRocmVhZCApOworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdLCBOVUxMKTsKKworICAgIC0tIF9fa21wX2FsbF9udGg7CisgICAgLy8gX19rbXBfbnRoIHdhcyBkZWNyZW1lbnRlZCB3aGVuIHRocmVhZCBpcyBhZGRlZCB0byB0aGUgcG9vbC4KKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgLyogQWRqdXN0IGJsb2NrdGltZSBiYWNrIHRvIHVzZXIgc2V0dGluZyBvciBkZWZhdWx0IGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBuZXZlciBoYXZlIG9jY3VycmVkICAgICAgICAgICAgICAgICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2F2YWlsX3Byb2MgPiAwICk7CisgICAgICAgIGlmICggX19rbXBfbnRoIDw9IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIC8qIGZyZWUgdGhlIG1lbW9yeSBiZWluZyB1c2VkICovCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2NvbnMgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX2NvbnNfc3RhY2soIHRocmVhZC0+dGgudGhfY29ucyApOworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9jb25zID0gTlVMTDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9CisKKyAgICBpZiAoIHRocmVhZC0+dGgudGhfcHJpX2NvbW1vbiAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9mcmVlKCB0aHJlYWQtPnRoLnRoX3ByaV9jb21tb24gKTsKKyAgICAgICAgdGhyZWFkLT50aC50aF9wcmlfY29tbW9uID0gTlVMTDsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKHRocmVhZC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWQtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayk7CisgICAgICAgIHRocmVhZC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrID0gTlVMTDsKKyAgICB9CisKKyAgICAjaWYgS01QX1VTRV9CR0VUCisgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZpbmFsaXplX2JnZXQoIHRocmVhZCApOworICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGlmICggdGhyZWFkLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwgKSB7CisgICAgICAgIEtNUF9DUFVfRlJFRSggdGhyZWFkLT50aC50aF9hZmZpbl9tYXNrICk7CisgICAgICAgIHRocmVhZC0+dGgudGhfYWZmaW5fbWFzayA9IE5VTEw7CisgICAgfTsgLy8gaWYKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBfX2ttcF9yZWFwX3RlYW0oIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtID0gTlVMTDsKKyAgICBfX2ttcF9mcmVlKCB0aHJlYWQgKTsKKworICAgIEtNUF9NQigpOworCit9IC8vIF9fa21wX3JlYXBfdGhyZWFkCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEZpcnN0LCB1bnJlZ2lzdGVyIHRoZSBsaWJyYXJ5ICovCisgICAgX19rbXBfdW5yZWdpc3Rlcl9saWJyYXJ5KCk7CisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLyogSW4gV2luIHN0YXRpYyBsaWJyYXJ5LCB3ZSBjYW4ndCB0ZWxsIHdoZW4gYSByb290IGFjdHVhbGx5IGRpZXMsIHNvIHdlCisgICAgICAgICAgIHJlY2xhaW0gdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgYW55IHJvb3QgdGhyZWFkcyB0aGF0IGhhdmUgZGllZCBidXQgbm90CisgICAgICAgICAgIHVucmVnaXN0ZXJlZCB0aGVtc2VsdmVzLCBpbiBvcmRlciB0byBzaHV0IGRvd24gY2xlYW5seS4KKyAgICAgICAgICAgSW4gV2luIGR5bmFtaWMgbGlicmFyeSB3ZSBhbHNvIGNhbid0IHRlbGwgd2hlbiBhIHRocmVhZCBkaWVzLgorICAgICAgICAqLworICAgICAgICBfX2ttcF9yZWNsYWltX2RlYWRfcm9vdHMoKTsgLy8gQUM6IG1vdmVkIGhlcmUgdG8gYWx3YXlzIGNsZWFuIHJlc291cmNlcyBvZiBkZWFkIHJvb3RzCisgICAgI2VuZGlmCisKKyAgICBmb3IoIGk9MCA7IGk8X19rbXBfdGhyZWFkc19jYXBhY2l0eSA7IGkrKyApCisgICAgICAgIGlmKCBfX2ttcF9yb290W2ldICkKKyAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2ldLT5yLnJfYWN0aXZlICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBUQ1dfU1lOQ180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgVFJVRSk7CisKKyAgICBpZiAoIGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICkgeworI2lmIEtNUF9VU0VfTU9OSVRPUgorICAgICAgICAvLyAyMDA5LTA5LTA4IChsZXYpOiBPdGhlciBhbGl2ZSByb290cyBmb3VuZC4gV2h5IGRvIHdlIGtpbGwgdGhlIG1vbml0b3I/PworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvLworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIHRoYXQgbW9uaXRvciB3YXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHJlYXBpbmcgaXQuCisgICAgICAgIC8vIElmIHdlIGFyZSBjYWxsZWQgZm9ybSBfX2ttcF9hdGZvcmtfY2hpbGQgKHdoaWNoIHNldHMKKyAgICAgICAgLy8gX19rbXBfaW5pdF9wYXJhbGxlbCA9IDApLCB0aGVuIF9fa21wX21vbml0b3Igd2lsbCBhcHBlYXIgdG8KKyAgICAgICAgLy8gY29udGFpbiB2YWxpZCBkYXRhLCBidXQgaXQgaXMgb25seSB2YWxpZCBpbiB0aGUgcGFyZW50IHByb2Nlc3MsCisgICAgICAgIC8vIG5vdCB0aGUgY2hpbGQuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5ldyBiZWhhdmlvciAoMjAxMDA4KTogaW5zdGVhZCBvZiBrZXlpbmcgb2ZmIG9mIHRoZSBmbGFnCisgICAgICAgIC8vIF9fa21wX2luaXRfcGFyYWxsZWwsIHRoZSBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiBpcyBrZXllZCBvZmYKKyAgICAgICAgLy8gb2YgdGhlIG5ldyBmbGFnIF9fa21wX2luaXRfbW9uaXRvci4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfaW5pdF9tb25pdG9yICkgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWFwX21vbml0b3IoICYgX19rbXBfbW9uaXRvciApOworICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMCApOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IG1vbml0b3IgcmVhcGVkXG4iICkgKTsKKyNlbmRpZiAvLyBLTVBfVVNFX01PTklUT1IKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUT0RPIG1vdmUgdGhpcyB0byBjbGVhbnVwIGNvZGUgKi8KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZyBoYXMgcHJvcGVybHkgZW5kZWQgKi8KKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2ldICkgeworLy8gICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoICEgS01QX1VCRVJfR1RJRCggaSApICk7ICAgICAgICAgLy8gQUM6IHRoZXJlIGNhbiBiZSB1YmVyIHRocmVhZHMgYWxpdmUgaGVyZQorICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKCAhIF9fa21wX3Jvb3RbaV0tPnIucl9hY3RpdmUgKTsgIC8vIFRPRE86IGNhbiB0aGV5IGJlIGFjdGl2ZT8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIC8vIFJlYXAgdGhlIHdvcmtlciB0aHJlYWRzLgorICAgICAgICAvLyBUaGlzIGlzIHZhbGlkIGZvciBub3csIGJ1dCBiZSBjYXJlZnVsIGlmIHRocmVhZHMgYXJlIHJlYXBlZCBzb29uZXIuCisgICAgICAgIHdoaWxlICggX19rbXBfdGhyZWFkX3Bvb2wgIT0gTlVMTCApIHsgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdGhyZWFkIGluIHRoZSBwb29sLgorICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHRocmVhZCBmcm9tIHRoZSBwb29sLgorICAgICAgICAgICAga21wX2luZm9fdCAqIHRocmVhZCA9IChrbXBfaW5mb190ICopIF9fa21wX3RocmVhZF9wb29sOworICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2wgPSB0aHJlYWQtPnRoLnRoX25leHRfcG9vbDsKKyAgICAgICAgICAgIC8vIFJlYXAgaXQuCisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCA9IE5VTEw7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICAgIF9fa21wX3JlYXBfdGhyZWFkKCB0aHJlYWQsIDAgKTsKKyAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKworICAgICAgICAvLyBSZWFwIHRlYW1zLgorICAgICAgICB3aGlsZSAoIF9fa21wX3RlYW1fcG9vbCAhPSBOVUxMICkgeyAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdGVhbXMgaW4gdGhlIHBvb2wuCisgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdGVhbSBmcm9tIHRoZSBwb29sLgorICAgICAgICAgICAga21wX3RlYW1fdCAqIHRlYW0gPSAoa21wX3RlYW1fdCAqKSBfX2ttcF90ZWFtX3Bvb2w7CisgICAgICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgPSB0ZWFtLT50LnRfbmV4dF9wb29sOworICAgICAgICAgICAgLy8gUmVhcCBpdC4KKyAgICAgICAgICAgIHRlYW0tPnQudF9uZXh0X3Bvb2wgPSBOVUxMOworICAgICAgICAgICAgX19rbXBfcmVhcF90ZWFtKCB0ZWFtICk7CisgICAgICAgIH07IC8vIHdoaWxlCisKKyAgICAgICAgX19rbXBfcmVhcF90YXNrX3RlYW1zKCApOworCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKysgaSApIHsKKyAgICAgICAgICAgIC8vIFRCRDogQWRkIHNvbWUgY2hlY2tpbmcuLi4KKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyBsaWtlIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZFsgaSBdID09IE5VTEwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgdGhyZWFkcHJpdmF0ZSBkZXN0cnVjdG9ycyBnZXQgcnVuIGJ5IGpvaW5pbmcgd2l0aCBhbGwgd29ya2VyCisgICAgICAgICAgIHRocmVhZHMgYmVmb3JlIHJlc2V0dGluZyB0aGlzIGZsYWcgKi8KKyAgICAgICAgVENXX1NZTkNfNChfX2ttcF9pbml0X2NvbW1vbiwgRkFMU0UpOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IGFsbCB3b3JrZXJzIHJlYXBlZFxuIiApICk7CisgICAgICAgIEtNUF9NQigpOworCisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgICAgIC8vCisgICAgICAgIC8vIFNlZSBub3RlIGFib3ZlOiBPbmUgb2YgdGhlIHBvc3NpYmxlIGZpeGVzIGZvciBDUTEzODQzNCAvIENRMTQwMTI2CisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBwdXNoIGJvdGggY29kZSBmcmFnbWVudHMgZG93biBhbmQgQ1NFIHRoZW0/CisgICAgICAgIC8vIHB1c2ggdGhlbSBpbnRvIF9fa21wX2NsZWFudXAoKSA/CisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIGlmICggVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yKCAmIF9fa21wX21vbml0b3IgKTsKKyAgICAgICAgICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kOiBtb25pdG9yIHJlYXBlZFxuIiApICk7CisjZW5kaWYKKyAgICB9IC8qIGVsc2UgIV9fa21wX2dsb2JhbC50X2FjdGl2ZSAqLworICAgIFRDV180KF9fa21wX2luaXRfZ3RpZCwgRkFMU0UpOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgX19rbXBfY2xlYW51cCgpOworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfZmluaSgpOworI2VuZGlmCit9CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCBpbnQgZ3RpZF9yZXEgKQoreworICAgIC8qIGlmIHdlIGhhdmUgYWxyZWFkeSBjbGVhbmVkIHVwLCBkb24ndCB0cnkgYWdhaW4sIGl0IHdvdWxkbid0IGJlIHByZXR0eSAqLworICAgIC8qIHRoaXMgc2hvdWxkbid0IGJlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSBfX2ttcF9pbnRlcm5hbF9lbmQoKSBpcyB0aGUKKyAgICAgKiBvbmx5IHBsYWNlIHRvIGNsZWFyIF9fa21wX3NlcmlhbF9pbml0ICovCisgICAgLyogd2UnbGwgY2hlY2sgdGhpcyBsYXRlciB0b28sIGFmdGVyIHdlIGdldCB0aGUgbG9jayAqLworICAgIC8vIDIwMDktMDktMDY6IFdlIGRvIG5vdCBzZXQgZ19hYm9ydCB3aXRob3V0IHNldHRpbmcgZ19kb25lLiBUaGlzIGNoZWNrIGxvb2tzIHJlZHVuZGFhbnQsCisgICAgLy8gYmVjYXVzZSB0aGUgbmV4dCBjaGVjayB3aWxsIHdvcmsgaW4gYW55IGNhc2UuCisgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMSwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogYWJvcnQsIGV4aXRpbmdcbiIgKSk7CisgICAgICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgfHwgIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGFscmVhZHkgZmluaXNoZWRcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLyogZmluZCBvdXQgd2hvIHdlIGFyZSBhbmQgd2hhdCB3ZSBzaG91bGQgZG8gKi8KKyAgICB7CisgICAgICAgIGludCBndGlkID0gKGd0aWRfcmVxPj0wKSA/IGd0aWRfcmVxIDogX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBlbnRlciBUIyVkICAoJWQpXG4iLCBndGlkLCBndGlkX3JlcSApKTsKKyAgICAgICAgaWYoIGd0aWQgPT0gS01QX0dUSURfU0hVVERPV04gKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6ICFfX2ttcF9pbml0X3J1bnRpbWUsIHN5c3RlbSBhbHJlYWR5IHNodXRkb3duXG4iICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYoIGd0aWQgPT0gS01QX0dUSURfTU9OSVRPUiApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogbW9uaXRvciB0aHJlYWQsIGd0aWQgbm90IHJlZ2lzdGVyZWQsIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBndGlkID09IEtNUF9HVElEX0RORSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogZ3RpZCBub3QgcmVnaXN0ZXJlZCBvciBzeXN0ZW0gc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICAvKiB3ZSBkb24ndCBrbm93IHdobyB3ZSBhcmUsIGJ1dCB3ZSBtYXkgc3RpbGwgc2h1dGRvd24gdGhlIGxpYnJhcnkgKi8KKyAgICAgICAgfSBlbHNlIGlmKCBLTVBfVUJFUl9HVElEKCBndGlkICkpIHsKKyAgICAgICAgICAgIC8qIHVucmVnaXN0ZXIgb3Vyc2VsdmVzIGFzIGFuIHViZXIgdGhyZWFkLiAgZ3RpZCBpcyBubyBsb25nZXIgdmFsaWQgKi8KKyAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2d0aWRdLT5yLnJfYWN0aXZlICkgeworICAgICAgICAgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPSAtMTsKKyAgICAgICAgICAgICAgICBUQ1dfU1lOQ180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiByb290IHN0aWxsIGFjdGl2ZSwgYWJvcnQgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogdW5yZWdpc3RlcmluZyBzaWJsaW5nIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICAgICAgX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkKCBndGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiB3b3JrZXIgdGhyZWFkcyBtYXkgY2FsbCB0aGlzIGZ1bmN0aW9uIHRocm91Z2ggdGhlIGF0ZXhpdCBoYW5kbGVyLCBpZiB0aGV5IGNhbGwgZXhpdCgpICovCisgICAgICAgICAgICAvKiBGb3Igbm93LCBza2lwIHRoZSB1c3VhbCBzdWJzZXF1ZW50IHByb2Nlc3NpbmcgYW5kIGp1c3QgZHVtcCB0aGUgZGVidWcgYnVmZmVyLgorICAgICAgICAgICAgICAgVE9ETzogZG8gYSB0aG9yb3VnaCBzaHV0ZG93biBpbnN0ZWFkCisgICAgICAgICAgICAqLworICAgICAgICAgICAgI2lmZGVmIERVTVBfREVCVUdfT05fRVhJVAorICAgICAgICAgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzeW5jaHJvbml6ZSB0aGUgdGVybWluYXRpb24gcHJvY2VzcyAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICAvKiBoYXZlIHdlIGFscmVhZHkgZmluaXNoZWQgKi8KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRoaXMgbG9jayB0byBlbmZvcmNlIG11dGV4IGJldHdlZW4gdGhpcyByZWFkaW5nIG9mCisgICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSBhbmQgdGhlIHdyaXRpbmcgYnkgX19rbXBfcmVnaXN0ZXJfcm9vdC4KKyAgICAgICBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gdXNlIGEgY291bnRlciBvZiByb290cyB0aGF0IGlzCisgICAgICAgYXRvbWljYWxseSB1cGRhdGVkIGJ5IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZywKKyAgICAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSBhbmQgX19rbXBfaW50ZXJuYWxfZW5kXyouCisgICAgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgLyogbm93IHdlIGNhbiBzYWZlbHkgY29uZHVjdCB0aGUgYWN0dWFsIHRlcm1pbmF0aW9uICovCisgICAgX19rbXBfaW50ZXJuYWxfZW5kKCk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGV4aXRcbiIgKSApOworCisgICAgI2lmZGVmIERVTVBfREVCVUdfT05fRVhJVAorICAgICAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApCisgICAgICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlcigpOworICAgICNlbmRpZgorCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX2Nsb3NlX2NvbnNvbGUoKTsKKyAgICAjZW5kaWYKKworICAgIF9fa21wX2ZpbmlfYWxsb2NhdG9yKCk7CisKK30gLy8gX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkKKwordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggaW50IGd0aWRfcmVxICkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIGlmIHdlIGhhdmUgYWxyZWFkeSBjbGVhbmVkIHVwLCBkb24ndCB0cnkgYWdhaW4sIGl0IHdvdWxkbid0IGJlIHByZXR0eSAqLworICAgIC8qIHRoaXMgc2hvdWxkbid0IGJlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSBfX2ttcF9pbnRlcm5hbF9lbmQoKSBpcyB0aGUKKyAgICAgKiBvbmx5IHBsYWNlIHRvIGNsZWFyIF9fa21wX3NlcmlhbF9pbml0ICovCisgICAgLyogd2UnbGwgY2hlY2sgdGhpcyBsYXRlciB0b28sIGFmdGVyIHdlIGdldCB0aGUgbG9jayAqLworICAgIC8vIDIwMDktMDktMDY6IFdlIGRvIG5vdCBzZXQgZ19hYm9ydCB3aXRob3V0IHNldHRpbmcgZ19kb25lLiBUaGlzIGNoZWNrIGxvb2tzIHJlZHVuZGFudCwKKyAgICAvLyBiZWNhdXNlIHRoZSBuZXh0IGNoZWNrIHdpbGwgd29yayBpbiBhbnkgY2FzZS4KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDExLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGFib3J0LCBleGl0aW5nXG4iICkpOworICAgICAgICAvKiBUT0RPIGFib3J0PyAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGFscmVhZHkgZmluaXNoZWRcbiIgKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIC8qIGZpbmQgb3V0IHdobyB3ZSBhcmUgYW5kIHdoYXQgd2Ugc2hvdWxkIGRvICovCisgICAgeworICAgICAgICBpbnQgZ3RpZCA9IChndGlkX3JlcT49MCkgPyBndGlkX3JlcSA6IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBlbnRlciBUIyVkICAoJWQpXG4iLCBndGlkLCBndGlkX3JlcSApKTsKKyAgICAgICAgaWYoIGd0aWQgPT0gS01QX0dUSURfU0hVVERPV04gKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogIV9fa21wX2luaXRfcnVudGltZSwgc3lzdGVtIGFscmVhZHkgc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IG1vbml0b3IgdGhyZWFkLCBndGlkIG5vdCByZWdpc3RlcmVkLCBvciBzeXN0ZW0gc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9ETkUgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZ3RpZCBub3QgcmVnaXN0ZXJlZCBvciBzeXN0ZW0gc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAvKiB3ZSBkb24ndCBrbm93IHdobyB3ZSBhcmUgKi8KKyAgICAgICAgfSBlbHNlIGlmKCBLTVBfVUJFUl9HVElEKCBndGlkICkpIHsKKyAgICAgICAgLyogdW5yZWdpc3RlciBvdXJzZWx2ZXMgYXMgYW4gdWJlciB0aHJlYWQuICBndGlkIGlzIG5vIGxvbmdlciB2YWxpZCAqLworICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbZ3RpZF0tPnIucl9hY3RpdmUgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IC0xOworICAgICAgICAgICAgICAgIFRDV19TWU5DXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogcm9vdCBzdGlsbCBhY3RpdmUsIGFib3J0IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogdW5yZWdpc3RlcmluZyBzaWJsaW5nIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICAgICAgX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkKCBndGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBqdXN0IGEgd29ya2VyIHRocmVhZCwgbGV0J3MgbGVhdmUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiB3b3JrZXIgdGhyZWFkIFQjJWRcbiIsIGd0aWQgKSk7CisKKyAgICAgICAgICAgIGlmICggZ3RpZCA+PSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiB3b3JrZXIgdGhyZWFkIGRvbmUsIGV4aXRpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAjaWYgZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKyAgICAvLyBBQzogbGV0cyBub3Qgc2h1dGRvd24gdGhlIExpbnV4KiBPUyBkeW5hbWljIGxpYnJhcnkgYXQgdGhlIGV4aXQgb2YgdWJlciB0aHJlYWQsCisgICAgLy8gICAgIGJlY2F1c2Ugd2Ugd2lsbCBiZXR0ZXIgc2h1dGRvd24gbGF0ZXIgaW4gdGhlIGxpYnJhcnkgZGVzdHJ1Y3Rvci4KKyAgICAvLyAgICAgVGhlIHJlYXNvbiBvZiB0aGlzIGNoYW5nZSBpcyBwZXJmb3JtYW5jZSBwcm9ibGVtIHdoZW4gbm9uLW9wZW5tcCB0aHJlYWQKKyAgICAvLyAgICAgaW4gYSBsb29wIGZvcmtzIGFuZCBqb2lucyBtYW55IG9wZW5tcCB0aHJlYWRzLiBXZSBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lCisgICAgLy8gICAgIGtlZXBpbmcgd29ya2VyIHRocmVhZHMgYWxpdmUgdW50aWwgdGhlIHByb2dyYW0gc2h1dGRvd24uCisgICAgLy8gT006IFJlbW92ZWQgTGludXgqIE9TIHJlc3RyaWN0aW9uIHRvIGZpeCB0aGUgY3Jhc2ggb24gT1MgWCogKERQRDIwMDIzOTk2NikgYW5kCisgICAgLy8gICAgIFdpbmRvd3MoRFBEMjAwMjg3NDQzKSB0aGF0IG9jY3VycyB3aGVuIHVzaW5nIGNyaXRpY2FsIHNlY3Rpb25zIGZyb20gZm9yZWlnbiB0aHJlYWRzLgorICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZXhpdGluZyBUIyVkXG4iLCBndGlkX3JlcSkgKTsKKyAgICAgICAgcmV0dXJuOworICAgICNlbmRpZgorICAgIC8qIHN5bmNocm9uaXplIHRoZSB0ZXJtaW5hdGlvbiBwcm9jZXNzICovCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIC8qIGhhdmUgd2UgYWxyZWFkeSBmaW5pc2hlZCAqLworICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWJvcnQsIGV4aXRpbmdcbiIgKSk7CisgICAgICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgfHwgIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogV2UgbmVlZCB0aGlzIGxvY2sgdG8gZW5mb3JjZSBtdXRleCBiZXR3ZWVuIHRoaXMgcmVhZGluZyBvZgorICAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgYW5kIHRoZSB3cml0aW5nIGJ5IF9fa21wX3JlZ2lzdGVyX3Jvb3QuCisgICAgICAgQWx0ZXJuYXRpdmVseSwgd2UgY2FuIHVzZSBhIGNvdW50ZXIgb2Ygcm9vdHMgdGhhdCBpcworICAgICAgIGF0b21pY2FsbHkgdXBkYXRlZCBieSBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcsCisgICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUgYW5kIF9fa21wX2ludGVybmFsX2VuZF8qLgorICAgICovCisKKyAgICAvKiBzaG91bGQgd2UgZmluaXNoIHRoZSBydW4tdGltZT8gIGFyZSBhbGwgc2libGluZ3MgZG9uZT8gKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBpICkgeworICAgICAgICBpZiAoIEtNUF9VQkVSX0dUSUQoIGkgKSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiByZW1haW5pbmcgc2libGluZyB0YXNrOiBndGlkPT0lZFxuIiwgaSApKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9OworICAgIH0KKworICAgIC8qIG5vdyB3ZSBjYW4gc2FmZWx5IGNvbmR1Y3QgdGhlIGFjdHVhbCB0ZXJtaW5hdGlvbiAqLworCisgICAgX19rbXBfaW50ZXJuYWxfZW5kKCk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZXhpdCBUIyVkXG4iLCBndGlkX3JlcSApICk7CisKKyAgICAjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkKKyAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgI2VuZGlmCit9IC8vIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlicmFyeSByZWdpc3RyYXRpb24gc3R1ZmYuCisKK3N0YXRpYyBsb25nICAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgPSAwOworICAgIC8vIFJhbmRvbSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24uCitzdGF0aWMgY2hhciAqIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgID0gTlVMTDsKKyAgICAvLyBWYWx1ZSB0byBiZSBzYXZlZCBpbiBlbnYgdmFyIF9fS01QX1JFR0lTVEVSRURfTElCXzxwaWQ+LgorCisKK3N0YXRpYyBpbmxpbmUKK2NoYXIgKgorX19rbXBfcmVnX3N0YXR1c19uYW1lKCkgeworICAgIC8qCisgICAgICAgIE9uIFJIRUwgM3U1IGlmIGxpbmtlZCBzdGF0aWNhbGx5LCBnZXRwaWQoKSByZXR1cm5zIGRpZmZlcmVudCB2YWx1ZXMgaW4gZWFjaCB0aHJlYWQuCisgICAgICAgIElmIHJlZ2lzdHJhdGlvbiBhbmQgdW5yZWdpc3RyYXRpb24gZ28gaW4gZGlmZmVyZW50IHRocmVhZHMgKG9tcF9taXNjX290aGVyX3Jvb3RfZXhpdC5jcHAgdGVzdCBjYXNlKSwKKyAgICAgICAgdGhlIG5hbWUgb2YgcmVnaXN0ZXJlZF9saWJfZW52IGVudiB2YXIgY2FuIG5vdCBiZSBmb3VuZCwgYmVjYXVzZSB0aGUgbmFtZSB3aWxsIGNvbnRhaW4gZGlmZmVyZW50IHBpZC4KKyAgICAqLworICAgIHJldHVybiBfX2ttcF9zdHJfZm9ybWF0KCAiX19LTVBfUkVHSVNURVJFRF9MSUJfJWQiLCAoaW50KSBnZXRwaWQoKSApOworfSAvLyBfX2ttcF9yZWdfc3RhdHVzX2dldAorCisKK3ZvaWQKK19fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cCgKKyAgICB2b2lkCispIHsKKworICAgIGNoYXIgKiBuYW1lICAgPSBfX2ttcF9yZWdfc3RhdHVzX25hbWUoKTsgIC8vIE5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgIGludCAgICBkb25lICAgPSAwOworICAgIHVuaW9uIHsKKyAgICAgICAgZG91YmxlIGR0aW1lOworICAgICAgICBsb25nICAgbHRpbWU7CisgICAgfSB0aW1lOworICAgICNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgICAgIF9fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soKTsKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCAmIHRpbWUuZHRpbWUgKTsKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDB4Q0FGRTAwMDBMIHwgKCB0aW1lLmx0aW1lICYgMHgwMDAwRkZGRkwgKTsKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fc3RyID0KKyAgICAgICAgX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICIlcC0lbHgtJXMiLAorICAgICAgICAgICAgJiBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZywKKyAgICAgICAgICAgIF9fa21wX3JlZ2lzdHJhdGlvbl9mbGFnLAorICAgICAgICAgICAgS01QX0xJQlJBUllfRklMRQorICAgICAgICApOworCisgICAgS0FfVFJBQ0UoIDUwLCAoICJfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXA6ICVzPVwiJXNcIlxuIiwgbmFtZSwgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApICk7CisKKyAgICB3aGlsZSAoICEgZG9uZSApIHsKKworICAgICAgICBjaGFyICogdmFsdWUgID0gTlVMTDsgLy8gQWN0dWFsIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworICAgICAgICAvLyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUsIGJ1dCBkbyBub3Qgb3ZlcndyaXRlIGlmIGl0IGlzIGV4aXN0LgorICAgICAgICBfX2ttcF9lbnZfc2V0KCBuYW1lLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyLCAwICk7CisgICAgICAgIC8vIENoZWNrIHRoZSB2YXJpYWJsZSBpcyB3cml0dGVuLgorICAgICAgICB2YWx1ZSA9IF9fa21wX2Vudl9nZXQoIG5hbWUgKTsKKyAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICYmIHN0cmNtcCggdmFsdWUsIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgKSA9PSAwICkgeworCisgICAgICAgICAgICBkb25lID0gMTsgICAgLy8gT2ssIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBzdWNjZXNzZnVsbHksIGV4aXQgdGhlIGxvb3AuCisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gT29wcy4gV3JpdGUgZmFpbGVkLiBBbm90aGVyIGNvcHkgb2YgT3Blbk1QIFJUTCBpcyBpbiBtZW1vcnkuCisgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGl0IGFsaXZlIG9yIGRlYWQuCisgICAgICAgICAgICBpbnQgICAgbmVpZ2hib3IgPSAwOyAvLyAwIC0tIHVua25vd24gc3RhdHVzLCAxIC0tIGFsaXZlLCAyIC0tIGRlYWQuCisgICAgICAgICAgICBjaGFyICogdGFpbCAgICAgICAgICA9IHZhbHVlOworICAgICAgICAgICAgY2hhciAqIGZsYWdfYWRkcl9zdHIgPSBOVUxMOworICAgICAgICAgICAgY2hhciAqIGZsYWdfdmFsX3N0ciAgPSBOVUxMOworICAgICAgICAgICAgY2hhciBjb25zdCAqIGZpbGVfbmFtZSAgICAgPSBOVUxMOworICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnLScsICYgZmxhZ19hZGRyX3N0ciwgJiB0YWlsICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICctJywgJiBmbGFnX3ZhbF9zdHIsICAmIHRhaWwgKTsKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IHRhaWw7CisgICAgICAgICAgICBpZiAoIHRhaWwgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBsb25nICogZmxhZ19hZGRyID0gMDsKKyAgICAgICAgICAgICAgICBsb25nICAgZmxhZ192YWwgID0gMDsKKyAgICAgICAgICAgICAgICBLTVBfU1NDQU5GKCBmbGFnX2FkZHJfc3RyLCAiJXAiLCAgJiBmbGFnX2FkZHIgKTsKKyAgICAgICAgICAgICAgICBLTVBfU1NDQU5GKCBmbGFnX3ZhbF9zdHIsICAiJWx4IiwgJiBmbGFnX3ZhbCAgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGZsYWdfYWRkciAhPSAwICYmIGZsYWdfdmFsICE9IDAgJiYgc3RyY21wKCBmaWxlX25hbWUsICIiICkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIGNoZWNrIHdoZXRoZXIgZW52aXJvbm1lbnQtZW5jb2RlZCBhZGRyZXNzIGlzIG1hcHBlZCBpbnRvIGFkZHIgc3BhY2UuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHNvLCBkZXJlZmVyZW5jZSBpdCB0byBzZWUgaWYgaXQgc3RpbGwgaGFzIHRoZSByaWdodCB2YWx1ZS4KKworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2lzX2FkZHJlc3NfbWFwcGVkKCBmbGFnX2FkZHIgKSAmJiAqIGZsYWdfYWRkciA9PSBmbGFnX3ZhbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgdGhlbiB3ZSBrbm93IHRoZSBvdGhlciBjb3B5IG9mIHRoZSBsaWJyYXJ5IGlzIG5vIGxvbmdlciBydW5uaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3IgPSAyOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgc3dpdGNoICggbmVpZ2hib3IgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwIDogICAgICAvLyBDYW5ub3QgcGFyc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgLS0gbmVpZ2hib3Igc3RhdHVzIHVua25vd24uCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBpdCBpcyB0aGUgaW5jb21wYXRpYmxlIGZvcm1hdCBvZiBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSBvdGhlciBsaWJyYXJ5IGlzIGFsaXZlLgorICAgICAgICAgICAgICAgICAgICAvLyBXQVJOKCAuLi4gKTsgLy8gVE9ETzogSXNzdWUgYSB3YXJuaW5nLgorICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSAidW5rbm93biBsaWJyYXJ5IjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW50aW9uISBGYWxsaW5nIHRvIHRoZSBuZXh0IGNhc2UuIFRoYXQncyBpbnRlbnRpb25hbC4KKyAgICAgICAgICAgICAgICBjYXNlIDEgOiB7ICAgIC8vIE5laWdoYm9yIGlzIGFsaXZlLgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpdCBpcyBhbGxvd2VkLgorICAgICAgICAgICAgICAgICAgICBjaGFyICogZHVwbGljYXRlX29rID0gX19rbXBfZW52X2dldCggIktNUF9EVVBMSUNBVEVfTElCX09LIiApOworICAgICAgICAgICAgICAgICAgICBpZiAoICEgX19rbXBfc3RyX21hdGNoX3RydWUoIGR1cGxpY2F0ZV9vayApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCdzIG5vdCBhbGxvd2VkLiBJc3N1ZSBmYXRhbCBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggRHVwbGljYXRlTGlicmFyeSwgS01QX0xJQlJBUllfRklMRSwgZmlsZV9uYW1lICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggRHVwbGljYXRlTGlicmFyeSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggZHVwbGljYXRlX29rICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDE7ICAgIC8vIEV4aXQgdGhlIGxvb3AuCisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOiB7ICAgIC8vIE5laWdoYm9yIGlzIGRlYWQuCisgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB2YXJpYWJsZSBhbmQgdHJ5IHRvIHJlZ2lzdGVyIGxpYnJhcnkgYWdhaW4uCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2Vudl91bnNldCggbmFtZSApOworICAgICAgICAgICAgICAgIH0gIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfTsgLy8gc3dpdGNoCisKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHZhbHVlICk7CisKKyAgICB9OyAvLyB3aGlsZQorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBuYW1lICk7CisKK30gLy8gZnVuYyBfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAKKworCit2b2lkCitfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkoIHZvaWQgKSB7CisKKyAgICBjaGFyICogbmFtZSAgPSBfX2ttcF9yZWdfc3RhdHVzX25hbWUoKTsKKyAgICBjaGFyICogdmFsdWUgPSBfX2ttcF9lbnZfZ2V0KCBuYW1lICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyAhPSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgIT0gTlVMTCApOworICAgIGlmICggdmFsdWUgIT0gTlVMTCAmJiBzdHJjbXAoIHZhbHVlLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICkgPT0gMCApIHsKKyAgICAgICAgLy8gT2ssIHRoaXMgaXMgb3VyIHZhcmlhYmxlLiBEZWxldGUgaXQuCisgICAgICAgIF9fa21wX2Vudl91bnNldCggbmFtZSApOworICAgIH07IC8vIGlmCisKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCB2YWx1ZSApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBuYW1lICk7CisKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDA7CisgICAgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgPSBOVUxMOworCit9IC8vIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeQorCisKKy8vIEVuZCBvZiBMaWJyYXJ5IHJlZ2lzdHJhdGlvbiBzdHVmZi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorCitzdGF0aWMgdm9pZCBfX2ttcF9jaGVja19taWNfdHlwZSgpCit7CisgICAga21wX2NwdWlkX3QgY3B1aWRfc3RhdGUgPSB7MH07CisgICAga21wX2NwdWlkX3QgKiBjc19wID0gJmNwdWlkX3N0YXRlOworICAgIF9fa21wX3g4Nl9jcHVpZCgxLCAwLCBjc19wKTsKKyAgICAvLyBXZSBkb24ndCBzdXBwb3J0IG1pYzEgYXQgdGhlIG1vbWVudAorICAgIGlmKCAoY3NfcC0+ZWF4ICYgMHhmZjApID09IDB4QjEwICkgeworICAgICAgICBfX2ttcF9taWNfdHlwZSA9IG1pYzI7CisgICAgfSBlbHNlIGlmKCAoY3NfcC0+ZWF4ICYgMHhmMGZmMCkgPT0gMHg1MDY3MCApIHsKKyAgICAgICAgX19rbXBfbWljX3R5cGUgPSBtaWMzOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX21pY190eXBlID0gbm9uX21pYzsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgaSwgZ3RpZDsKKyAgICBpbnQgc2l6ZTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogZW50ZXJcbiIgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfaW50MzIgKSA9PSA0ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfdWludDMyICkgPT0gNCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX2ludDY0ICkgPT0gOCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX3VpbnQ2NCApID09IDggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF9pbnRwdHJfdCApID09IHNpemVvZiggdm9pZCAqICkgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcHJlX2luaXQoKTsKKyNlbmRpZgorCisgICAgX19rbXBfdmFsaWRhdGVfbG9ja3MoKTsKKworICAgIC8qIEluaXRpYWxpemUgaW50ZXJuYWwgbWVtb3J5IGFsbG9jYXRvciAqLworICAgIF9fa21wX2luaXRfYWxsb2NhdG9yKCk7CisKKyAgICAvKiBSZWdpc3RlciB0aGUgbGlicmFyeSBzdGFydHVwIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgIGFuZCBjaGVjayB0byBzZWUgd2hldGhlciBhbm90aGVyIGNvcHkgb2YgdGhlIGxpYnJhcnkgaXMgYWxyZWFkeQorICAgICAgIHJlZ2lzdGVyZWQuICovCisKKyAgICBfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAoICk7CisKKyAgICAvKiBUT0RPIHJlaW5pdGlhbGl6YXRpb24gb2YgbGlicmFyeSAqLworICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogcmVpbml0aWFsaXphdGlvbiBvZiBsaWJyYXJ5XG4iICkgKTsKKyAgICB9CisKKyAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gMDsKKyAgICBUQ1dfU1lOQ180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgRkFMU0UpOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgbG9ja3MgKi8KKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpOworI2VuZGlmCisjZW5kaWYKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIF9fa21wX3N0YXRzX2luaXQoKTsKKyNlbmRpZgorICAgIF9fa21wX2luaXRfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jayAgICAgKTsKKyAgICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayggJiBfX2ttcF9kaXNwYXRjaF9sb2NrICk7CisgICAgX19rbXBfaW5pdF9sb2NrKCAmIF9fa21wX2RlYnVnX2xvY2sgICAgICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2sgICAgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xaSAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzJpICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfNGkgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja180ciAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhpICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOHIgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184YyAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzEwciApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTZyICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNmMgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzIwYyApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMzJjICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiBfX2ttcF9mb3Jram9pbl9sb2NrICApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfZXhpdF9sb2NrICAgICAgKTsKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayAgICk7CisjZW5kaWYKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3RwX2NhY2hlZF9sb2NrICk7CisKKyAgICAvKiBjb25kdWN0IGluaXRpYWxpemF0aW9uIGFuZCBpbml0aWFsIHNldHVwIG9mIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIF9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSgpOworCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgX19rbXBfY2hlY2tfbWljX3R5cGUoKTsKKyNlbmRpZgorCisgICAgLy8gU29tZSBnbG9iYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gbW92ZWQgaGVyZSBmcm9tIGttcF9lbnZfaW5pdGlhbGl6ZSgpCisjaWZkZWYgS01QX0RFQlVHCisgICAga21wX2RpYWcgPSAwOworI2VuZGlmCisgICAgX19rbXBfYWJvcnRfZGVsYXkgPSAwOworCisgICAgLy8gRnJvbSBfX2ttcF9pbml0X2RmbHRfdGVhbV9udGgoKQorICAgIC8qIGFzc3VtZSB0aGUgZW50aXJlIG1hY2hpbmUgd2lsbCBiZSB1c2VkICovCisgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3hwcm9jOworICAgIGlmKCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBLTVBfTUlOX05USDsKKyAgICB9CisgICAgaWYoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3N5c19tYXhfbnRoOworICAgIH0KKyAgICBfX2ttcF9tYXhfbnRoID0gX19rbXBfc3lzX21heF9udGg7CisKKyAgICAvLyBUaHJlZSB2YXJzIGJlbG93IG1vdmVkIGhlcmUgZnJvbSBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpICJLTVBfQkxPQ0tUSU1FIiBwYXJ0CisgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisjZW5kaWYKKyAgICAvLyBGcm9tICJLTVBfTElCUkFSWSIgcGFydCBvZiBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpCisgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICAvLyBGcm9tIEtNUF9TQ0hFRFVMRSBpbml0aWFsaXphdGlvbgorICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOworICAgIC8vIEFDOiBkbyBub3QgdXNlIGFuYWx5dGljYWwgaGVyZSwgYmVjYXVzZSBpdCBpcyBub24tbW9ub3Rvbm91cworICAgIC8vX19rbXBfZ3VpZGVkID0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ7CisgICAgLy9fX2ttcF9hdXRvID0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOyAvLyBBQzogaXQgaXMgdGhlIGRlZmF1bHQsIG5vIG5lZWQgdG8gcmVwZWF0ZSBhc3NpZ25tZW50CisgICAgLy8gQmFycmllciBpbml0aWFsaXphdGlvbi4gTW92ZWQgaGVyZSBmcm9tIF9fa21wX2Vudl9pbml0aWFsaXplKCkgQmFycmllciBicmFuY2ggYml0IGNvbnRyb2wgYW5kIGJhcnJpZXIgbWV0aG9kCisgICAgLy8gY29udHJvbCBwYXJ0cworICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAjZGVmaW5lIGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfYmIgKChpbnQpMSkKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9iYiAoKGludCkxKQorICAgICAgICAjZGVmaW5lIGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfcGF0IGJwX2h5cGVyX2JhcgorICAgICAgICAjZGVmaW5lIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX3BhdCBicF9oeXBlcl9iYXIKKyAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICBmb3IgKCBpPWJzX3BsYWluX2JhcnJpZXI7IGk8YnNfbGFzdF9iYXJyaWVyOyBpKysgKSB7CisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdID0gX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdDsKKyAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKKyAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGkgXSA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0OworICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgaSBdID0gX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdF9kZmx0OworICAgICAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgaWYoIGkgPT0gYnNfcmVkdWN0aW9uX2JhcnJpZXIgKSB7IC8vIHRlc3RlZCBhbmQgY29uZmlybWVkIG9uIEFMVElYIG9ubHkgKCBsaW5fNjQgKTogaHlwZXIsMQorICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyBpIF0gPSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX2JiOworICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9iYjsKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBpIF0gPSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX3BhdDsKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBpIF0gPSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9wYXQ7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgfQorICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAjdW5kZWYga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfcGF0CisgICAgICAgICN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX3BhdAorICAgICAgICAjdW5kZWYga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfYmIKKyAgICAgICAgI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfYmIKKyAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKKyAgICBpZiAoX19rbXBfbWljX3R5cGUgPT0gbWljMikgeyAvLyBLTkMKKyAgICAgICAgLy8gQUM6IHBsYW5lPTMsMiwgZm9ya2pvaW49MiwxIGFyZSBvcHRpbWFsIGZvciAyNDAgdGhyZWFkcyBvbiBLTkMKKyAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyBic19wbGFpbl9iYXJyaWVyIF0gPSAzOyAgLy8gcGxhaW4gZ2F0aGVyCisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgYnNfZm9ya2pvaW5fYmFycmllciBdID0gMTsgIC8vIGZvcmtqb2luIHJlbGVhc2UKKyAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXSA9IGJwX2hpZXJhcmNoaWNhbF9iYXI7CisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPSBicF9oaWVyYXJjaGljYWxfYmFyOworICAgIH0KKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIGlmIChfX2ttcF9taWNfdHlwZSA9PSBtaWMyKSB7IC8vIEtOQworICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuIFsgYnNfcmVkdWN0aW9uX2JhcnJpZXIgXSA9IGJwX2hpZXJhcmNoaWNhbF9iYXI7CisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBic19yZWR1Y3Rpb25fYmFycmllciBdID0gYnBfaGllcmFyY2hpY2FsX2JhcjsKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisgICAgLy8gRnJvbSBLTVBfQ0hFQ0tTIGluaXRpYWxpemF0aW9uCisjaWZkZWYgS01QX0RFQlVHCisgICAgX19rbXBfZW52X2NoZWNrcyA9IFRSVUU7ICAgLyogZGV2ZWxvcG1lbnQgdmVyc2lvbnMgaGF2ZSB0aGUgZXh0cmEgY2hlY2tzICovCisjZWxzZQorICAgIF9fa21wX2Vudl9jaGVja3MgPSBGQUxTRTsgIC8qIHBvcnQgdmVyc2lvbnMgZG8gbm90IGhhdmUgdGhlIGV4dHJhIGNoZWNrcyAqLworI2VuZGlmCisKKyAgICAvLyBGcm9tICJLTVBfRk9SRUlHTl9USFJFQURTX1RIUkVBRFBSSVZBVEUiIGluaXRpYWxpemF0aW9uCisgICAgX19rbXBfZm9yZWlnbl90cCA9IFRSVUU7CisKKyAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMgPSBGQUxTRTsKKyAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfZGVmYXVsdDsKKworICAgIF9fa21wX2Vudl9pbml0aWFsaXplKCBOVUxMICk7CisKKyAgICAvLyBQcmludCBhbGwgbWVzc2FnZXMgaW4gbWVzc2FnZSBjYXRhbG9nIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgY2hhciBjb25zdCAqIHZhbCA9IF9fa21wX2Vudl9nZXQoICJLTVBfRFVNUF9DQVRBTE9HIiApOworICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaF90cnVlKCB2YWwgKSApIHsKKyAgICAgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgICAgICAgICAgX19rbXBfaTE4bl9kdW1wX2NhdGFsb2coICYgYnVmZmVyICk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfZW52X2ZyZWUoICYgdmFsICk7CisgICAgI2VuZGlmCisKKyAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisgICAgLy8gTW92ZWQgaGVyZSBmcm9tIF9fa21wX2Vudl9pbml0aWFsaXplKCkgIktNUF9BTExfVEhSRUFEUFJJVkFURSIgcGFydAorICAgIF9fa21wX3RwX2NhcGFjaXR5ID0gX19rbXBfZGVmYXVsdF90cF9jYXBhY2l0eShfX2ttcF9kZmx0X3RlYW1fbnRoX3ViLCBfX2ttcF9tYXhfbnRoLCBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkKTsKKworICAgIC8vIElmIHRoZSBsaWJyYXJ5IGlzIHNodXQgZG93biBwcm9wZXJseSwgYm90aCBwb29scyBtdXN0IGJlIE5VTEwuIEp1c3QgaW4gY2FzZSwgc2V0IHRoZW0KKyAgICAvLyB0byBOVUxMIC0tIHNvbWUgbWVtb3J5IG1heSBsZWFrLCBidXQgc3Vic2VxdWVudCBjb2RlIHdpbGwgd29yayBldmVuIGlmIHBvb2xzIGFyZSBub3QgZnJlZWQuCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2wgPT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9PSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGVhbV9wb29sICAgPT0gTlVMTCApOworICAgIF9fa21wX3RocmVhZF9wb29sID0gTlVMTDsKKyAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworICAgIF9fa21wX3RlYW1fcG9vbCAgID0gTlVMTDsKKworICAgIC8qIEFsbG9jYXRlIGFsbCBvZiB0aGUgdmFyaWFibGUgc2l6ZWQgcmVjb3JkcyAqLworICAgIC8qIE5PVEU6IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgZW50cmllcyBhcmUgYWxsb2NhdGVkLCBidXQgdGhlIGFycmF5cyBhcmUgZXhwYW5kYWJsZSAqLworICAgIC8qIFNpbmNlIGFsbG9jYXRpb24gaXMgY2FjaGUtYWxpZ25lZCwganVzdCBhZGQgZXh0cmEgcGFkZGluZyBhdCB0aGUgZW5kICovCisgICAgc2l6ZSA9IChzaXplb2Yoa21wX2luZm9fdCopICsgc2l6ZW9mKGttcF9yb290X3QqKSkqX19rbXBfdGhyZWFkc19jYXBhY2l0eSArIENBQ0hFX0xJTkU7CisgICAgX19rbXBfdGhyZWFkcyA9IChrbXBfaW5mb190KiopIF9fa21wX2FsbG9jYXRlKCBzaXplICk7CisgICAgX19rbXBfcm9vdCAgICA9IChrbXBfcm9vdF90KiopICgoY2hhciopX19rbXBfdGhyZWFkcyArIHNpemVvZihrbXBfaW5mb190KikgKiBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICk7CisKKyAgICAvKiBpbml0IHRocmVhZCBjb3VudHMgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hbGxfbnRoID09IDAgKTsgLy8gQXNzZXJ0cyBmYWlsIGlmIHRoZSBsaWJyYXJ5IGlzIHJlaW5pdGlhbGl6aW5nIGFuZAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX250aCA9PSAwICk7ICAgICAvLyBzb21ldGhpbmcgd2FzIHdyb25nIGluIHRlcm1pbmF0aW9uLgorICAgIF9fa21wX2FsbF9udGggPSAwOworICAgIF9fa21wX250aCAgICAgPSAwOworCisgICAgLyogc2V0dXAgdGhlIHViZXIgbWFzdGVyIHRocmVhZCBhbmQgaGllcmFyY2h5ICovCisgICAgZ3RpZCA9IF9fa21wX3JlZ2lzdGVyX3Jvb3QoIFRSVUUgKTsKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUgIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApICk7CisgICAgS01QX0FTU0VSVCggS01QX0lOSVRJQUxfR1RJRCggZ3RpZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIF9fa21wX2NvbW1vbl9pbml0aWFsaXplKCk7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgLyogaW52b2tlIHRoZSBjaGlsZCBmb3JrIGhhbmRsZXIgKi8KKyAgICAgICAgX19rbXBfcmVnaXN0ZXJfYXRmb3JrKCk7CisgICAgI2VuZGlmCisKKyAgICAjaWYgISBkZWZpbmVkIEtNUF9EWU5BTUlDX0xJQgorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbnZva2UgdGhlIGV4aXQgaGFuZGxlciB3aGVuIHRoZSBwcm9ncmFtIGZpbmlzaGVzLCBvbmx5IGZvciBzdGF0aWMgbGlicmFyeS4KKyAgICAgICAgICAgICAgIEZvciBkeW5hbWljIGxpYnJhcnksIHdlIGFscmVhZHkgaGF2ZSBfZmluaSBhbmQgRGxsTWFpbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IHJjID0gYXRleGl0KCBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0ICk7CisgICAgICAgICAgICBpZiAoIHJjICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJhdGV4aXQoKSIgKSwgS01QX0VSUiggcmMgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0KKyAgICAjZW5kaWYKKworICAgICNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICAgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgICAgICAvKiBOT1RFOiBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHVzZXIgaW5zdGFsbHMKKyAgICAgICAgICAgICAqICAgICAgICAgIHRoZWlyIG93biBzaWduYWwgaGFuZGxlcnMgc28gdGhhdCB0aGUgdXNlciBoYW5kbGVycworICAgICAgICAgICAgICogICAgICAgICAgYXJlIGNhbGxlZCBmaXJzdC4gIHRoaXMgd2F5IHRoZXkgY2FuIHJldHVybiBmYWxzZSwKKyAgICAgICAgICAgICAqICAgICAgICAgIG5vdCBjYWxsIG91ciBoYW5kbGVyLCBhdm9pZCB0ZXJtaW5hdGluZyB0aGUgbGlicmFyeSwKKyAgICAgICAgICAgICAqICAgICAgICAgIGFuZCBjb250aW51ZSBleGVjdXRpb24gd2hlcmUgdGhleSBsZWZ0IG9mZi4gKi8KKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfc2lnbmFscyggRkFMU0UgKTsKKyAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19VTklYICovCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgX19rbXBfaW5zdGFsbF9zaWduYWxzKCBUUlVFICk7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgICNlbmRpZgorCisgICAgLyogd2UgaGF2ZSBmaW5pc2hlZCB0aGUgc2VyaWFsIGluaXRpYWxpemF0aW9uICovCisgICAgX19rbXBfaW5pdF9jb3VudGVyICsrOworCisgICAgX19rbXBfaW5pdF9zZXJpYWwgPSBUUlVFOworCisgICAgaWYgKF9fa21wX3NldHRpbmdzKSB7CisgICAgICAgIF9fa21wX2Vudl9wcmludCgpOworICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKF9fa21wX2Rpc3BsYXlfZW52IHx8IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfZW52X3ByaW50XzIoKTsKKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcG9zdF9pbml0KCk7CisjZW5kaWYKKworICAgIEtNUF9NQigpOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplOiBleGl0XG4iICkgKTsKK30KKwordm9pZAorX19rbXBfc2VyaWFsX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGlmICggX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICBpZiAoIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2RvX21pZGRsZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgcHJldl9kZmx0X3RlYW1fbnRoOworCisgICAgaWYoICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IGVudGVyXG4iICkgKTsKKworICAgIC8vCisgICAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSBfX2ttcF9kZmx0X3RlYW1fbnRoIHNvIHRoYXQKKyAgICAvLyB3ZSBjYW4gYXZvaWQgc29tZSByZWluaXRpYWxpemF0aW9uIGlmIGl0IGhhc24ndCBjaGFuZ2VkLgorICAgIC8vCisgICAgcHJldl9kZmx0X3RlYW1fbnRoID0gX19rbXBfZGZsdF90ZWFtX250aDsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAvLworICAgIC8vIF9fa21wX2FmZmluaXR5X2luaXRpYWxpemUoKSB3aWxsIHRyeSB0byBzZXQgX19rbXBfbmNvcmVzIHRvIHRoZQorICAgIC8vIG51bWJlciBvZiBjb3JlcyBvbiB0aGUgbWFjaGluZS4KKyAgICAvLworICAgIF9fa21wX2FmZmluaXR5X2luaXRpYWxpemUoKTsKKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggdGhlIF9fa21wX3RocmVhZHMgYXJyYXkgYW5kIHNldCB0aGUgYWZmaW5pdHkgbWFzaworICAgIC8vIGZvciBlYWNoIHJvb3QgdGhyZWFkIHRoYXQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgUlRMLgorICAgIC8vCisgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBpKysgKSB7CisgICAgICAgIGlmICggVENSX1BUUiggX19rbXBfdGhyZWFkc1sgaSBdICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGksIFRSVUUgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBLTVBfQVNTRVJUKCBfX2ttcF94cHJvYyA+IDAgKTsKKyAgICBpZiAoIF9fa21wX2F2YWlsX3Byb2MgPT0gMCApIHsKKyAgICAgICAgX19rbXBfYXZhaWxfcHJvYyA9IF9fa21wX3hwcm9jOworICAgIH0KKworICAgIC8vIElmIHRoZXJlIHdlcmUgZW1wdHkgcGxhY2VzIGluIG51bV90aHJlYWRzIGxpc3QgKE9NUF9OVU1fVEhSRUFEUz0sLDIsMyksIGNvcnJlY3QgdGhlbSBub3cKKyAgICBqID0gMDsKKyAgICB3aGlsZSAoICggaiA8IF9fa21wX25lc3RlZF9udGgudXNlZCApICYmICEgX19rbXBfbmVzdGVkX250aC5udGhbIGogXSApIHsKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5udGhbIGogXSA9IF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfYXZhaWxfcHJvYzsKKyAgICAgICAgaisrOworICAgIH0KKworICAgIGlmICggX19rbXBfZGZsdF90ZWFtX250aCA9PSAwICkgeworI2lmZGVmIEtNUF9ERkxUX05USF9DT1JFUworICAgICAgICAvLworICAgICAgICAvLyBEZWZhdWx0ICN0aHJlYWRzID0gI2NvcmVzCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9uY29yZXM7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZTogc2V0dGluZyBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfbmNvcmVzICglZClcbiIsCisgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCApICk7CisjZWxzZQorICAgICAgICAvLworICAgICAgICAvLyBEZWZhdWx0ICN0aHJlYWRzID0gI2F2YWlsYWJsZSBPUyBwcm9jcworICAgICAgICAvLworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfYXZhaWxfcHJvYzsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX21pZGRsZV9pbml0aWFsaXplOiBzZXR0aW5nIF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9hdmFpbF9wcm9jKCVkKVxuIiwKKyAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoICkgKTsKKyNlbmRpZiAvKiBLTVBfREZMVF9OVEhfQ09SRVMgKi8KKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGggPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IEtNUF9NSU5fTlRIOworICAgIH0KKyAgICBpZiggX19rbXBfZGZsdF90ZWFtX250aCA+IF9fa21wX3N5c19tYXhfbnRoICkgeworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfc3lzX21heF9udGg7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUaGVyZSdzIG5vIGhhcm0gaW4gY29udGludWluZyBpZiB0aGUgZm9sbG93aW5nIGNoZWNrIGZhaWxzLAorICAgIC8vIGJ1dCBpdCBpbmRpY2F0ZXMgYW4gZXJyb3IgaW4gdGhlIHByZXZpb3VzIGxvZ2ljLgorICAgIC8vCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZGZsdF90ZWFtX250aCA8PSBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisKKyAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGggIT0gcHJldl9kZmx0X3RlYW1fbnRoICkgeworICAgICAgICAvLworICAgICAgICAvLyBSdW4gdGhyb3VnaCB0aGUgX19rbXBfdGhyZWFkcyBhcnJheSBhbmQgc2V0IHRoZSBudW0gdGhyZWFkcyBpY3YKKyAgICAgICAgLy8gZm9yIGVhY2ggcm9vdCB0aHJlYWQgdGhhdCBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBSVEwKKyAgICAgICAgLy8gKHdoaWNoIGhhcyBub3QgYWxyZWFkeSBleHBsaWNpdGx5IHNldCBpdHMgbnRocmVhZHMtdmFyIHdpdGggYQorICAgICAgICAvLyBjYWxsIHRvIG9tcF9zZXRfbnVtX3RocmVhZHMoKSkuCisgICAgICAgIC8vCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgaSBdOworICAgICAgICAgICAgaWYgKCB0aHJlYWQgPT0gTlVMTCApIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYyAhPSAwICkgY29udGludWU7CisKKyAgICAgICAgICAgIHNldF9fbnByb2MoIF9fa21wX3RocmVhZHNbIGkgXSwgX19rbXBfZGZsdF90ZWFtX250aCApOworICAgICAgICB9CisgICAgfQorICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZTogZmluYWwgdmFsdWUgZm9yIF9fa21wX2RmbHRfdGVhbV9udGggPSAlZFxuIiwKKyAgICAgIF9fa21wX2RmbHRfdGVhbV9udGgpICk7CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgIC8qIEFkanVzdCBibG9ja3RpbWUgdG8gemVybyBpZiBuZWNlc3NhcnkgKi8KKyAgICAvKiBub3cgdGhhdCBfX2ttcF9hdmFpbF9wcm9jIGlzIHNldCAgICAgICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2F2YWlsX3Byb2MgPiAwICk7CisgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAvKiB3ZSBoYXZlIGZpbmlzaGVkIG1pZGRsZSBpbml0aWFsaXphdGlvbiAqLworICAgIFRDV19TWU5DXzQoX19rbXBfaW5pdF9taWRkbGUsIFRSVUUpOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2RvX21pZGRsZV9pbml0aWFsaXplOiBleGl0XG4iICkgKTsKK30KKwordm9pZAorX19rbXBfbWlkZGxlX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGlmICggX19rbXBfaW5pdF9taWRkbGUgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICBpZiAoIF9fa21wX2luaXRfbWlkZGxlICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2RvX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKwordm9pZAorX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgLy8gdGhpcyBtaWdodCBiZSBhIG5ldyByb290CisKKyAgICAvKiBzeW5jaHJvbml6ZSBwYXJhbGxlbCBpbml0aWFsaXphdGlvbiAoZm9yIHNpYmxpbmcpICovCisgICAgaWYoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgcmV0dXJuOworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgaWYoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeyBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOyByZXR1cm47IH0KKworICAgIC8qIFRPRE8gcmVpbml0aWFsaXphdGlvbiBhZnRlciB3ZSBoYXZlIGFscmVhZHkgc2h1dCBkb3duICovCisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplOiBhdHRlbXB0IHRvIGluaXQgd2hpbGUgc2h1dHRpbmcgZG93blxuIiApICk7CisgICAgICAgIF9fa21wX2luZmluaXRlX2xvb3AoKTsKKyAgICB9CisKKyAgICAvKiBqYzogVGhlIGxvY2sgX19rbXBfaW5pdHpfbG9jayBpcyBhbHJlYWR5IGhlbGQsIHNvIGNhbGxpbmcgX19rbXBfc2VyaWFsX2luaXRpYWxpemUKKyAgICAgICAgICAgd291bGQgY2F1c2UgYSBkZWFkbG9jay4gIFNvIHdlIGNhbGwgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUgZGlyZWN0bHkuCisgICAgKi8KKyAgICBpZiggIV9fa21wX2luaXRfbWlkZGxlICkgeworICAgICAgICBfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIC8qIGJlZ2luIGluaXRpYWxpemF0aW9uICovCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3BhcmFsbGVsX2luaXRpYWxpemU6IGVudGVyXG4iICkgKTsKKyAgICBLTVBfQVNTRVJUKCBLTVBfVUJFUl9HVElEKCBndGlkICkgKTsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAvLworICAgIC8vIFNhdmUgdGhlIEZQIGNvbnRyb2wgcmVncy4KKyAgICAvLyBXb3JrZXIgdGhyZWFkcyB3aWxsIHNldCB0aGVpcnMgdG8gdGhlc2UgdmFsdWVzIGF0IHRocmVhZCBzdGFydHVwLgorICAgIC8vCisgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgX19rbXBfc3RvcmVfbXhjc3IoICZfX2ttcF9pbml0X214Y3NyICk7CisgICAgX19rbXBfaW5pdF9teGNzciAmPSBLTVBfWDg2X01YQ1NSX01BU0s7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWYgS01QX09TX1VOSVgKKyMgaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgLyogIG11c3QgYmUgYWZ0ZXIgX19rbXBfc2VyaWFsX2luaXRpYWxpemUgICovCisgICAgX19rbXBfaW5zdGFsbF9zaWduYWxzKCBUUlVFICk7CisjIGVuZGlmCisjZW5kaWYKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZSgpOworCisjaWYgZGVmaW5lZChVU0VfTE9BRF9CQUxBTkNFKQorICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfbG9hZF9iYWxhbmNlOworICAgIH0KKyNlbHNlCisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQ7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX3ZlcnNpb24gKSB7CisgICAgICAgIF9fa21wX3ByaW50X3ZlcnNpb25fMigpOworICAgIH0KKworICAgIC8qIHdlIGhhdmUgZmluaXNoZWQgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBUQ1dfU1lOQ180KF9fa21wX2luaXRfcGFyYWxsZWwsIFRSVUUpOworCisgICAgS01QX01CKCk7CisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3BhcmFsbGVsX2luaXRpYWxpemU6IGV4aXRcbiIgKSApOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX2Rpc3BfdCAqZGlzcGF0Y2g7CisKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIG5vbmUgb2YgdGhlIHRocmVhZHMgaGF2ZSBlbmNvdW50ZXJlZCBhbnkgY29uc3RydWN0cywgeWV0LiAqLworICAgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCA9IDA7CisjaWYgS01QX0NBQ0hFX01BTkFHRQorICAgIEtNUF9DQUNIRV9QUkVGRVRDSCggJnRoaXNfdGhyLT50aC50aF9iYXJbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXS5iYi5iX2Fycml2ZWQgKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgZGlzcGF0Y2ggPSAoa21wX2Rpc3BfdCAqKVRDUl9QVFIodGhpc190aHItPnRoLnRoX2Rpc3BhdGNoKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBkaXNwYXRjaCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9kaXNwYXRjaCApOworICAgIC8vS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoID09ICZ0ZWFtLT50LnRfZGlzcGF0Y2hbIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCBdICk7CisKKyAgICBkaXNwYXRjaC0+dGhfZGlzcF9pbmRleCA9IDA7ICAgIC8qIHJlc2V0IHRoZSBkaXNwYXRjaCBidWZmZXIgY291bnRlciAqLworI2lmIE9NUF80NV9FTkFCTEVECisgICAgZGlzcGF0Y2gtPnRoX2RvYWNyb3NzX2J1Zl9pZHggPSAwOyAvKiByZXNldCB0aGUgZG9hY3Jvc3MgZGlzcGF0Y2ggYnVmZmVyIGNvdW50ZXIgKi8KKyNlbmRpZgorICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3BhcmFsbGVsKCBndGlkLCB0ZWFtLT50LnRfaWRlbnQgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfQorCit2b2lkCitfX2ttcF9ydW5fYWZ0ZXJfaW52b2tlZF90YXNrKCBpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsCisgIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3BfcGFyYWxsZWwoIGd0aWQsIHRlYW0tPnQudF9pZGVudCApOworCisgICAgX19rbXBfZmluaXNoX2ltcGxpY2l0X3Rhc2sodGhpc190aHIpOworfQorCitpbnQKK19fa21wX2ludm9rZV90YXNrX2Z1bmMoIGludCBndGlkICkKK3sKKyAgICBpbnQgICAgICAgICAgcmM7CisgICAgaW50ICAgICAgICAgIHRpZCAgICAgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF9pbmZvX3QgICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICAqdGVhbSAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKworICAgIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKCBndGlkLCB0aWQsIHRoaXNfdGhyLCB0ZWFtICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIF9fa21wX2l0dF9zdGFja19jYWxsZWVfZW50ZXIoIChfX2l0dF9jYWxsZXIpdGVhbS0+dC50X3N0YWNrX2lkICk7IC8vIGluZm9ybSBpdHRub3RpZnkgYWJvdXQgZW50ZXJpbmcgdXNlcidzIGNvZGUKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfSU5WT0tJTkcoKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgdm9pZCAqZHVtbXk7CisgICAgdm9pZCAqKmV4aXRfcnVudGltZV9wOworICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgb21wdF9wYXJhbGxlbF9pZF90IG15X3BhcmFsbGVsX2lkOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBleGl0X3J1bnRpbWVfcCA9ICYodGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS4KKyAgICAgICAgICAgIG9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmZHVtbXk7CisgICAgfQorCisjaWYgT01QVF9UUkFDRQorICAgIG15X3Rhc2tfaWQgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgbXlfcGFyYWxsZWxfaWQgPSB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisgICAgeworICAgICAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGFyYWxsZWwpOworICAgICAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhJTVBMSUNJVF9UQVNLKTsKKyAgICAgICAgcmMgPSBfX2ttcF9pbnZva2VfbWljcm90YXNrKCAobWljcm90YXNrX3QpIFRDUl9TWU5DX1BUUih0ZWFtLT50LnRfcGtmbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGlkLCAoaW50KSB0ZWFtLT50LnRfYXJnYywgKHZvaWQgKiopIHRlYW0tPnQudF9hcmd2CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBleGl0X3J1bnRpbWVfcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgKmV4aXRfcnVudGltZV9wID0gTlVMTDsKKyNlbmRpZgorICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkgeworICAgICAgICBfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2xlYXZlKCAoX19pdHRfY2FsbGVyKXRlYW0tPnQudF9zdGFja19pZCApOyAvLyBpbmZvcm0gaXR0bm90aWZ5IGFib3V0IGxlYXZpbmcgdXNlcidzIGNvZGUKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIF9fa21wX3J1bl9hZnRlcl9pbnZva2VkX3Rhc2soIGd0aWQsIHRpZCwgdGhpc190aHIsIHRlYW0gKTsKKworICAgIHJldHVybiByYzsKK30KKworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkCitfX2ttcF90ZWFtc19tYXN0ZXIoIGludCBndGlkICkKK3sKKyAgICAvLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGFsbCBtYXN0ZXIgdGhyZWFkcyBpbiB0ZWFtcyBjb25zdHJ1Y3QKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKyAgICBpZGVudF90ICAgICAqbG9jID0gIHRlYW0tPnQudF9pZGVudDsKKyAgICB0aHItPnRoLnRoX3NldF9ucHJvYyA9IHRoci0+dGgudGhfdGVhbXNfc2l6ZS5udGg7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHItPnRoLnRoX3NldF9ucHJvYyApOworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF90ZWFtc19tYXN0ZXI6IFQjJWQsIFRpZCAlZCwgbWljcm90YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSwgdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSApOworICAgIC8vIExhdW5jaCBsZWFndWUgb2YgdGVhbXMgbm93LCBidXQgbm90IGxldCB3b3JrZXJzIGV4ZWN1dGUKKyAgICAvLyAodGhleSBoYW5nIG9uIGZvcmsgYmFycmllciB1bnRpbCBuZXh0IHBhcmFsbGVsKQorI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfRk9SS0lORygpOworI2VuZGlmCisgICAgX19rbXBfZm9ya19jYWxsKCBsb2MsIGd0aWQsIGZvcmtfY29udGV4dF9pbnRlbCwKKyAgICAgICAgICAgIHRlYW0tPnQudF9hcmdjLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgKHZvaWQgKil0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzaywgICAgICAvLyAidW53cmFwcGVkIiB0YXNrCisjZW5kaWYKKyAgICAgICAgICAgIChtaWNyb3Rhc2tfdCl0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzaywgLy8gIndyYXBwZWQiIHRhc2sKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobGF1bmNoX3QpIF9fa21wX2ludm9rZV90YXNrX2Z1bmMsCisgICAgICAgICAgICBOVUxMICk7CisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19KT0lOSU5HKCk7CisjZW5kaWYKKworICAgIC8vIEFDOiBsYXN0IHBhcmFtZXRlciAiMSIgZWxpbWluYXRlcyBqb2luIGJhcnJpZXIgd2hpY2ggd29uJ3Qgd29yayBiZWNhdXNlCisgICAgLy8gd29ya2VyIHRocmVhZHMgYXJlIGluIGEgZm9yayBiYXJyaWVyIHdhaXRpbmcgZm9yIG1vcmUgcGFyYWxsZWwgcmVnaW9ucworICAgIF9fa21wX2pvaW5fY2FsbCggbG9jLCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICwgZm9ya19jb250ZXh0X2ludGVsCisjZW5kaWYKKyAgICAgICAgLCAxICk7Cit9CisKK2ludAorX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciggaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICAqdGVhbSAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAjaWYgS01QX0RFQlVHCisgICAgaWYgKCAhX19rbXBfdGhyZWFkc1tndGlkXS0+IHRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkICkKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHZvaWQqKV9fa21wX3RocmVhZHNbZ3RpZF0tPiB0aC50aF90ZWFtLT50LnRfcGtmbiA9PSAodm9pZCopX19rbXBfdGVhbXNfbWFzdGVyICk7CisgICAgI2VuZGlmCisgICAgX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soIGd0aWQsIDAsIHRoaXNfdGhyLCB0ZWFtICk7CisgICAgX19rbXBfdGVhbXNfbWFzdGVyKCBndGlkICk7CisgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggZ3RpZCwgMCwgdGhpc190aHIsIHRlYW0gKTsKKyAgICByZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisvKiB0aGlzIHNldHMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uCisgKiBlbmNvdW50ZXJlZCBieSB0aGlzIHRlYW0gKi8KKy8qIHNpbmNlIHRoaXMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBmb3Jram9pbiBjcml0aWNhbCBzZWN0aW9uIGl0CisgKiBzaG91bGQgYXZvaWQgcmFjZSBjb25kaXRpb25zIHdpdGggYXNzeW1tZXRyaWNhbCBuZXN0ZWQgcGFyYWxsZWxpc20gKi8KKwordm9pZAorX19rbXBfcHVzaF9udW1fdGhyZWFkcyggaWRlbnRfdCAqaWQsIGludCBndGlkLCBpbnQgbnVtX3RocmVhZHMgKQoreworICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBpZiggbnVtX3RocmVhZHMgPiAwICkKKyAgICAgICAgdGhyLT50aC50aF9zZXRfbnByb2MgPSBudW1fdGhyZWFkczsKK30KKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8qIHRoaXMgc2V0cyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiB0ZWFtcyBmb3IgdGhlIHRlYW1zIHJlZ2lvbiBhbmQvb3IKKyAqIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uIGVuY291bnRlcmVkICAqLwordm9pZAorX19rbXBfcHVzaF9udW1fdGVhbXMoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwgaW50IG51bV90ZWFtcywgaW50IG51bV90aHJlYWRzICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIEtNUF9ERUJVR19BU1NFUlQobnVtX3RlYW1zID49IDApOworICAgIEtNUF9ERUJVR19BU1NFUlQobnVtX3RocmVhZHMgPj0gMCk7CisKKyAgICBpZiggbnVtX3RlYW1zID09IDAgKQorICAgICAgICBudW1fdGVhbXMgPSAxOyAgICAvLyBkZWZhdWx0IG51bWJlciBvZiB0ZWFtcyBpcyAxLgorICAgIGlmKCBudW1fdGVhbXMgPiBfX2ttcF9tYXhfbnRoICkgeyAvLyBpZiB0b28gbWFueSB0ZWFtcyByZXF1ZXN0ZWQ/CisgICAgICAgIGlmICggIV9fa21wX3Jlc2VydmVfd2FybiApIHsKKyAgICAgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybiA9IDE7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEZvcm1UaHJUZWFtLCBudW1fdGVhbXMsIF9fa21wX21heF9udGggKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBVbnNldF9BTExfVEhSRUFEUyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIG51bV90ZWFtcyA9IF9fa21wX21heF9udGg7CisgICAgfQorICAgIC8vIFNldCBudW1iZXIgb2YgdGVhbXMgKG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBvdXRlciAicGFyYWxsZWwiIG9mIHRoZSB0ZWFtcykKKyAgICB0aHItPnRoLnRoX3NldF9ucHJvYyA9IHRoci0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXMgPSBudW1fdGVhbXM7CisKKyAgICAvLyBSZW1lbWJlciB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZm9yIGlubmVyIHBhcmFsbGVsIHJlZ2lvbnMKKyAgICBpZiggbnVtX3RocmVhZHMgPT0gMCApIHsKKyAgICAgICAgaWYoICFUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKQorICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsgIC8vIGdldCBfX2ttcF9hdmFpbF9wcm9jIGNhbGN1bGF0ZWQKKyAgICAgICAgbnVtX3RocmVhZHMgPSBfX2ttcF9hdmFpbF9wcm9jIC8gbnVtX3RlYW1zOworICAgICAgICBpZiggbnVtX3RlYW1zICogbnVtX3RocmVhZHMgPiBfX2ttcF9tYXhfbnRoICkgeworICAgICAgICAgICAgLy8gYWRqdXN0IG51bV90aHJlYWRzIHcvbyB3YXJuaW5nIGFzIGl0IGlzIG5vdCB1c2VyIHNldHRpbmcKKyAgICAgICAgICAgIG51bV90aHJlYWRzID0gX19rbXBfbWF4X250aCAvIG51bV90ZWFtczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCBudW1fdGVhbXMgKiBudW1fdGhyZWFkcyA+IF9fa21wX21heF9udGggKSB7CisgICAgICAgICAgICBpbnQgbmV3X3RocmVhZHMgPSBfX2ttcF9tYXhfbnRoIC8gbnVtX3RlYW1zOworICAgICAgICAgICAgaWYgKCAhX19rbXBfcmVzZXJ2ZV93YXJuICkgeyAvLyB1c2VyIGFza2VkIGZvciB0b28gbWFueSB0aHJlYWRzCisgICAgICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsgIC8vIHRoYXQgY29uZmxpY3RzIHdpdGggT01QX1RIUkVBRF9MSU1JVAorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRGb3JtVGhyVGVhbSwgbnVtX3RocmVhZHMsIG5ld190aHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFVuc2V0X0FMTF9USFJFQURTICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bV90aHJlYWRzID0gbmV3X3RocmVhZHM7CisgICAgICAgIH0KKyAgICB9CisgICAgdGhyLT50aC50aF90ZWFtc19zaXplLm50aCA9IG51bV90aHJlYWRzOworfQorCisKKy8vCisvLyBTZXQgdGhlIHByb2NfYmluZCB2YXIgdG8gdXNlIGluIHRoZSBmb2xsb3dpbmcgcGFyYWxsZWwgcmVnaW9uLgorLy8KK3ZvaWQKK19fa21wX3B1c2hfcHJvY19iaW5kKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQgKQoreworICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgdGhyLT50aC50aF9zZXRfcHJvY19iaW5kID0gcHJvY19iaW5kOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworLyogTGF1bmNoIHRoZSB3b3JrZXIgdGhyZWFkcyBpbnRvIHRoZSBtaWNyb3Rhc2suICovCisKK3ZvaWQKK19fa21wX2ludGVybmFsX2ZvcmsoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGY7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3RlYW0gID09ICB0ZWFtICk7CisgICAgS01QX0FTU0VSVCggICAgICAgS01QX01BU1RFUl9HVElEKGd0aWQpICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICB0ZWFtLT50LnRfY29uc3RydWN0ID0gMDsgICAgICAgICAgLyogbm8gc2luZ2xlIGRpcmVjdGl2ZXMgc2VlbiB5ZXQgKi8KKyAgICB0ZWFtLT50LnRfb3JkZXJlZC5kdC50X3ZhbHVlID0gMDsgLyogdGhyZWFkIDAgZW50ZXJzIHRoZSBvcmRlcmVkIHNlY3Rpb24gZmlyc3QgKi8KKworICAgIC8qIFJlc2V0IHRoZSBpZGVudGlmaWVycyBvbiB0aGUgZGlzcGF0Y2ggYnVmZmVyICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2Rpc3BfYnVmZmVyICk7CisgICAgaWYgKCB0ZWFtLT50LnRfbWF4X25wcm9jID4gMSApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAgX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnM7ICsraSkgeworICAgICAgICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyWyBpIF0uYnVmZmVyX2luZGV4ID0gaTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyW2ldLmRvYWNyb3NzX2J1Zl9pZHggPSBpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0ZWFtLT50LnRfZGlzcF9idWZmZXJbIDAgXS5idWZmZXJfaW5kZXggPSAwOworI2lmIE9NUF80NV9FTkFCTEVECisgICAgICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlclswXS5kb2Fjcm9zc19idWZfaWR4ID0gMDsKKyNlbmRpZgorICAgIH0KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtICA9PSAgdGVhbSApOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgZm9yKCBmPTAgOyBmPHRlYW0tPnQudF9ucHJvYyA7IGYrKyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbZl0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgLyogcmVsZWFzZSB0aGUgd29ya2VyIHRocmVhZHMgc28gdGhleSBtYXkgYmVnaW4gd29ya2luZyAqLworICAgIF9fa21wX2ZvcmtfYmFycmllciggZ3RpZCwgMCApOworfQorCisKK3ZvaWQKK19fa21wX2ludGVybmFsX2pvaW4oIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtICA9PSAgdGVhbSApOworICAgIEtNUF9BU1NFUlQoICAgICAgIEtNUF9NQVNURVJfR1RJRChndGlkKSApOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLyogSm9pbiBiYXJyaWVyIGFmdGVyIGZvcmsgKi8KKworI2lmZGVmIEtNUF9ERUJVRworICAgIGlmIChfX2ttcF90aHJlYWRzW2d0aWRdICYmIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW1fbnByb2MgIT0gdGVhbS0+dC50X25wcm9jICkgeworICAgICAgICBfX2ttcF9wcmludGYoIkdUSUQ6ICVkLCBfX2ttcF90aHJlYWRzWyVkXT0lcFxuIixndGlkLCBndGlkLCBfX2ttcF90aHJlYWRzW2d0aWRdKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJfX2ttcF90aHJlYWRzWyVkXS0+dGgudGhfdGVhbV9ucHJvYz0lZCwgVEVBTTogJXAsIHRlYW0tPnQudF9ucHJvYz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW1fbnByb2MsIHRlYW0sIHRlYW0tPnQudF9ucHJvYyk7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZSgpOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzW2d0aWRdICYmCisgICAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX25wcm9jID09IHRlYW0tPnQudF9ucHJvYyApOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgX19rbXBfam9pbl9iYXJyaWVyKCBndGlkICk7ICAvKiB3YWl0IGZvciBldmVyeW9uZSAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgS01QX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3RlYW0gID09ICB0ZWFtICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKworLy8KKy8vIFJldHVybiB0aGUgd29ya2VyIHRocmVhZHMgYWN0aXZlbHkgc3Bpbm5pbmcgaW4gdGhlIGhvdCB0ZWFtLCBpZiB3ZQorLy8gYXJlIGF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwgb2YgcGFyYWxsZWxpc20uICBPdGhlcndpc2UsIHJldHVybiAwLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FjdGl2ZV9ob3RfdGVhbV9ucHJvYygga21wX3Jvb3RfdCAqcm9vdCApCit7CisgICAgaW50IGk7CisgICAgaW50IHJldHZhbDsKKyAgICBrbXBfdGVhbV90ICpob3RfdGVhbTsKKworICAgIGlmICggcm9vdC0+ci5yX2FjdGl2ZSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGhvdF90ZWFtID0gcm9vdC0+ci5yX2hvdF90ZWFtOworICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgIHJldHVybiBob3RfdGVhbS0+dC50X25wcm9jIC0gMTsgIC8vIERvbid0IGNvdW50IG1hc3RlciB0aHJlYWQKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNraXAgdGhlIG1hc3RlciB0aHJlYWQgLSBpdCBpcyBhY2NvdW50ZWQgZm9yIGVsc2V3aGVyZS4KKyAgICAvLworICAgIHJldHZhbCA9IDA7CisgICAgZm9yICggaSA9IDE7IGkgPCBob3RfdGVhbS0+dC50X25wcm9jOyBpKysgKSB7CisgICAgICAgIGlmICggaG90X3RlYW0tPnQudF90aHJlYWRzW2ldLT50aC50aF9hY3RpdmUgKSB7CisgICAgICAgICAgICByZXR2YWwrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvLworLy8gUGVyZm9ybSBhbiBhdXRvbWF0aWMgYWRqdXN0bWVudCB0byB0aGUgbnVtYmVyIG9mCisvLyB0aHJlYWRzIHVzZWQgYnkgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2xvYWRfYmFsYW5jZV9ucHJvYygga21wX3Jvb3RfdCAqcm9vdCwgaW50IHNldF9ucHJvYyApCit7CisgICAgaW50IHJldHZhbDsKKyAgICBpbnQgcG9vbF9hY3RpdmU7CisgICAgaW50IGhvdF90ZWFtX2FjdGl2ZTsKKyAgICBpbnQgdGVhbV9jdXJyX2FjdGl2ZTsKKyAgICBpbnQgc3lzdGVtX2FjdGl2ZTsKKworICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IGNhbGxlZCByb290OiVwIHNldF9ucHJvYzolZFxuIiwKKyAgICAgICAgICAgICAgICByb290LCBzZXRfbnByb2MgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290LT5yLnJfcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMgPT0gVFJVRSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNldF9ucHJvYyA+IDEgKTsKKworICAgIGlmICggc2V0X25wcm9jID09IDEpIHsKKyAgICAgICAgS0JfVFJBQ0UoIDIwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogc2VyaWFsIGV4ZWN1dGlvbi5cbiIgKSApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRocmVhZHMgdGhhdCBhcmUgYWN0aXZlIGluIHRoZSB0aHJlYWQgcG9vbCwgYWN0aXZlIGluIHRoZSBob3QgdGVhbQorICAgIC8vIGZvciB0aGlzIHBhcnRpY3VsYXIgcm9vdCAoaWYgd2UgYXJlIGF0IHRoZSBvdXRlciBwYXIgbGV2ZWwpLCBhbmQKKyAgICAvLyB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0aHJlYWQgKHRvIGJlY29tZSB0aGUgbWFzdGVyKSBhcmUgYXZhaWxhYmxlCisgICAgLy8gdG8gYWRkIHRvIHRoZSBuZXcgdGVhbSwgYnV0IGFyZSBjdXJyZW50bHkgY29udHJpYnV0aW5nIHRvIHRoZSBzeXN0ZW0KKyAgICAvLyBsb2FkLCBhbmQgbXVzdCBiZSBhY2NvdW50ZWQgZm9yLgorICAgIC8vCisgICAgcG9vbF9hY3RpdmUgPSBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKTsKKyAgICBob3RfdGVhbV9hY3RpdmUgPSBfX2ttcF9hY3RpdmVfaG90X3RlYW1fbnByb2MoIHJvb3QgKTsKKyAgICB0ZWFtX2N1cnJfYWN0aXZlID0gcG9vbF9hY3RpdmUgKyBob3RfdGVhbV9hY3RpdmUgKyAxOworCisgICAgLy8KKyAgICAvLyBDaGVjayB0aGUgc3lzdGVtIGxvYWQuCisgICAgLy8KKyAgICBzeXN0ZW1fYWN0aXZlID0gX19rbXBfZ2V0X2xvYWRfYmFsYW5jZSggX19rbXBfYXZhaWxfcHJvYyArIHRlYW1fY3Vycl9hY3RpdmUgKTsKKyAgICBLQl9UUkFDRSggMzAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiBzeXN0ZW0gYWN0aXZlID0gJWQgcG9vbCBhY3RpdmUgPSAlZCBob3QgdGVhbSBhY3RpdmUgPSAlZFxuIiwKKyAgICAgIHN5c3RlbV9hY3RpdmUsIHBvb2xfYWN0aXZlLCBob3RfdGVhbV9hY3RpdmUgKSApOworCisgICAgaWYgKCBzeXN0ZW1fYWN0aXZlIDwgMCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlIG5lY2Vzc2FyeSBpbmZvIGZyb20gL3Byb2MsCisgICAgICAgIC8vIHNvIHVzZSB0aGUgdGhyZWFkIGxpbWl0IGFsZ29yaXRobSBpbnN0ZWFkLiAgT25jZSB3ZSBzZXQKKyAgICAgICAgLy8gX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3RocmVhZF9saW1pdCwKKyAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHdpbmQgdXAgZ2V0dGluZyBiYWNrIGhlcmUuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQ7CisgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50TG9hZEJhbFVzaW5nLCAiS01QX0RZTkFNSUNfTU9ERT10aHJlYWQgbGltaXQiICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTWFrZSB0aGlzIGNhbGwgYmVoYXZlIGxpa2UgdGhlIHRocmVhZCBsaW1pdCBhbGdvcml0aG0uCisgICAgICAgIC8vCisgICAgICAgIHJldHZhbCA9IF9fa21wX2F2YWlsX3Byb2MgLSBfX2ttcF9udGggKyAocm9vdC0+ci5yX2FjdGl2ZSA/IDEKKyAgICAgICAgICA6IHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgaWYgKCByZXR2YWwgPiBzZXRfbnByb2MgKSB7CisgICAgICAgICAgICByZXR2YWwgPSBzZXRfbnByb2M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCByZXR2YWwgPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgICAgIHJldHZhbCA9IEtNUF9NSU5fTlRIOworICAgICAgICB9CisKKyAgICAgICAgS0JfVFJBQ0UoIDIwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogdGhyZWFkIGxpbWl0IGV4aXQuIHJldHZhbDolZFxuIiwgcmV0dmFsICkgKTsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRoZXJlIGlzIGEgc2xpZ2h0IGRlbGF5IGluIHRoZSBsb2FkIGJhbGFuY2UgYWxnb3JpdGhtIGluIGRldGVjdGluZworICAgIC8vIG5ldyBydW5uaW5nIHByb2NzLiAgVGhlIHJlYWwgc3lzdGVtIGxvYWQgYXQgdGhpcyBpbnN0YW50IHNob3VsZCBiZQorICAgIC8vIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSAjYWN0aXZlIG9tcCB0aHJlYWQgdGhhdCBhcmUgYXZhaWxhYmxlIHRvCisgICAgLy8gYWRkIHRvIHRoZSB0ZWFtLgorICAgIC8vCisgICAgaWYgKCBzeXN0ZW1fYWN0aXZlIDwgdGVhbV9jdXJyX2FjdGl2ZSApIHsKKyAgICAgICAgc3lzdGVtX2FjdGl2ZSA9IHRlYW1fY3Vycl9hY3RpdmU7CisgICAgfQorICAgIHJldHZhbCA9IF9fa21wX2F2YWlsX3Byb2MgLSBzeXN0ZW1fYWN0aXZlICsgdGVhbV9jdXJyX2FjdGl2ZTsKKyAgICBpZiAoIHJldHZhbCA+IHNldF9ucHJvYyApIHsKKyAgICAgICAgcmV0dmFsID0gc2V0X25wcm9jOworICAgIH0KKyAgICBpZiAoIHJldHZhbCA8IEtNUF9NSU5fTlRIICkgeworICAgICAgICByZXR2YWwgPSBLTVBfTUlOX05USDsKKyAgICB9CisKKyAgICBLQl9UUkFDRSggMjAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiBleGl0LiByZXR2YWw6JWRcbiIsIHJldHZhbCApICk7CisgICAgcmV0dXJuIHJldHZhbDsKK30gLy8gX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jKCkKKworI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTk9URTogdGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgX19rbXBfaW5pdF9sb2NrIGhlbGQgKi8KK3ZvaWQKK19fa21wX2NsZWFudXAoIHZvaWQgKQoreworICAgIGludCBmOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGVudGVyXG4iICkgKTsKKworICAgIGlmIChUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgeworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgICAgICBfX2ttcF9yZW1vdmVfc2lnbmFscygpOworI2VuZGlmCisgICAgICAgIFRDV180KF9fa21wX2luaXRfcGFyYWxsZWwsIEZBTFNFKTsKKyAgICB9CisKKyAgICBpZiAoVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisgICAgICAgIF9fa21wX2NsZWFudXBfaGllcmFyY2h5KCk7CisgICAgICAgIFRDV180KF9fa21wX2luaXRfbWlkZGxlLCBGQUxTRSk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGdvIHNlcmlhbCBjbGVhbnVwXG4iICkgKTsKKworICAgIGlmIChfX2ttcF9pbml0X3NlcmlhbCkgeworICAgICAgICBfX2ttcF9ydW50aW1lX2Rlc3Ryb3koKTsKKyAgICAgICAgX19rbXBfaW5pdF9zZXJpYWwgPSBGQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKCBmID0gMDsgZiA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGYrKyApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9yb290WyBmIF0gIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIF9fa21wX3Jvb3RbIGYgXSApOworICAgICAgICAgICAgX19rbXBfcm9vdFsgZiBdID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9mcmVlKCBfX2ttcF90aHJlYWRzICk7CisgICAgLy8gX19rbXBfdGhyZWFkcyBhbmQgX19rbXBfcm9vdCB3ZXJlIGFsbG9jYXRlZCBhdCBvbmNlLCBhcyBzaW5nbGUgYmxvY2ssIHNvIHRoZXJlIGlzIG5vIG5lZWQgaW4KKyAgICAvLyBmcmVlaW5nIF9fa21wX3Jvb3QuCisgICAgX19rbXBfdGhyZWFkcyA9IE5VTEw7CisgICAgX19rbXBfcm9vdCAgICA9IE5VTEw7CisgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9IDA7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIF9fa21wX2NsZWFudXBfaW5kaXJlY3RfdXNlcl9sb2NrcygpOworI2Vsc2UKKyAgICBfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3MoKTsKKyNlbmRpZgorCisgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIF9fa21wX2NwdWluZm9fZmlsZSApOworICAgICAgICBfX2ttcF9jcHVpbmZvX2ZpbGUgPSBOVUxMOworICAgICNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgICAgX19rbXBfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKKyAgICNlbmRpZgorICAgI2VuZGlmCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIF9fa21wX25lc3RlZF9udGgubnRoICk7CisgICAgX19rbXBfbmVzdGVkX250aC5udGggPSBOVUxMOworICAgIF9fa21wX25lc3RlZF9udGguc2l6ZSA9IDA7CisgICAgX19rbXBfbmVzdGVkX250aC51c2VkID0gMDsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzICk7CisgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID0gTlVMTDsKKyAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnNpemUgPSAwOworICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDA7CisKKyAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7CisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIF9fa21wX3N0YXRzX2ZpbmkoKTsKKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGV4aXRcbiIgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQKK19fa21wX2lnbm9yZV9tcHBiZWcoIHZvaWQgKQoreworICAgIGNoYXIgKmVudjsKKworICAgIGlmICgoZW52ID0gZ2V0ZW52KCAiS01QX0lHTk9SRV9NUFBCRUciICkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZSggZW52ICkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIC8vIEJ5IGRlZmF1bHQgX19rbXBjX2JlZ2luKCkgaXMgbm8tb3AuCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorX19rbXBfaWdub3JlX21wcGVuZCggdm9pZCApCit7CisgICAgY2hhciAqZW52OworCisgICAgaWYgKChlbnYgPSBnZXRlbnYoICJLTVBfSUdOT1JFX01QUEVORCIgKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoX19rbXBfc3RyX21hdGNoX2ZhbHNlKCBlbnYgKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgLy8gQnkgZGVmYXVsdCBfX2ttcGNfZW5kKCkgaXMgbm8tb3AuCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2JlZ2luKCB2b2lkICkKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworCisgICAgLyogdGhpcyBpcyBhIHZlcnkgaW1wb3J0YW50IHN0ZXAgYXMgaXQgd2lsbCByZWdpc3RlciBuZXcgc2libGluZyB0aHJlYWRzCisgICAgICogYW5kIGFzc2lnbiB0aGVzZSBuZXcgdWJlciB0aHJlYWRzIGEgbmV3IGd0aWQgKi8KKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHJvb3QgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3Jvb3Q7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApKTsKKworICAgIGlmKCByb290LT5yLnJfYmVnaW4gKSByZXR1cm47CisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKKyAgICBpZiggcm9vdC0+ci5yX2JlZ2luICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJvb3QtPnIucl9iZWdpbiA9IFRSVUU7CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF91c2VyX3NldF9saWJyYXJ5IChlbnVtIGxpYnJhcnlfdHlwZSBhcmcpCit7CisgICAgaW50IGd0aWQ7CisgICAga21wX3Jvb3RfdCAqcm9vdDsKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICAvKiBmaXJzdCwgbWFrZSBzdXJlIHdlIGFyZSBpbml0aWFsaXplZCBzbyB3ZSBjYW4gZ2V0IG91ciBndGlkICovCisKKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIHJvb3QgPSB0aHJlYWQtPnRoLnRoX3Jvb3Q7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfdXNlcl9zZXRfbGlicmFyeTogZW50ZXIgVCMlZCwgYXJnOiAlZCwgJWRcbiIsIGd0aWQsIGFyZywgbGlicmFyeV9zZXJpYWwgKSk7CisgICAgaWYgKHJvb3QtPnIucl9pbl9wYXJhbGxlbCkgeyAvKiBNdXN0IGJlIGNhbGxlZCBpbiBzZXJpYWwgc2VjdGlvbiBvZiB0b3AtbGV2ZWwgdGhyZWFkICovCisgICAgICAgIEtNUF9XQVJOSU5HKCBTZXRMaWJyYXJ5SW5jb3JyZWN0Q2FsbCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoICggYXJnICkgeworICAgIGNhc2UgbGlicmFyeV9zZXJpYWwgOgorICAgICAgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIHNldF9fbnByb2MoIHRocmVhZCwgMSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6CisgICAgICAgIHRocmVhZC0+dGgudGhfc2V0X25wcm9jID0gMDsKKyAgICAgICAgc2V0X19ucHJvYyggdGhyZWFkLCBfX2ttcF9kZmx0X3RlYW1fbnRoID8gX19rbXBfZGZsdF90ZWFtX250aCA6IF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOgorICAgICAgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIHNldF9fbnByb2MoIHRocmVhZCwgX19rbXBfZGZsdF90ZWFtX250aCA/IF9fa21wX2RmbHRfdGVhbV9udGggOiBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9GQVRBTCggVW5rbm93bkxpYnJhcnlUeXBlLCBhcmcgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hdXhfc2V0X2xpYnJhcnkgKCBhcmcgKTsKK30KKwordm9pZAorX19rbXBfYXV4X3NldF9zdGFja3NpemUoIHNpemVfdCBhcmcgKQoreworICAgIGlmICghIF9fa21wX2luaXRfc2VyaWFsKQorICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworCisjaWYgS01QX09TX0RBUldJTgorICAgIGlmIChhcmcgJiAoMHgxMDAwIC0gMSkpIHsKKyAgICAgICAgYXJnICY9IH4oMHgxMDAwIC0gMSk7CisgICAgICAgIGlmKGFyZyArIDB4MTAwMCkgLyogY2hlY2sgZm9yIG92ZXJmbG93IGlmIHdlIHJvdW5kIHVwICovCisgICAgICAgICAgICBhcmcgKz0gMHgxMDAwOworICAgIH0KKyNlbmRpZgorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICAvKiBvbmx5IGNoYW5nZSB0aGUgZGVmYXVsdCBzdGFja3NpemUgYmVmb3JlIHRoZSBmaXJzdCBwYXJhbGxlbCByZWdpb24gKi8KKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgeworICAgICAgICBzaXplX3QgdmFsdWUgPSBhcmc7ICAgICAgIC8qIGFyZ3VtZW50IGlzIGluIGJ5dGVzICovCisKKyAgICAgICAgaWYgKHZhbHVlIDwgX19rbXBfc3lzX21pbl9zdGtzaXplICkKKyAgICAgICAgICAgIHZhbHVlID0gX19rbXBfc3lzX21pbl9zdGtzaXplIDsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBLTVBfTUFYX1NUS1NJWkUpCisgICAgICAgICAgICB2YWx1ZSA9IEtNUF9NQVhfU1RLU0laRTsKKworICAgICAgICBfX2ttcF9zdGtzaXplID0gdmFsdWU7CisKKyAgICAgICAgX19rbXBfZW52X3N0a3NpemUgPSBUUlVFOyAgICAvKiB3YXMgS01QX1NUQUNLU0laRSBzcGVjaWZpZWQ/ICovCisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKworLyogc2V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIHJ1bnRpbWUgbGlicmFyeSAqLworLyogVE9ETyB0aGlzIGNhbiBjYXVzZSBzb21lIG9kZCBiZWhhdmlvdXIgd2l0aCBzaWJsaW5nIHBhcmFsbGVsaXNtLi4uICovCit2b2lkCitfX2ttcF9hdXhfc2V0X2xpYnJhcnkgKGVudW0gbGlicmFyeV90eXBlIGFyZykKK3sKKyAgICBfX2ttcF9saWJyYXJ5ID0gYXJnOworCisgICAgc3dpdGNoICggX19rbXBfbGlicmFyeSApIHsKKyAgICBjYXNlIGxpYnJhcnlfc2VyaWFsIDoKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0lORk9STSggTGlicmFyeUlzU2VyaWFsICk7CisgICAgICAgICAgICAodm9pZCkgX19rbXBfY2hhbmdlX2xpYnJhcnkoIFRSVUUgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6CisgICAgICAgICh2b2lkKSBfX2ttcF9jaGFuZ2VfbGlicmFyeSggVFJVRSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dCA6CisgICAgICAgICh2b2lkKSBfX2ttcF9jaGFuZ2VfbGlicmFyeSggRkFMU0UgKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0ZBVEFMKCBVbmtub3duTGlicmFyeVR5cGUsIGFyZyApOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfYXV4X3NldF9ibG9ja3RpbWUgKGludCBhcmcsIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IHRpZCkKK3sKKyAgICBpbnQgYmxvY2t0aW1lID0gYXJnOyAgICAgICAgLyogYXJndW1lbnQgaXMgaW4gbWlsbGlzZWNvbmRzICovCisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgaW50IGJ0X2ludGVydmFsczsKKyNlbmRpZgorICAgIGludCBidF9zZXQ7CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIC8qIE5vcm1hbGl6ZSBhbmQgc2V0IGJsb2NrdGltZSBmb3IgdGhlIHRlYW1zICovCisgICAgaWYgKGJsb2NrdGltZSA8IEtNUF9NSU5fQkxPQ0tUSU1FKQorICAgICAgICBibG9ja3RpbWUgPSBLTVBfTUlOX0JMT0NLVElNRTsKKyAgICBlbHNlIGlmIChibG9ja3RpbWUgPiBLTVBfTUFYX0JMT0NLVElNRSkKKyAgICAgICAgYmxvY2t0aW1lID0gS01QX01BWF9CTE9DS1RJTUU7CisKKyAgICBzZXRfX2Jsb2NrdGltZV90ZWFtKCB0aHJlYWQtPnRoLnRoX3RlYW0sIHRpZCwgYmxvY2t0aW1lICk7CisgICAgc2V0X19ibG9ja3RpbWVfdGVhbSggdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSwgMCwgYmxvY2t0aW1lICk7CisKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgICAvKiBDYWxjdWxhdGUgYW5kIHNldCBibG9ja3RpbWUgaW50ZXJ2YWxzIGZvciB0aGUgdGVhbXMgKi8KKyAgICBidF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKGJsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzKTsKKworICAgIHNldF9fYnRfaW50ZXJ2YWxzX3RlYW0oIHRocmVhZC0+dGgudGhfdGVhbSwgdGlkLCBidF9pbnRlcnZhbHMgKTsKKyAgICBzZXRfX2J0X2ludGVydmFsc190ZWFtKCB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtLCAwLCBidF9pbnRlcnZhbHMgKTsKKyNlbmRpZgorCisgICAgLyogU2V0IHdoZXRoZXIgYmxvY2t0aW1lIGhhcyBiZWVuIHNldCB0byAiVFJVRSIgKi8KKyAgICBidF9zZXQgPSBUUlVFOworCisgICAgc2V0X19idF9zZXRfdGVhbSggdGhyZWFkLT50aC50aF90ZWFtLCB0aWQsIGJ0X3NldCApOworICAgIHNldF9fYnRfc2V0X3RlYW0oIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0sIDAsIGJ0X3NldCApOworI2lmIEtNUF9VU0VfTU9OSVRPUgorICAgIEtGX1RSQUNFKDEwLCAoImttcF9zZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkLCAiCisgICAgICAgICAgICAgICAgICAiYnRfaW50ZXJ2YWxzPSVkLCBtb25pdG9yX3VwZGF0ZXM9JWRcbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHRpZCwgdGhyZWFkLT50aC50aF90ZWFtKSwKKyAgICAgICAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2lkLCB0aWQsIGJsb2NrdGltZSwgYnRfaW50ZXJ2YWxzLAorICAgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl93YWtldXBzKSk7CisjZWxzZQorICAgIEtGX1RSQUNFKDEwLCAoImttcF9zZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aWQsIHRocmVhZC0+dGgudGhfdGVhbSksCisgICAgICAgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9pZCwgdGlkLCBibG9ja3RpbWUpKTsKKyNlbmRpZgorfQorCit2b2lkCitfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKAorICAgIGNoYXIgY29uc3QgKiBzdHIsCisgICAgaW50ICAgICAgICAgIGxlbgorKSB7CisgICAgaWYgKCAhIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIH07CisgICAgX19rbXBfZW52X2luaXRpYWxpemUoIHN0ciApOworCisgICAgaWYgKF9fa21wX3NldHRpbmdzCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgfHwgX19rbXBfZGlzcGxheV9lbnYgfHwgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisgICAgICAgICkgeworICAgICAgICBfX2ttcF9lbnZfcHJpbnQoKTsKKyAgICB9Cit9IC8vIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpbnRlcm5hbCBmYXN0IHJlZHVjdGlvbiByb3V0aW5lcworICovCisKK1BBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QKK19fa21wX2RldGVybWluZV9yZWR1Y3Rpb25fbWV0aG9kKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApCit7CisKKyAgICAvLyBEZWZhdWx0IHJlZHVjdGlvbiBtZXRob2Q6IGNyaXRpY2FsIGNvbnN0cnVjdCAoIGxjayAhPSBOVUxMLCBsaWtlIGluIGN1cnJlbnQgUEFST1BUICkKKyAgICAvLyBJZiAoIHJlZHVjZV9kYXRhIT1OVUxMICYmIHJlZHVjZV9mdW5jIT1OVUxMICk6IHRoZSB0cmVlLXJlZHVjdGlvbiBtZXRob2QgY2FuIGJlIHNlbGVjdGVkIGJ5IFJUTAorICAgIC8vIElmIGxvYy0+ZmxhZ3MgY29udGFpbnMgS01QX0lERU5UX0FUT01JQ19SRURVQ0UsIHRoZSBhdG9taWMgcmVkdWNlIG1ldGhvZCBjYW4gYmUgc2VsZWN0ZWQgYnkgUlRMCisgICAgLy8gRmluYWxseSwgaXQncyB1cCB0byBPcGVuTVAgUlRMIHRvIG1ha2UgYSBkZWNpc2lvbiBvbiB3aGljaCBtZXRob2QgdG8gc2VsZWN0IGFtb25nIGdlbmVyYXRlZCBieSBQQVJPUFQuCisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHJldHZhbDsKKworICAgIGludCB0ZWFtX3NpemU7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsb2MgKTsgICAgLy8gaXQgd291bGQgYmUgbmljZSB0byB0ZXN0ICggbG9jICE9IDAgKQorICAgIEtNUF9ERUJVR19BU1NFUlQoIGxjayApOyAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHRlc3QgKCBsY2sgIT0gMCApCisKKyAgICAjZGVmaW5lIEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVEICggKCBsb2MtPmZsYWdzICYgKCBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSApICkgPT0gKCBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSApICkKKyAgICAjZGVmaW5lIEZBU1RfUkVEVUNUSU9OX1RSRUVfTUVUSE9EX0dFTkVSQVRFRCAgICggKCByZWR1Y2VfZGF0YSApICYmICggcmVkdWNlX2Z1bmMgKSApCisKKyAgICByZXR2YWwgPSBjcml0aWNhbF9yZWR1Y2VfYmxvY2s7CisKKyAgICB0ZWFtX3NpemUgPSBfX2ttcF9nZXRfdGVhbV9udW1fdGhyZWFkcyggZ2xvYmFsX3RpZCApOyAvLyBhbm90aGVyIGNob2ljZSBvZiBnZXR0aW5nIGEgdGVhbSBzaXplICggd2l0aCAxIGR5bmFtaWMgZGVmZXJlbmNlICkgaXMgc2xvd2VyCisKKyAgICBpZiggdGVhbV9zaXplID09IDEgKSB7CisKKyAgICAgICAgcmV0dmFsID0gZW1wdHlfcmVkdWNlX2Jsb2NrOworCisgICAgfSBlbHNlIHsKKworICAgICAgICBpbnQgYXRvbWljX2F2YWlsYWJsZSA9IEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVEOworICAgICAgICBpbnQgdHJlZV9hdmFpbGFibGUgICA9IEZBU1RfUkVEVUNUSU9OX1RSRUVfTUVUSE9EX0dFTkVSQVRFRDsKKworICAgICAgICAjaWYgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQgfHwgS01QX0FSQ0hfTUlQUzY0CisKKyAgICAgICAgICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRCB8fCBLTVBfT1NfV0lORE9XUyB8fCBLTVBfT1NfREFSV0lOCisKKwkgICAgaW50IHRlYW1zaXplX2N1dG9mZiA9IDQ7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKKyAgICAgICAgICAgICAgICBpZiggX19rbXBfbWljX3R5cGUgIT0gbm9uX21pYyApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbXNpemVfY3V0b2ZmID0gODsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiggdHJlZV9hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0ZWFtX3NpemUgPD0gdGVhbXNpemVfY3V0b2ZmICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhdG9taWNfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1JFRFVDVElPTl9CQVJSSUVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYXRvbWljX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUyIKKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRCB8fCBLTVBfT1NfV0lORE9XUyB8fCBLTVBfT1NfREFSV0lOCisKKyAgICAgICAgI2VsaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSCB8fCBLTVBfQVJDSF9NSVBTCisKKyAgICAgICAgICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MKKworICAgICAgICAgICAgICAgIC8vIGJhc2ljIHR1bmluZworCisgICAgICAgICAgICAgICAgaWYoIGF0b21pY19hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBudW1fdmFycyA8PSAyICkgeyAvLyAmJiAoIHRlYW1fc2l6ZSA8PSA4ICkgZHVlIHRvIGZhbHNlLXNoYXJpbmcgPz8/CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBvdGhlcndpc2U6IHVzZSBjcml0aWNhbCBzZWN0aW9uCisKKyAgICAgICAgICAgICNlbGlmIEtNUF9PU19EQVJXSU4KKworICAgICAgICAgICAgICAgIGlmKCBhdG9taWNfYXZhaWxhYmxlICYmICggbnVtX3ZhcnMgPD0gMyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIHRyZWVfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICBpZiggKCByZWR1Y2Vfc2l6ZSA+ICggOSAqIHNpemVvZigga21wX3JlYWw2NCApICkgKSAmJiAoIHJlZHVjZV9zaXplIDwgKCAyMDAwICogc2l6ZW9mKCBrbXBfcmVhbDY0ICkgKSApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9QTEFJTl9CQVJSSUVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBvdGhlcndpc2U6IHVzZSBjcml0aWNhbCBzZWN0aW9uCisKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUiCisgICAgICAgICNlbmRpZgorCisgICAgfQorCisgICAgLy8gS01QX0ZPUkNFX1JFRFVDVElPTgorCisgICAgLy8gSWYgdGhlIHRlYW0gaXMgc2VyaWFsaXplZCAodGVhbV9zaXplID09IDEpLCBpZ25vcmUgdGhlIGZvcmNlZCByZWR1Y3Rpb24KKyAgICAvLyBtZXRob2QgYW5kIHN0YXkgd2l0aCB0aGUgdW5zeW5jaHJvbml6ZWQgbWV0aG9kIChlbXB0eV9yZWR1Y2VfYmxvY2spCisgICAgaWYoIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgIT0gcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZCAmJiB0ZWFtX3NpemUgIT0gMSkgeworCisgICAgICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgZm9yY2VkX3JldHZhbCA9IGNyaXRpY2FsX3JlZHVjZV9ibG9jazsKKworICAgICAgICBpbnQgYXRvbWljX2F2YWlsYWJsZSwgdHJlZV9hdmFpbGFibGU7CisKKyAgICAgICAgc3dpdGNoKCAoIGZvcmNlZF9yZXR2YWwgPSBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kICkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgY3JpdGljYWxfcmVkdWNlX2Jsb2NrOgorICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIGxjayApOyAgICAgICAgICAgICAgLy8gbGNrIHNob3VsZCBiZSAhPSAwCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgYXRvbWljX3JlZHVjZV9ibG9jazoKKyAgICAgICAgICAgICAgICBhdG9taWNfYXZhaWxhYmxlID0gRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICAgICAgICAgICAgaWYoICEgYXRvbWljX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoUmVkTWV0aG9kTm90U3VwcG9ydGVkLCAiYXRvbWljIik7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlZF9yZXR2YWwgPSBjcml0aWNhbF9yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIHRyZWVfcmVkdWNlX2Jsb2NrOgorICAgICAgICAgICAgICAgIHRyZWVfYXZhaWxhYmxlID0gRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVEOworICAgICAgICAgICAgICAgIGlmKCAhIHRyZWVfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhSZWRNZXRob2ROb3RTdXBwb3J0ZWQsICJ0cmVlIik7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlZF9yZXR2YWwgPSBjcml0aWNhbF9yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgIGZvcmNlZF9yZXR2YWwgPSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1JFRFVDVElPTl9CQVJSSUVSOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggMCApOyAvLyAidW5zdXBwb3J0ZWQgbWV0aG9kIHNwZWNpZmllZCIKKyAgICAgICAgfQorCisgICAgICAgIHJldHZhbCA9IGZvcmNlZF9yZXR2YWw7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICggInJlZHVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQ9JTA4eFxuIiwgcmV0dmFsICkgKTsKKworICAgICN1bmRlZiBGQVNUX1JFRFVDVElPTl9UUkVFX01FVEhPRF9HRU5FUkFURUQKKyAgICAjdW5kZWYgRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQKKworICAgIHJldHVybiAoIHJldHZhbCApOworfQorCisvLyB0aGlzIGZ1bmN0aW9uIGlzIGZvciB0ZXN0aW5nIHNldC9nZXQvZGV0ZXJtaW5lIHJlZHVjZSBtZXRob2QKK2ttcF9pbnQzMgorX19rbXBfZ2V0X3JlZHVjZV9tZXRob2QoIHZvaWQgKSB7CisgICAgcmV0dXJuICggKCBfX2ttcF9lbnRyeV90aHJlYWQoKS0+dGgudGhfbG9jYWwucGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSA+PiA4ICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9zYWZlX2NfYXBpLmggYi9yYzMvcnVudGltZS9zcmMva21wX3NhZmVfY19hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmVhZjhjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zYWZlX2NfYXBpLmgKQEAgLTAsMCArMSw2MiBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NBRkVfQ19BUElfSAorI2RlZmluZSBLTVBfU0FGRV9DX0FQSV9ICisKKy8vCisvLyBSZXBsYWNlbWVudCBmb3IgYmFubmVkIEMgQVBJCisvLworCisvLyBOb3QgZXZlcnkgdW5zYWZlIGNhbGwgbGlzdGVkIGhlcmUgaXMgaGFuZGxlZCBub3csIGJ1dCBrZWVwaW5nIGV2ZXJ5dGhpbmcKKy8vIGluIG9uZSBwbGFjZSBzaG91bGQgYmUgaGFuZHkgZm9yIGZ1dHVyZSBtYWludGVuYW5jZS4KKyNpZiBLTVBfT1NfV0lORE9XUworCisjIGRlZmluZSBSU0laRV9NQVhfU1RSICggNFVMIDw8IDEwICkgLy8gNEtCCisKKy8vIF9tYWxsb2NhIHdhcyBzdWdnZXN0ZWQsIGJ1dCBpdCBpcyBub3QgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBfYWxsb2NhCisjIGRlZmluZSBLTVBfQUxMT0NBICAgICAgICAgICAgICAgICAgX2FsbG9jYQorCisjIGRlZmluZSBLTVBfTUVNQ1BZX1MgICAgICAgICAgICAgICAgbWVtY3B5X3MKKyMgZGVmaW5lIEtNUF9TTlBSSU5URiAgICAgICAgICAgICAgICBzcHJpbnRmX3MKKyMgZGVmaW5lIEtNUF9TU0NBTkYgICAgICAgICAgICAgICAgICBzc2NhbmZfcworIyBkZWZpbmUgS01QX1NUUkNQWV9TICAgICAgICAgICAgICAgIHN0cmNweV9zCisjIGRlZmluZSBLTVBfU1RSTkNQWV9TICAgICAgICAgICAgICAgc3RybmNweV9zCisKKy8vIFVzZSB0aGlzIG9ubHkgd2hlbiBidWZmZXIgc2l6ZSBpcyB1bmtub3duCisjIGRlZmluZSBLTVBfTUVNQ1BZKGRzdCwgc3JjLCBjbnQpICAgbWVtY3B5X3MoZHN0LCBjbnQsIHNyYywgY250KQorCisjIGRlZmluZSBLTVBfU1RSTEVOKHN0cikgICAgICAgICAgICAgc3Rybmxlbl9zKHN0ciwgUlNJWkVfTUFYX1NUUikKKworLy8gVXNlIHRoaXMgb25seSB3aGVuIGJ1ZmZlciBzaXplIGlzIHVua25vd24KKyMgZGVmaW5lIEtNUF9TVFJOQ1BZKGRzdCwgc3JjLCBjbnQpICBzdHJuY3B5X3MoZHN0LCBjbnQsIHNyYywgY250KQorCisvLyBfVFJVTkNBVEUgaW5zdXJlcyBidWZmZXIgc2l6ZSA+IG1heCBzdHJpbmcgdG8gcHJpbnQuCisjIGRlZmluZSBLTVBfVlNOUFJJTlRGKGRzdCwgY250LCBmbXQsIGFyZykgIHZzbnByaW50Zl9zKGRzdCwgY250LCBfVFJVTkNBVEUsIGZtdCwgYXJnKQorCisjZWxzZSAvLyBLTVBfT1NfV0lORE9XUworCisvLyBGb3Igbm93LCB0aGVzZSBtYWNyb3MgdXNlIHRoZSBleGlzdGluZyBBUEkuCisKKyMgZGVmaW5lIEtNUF9BTExPQ0EgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhCisjIGRlZmluZSBLTVBfTUVNQ1BZX1MoZHN0LCBic3osIHNyYywgY250KSAgIG1lbWNweShkc3QsIHNyYywgY250KQorIyBkZWZpbmUgS01QX1NOUFJJTlRGICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZgorIyBkZWZpbmUgS01QX1NTQ0FORiAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYKKyMgZGVmaW5lIEtNUF9TVFJDUFlfUyhkc3QsIGJzeiwgc3JjKSAgICAgICAgc3RyY3B5KGRzdCwgc3JjKQorIyBkZWZpbmUgS01QX1NUUk5DUFlfUyhkc3QsIGJzeiwgc3JjLCBjbnQpICBzdHJuY3B5KGRzdCwgc3JjLCBjbnQpCisjIGRlZmluZSBLTVBfVlNOUFJJTlRGICAgICAgICAgICAgICAgICAgICAgIHZzbnByaW50ZgorIyBkZWZpbmUgS01QX1NUUk5DUFkgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5CisjIGRlZmluZSBLTVBfU1RSTEVOICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbgorIyBkZWZpbmUgS01QX01FTUNQWSAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkKKworI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisKKyNlbmRpZiAvLyBLTVBfU0FGRV9DX0FQSV9ICmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3NjaGVkLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc2NoZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNmJiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3NjaGVkLmNwcApAQCAtMCwwICsxLDk3NCBAQAorLyoKKyAqIGttcF9zY2hlZC5jcHAgLS0gc3RhdGljIHNjaGVkdWxpbmcgLS0gaXRlcmF0aW9uIGluaXRpYWxpemF0aW9uCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qCisgKiBTdGF0aWMgc2NoZWR1bGluZyBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBOT1RFOiB0ZWFtLT50LnRfbnByb2MgaXMgYSBjb25zdGFudCBpbnNpZGUgb2YgYW55IGRpc3BhdGNoIGxvb3AsIGhvd2V2ZXIKKyAqICAgICAgIGl0IG1heSBjaGFuZ2UgdmFsdWVzIGJldHdlZW4gcGFyYWxsZWwgcmVnaW9ucy4gIF9fa21wX21heF9udGgKKyAqICAgICAgIGlzIHRoZSBsYXJnZXN0IHZhbHVlIF9fa21wX250aCBtYXkgdGFrZSwgMSBpcyB0aGUgc21hbGxlc3QuCisgKgorICovCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworLy8gdGVtcGxhdGUgZm9yIHR5cGUgbGltaXRzCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdHJ1Y3QgaV9tYXhtaW4geworICAgIHN0YXRpYyBjb25zdCBUIG14OworICAgIHN0YXRpYyBjb25zdCBUIG1uOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgaW50ID4geworICAgIHN0YXRpYyBjb25zdCBpbnQgbXggPSAweDdmZmZmZmZmOworICAgIHN0YXRpYyBjb25zdCBpbnQgbW4gPSAweDgwMDAwMDAwOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgdW5zaWduZWQgaW50ID4geworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXggPSAweGZmZmZmZmZmOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbW4gPSAweDAwMDAwMDAwOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgbG9uZyBsb25nID4geworICAgIHN0YXRpYyBjb25zdCBsb25nIGxvbmcgbXggPSAweDdmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIG1uID0gMHg4MDAwMDAwMDAwMDAwMDAwTEw7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCB1bnNpZ25lZCBsb25nIGxvbmcgPiB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBteCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkxMOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbW4gPSAweDAwMDAwMDAwMDAwMDAwMDBMTDsKK307CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfREVCVUcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGVtcGxhdGUgZm9yIGRlYnVnIHByaW50cyBzcGVjaWZpY2F0aW9uICggZCwgdSwgbGxkLCBsbHUgKQorICAgIGNoYXIgY29uc3QgKiB0cmFpdHNfdDwgaW50ID46OnNwZWMgPSAiZCI7CisgICAgY2hhciBjb25zdCAqIHRyYWl0c190PCB1bnNpZ25lZCBpbnQgPjo6c3BlYyA9ICJ1IjsKKyAgICBjaGFyIGNvbnN0ICogdHJhaXRzX3Q8IGxvbmcgbG9uZyA+OjpzcGVjID0gImxsZCI7CisgICAgY2hhciBjb25zdCAqIHRyYWl0c190PCB1bnNpZ25lZCBsb25nIGxvbmcgPjo6c3BlYyA9ICJsbHUiOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZW5kaWYKKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIHZvaWQKK19fa21wX2Zvcl9zdGF0aWNfaW5pdCgKKyAgICBpZGVudF90ICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHR5cGUsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxvd2VyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgKnBzdHJpZGUsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgIGluY3IsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgIGNodW5rCispIHsKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0ZPUl9zdGF0aWMpOworICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKEZPUl9zdGF0aWNfc2NoZWR1bGluZyk7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgLyogIHRoaXMgYWxsIGhhcyB0byBiZSBjaGFuZ2VkIGJhY2sgdG8gVElEIGFuZCBzdWNoLi4gKi8KKyAgICByZWdpc3RlciBrbXBfaW50MzIgICBndGlkID0gZ2xvYmFsX3RpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICB0aWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgbnRoOworICAgIHJlZ2lzdGVyIFVUICAgICAgICAgIHRyaXBfY291bnQ7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgb21wdF90ZWFtX2luZm9fdCAqdGVhbV9pbmZvID0gTlVMTDsKKyAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBOVUxMOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAvLyBPbmx5IGZ1bGx5IGluaXRpYWxpemUgdmFyaWFibGVzIG5lZWRlZCBieSBPTVBUIGlmIE9NUFQgaXMgZW5hYmxlZC4KKyAgICAgICAgdGVhbV9pbmZvID0gX19vbXB0X2dldF90ZWFtaW5mbygwLCBOVUxMKTsKKyAgICAgICAgdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgICB9CisjZW5kaWYKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHBsYXN0aXRlciAmJiBwbG93ZXIgJiYgcHVwcGVyICYmIHBzdHJpZGUgKTsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdCBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlJWQgc2NoZWQ9JSVkIGxpdGVyPSUlZCBpdGVyPSglJSVzLCIgXAorICAgICAgICAgICAgIiAlJSVzLCAlJSVzKSBpbmNyPSUlJXMgY2h1bms9JSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBnbG9iYWxfdGlkLCBzY2hlZHR5cGUsICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSwgaW5jciwgY2h1bmsgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIGlmICggaW5jciA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciB6ZXJvLXRyaXAgbG9vcHMgKi8KKyAgICBpZiAoIGluY3IgPiAwID8gKCpwdXBwZXIgPCAqcGxvd2VyKSA6ICgqcGxvd2VyIDwgKnB1cHBlcikgKSB7CisgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAqcGxhc3RpdGVyID0gRkFMU0U7CisgICAgICAgIC8qIGxlYXZlIHB1cHBlciBhbmQgcGxvd2VyIHNldCB0byBlbnRpcmUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgICAgICpwc3RyaWRlID0gaW5jcjsgICAvKiB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgdXNlZCAqLworCS8vICAgICAgICAqcGxvd2VyID0gKnB1cHBlciAtIGluY3I7ICAgLy8gbGV0IGNvbXBpbGVyIGJ5cGFzcyB0aGUgaWxsZWdhbCBsb29wIChsaWtlIGZvcihpPTE7aTwxMDtpLS0pKSAgVEhJUyBMSU5FIENBVVNFRCBzaGFwZTJGL2hfdGVzdHNfMS5mIFRPIEhBVkUgQSBGQUlMVVJFIE9OIEEgWkVSTy1UUklQIExPT1AgKGxvd2VyPTEsXAorCSAgdXBwZXI9MCxzdHJpZGU9MSkgLSBKUEggSnVuZSAyMywgMjAwOS4KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6KFpFUk8gVFJJUCkgbGl0ZXI9JSVkIGxvd2VyPSUlJXMgdXBwZXI9JSUlcyBzdHJpZGUgPSAlJSVzIHNpZ25lZD88JXM+LCBsb2MgPSAlJXNcbiIsCisgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSwgbG9jLT5wc291cmNlICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4pKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkLAorICAgICAgICAgICAgICAgIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIEtNUF9DT1VOVF9WQUxVRSAoRk9SX3N0YXRpY19pdGVyYXRpb25zLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vIEFsdGhvdWdoIHRoZXJlIGFyZSBzY2hlZHVsZSBlbnVtZXJhdGlvbnMgYWJvdmUga21wX29yZF91cHBlciB3aGljaCBhcmUgbm90IHNjaGVkdWxlcyBmb3IgImRpc3RyaWJ1dGUiLAorICAgIC8vIHRoZSBvbmx5IG9uZXMgd2hpY2ggYXJlIHVzZWZ1bCBhcmUgZHluYW1pYywgc28gY2Fubm90IGJlIHNlZW4gaGVyZSwgc2luY2UgdGhpcyBjb2RlcGF0aCBpcyBvbmx5IGV4ZWN1dGVkCisgICAgLy8gZm9yIHN0YXRpYyBzY2hlZHVsZXMuCisgICAgaWYgKCBzY2hlZHR5cGUgPiBrbXBfb3JkX3VwcGVyICkgeworICAgICAgICAvLyB3ZSBhcmUgaW4gRElTVFJJQlVURSBjb25zdHJ1Y3QKKyAgICAgICAgc2NoZWR0eXBlICs9IGttcF9zY2hfc3RhdGljIC0ga21wX2Rpc3RyaWJ1dGVfc3RhdGljOyAgICAgIC8vIEFDOiBjb252ZXJ0IHRvIHVzdWFsIHNjaGVkdWxlIHR5cGUKKyAgICAgICAgdGlkICA9IHRoLT50aC50aF90ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICAgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtLT50LnRfcGFyZW50OworICAgIH0gZWxzZQorICAgICNlbmRpZgorICAgIHsKKyAgICAgICAgdGlkICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKyAgICAgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgIH0KKworICAgIC8qIGRldGVybWluZSBpZiAiZm9yIiBsb29wIGlzIGFuIGFjdGl2ZSB3b3Jrc2hhcmluZyBjb25zdHJ1Y3QgKi8KKyAgICBpZiAoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIC8qIHNlcmlhbGl6ZWQgcGFyYWxsZWwsIGVhY2ggdGhyZWFkIGV4ZWN1dGVzIHdob2xlIGl0ZXJhdGlvbiBzcGFjZSAqLworICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9IFRSVUU7CisgICAgICAgIC8qIGxlYXZlIHB1cHBlciBhbmQgcGxvd2VyIHNldCB0byBlbnRpcmUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgICAgICpwc3RyaWRlID0gKGluY3IgPiAwKSA/ICgqcHVwcGVyIC0gKnBsb3dlciArIDEpIDogKC0oKnBsb3dlciAtICpwdXBwZXIgKyAxKSk7CisKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IChzZXJpYWwpIGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4pKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkLAorICAgICAgICAgICAgICAgIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbnRoID0gdGVhbS0+dC50X25wcm9jOworICAgIGlmICggbnRoID09IDEgKSB7CisgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAqcGxhc3RpdGVyID0gVFJVRTsKKyAgICAgICAgKnBzdHJpZGUgPSAoaW5jciA+IDApID8gKCpwdXBwZXIgLSAqcGxvd2VyICsgMSkgOiAoLSgqcGxvd2VyIC0gKnB1cHBlciArIDEpKTsKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IChzZXJpYWwpIGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlICkgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4pKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkLAorICAgICAgICAgICAgICAgIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHRyaXAgY291bnQgKi8KKyAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwdXBwZXIgLSAqcGxvd2VyICsgMTsKKyAgICB9IGVsc2UgaWYgKGluY3IgPT0gLTEpIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwbG93ZXIgLSAqcHVwcGVyICsgMTsKKyAgICB9IGVsc2UgaWYgKCBpbmNyID4gMCApIHsKKyAgICAgICAgLy8gdXBwZXItbG93ZXIgY2FuIGV4Y2VlZCB0aGUgbGltaXQgb2Ygc2lnbmVkIHR5cGUKKyAgICAgICAgdHJpcF9jb3VudCA9IChVVCkoKnB1cHBlciAtICpwbG93ZXIpIC8gaW5jciArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJpcF9jb3VudCA9IChVVCkoKnBsb3dlciAtICpwdXBwZXIpIC8gKC1pbmNyKSArIDE7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIC8qIHRyaXBjb3VudCBvdmVyZmxvdz8gKi8KKyAgICAgICAgaWYgKCB0cmlwX2NvdW50ID09IDAgJiYgKnB1cHBlciAhPSAqcGxvd2VyICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zSXRlcmF0aW9uUmFuZ2VUb29MYXJnZSwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfQ09VTlRfVkFMVUUgKEZPUl9zdGF0aWNfaXRlcmF0aW9ucywgdHJpcF9jb3VudCk7CisKKyAgICAvKiBjb21wdXRlIHJlbWFpbmluZyBwYXJhbWV0ZXJzICovCisgICAgc3dpdGNoICggc2NoZWR0eXBlICkgeworICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdHJpcF9jb3VudCA8IG50aCApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5IHx8IFwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkCisgICAgICAgICAgICAgICAgKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAgICAgICAgIGlmICggdGlkIDwgdHJpcF9jb3VudCApIHsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgPSAqcGxvd2VyICsgdGlkICogaW5jcjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqcGxvd2VyID0gKnB1cHBlciArIGluY3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRpZCA9PSB0cmlwX2NvdW50IC0gMSApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVVQgc21hbGxfY2h1bmsgPSB0cmlwX2NvdW50IC8gbnRoOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBVVCBleHRyYXMgPSB0cmlwX2NvdW50ICUgbnRoOworICAgICAgICAgICAgICAgICAgICAqcGxvd2VyICs9IGluY3IgKiAoIHRpZCAqIHNtYWxsX2NodW5rICsgKCB0aWQgPCBleHRyYXMgPyB0aWQgOiBleHRyYXMgKSApOworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIHNtYWxsX2NodW5rICogaW5jciAtICggdGlkIDwgZXh0cmFzID8gMCA6IGluY3IgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRpZCA9PSBudGggLSAxICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVCBiaWdfY2h1bmtfaW5jX2NvdW50ID0gKCB0cmlwX2NvdW50L250aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCB0cmlwX2NvdW50ICUgbnRoICkgPyAxIDogMCkgKSAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFQgb2xkX3VwcGVyID0gKnB1cHBlcjsKKworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciArPSB0aWQgKiBiaWdfY2h1bmtfaW5jX2NvdW50OworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGJpZ19jaHVua19pbmNfY291bnQgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwdXBwZXIgPCAqcGxvd2VyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gaV9tYXhtaW48IFQgPjo6bXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAqcGxvd2VyIDw9IG9sZF91cHBlciAmJiAqcHVwcGVyID4gb2xkX3VwcGVyIC0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKnB1cHBlciA+IG9sZF91cHBlciApICpwdXBwZXIgPSBvbGRfdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA+ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjptbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPj0gb2xkX3VwcGVyICYmICpwdXBwZXIgPCBvbGRfdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcHVwcGVyIDwgb2xkX3VwcGVyICkgKnB1cHBlciA9IG9sZF91cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICB7CisgICAgICAgICAgICByZWdpc3RlciBTVCBzcGFuOworICAgICAgICAgICAgaWYgKCBjaHVuayA8IDEgKSB7CisgICAgICAgICAgICAgICAgY2h1bmsgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3BhbiA9IGNodW5rICogaW5jcjsKKyAgICAgICAgICAgICpwc3RyaWRlID0gc3BhbiAqIG50aDsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcGxvd2VyICsgKHNwYW4gKiB0aWQpOworICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBzcGFuIC0gaW5jcjsKKyAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICh0aWQgPT0gKCh0cmlwX2NvdW50IC0gMSkvKCBVVCApY2h1bmspICUgbnRoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkX2NodW5rZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFQgb2xkX3VwcGVyID0gKnB1cHBlcjsKKyAgICAgICAgICAgIC8vIHJvdW5kIHVwIHRvIG1ha2Ugc3VyZSB0aGUgY2h1bmsgaXMgZW5vdWdoIHRvIGNvdmVyIGFsbCBpdGVyYXRpb25zCisgICAgICAgICAgICByZWdpc3RlciBVVCBzcGFuID0gKHRyaXBfY291bnQrbnRoLTEpIC8gbnRoOworCisgICAgICAgICAgICAvLyBwZXJmb3JtIGNodW5rIGFkanVzdG1lbnQKKyAgICAgICAgICAgIGNodW5rID0gKHNwYW4gKyBjaHVuayAtIDEpICYgfihjaHVuay0xKTsKKworICAgICAgICAgICAgc3BhbiA9IGNodW5rICogaW5jcjsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcGxvd2VyICsgKHNwYW4gKiB0aWQpOworICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBzcGFuIC0gaW5jcjsKKyAgICAgICAgICAgIGlmICggaW5jciA+IDAgKSB7CisgICAgICAgICAgICAgIGlmICggKnB1cHBlciA+IG9sZF91cHBlciApICpwdXBwZXIgPSBvbGRfdXBwZXI7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgaWYgKCAqcHVwcGVyIDwgb2xkX3VwcGVyICkgKnB1cHBlciA9IG9sZF91cHBlcjsKKworICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKCB0aWQgPT0gKCh0cmlwX2NvdW50IC0gMSkvKCBVVCApY2h1bmspICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0FTU0VSVDIoIDAsICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiB1bmtub3duIHNjaGVkdWxpbmcgdHlwZSIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIC8vIFJlcG9ydCBsb29wIG1ldGFkYXRhCisgICAgaWYgKCBLTVBfTUFTVEVSX1RJRCh0aWQpICYmIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0gMSApCisgICAgeworICAgICAgICBrbXBfdWludDY0IGN1cl9jaHVuayA9IGNodW5rOworICAgICAgICAvLyBDYWxjdWxhdGUgY2h1bmsgaW4gY2FzZSBpdCB3YXMgbm90IHNwZWNpZmllZDsgaXQgaXMgc3BlY2lmaWVkIGZvciBrbXBfc2NoX3N0YXRpY19jaHVua2VkCisgICAgICAgIGlmICggc2NoZWR0eXBlID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICAgICAgY3VyX2NodW5rID0gdHJpcF9jb3VudCAvIG50aCArICggKCB0cmlwX2NvdW50ICUgbnRoICkgPyAxIDogMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gMCAtICJzdGF0aWMiIHNjaGVkdWxlCisgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKGxvYywgMCwgdHJpcF9jb3VudCwgY3VyX2NodW5rKTsKKyAgICB9CisjZW5kaWYKKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IGxpdGVyPSUlZCBsb3dlcj0lJSVzIHVwcGVyPSUlJXMgc3RyaWRlID0gJSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQgKSApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3RfZm9yX3N0YXRpY19pbml0KAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2MsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlLAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsb3dlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXJEaXN0LAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICpwc3RyaWRlLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBpbmNyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBjaHVuaworKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9ESVNUUklCVVRFKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgdGlkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIG50aDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICB0ZWFtX2lkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIG50ZWFtczsKKyAgICByZWdpc3RlciBVVCAgICAgICAgICB0cmlwX2NvdW50OworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqIHRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggcGxhc3RpdGVyICYmIHBsb3dlciAmJiBwdXBwZXIgJiYgcHVwcGVyRGlzdCAmJiBwc3RyaWRlICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdCBjYWxsZWQgKCVkKVxuIiwgZ3RpZCkpOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiBUIyUlZCBzY2hlZExvb3A9JSVkIGxpdGVyPSUlZCAiXAorICAgICAgICAgICAgIml0ZXI9KCUlJXMsICUlJXMsICUlJXMpIGNodW5rPSUlJXMgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgKnBsb3dlciwgKnB1cHBlciwgaW5jciwgY2h1bmsgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ3RpZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgaWYoIGluY3IgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGluY3IgPiAwID8gKCpwdXBwZXIgPCAqcGxvd2VyKSA6ICgqcGxvd2VyIDwgKnB1cHBlcikgKSB7CisgICAgICAgICAgICAvLyBUaGUgbG9vcCBpcyBpbGxlZ2FsLgorICAgICAgICAgICAgLy8gU29tZSB6ZXJvLXRyaXAgbG9vcHMgbWFpbnRhaW5lZCBieSBjb21waWxlciwgZS5nLjoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOysraSkgLy8gbG93ZXIgPj0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7LS1pKSAvLyBsb3dlciA8PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDsrK2kpIC8vIGluY3IgPiAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDstLWkpIC8vIGluY3IgPCAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyBDb21waWxlciBkb2VzIG5vdCBjaGVjayB0aGUgZm9sbG93aW5nIGlsbGVnYWwgbG9vcHM6CisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aTwxMDtpKz1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aT4wO2ktPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JJbGxlZ2FsLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgbnRoID0gdGgtPnRoLnRoX3RlYW1fbnByb2M7CisgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgICNpZiBPTVBfNDBfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayk7ICAgLy8gd2UgYXJlIGluIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICBudGVhbXMgPSB0aC0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXM7CisgICAgI2VuZGlmCisgICAgdGVhbV9pZCA9IHRlYW0tPnQudF9tYXN0ZXJfdGlkOworICAgIEtNUF9ERUJVR19BU1NFUlQobnRlYW1zID09IHRlYW0tPnQudF9wYXJlbnQtPnQudF9ucHJvYyk7CisKKyAgICAvLyBjb21wdXRlIGdsb2JhbCB0cmlwIGNvdW50CisgICAgaWYoIGluY3IgPT0gMSApIHsKKyAgICAgICAgdHJpcF9jb3VudCA9ICpwdXBwZXIgLSAqcGxvd2VyICsgMTsKKyAgICB9IGVsc2UgaWYoaW5jciA9PSAtMSkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnBsb3dlciAtICpwdXBwZXIgKyAxOworICAgIH0gZWxzZSBpZiAoIGluY3IgPiAwICkgeworICAgICAgICAvLyB1cHBlci1sb3dlciBjYW4gZXhjZWVkIHRoZSBsaW1pdCBvZiBzaWduZWQgdHlwZQorICAgICAgICB0cmlwX2NvdW50ID0gKFVUKSgqcHVwcGVyIC0gKnBsb3dlcikgLyBpbmNyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmlwX2NvdW50ID0gKFVUKSgqcGxvd2VyIC0gKnB1cHBlcikgLyAoLWluY3IpICsgMTsKKyAgICB9CisKKyAgICAqcHN0cmlkZSA9ICpwdXBwZXIgLSAqcGxvd2VyOyAgLy8ganVzdCBpbiBjYXNlIChjYW4gYmUgdW51c2VkKQorICAgIGlmKCB0cmlwX2NvdW50IDw9IG50ZWFtcyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgfHwgXAorICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkCisgICAgICAgICk7IC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgLy8gb25seSBtYXN0ZXJzIG9mIHNvbWUgdGVhbXMgZ2V0IHNpbmdsZSBpdGVyYXRpb24sIG90aGVyIHRocmVhZHMgZ2V0IG5vdGhpbmcKKyAgICAgICAgaWYoIHRlYW1faWQgPCB0cmlwX2NvdW50ICYmIHRpZCA9PSAwICkgeworICAgICAgICAgICAgKnB1cHBlciA9ICpwdXBwZXJEaXN0ID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0ZWFtX2lkICogaW5jcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gKnB1cHBlcjsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsgLy8gY29tcGlsZXIgc2hvdWxkIHNraXAgbG9vcCBib2R5CisgICAgICAgIH0KKyAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRpZCA9PSAwICYmIHRlYW1faWQgPT0gdHJpcF9jb3VudCAtIDEgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBHZXQgdGhlIHRlYW0ncyBjaHVuayBmaXJzdCAoZWFjaCB0ZWFtIGdldHMgYXQgbW9zdCBvbmUgY2h1bmspCisgICAgICAgIGlmKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICByZWdpc3RlciBVVCBjaHVua0QgPSB0cmlwX2NvdW50IC8gbnRlYW1zOworICAgICAgICAgICAgcmVnaXN0ZXIgVVQgZXh0cmFzID0gdHJpcF9jb3VudCAlIG50ZWFtczsKKyAgICAgICAgICAgICpwbG93ZXIgKz0gaW5jciAqICggdGVhbV9pZCAqIGNodW5rRCArICggdGVhbV9pZCA8IGV4dHJhcyA/IHRlYW1faWQgOiBleHRyYXMgKSApOworICAgICAgICAgICAgKnB1cHBlckRpc3QgPSAqcGxvd2VyICsgY2h1bmtEICogaW5jciAtICggdGVhbV9pZCA8IGV4dHJhcyA/IDAgOiBpbmNyICk7CisgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRlYW1faWQgPT0gbnRlYW1zIC0gMSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVnaXN0ZXIgVCBjaHVua19pbmNfY291bnQgPQorICAgICAgICAgICAgICAgICggdHJpcF9jb3VudCAvIG50ZWFtcyArICggKCB0cmlwX2NvdW50ICUgbnRlYW1zICkgPyAxIDogMCkgKSAqIGluY3I7CisgICAgICAgICAgICByZWdpc3RlciBUIHVwcGVyID0gKnB1cHBlcjsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKTsKKyAgICAgICAgICAgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAqcGxvd2VyICs9IHRlYW1faWQgKiBjaHVua19pbmNfY291bnQ7CisgICAgICAgICAgICAqcHVwcGVyRGlzdCA9ICpwbG93ZXIgKyBjaHVua19pbmNfY291bnQgLSBpbmNyOworICAgICAgICAgICAgLy8gQ2hlY2svY29ycmVjdCBib3VuZHMgaWYgbmVlZGVkCisgICAgICAgICAgICBpZiggaW5jciA+IDAgKSB7CisgICAgICAgICAgICAgICAgaWYoICpwdXBwZXJEaXN0IDwgKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gaV9tYXhtaW48IFQgPjo6bXg7CisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPD0gdXBwZXIgJiYgKnB1cHBlckRpc3QgPiB1cHBlciAtIGluY3I7CisgICAgICAgICAgICAgICAgaWYoICpwdXBwZXJEaXN0ID4gdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyRGlzdCA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgIGlmKCAqcGxvd2VyID4gKnB1cHBlckRpc3QgKSB7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcHVwcGVyRGlzdDsgIC8vIG5vIGl0ZXJhdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgdGVhbQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyRGlzdCA+ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyRGlzdCA9IGlfbWF4bWluPCBUID46Om1uOworICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAqcGxvd2VyID49IHVwcGVyICYmICpwdXBwZXJEaXN0IDwgdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyRGlzdCA8IHVwcGVyICkKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlckRpc3QgPSB1cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICBpZiggKnBsb3dlciA8ICpwdXBwZXJEaXN0ICkgeworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnB1cHBlckRpc3Q7ICAvLyBubyBpdGVyYXRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHRlYW0KKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEdldCB0aGUgcGFyYWxsZWwgbG9vcCBjaHVuayBub3cgKGZvciB0aHJlYWQpCisgICAgICAgIC8vIGNvbXB1dGUgdHJpcCBjb3VudCBmb3IgdGVhbSdzIGNodW5rCisgICAgICAgIGlmKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICB0cmlwX2NvdW50ID0gKnB1cHBlckRpc3QgLSAqcGxvd2VyICsgMTsKKyAgICAgICAgfSBlbHNlIGlmKGluY3IgPT0gLTEpIHsKKyAgICAgICAgICAgIHRyaXBfY291bnQgPSAqcGxvd2VyIC0gKnB1cHBlckRpc3QgKyAxOworICAgICAgICB9IGVsc2UgaWYgKCBpbmNyID4gMSApIHsKKyAgICAgICAgICAgIC8vIHVwcGVyLWxvd2VyIGNhbiBleGNlZWQgdGhlIGxpbWl0IG9mIHNpZ25lZCB0eXBlCisgICAgICAgICAgICB0cmlwX2NvdW50ID0gKFVUKSgqcHVwcGVyRGlzdCAtICpwbG93ZXIpIC8gaW5jciArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmlwX2NvdW50ID0gKFVUKSgqcGxvd2VyIC0gKnB1cHBlckRpc3QpIC8gKC1pbmNyKSArIDE7CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdHJpcF9jb3VudCApOworICAgICAgICBzd2l0Y2goIHNjaGVkdWxlICkgeworICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgICAgICB7CisgICAgICAgICAgICBpZiggdHJpcF9jb3VudCA8PSBudGggKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fCBcCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZAorICAgICAgICAgICAgICAgICk7IC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICAgICBpZiggdGlkIDwgdHJpcF9jb3VudCApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyID0gKnBsb3dlciArIHRpZCAqIGluY3I7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqcGxvd2VyID0gKnB1cHBlciArIGluY3I7IC8vIG5vIGl0ZXJhdGlvbnMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgaWYoICpwbGFzdGl0ZXIgIT0gMCAmJiAhKCB0aWQgPT0gdHJpcF9jb3VudCAtIDEgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVVQgY2h1bmtMID0gdHJpcF9jb3VudCAvIG50aDsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVVQgZXh0cmFzID0gdHJpcF9jb3VudCAlIG50aDsKKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKHRpZCAqIGNodW5rTCArICh0aWQgPCBleHRyYXMgPyB0aWQgOiBleHRyYXMpKTsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBjaHVua0wgKiBpbmNyIC0gKHRpZCA8IGV4dHJhcyA/IDAgOiBpbmNyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcGxhc3RpdGVyICE9IDAgJiYgISggdGlkID09IG50aCAtIDEgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVCBjaHVua19pbmNfY291bnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKCB0cmlwX2NvdW50IC8gbnRoICsgKCAoIHRyaXBfY291bnQgJSBudGggKSA/IDEgOiAwKSApICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVCB1cHBlciA9ICpwdXBwZXJEaXN0OworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgKz0gdGlkICogY2h1bmtfaW5jX2NvdW50OworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGNodW5rX2luY19jb3VudCAtIGluY3I7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpbmNyID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IGlfbWF4bWluPCBUID46Om14OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnBsYXN0aXRlciAhPSAwICYmICEoKnBsb3dlciA8PSB1cHBlciAmJiAqcHVwcGVyID4gdXBwZXIgLSBpbmNyKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwdXBwZXIgPiB1cHBlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IHVwcGVyOy8vdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IGlfbWF4bWluPCBUID46Om1uOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnBsYXN0aXRlciAhPSAwICYmICEoKnBsb3dlciA+PSB1cHBlciAmJiAqcHVwcGVyIDwgdXBwZXIgLSBpbmNyKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwdXBwZXIgPCB1cHBlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IHVwcGVyOy8vdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgU1Qgc3BhbjsKKyAgICAgICAgICAgIGlmKCBjaHVuayA8IDEgKQorICAgICAgICAgICAgICAgIGNodW5rID0gMTsKKyAgICAgICAgICAgIHNwYW4gPSBjaHVuayAqIGluY3I7CisgICAgICAgICAgICAqcHN0cmlkZSA9IHNwYW4gKiBudGg7CisgICAgICAgICAgICAqcGxvd2VyID0gKnBsb3dlciArIChzcGFuICogdGlkKTsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgc3BhbiAtIGluY3I7CisgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIGlmKCAqcGxhc3RpdGVyICE9IDAgJiYgISh0aWQgPT0gKCh0cmlwX2NvdW50IC0gMSkgLyAoIFVUICljaHVuaykgJSBudGgpICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgS01QX0FTU0VSVDIoIDAsICJfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXQ6IHVua25vd24gbG9vcCBzY2hlZHVsaW5nIHR5cGUiICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbmQ6OworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiBsYXN0PSUlZCBsbz0lJSVzIHVwPSUlJXMgdXBEaXN0PSUlJXMgIlwKKyAgICAgICAgICAgICJzdHJpZGU9JSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnB1cHBlckRpc3QsICpwc3RyaWRlICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXQ6IFQjJWQgcmV0dXJuXG4iLCBndGlkICkgKTsKKyAgICByZXR1cm47Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF90ZWFtX3N0YXRpY19pbml0KAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2MsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAqcF9zdCwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgaW5jciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgY2h1bmsKKykgeworICAgIC8vIFRoZSByb3V0aW5lIHJldHVybnMgdGhlIGZpcnN0IGNodW5rIGRpc3RyaWJ1dGVkIHRvIHRoZSB0ZWFtIGFuZAorICAgIC8vIHN0cmlkZSBmb3IgbmV4dCBjaHVua3MgY2FsY3VsYXRpb24uCisgICAgLy8gTGFzdCBpdGVyYXRpb24gZmxhZyBzZXQgZm9yIHRoZSB0ZWFtIHRoYXQgd2lsbCBleGVjdXRlCisgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wLgorICAgIC8vIFRoZSByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZGlzdF9zY2hlZHVlKHN0YXRpYyxjaHVuaykgb25seS4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAga21wX3VpbnQzMiAgdGVhbV9pZDsKKyAgICBrbXBfdWludDMyICBudGVhbXM7CisgICAgVVQgICAgICAgICAgdHJpcF9jb3VudDsKKyAgICBUICAgICAgICAgICBsb3dlcjsKKyAgICBUICAgICAgICAgICB1cHBlcjsKKyAgICBTVCAgICAgICAgICBzcGFuOworICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwX2xhc3QgJiYgcF9sYiAmJiBwX3ViICYmIHBfc3QgKTsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBfdGVhbV9zdGF0aWNfaW5pdCBjYWxsZWQgKCVkKVxuIiwgZ3RpZCkpOworICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoICJfX2ttcF90ZWFtX3N0YXRpY19pbml0IGVudGVyOiBUIyUlZCBsaXRlcj0lJWQgIlwKKyAgICAgICAgICAgICJpdGVyPSglJSVzLCAlJSVzLCAlJSVzKSBjaHVuayAlJSVzOyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsIGd0aWQsICpwX2xhc3QsICpwX2xiLCAqcF91YiwgKnBfc3QsIGNodW5rICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgbG93ZXIgPSAqcF9sYjsKKyAgICB1cHBlciA9ICpwX3ViOworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmKCBpbmNyID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgICAgIGlmKCBpbmNyID4gMCA/ICh1cHBlciA8IGxvd2VyKSA6IChsb3dlciA8IHVwcGVyKSApIHsKKyAgICAgICAgICAgIC8vIFRoZSBsb29wIGlzIGlsbGVnYWwuCisgICAgICAgICAgICAvLyBTb21lIHplcm8tdHJpcCBsb29wcyBtYWludGFpbmVkIGJ5IGNvbXBpbGVyLCBlLmcuOgorICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPDA7KytpKSAvLyBsb3dlciA+PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDstLWkpIC8vIGxvd2VyIDw9IHVwcGVyIC0gcnVuLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPjEwOysraSkgLy8gaW5jciA+IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOy0taSkgLy8gaW5jciA8IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vIENvbXBpbGVyIGRvZXMgbm90IGNoZWNrIHRoZSBmb2xsb3dpbmcgaWxsZWdhbCBsb29wczoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPDEwO2krPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPjA7aS09aW5jcikgLy8gd2hlcmUgaW5jcjwwCisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNMb29wSW5jcklsbGVnYWwsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIHRlYW0gPSB0aC0+dGgudGhfdGVhbTsKKyAgICAjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2spOyAgIC8vIHdlIGFyZSBpbiB0aGUgdGVhbXMgY29uc3RydWN0CisgICAgbnRlYW1zID0gdGgtPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zOworICAgICNlbmRpZgorICAgIHRlYW1faWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG50ZWFtcyA9PSB0ZWFtLT50LnRfcGFyZW50LT50LnRfbnByb2MpOworCisgICAgLy8gY29tcHV0ZSB0cmlwIGNvdW50CisgICAgaWYoIGluY3IgPT0gMSApIHsKKyAgICAgICAgdHJpcF9jb3VudCA9IHVwcGVyIC0gbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZihpbmNyID09IC0xKSB7CisgICAgICAgIHRyaXBfY291bnQgPSBsb3dlciAtIHVwcGVyICsgMTsKKyAgICB9IGVsc2UgaWYgKCBpbmNyID4gMCApIHsKKyAgICAgICAgLy8gdXBwZXItbG93ZXIgY2FuIGV4Y2VlZCB0aGUgbGltaXQgb2Ygc2lnbmVkIHR5cGUKKyAgICAgICAgdHJpcF9jb3VudCA9IChVVCkodXBwZXIgLSBsb3dlcikgLyBpbmNyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmlwX2NvdW50ID0gKFVUKShsb3dlciAtIHVwcGVyKSAvICgtaW5jcikgKyAxOworICAgIH0KKyAgICBpZiggY2h1bmsgPCAxICkKKyAgICAgICAgY2h1bmsgPSAxOworICAgIHNwYW4gPSBjaHVuayAqIGluY3I7CisgICAgKnBfc3QgPSBzcGFuICogbnRlYW1zOworICAgICpwX2xiID0gbG93ZXIgKyAoc3BhbiAqIHRlYW1faWQpOworICAgICpwX3ViID0gKnBfbGIgKyBzcGFuIC0gaW5jcjsKKyAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKyAgICAgICAgKnBfbGFzdCA9ICh0ZWFtX2lkID09ICgodHJpcF9jb3VudCAtIDEpLyhVVCljaHVuaykgJSBudGVhbXMpOworICAgIC8vIENvcnJlY3QgdXBwZXIgYm91bmQgaWYgbmVlZGVkCisgICAgaWYoIGluY3IgPiAwICkgeworICAgICAgICBpZiggKnBfdWIgPCAqcF9sYiApIC8vIG92ZXJmbG93PworICAgICAgICAgICAgKnBfdWIgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgaWYoICpwX3ViID4gdXBwZXIgKQorICAgICAgICAgICAgKnBfdWIgPSB1cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICB9IGVsc2UgeyAgIC8vIGluY3IgPCAwCisgICAgICAgIGlmKCAqcF91YiA+ICpwX2xiICkKKyAgICAgICAgICAgICpwX3ViID0gaV9tYXhtaW48IFQgPjo6bW47CisgICAgICAgIGlmKCAqcF91YiA8IHVwcGVyICkKKyAgICAgICAgICAgICpwX3ViID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgfQorICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoICJfX2ttcF90ZWFtX3N0YXRpY19pbml0IGV4aXQ6IFQjJSVkIHRlYW0lJXUgbGl0ZXI9JSVkICJcCisgICAgICAgICAgICAiaXRlcj0oJSUlcywgJSUlcywgJSUlcykgY2h1bmsgJSUlc1xuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsIGd0aWQsIHRlYW1faWQsICpwX2xhc3QsICpwX2xiLCAqcF91YiwgKnBfc3QsIGNodW5rICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitleHRlcm4gIkMiIHsKKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSAgICBsb2MgICAgICAgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSAgICBndGlkICAgICAgR2xvYmFsIHRocmVhZCBpZCBvZiB0aGlzIHRocmVhZAorQHBhcmFtICAgIHNjaGVkdHlwZSAgU2NoZWR1bGluZyB0eXBlCitAcGFyYW0gICAgcGxhc3RpdGVyIFBvaW50ZXIgdG8gdGhlICJsYXN0IGl0ZXJhdGlvbiIgZmxhZworQHBhcmFtICAgIHBsb3dlciAgICBQb2ludGVyIHRvIHRoZSBsb3dlciBib3VuZAorQHBhcmFtICAgIHB1cHBlciAgICBQb2ludGVyIHRvIHRoZSB1cHBlciBib3VuZAorQHBhcmFtICAgIHBzdHJpZGUgICBQb2ludGVyIHRvIHRoZSBzdHJpZGUKK0BwYXJhbSAgICBpbmNyICAgICAgTG9vcCBpbmNyZW1lbnQKK0BwYXJhbSAgICBjaHVuayAgICAgVGhlIGNodW5rIHNpemUKKworRWFjaCBvZiB0aGUgZm91ciBmdW5jdGlvbnMgaGVyZSBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIGFyZ3VtZW50IHR5cGVzLgorCitUaGUgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgYW5kIHN0cmlkZSB0byBiZSB1c2VkIGZvciB0aGUgc2V0IG9mIGl0ZXJhdGlvbnMKK3RvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjdXJyZW50IHRocmVhZCBmcm9tIHRoZSBzdGF0aWNhbGx5IHNjaGVkdWxlZCBsb29wIHRoYXQgaXMgZGVzY3JpYmVkIGJ5IHRoZQoraW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGJvdW5kcywgc3RyaWRlLCBpbmNyZW1lbnQgYW5kIGNodW5rIHNpemUuCisKK0B7CisqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBsb3dlciwga21wX2ludDMyICpwdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwc3RyaWRlLCBrbXBfaW50MzIgaW5jciwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBfX2ttcF9mb3Jfc3RhdGljX2luaXQ8IGttcF9pbnQzMiA+KAorICAgICAgICAgICAgICAgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAqcGxvd2VyLCBrbXBfdWludDMyICpwdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwc3RyaWRlLCBrbXBfaW50MzIgaW5jciwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBfX2ttcF9mb3Jfc3RhdGljX2luaXQ8IGttcF91aW50MzIgPigKKyAgICAgICAgICAgICAgICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdHlwZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwbG93ZXIsIGttcF9pbnQ2NCAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcHN0cmlkZSwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgX19rbXBfZm9yX3N0YXRpY19pbml0PCBrbXBfaW50NjQgPigKKyAgICAgICAgICAgICAgICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdHlwZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2luaXRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKnBsb3dlciwga21wX3VpbnQ2NCAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcHN0cmlkZSwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgX19rbXBfZm9yX3N0YXRpY19pbml0PCBrbXBfdWludDY0ID4oCisgICAgICAgICAgICAgICAgICAgICAgbG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisvKiEKK0B9CisqLworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtICAgIGxvYyAgICAgICBTb3VyY2UgY29kZSBsb2NhdGlvbgorQHBhcmFtICAgIGd0aWQgICAgICBHbG9iYWwgdGhyZWFkIGlkIG9mIHRoaXMgdGhyZWFkCitAcGFyYW0gICAgc2NoZWR1bGUgIFNjaGVkdWxpbmcgdHlwZSBmb3IgdGhlIHBhcmFsbGVsIGxvb3AKK0BwYXJhbSAgICBwbGFzdGl0ZXIgUG9pbnRlciB0byB0aGUgImxhc3QgaXRlcmF0aW9uIiBmbGFnCitAcGFyYW0gICAgcGxvd2VyICAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kCitAcGFyYW0gICAgcHVwcGVyICAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kIG9mIGxvb3AgY2h1bmsKK0BwYXJhbSAgICBwdXBwZXJEICAgUG9pbnRlciB0byB0aGUgdXBwZXIgYm91bmQgb2YgZGlzdF9jaHVuaworQHBhcmFtICAgIHBzdHJpZGUgICBQb2ludGVyIHRvIHRoZSBzdHJpZGUgZm9yIHBhcmFsbGVsIGxvb3AKK0BwYXJhbSAgICBpbmNyICAgICAgTG9vcCBpbmNyZW1lbnQKK0BwYXJhbSAgICBjaHVuayAgICAgVGhlIGNodW5rIHNpemUgZm9yIHRoZSBwYXJhbGxlbCBsb29wCisKK0VhY2ggb2YgdGhlIGZvdXIgZnVuY3Rpb25zIGhlcmUgYXJlIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSBhcmd1bWVudCB0eXBlcy4KKworVGhlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGFuZCBzdHJpZGVzIHRvIGJlIHVzZWQgZm9yIHRoZSBzZXQgb2YgaXRlcmF0aW9ucwordG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkIGZyb20gdGhlIHN0YXRpY2FsbHkgc2NoZWR1bGVkIGxvb3AgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhlCitpbml0aWFsIHZhbHVlcyBvZiB0aGUgYm91bmRzLCBzdHJpZGVzLCBpbmNyZW1lbnQgYW5kIGNodW5rcyBmb3IgcGFyYWxsZWwgbG9vcCBhbmQgZGlzdHJpYnV0ZQorY29uc3RydWN0cy4KKworQHsKKyovCit2b2lkCitfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR1bGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgIGttcF9pbnQzMiAqcGxvd2VyLCBrbXBfaW50MzIgKnB1cHBlciwga21wX2ludDMyICpwdXBwZXJELAorICAgIGttcF9pbnQzMiAqcHN0cmlkZSwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8IGttcF9pbnQzMiA+KAorICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdWxlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwdXBwZXJELCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNHUoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdWxlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICBrbXBfdWludDMyICpwbG93ZXIsIGttcF91aW50MzIgKnB1cHBlciwga21wX3VpbnQzMiAqcHVwcGVyRCwKKyAgICBrbXBfaW50MzIgKnBzdHJpZGUsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIF9fa21wX2Rpc3RfZm9yX3N0YXRpY19pbml0PCBrbXBfdWludDMyID4oCisgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR1bGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHB1cHBlckQsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF84KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAga21wX2ludDY0ICpwbG93ZXIsIGttcF9pbnQ2NCAqcHVwcGVyLCBrbXBfaW50NjQgKnB1cHBlckQsCisgICAga21wX2ludDY0ICpwc3RyaWRlLCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBfX2ttcF9kaXN0X2Zvcl9zdGF0aWNfaW5pdDwga21wX2ludDY0ID4oCisgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR1bGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHB1cHBlckQsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF84dSgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR1bGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgIGttcF91aW50NjQgKnBsb3dlciwga21wX3VpbnQ2NCAqcHVwcGVyLCBrbXBfdWludDY0ICpwdXBwZXJELAorICAgIGttcF9pbnQ2NCAqcHN0cmlkZSwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8IGttcF91aW50NjQgPigKKyAgICAgICAgbG9jLCBndGlkLCBzY2hlZHVsZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHVwcGVyRCwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKy8qIQorQH0KKyovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1eGlsaWFyeSByb3V0aW5lcyBmb3IgRGlzdHJpYnV0ZSBQYXJhbGxlbCBMb29wIGNvbnN0cnVjdCBpbXBsZW1lbnRhdGlvbgorLy8gICAgVHJhbnNmZXIgY2FsbCB0byB0ZW1wbGF0ZTwgdHlwZSBUID4KKy8vICAgIF9fa21wX3RlYW1fc3RhdGljX2luaXQoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsCisvLyAgICAgICAgaW50ICpwX2xhc3QsIFQgKmxiLCBUICp1YiwgU1QgKnN0LCBTVCBpbmNyLCBTVCBjaHVuayApCisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAeworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBwX2xhc3QgcG9pbnRlciB0byBsYXN0IGl0ZXJhdGlvbiBmbGFnCitAcGFyYW0gcF9sYiAgcG9pbnRlciB0byBMb3dlciBib3VuZAorQHBhcmFtIHBfdWIgIHBvaW50ZXIgdG8gVXBwZXIgYm91bmQKK0BwYXJhbSBwX3N0ICBTdGVwIChvciBpbmNyZW1lbnQgaWYgeW91IHByZWZlcikKK0BwYXJhbSBpbmNyICBMb29wIGluY3JlbWVudAorQHBhcmFtIGNodW5rIFRoZSBjaHVuayBzaXplIHRvIGJsb2NrIHdpdGgKKworVGhlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGFuZCBzdHJpZGUgdG8gYmUgdXNlZCBmb3IgdGhlIHNldCBvZiBpdGVyYXRpb25zCit0byBiZSBleGVjdXRlZCBieSB0aGUgY3VycmVudCB0ZWFtIGZyb20gdGhlIHN0YXRpY2FsbHkgc2NoZWR1bGVkIGxvb3AgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhlCitpbml0aWFsIHZhbHVlcyBvZiB0aGUgYm91bmRzLCBzdHJpZGUsIGluY3JlbWVudCBhbmQgY2h1bmsgZm9yIHRoZSBkaXN0cmlidXRlIGNvbnN0cnVjdCBhcyBwYXJ0IG9mCitjb21wb3NpdGUgZGlzdHJpYnV0ZSBwYXJhbGxlbCBsb29wIGNvbnN0cnVjdC4KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgYWxsIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLgorKi8KKwordm9pZAorX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNCgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICBrbXBfaW50MzIgKnBfbGIsIGttcF9pbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0LCBrbXBfaW50MzIgaW5jciwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX3RlYW1fc3RhdGljX2luaXQ8IGttcF9pbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80dSgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICBrbXBfdWludDMyICpwX2xiLCBrbXBfdWludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF84KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgIGttcF9pbnQ2NCAqcF9sYiwga21wX2ludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdDwga21wX2ludDY0ID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0LCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY190ZWFtX3N0YXRpY19pbml0Xzh1KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgIGttcF91aW50NjQgKnBfbGIsIGttcF91aW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF90ZWFtX3N0YXRpY19pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0LCBpbmNyLCBjaHVuayApOworfQorLyohCitAfQorKi8KKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkODY1MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuY3BwCkBAIC0wLDAgKzEsNTYzMSBAQAorLyoKKyAqIGttcF9zZXR0aW5ncy5jcHAgLS0gSW5pdGlhbGl6ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImttcF9hdG9taWMuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9zZXR0aW5ncy5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfYWZmaW5pdHkuaCIKKworc3RhdGljIGludCBfX2ttcF9lbnZfdG9QcmludCggY2hhciBjb25zdCAqIG5hbWUsIGludCBmbGFnICk7CisKK2Jvb2wgX19rbXBfZW52X2Zvcm1hdCA9IDA7IC8vIDAgLSBvbGQgZm9ybWF0OyAxIC0gbmV3IGZvcm1hdAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIHN0cmluZyBmdW5jdGlvbnMuIFN1YmplY3QgdG8gbW92ZSB0byBrbXBfc3RyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgZG91YmxlCitfX2ttcF9jb252ZXJ0X3RvX2RvdWJsZSggY2hhciBjb25zdCAqIHMgKQoreworICAgIGRvdWJsZSByZXN1bHQ7CisKKyAgICBpZiAoIEtNUF9TU0NBTkYoIHMsICIlbGYiLCAmcmVzdWx0ICkgPCAxICkgeworICAgICAgICByZXN1bHQgPSAwLjA7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2lmZGVmIEtNUF9ERUJVRworc3RhdGljIHVuc2lnbmVkIGludAorX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKGNoYXIgKmRlc3QsIGNoYXIgY29uc3QgKiBzcmMsIHNpemVfdCBsZW4sIGNoYXIgc2VudGluZWwpIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKCgqc3JjID09ICdcMCcpIHx8ICgqc3JjID09IHNlbnRpbmVsKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKihkZXN0KyspID0gKihzcmMrKyk7CisgICAgfQorICAgICpkZXN0ID0gJ1wwJzsKKyAgICByZXR1cm4gaTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitfX2ttcF9tYXRjaF93aXRoX3NlbnRpbmVsKCBjaGFyIGNvbnN0ICogYSwgY2hhciBjb25zdCAqIGIsIHNpemVfdCBsZW4sIGNoYXIgc2VudGluZWwgKSB7CisgICAgc2l6ZV90IGwgPSAwOworCisgICAgaWYoYSA9PSBOVUxMKQorICAgICAgICBhID0gIiI7CisgICAgaWYoYiA9PSBOVUxMKQorICAgICAgICBiID0gIiI7CisgICAgd2hpbGUoKmEgJiYgKmIgJiYgKmIgIT0gc2VudGluZWwpIHsKKyAgICAgICAgY2hhciBjYSA9ICphLCBjYiA9ICpiOworCisgICAgICAgIGlmKGNhID49ICdhJyAmJiBjYSA8PSAneicpCisgICAgICAgICAgICBjYSAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNiID49ICdhJyAmJiBjYiA8PSAneicpCisgICAgICAgICAgICBjYiAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNhICE9IGNiKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICArK2w7CisgICAgICAgICsrYTsKKyAgICAgICAgKytiOworICAgIH0KKyAgICByZXR1cm4gbCA+PSBsZW47Cit9CisKKy8vCisvLyBFeHBlY3RlZCB1c2FnZToKKy8vICAgICB0b2tlbiBpcyB0aGUgdG9rZW4gdG8gY2hlY2sgZm9yLgorLy8gICAgIGJ1ZiBpcyB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZC4KKy8vICAgICAqZW5kIHJldHVybnMgdGhlIGNoYXIgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdG9rZW4uCisvLyAgICAgICAgaXQgaXMgbm90IG1vZGlmaWVkIHVubGVzcyBhIG1hdGNoIG9jY3Vycy4KKy8vCisvLworLy8gRXhhbXBsZSAxOgorLy8KKy8vICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ0b2tlbiIsIGJ1ZiwgKmVuZCkgeworLy8gICAgICAgICA8ZG8gc29tZXRoaW5nPgorLy8gICAgICAgICBidWYgPSBlbmQ7CisvLyAgICAgfQorLy8KKy8vICBFeGFtcGxlIDI6CisvLworLy8gICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoInRva2VuIiwgYnVmLCAqZW5kKSB7CisvLyAgICAgICAgIGNoYXIgKnNhdmUgPSAqKmVuZDsKKy8vICAgICAgICAgKiplbmQgPSBzZW50aW5lbDsKKy8vICAgICAgICAgPHVzZSBhbnkgb2YgdGhlIF9fa21wKl93aXRoX3NlbnRpbmVsKCkgZnVuY3Rpb25zPgorLy8gICAgICAgICAqKmVuZCA9IHNhdmU7CisvLyAgICAgICAgIGJ1ZiA9IGVuZDsKKy8vICAgICB9CisvLworCitzdGF0aWMgaW50CitfX2ttcF9tYXRjaF9zdHIoIGNoYXIgY29uc3QgKnRva2VuLCBjaGFyIGNvbnN0ICpidWYsIGNvbnN0IGNoYXIgKiplbmQpIHsKKworICAgIEtNUF9BU1NFUlQodG9rZW4gIT0gTlVMTCk7CisgICAgS01QX0FTU0VSVChidWYgIT0gTlVMTCk7CisgICAgS01QX0FTU0VSVChlbmQgIT0gTlVMTCk7CisKKyAgICB3aGlsZSAoKnRva2VuICYmICpidWYpIHsKKyAgICAgICAgY2hhciBjdCA9ICp0b2tlbiwgY2IgPSAqYnVmOworCisgICAgICAgIGlmKGN0ID49ICdhJyAmJiBjdCA8PSAneicpCisgICAgICAgICAgICBjdCAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNiID49ICdhJyAmJiBjYiA8PSAneicpCisgICAgICAgICAgICBjYiAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmIChjdCAhPSBjYikKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgKyt0b2tlbjsKKyAgICAgICAgKytidWY7CisgICAgfQorICAgIGlmICgqdG9rZW4pIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAqZW5kID0gYnVmOworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBzaXplX3QKK19fa21wX3JvdW5kNGsoIHNpemVfdCBzaXplICkgeworICAgIHNpemVfdCBfNGsgPSA0ICogMTAyNDsKKyAgICBpZiAoIHNpemUgJiAoIF80ayAtIDEgKSApIHsKKyAgICAgICAgc2l6ZSAmPSB+ICggXzRrIC0gMSApOworICAgICAgICBpZiAoIHNpemUgPD0gS01QX1NJWkVfVF9NQVggLSBfNGsgKSB7CisgICAgICAgICAgICBzaXplICs9IF80azsgICAgLy8gUm91bmQgdXAgaWYgdGhlcmUgaXMgbm8gb3ZlcmZsb3cuCisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gc2l6ZTsKK30gLy8gX19rbXBfcm91bmQ0aworCisKKy8qCisgICAgSGVyZSwgbXVsdGlwbGllcnMgYXJlIGxpa2UgX19rbXBfY29udmVydF90b19zZWNvbmRzLCBidXQgZmxvYXRpbmctcG9pbnQKKyAgICB2YWx1ZXMgYXJlIGFsbG93ZWQsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIG1pbGxpc2Vjb25kcy4gIFRoZSBkZWZhdWx0CisgICAgbXVsdGlwbGllciBpcyBtaWxsaXNlY29uZHMuICBSZXR1cm5zIElOVF9NQVggb25seSBpZiB0aGUgdmFsdWUgc3BlY2lmaWVkCisgICAgbWF0Y2hlcyAiaW5maW5pdCoiLiAgUmV0dXJucyAtMSBpZiBzcGVjaWZpZWQgc3RyaW5nIGlzIGludmFsaWQuCisqLworaW50CitfX2ttcF9jb252ZXJ0X3RvX21pbGxpc2Vjb25kcyggY2hhciBjb25zdCAqIGRhdGEgKQoreworICAgIGludCByZXQsIG52YWx1ZXMsIGZhY3RvcjsKKyAgICBjaGFyIG11bHQsIGV4dHJhOworICAgIGRvdWJsZSB2YWx1ZTsKKworICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiAoLTEpOworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiaW5maW5pdCIsIC0xLCBkYXRhKSkgcmV0dXJuIChJTlRfTUFYKTsKKyAgICB2YWx1ZSA9IChkb3VibGUpIDAuMDsKKyAgICBtdWx0ID0gJ1wwJzsKKyAgICBudmFsdWVzID0gS01QX1NTQ0FORiAoZGF0YSwgIiVsZiVjJWMiLCAmdmFsdWUsICZtdWx0LCAmZXh0cmEpOworICAgIGlmIChudmFsdWVzIDwgMSkgcmV0dXJuICgtMSk7CisgICAgaWYgKG52YWx1ZXMgPT0gMSkgbXVsdCA9ICdcMCc7CisgICAgaWYgKG52YWx1ZXMgPT0gMykgcmV0dXJuICgtMSk7CisKKyAgICBpZiAodmFsdWUgPCAwKSAgICByZXR1cm4gKC0xKTsKKworICAgIHN3aXRjaCAobXVsdCkgeworICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgLyogIGRlZmF1bHQgaXMgbWlsbGlzZWNvbmRzICAqLworICAgICAgICBmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdzJzogY2FzZSAnUyc6CisgICAgICAgIGZhY3RvciA9IDEwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKKyAgICAgICAgZmFjdG9yID0gMTAwMCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzogY2FzZSAnSCc6CisgICAgICAgIGZhY3RvciA9IDEwMDAgKiA2MCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzogY2FzZSAnRCc6CisgICAgICAgIGZhY3RvciA9IDEwMDAgKiAyNCAqIDYwICogNjA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIGlmICggdmFsdWUgPj0gKCAoSU5UX01BWC0xKSAvIGZhY3RvcikgKQorICAgICAgICByZXQgPSBJTlRfTUFYLTE7ICAgICAgICAvKiBEb24ndCBhbGxvdyBpbmZpbml0ZSB2YWx1ZSBoZXJlICovCisgICAgZWxzZQorICAgICAgICByZXQgPSAoaW50KSAodmFsdWUgKiAoZG91YmxlKSBmYWN0b3IpOyAgLyogdHJ1bmNhdGUgdG8gaW50ICAqLworCisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50CitfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoIGNoYXIgY29uc3QgKiBhLCBjaGFyIGNvbnN0ICogYiwgY2hhciBzZW50aW5lbCApIHsKKyAgICBpZihhID09IE5VTEwpCisgICAgICAgIGEgPSAiIjsKKyAgICBpZihiID09IE5VTEwpCisgICAgICAgIGIgPSAiIjsKKyAgICB3aGlsZSgqYSAmJiAqYiAmJiAqYiAhPSBzZW50aW5lbCkgeworICAgICAgICBjaGFyIGNhID0gKmEsIGNiID0gKmI7CisKKyAgICAgICAgaWYoY2EgPj0gJ2EnICYmIGNhIDw9ICd6JykKKyAgICAgICAgICAgIGNhIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2IgPj0gJ2EnICYmIGNiIDw9ICd6JykKKyAgICAgICAgICAgIGNiIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2EgIT0gY2IpCisgICAgICAgICAgICByZXR1cm4gKGludCkodW5zaWduZWQgY2hhcikqYSAtIChpbnQpKHVuc2lnbmVkIGNoYXIpKmI7CisgICAgICAgICsrYTsKKyAgICAgICAgKytiOworICAgIH0KKyAgICByZXR1cm4gKmEgPworICAgICAgICAoKmIgJiYgKmIgIT0gc2VudGluZWwpID8gKGludCkodW5zaWduZWQgY2hhcikqYSAtIChpbnQpKHVuc2lnbmVkIGNoYXIpKmIgOiAxIDoKKyAgICAgICAgKCpiICYmICpiICE9IHNlbnRpbmVsKSA/IC0xIDogMDsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUYWJsZSBzdHJ1Y3R1cmVzIGFuZCBoZWxwZXIgZnVuY3Rpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zZXR0aW5nICAgICAgICBrbXBfc2V0dGluZ190OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEgICAga21wX3N0Z19zc19kYXRhX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zdGdfd3BfZGF0YSAgICBrbXBfc3RnX3dwX2RhdGFfdDsKK3R5cGVkZWYgc3RydWN0IF9fa21wX3N0Z19mcl9kYXRhICAgIGttcF9zdGdfZnJfZGF0YV90OworCit0eXBlZGVmIHZvaWQgKCAqIGttcF9zdGdfcGFyc2VfZnVuY190ICkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICk7Cit0eXBlZGVmIHZvaWQgKCAqIGttcF9zdGdfcHJpbnRfZnVuY190ICkoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApOworCitzdHJ1Y3QgX19rbXBfc2V0dGluZyB7CisgICAgY2hhciBjb25zdCAqICAgICAgICAgbmFtZTsgICAgICAgIC8vIE5hbWUgb2Ygc2V0dGluZyAoZW52aXJvbm1lbnQgdmFyaWFibGUpLgorICAgIGttcF9zdGdfcGFyc2VfZnVuY190IHBhcnNlOyAgICAgICAvLyBQYXJzZXIgZnVuY3Rpb24uCisgICAga21wX3N0Z19wcmludF9mdW5jX3QgcHJpbnQ7ICAgICAgIC8vIFByaW50IGZ1bmN0aW9uLgorICAgIHZvaWQgKiAgICAgICAgICAgICAgIGRhdGE7ICAgICAgICAvLyBEYXRhIHBhc3NlZCB0byBwYXJzZXIgYW5kIHByaW50ZXIuCisgICAgaW50ICAgICAgICAgICAgICAgICAgc2V0OyAgICAgICAgIC8vIFZhcmlhYmxlIHNldCBkdXJpbmcgdGhpcyAic2Vzc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpIG9yIGttcF9zZXRfZGVmYXVsdHMoKSBjYWxsKS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICBkZWZpbmVkOyAgICAgLy8gVmFyaWFibGUgc2V0IGluIGFueSAic2Vzc2lvbiIuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc2V0dGluZworCitzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEgeworICAgIHNpemVfdCAgICAgICAgICAgICBmYWN0b3I7ICAvLyBEZWZhdWx0IGZhY3RvcjogMSBmb3IgS01QX1NUQUNLU0laRSwgMTAyNCBmb3Igb3RoZXJzLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHM7ICAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z19zc19kYXRhCisKK3N0cnVjdCBfX2ttcF9zdGdfd3BfZGF0YSB7CisgICAgaW50ICAgICAgICAgICAgICAgIG9tcDsgICAgIC8vIDAgLS0gS01QX0xJQlJBUlksIDEgLS0gT01QX1dBSVRfUE9MSUNZLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHM7ICAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z193cF9kYXRhCisKK3N0cnVjdCBfX2ttcF9zdGdfZnJfZGF0YSB7CisgICAgaW50ICAgICAgICAgICAgICAgIGZvcmNlOyAgLy8gMCAtLSBLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04sIDEgLS0gS01QX0ZPUkNFX1JFRFVDVElPTi4KKyAgICBrbXBfc2V0dGluZ190ICogKiAgcml2YWxzOyAgLy8gQXJyYXkgb2YgcG9pbnRlcnMgdG8gcml2YWxzIChpbmNsdWRpbmcgaXRzZWxmKS4KK307IC8vIHN0cnVjdCBfX2ttcF9zdGdfZnJfZGF0YQorCitzdGF0aWMgaW50CitfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCAgICAgICAgICAvLyAwIC0tIE9rLCAxIC0tIGVycm9ycyBmb3VuZC4KKyAgICBjaGFyIGNvbnN0ICogICAgICAgbmFtZSwgICAgIC8vIE5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciBjb25zdCAqICAgICAgIHZhbHVlLCAgICAvLyBWYWx1ZSBvZiB0aGUgdmFyaWFibGUuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFscyAgICAvLyBMaXN0IG9mIHJpdmFsIHNldHRpbmdzICh0aGUgbGlzdCBtdXN0IGluY2x1ZGUgY3VycmVudCBvbmUpLgorKTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgcGFyc2UgZnVuY3Rpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Jvb2woCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGludCAqICAgICAgICBvdXQKKykgeworICAgIGlmICggX19rbXBfc3RyX21hdGNoX3RydWUoIHZhbHVlICkgKSB7CisgICAgICAgICogb3V0ID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZSggdmFsdWUgKSApIHsKKyAgICAgICAgKiBvdXQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgIEtNUF9NU0coIEJhZEJvb2xWYWx1ZSwgbmFtZSwgdmFsdWUgKSwKKyAgICAgICAgICAgIEtNUF9ITlQoIFZhbGlkQm9vbFZhbHVlcyApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYm9vbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIHNpemVfdCAgICAgICBzaXplX21pbiwKKyAgICBzaXplX3QgICAgICAgc2l6ZV9tYXgsCisgICAgaW50ICogICAgICAgIGlzX3NwZWNpZmllZCwKKyAgICBzaXplX3QgKiAgICAgb3V0LAorICAgIHNpemVfdCAgICAgICBmYWN0b3IKKykgeworICAgIGNoYXIgY29uc3QgKiBtc2cgPSBOVUxMOworICAgICNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgIHNpemVfbWluID0gX19rbXBfcm91bmQ0ayggc2l6ZV9taW4gKTsKKyAgICAgICAgc2l6ZV9tYXggPSBfX2ttcF9yb3VuZDRrKCBzaXplX21heCApOworICAgICNlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgaWYgKCBpc19zcGVjaWZpZWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICogaXNfc3BlY2lmaWVkID0gMTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX3RvX3NpemUoIHZhbHVlLCBvdXQsIGZhY3RvciwgJiBtc2cgKTsKKyAgICAgICAgaWYgKCBtc2cgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGlmICggKiBvdXQgPiBzaXplX21heCApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWF4OworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgfSBlbHNlIGlmICggKiBvdXQgPCBzaXplX21pbiApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWluOworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29TbWFsbCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAjaWYgS01QX09TX0RBUldJTgorICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm91bmQ0ayA9IF9fa21wX3JvdW5kNGsoICogb3V0ICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKiBvdXQgIT0gcm91bmQ0ayApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICogb3V0ID0gcm91bmQ0azsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggTm90TXVsdGlwbGU0SyApOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIGludGVnZXIgb3ZlcmZsb3cgb2NjdXJyZWQsICogb3V0ID09IEtNUF9TSVpFX1RfTUFYLiBDdXQgaXQgdG8gc2l6ZV9tYXggc2lsZW50bHkuCisgICAgICAgICAgICBpZiAoICogb3V0IDwgc2l6ZV9taW4gKSB7CisgICAgICAgICAgICAgICAgKiBvdXQgPSBzaXplX21heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAqIG91dCA+ICBzaXplX21heCApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWF4OworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoICYgYnVmLCAqIG91dCApOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIG5hbWUsIHZhbHVlLCBtc2cgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3N0cl9WYWx1ZSwgbmFtZSwgYnVmLnN0ciApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZiApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9zaXplCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0cigKKyAgICBjaGFyIGNvbnN0ICogICAgICBuYW1lLAorICAgIGNoYXIgY29uc3QgKiAgICAgIHZhbHVlLAorICAgIGNoYXIgY29uc3QgKiAqICAgIG91dAorKSB7CisgICAgX19rbXBfc3RyX2ZyZWUob3V0KTsKKyAgICAqIG91dCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIHZhbHVlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdHIKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ludCgKKyAgICBjaGFyIGNvbnN0ICogbmFtZSwgICAvLyBJOiBOYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlICh1c2VkIGluIHdhcm5pbmcgbWVzc2FnZXMpLgorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwgIC8vIEk6IFZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBhcnNlLgorICAgIGludCAgICAgICAgICBtaW4sICAgIC8vIEk6IE1pbWluYWwgYWxsb3dlZCB2YWx1ZS4KKyAgICBpbnQgICAgICAgICAgbWF4LCAgICAvLyBJOiBNYXhpbXVtIGFsbG93ZWQgdmFsdWUuCisgICAgaW50ICogICAgICAgIG91dCAgICAgLy8gTzogT3V0cHV0IChwYXJzZWQpIHZhbHVlLgorKSB7CisgICAgY2hhciBjb25zdCAqIG1zZyAgPSBOVUxMOworICAgIGttcF91aW50NjQgICB1aW50ID0gKiBvdXQ7CisgICAgX19rbXBfc3RyX3RvX3VpbnQoIHZhbHVlLCAmIHVpbnQsICYgbXNnICk7CisgICAgaWYgKCBtc2cgPT0gTlVMTCApIHsKKyAgICAgICAgaWYgKCB1aW50IDwgKHVuc2lnbmVkIGludCltaW4gKSB7CisgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgIHVpbnQgPSBtaW47CisgICAgICAgIH0gZWxzZSBpZiAoIHVpbnQgPiAodW5zaWduZWQgaW50KW1heCApIHsKKyAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgdWludCA9IG1heDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiBvdmVyZmxvdyBvY2N1cnJlZCBtc2cgY29udGFpbnMgZXJyb3IgbWVzc2FnZSBhbmQgdWludCBpcyB2ZXJ5IGJpZy4gQ3V0IHRtcCBpdAorICAgICAgICAvLyB0byBJTlRfTUFYLgorICAgICAgICBpZiAoIHVpbnQgPCAodW5zaWduZWQgaW50KW1pbiApIHsKKyAgICAgICAgICAgIHVpbnQgPSBtaW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHVpbnQgPiAodW5zaWduZWQgaW50KW1heCApIHsKKyAgICAgICAgICAgIHVpbnQgPSBtYXg7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZVNpemVJbnRXYXJuLCBuYW1lLCB2YWx1ZSwgbXNnICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWYgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJmJ1ZiwgIiUiIEtNUF9VSU5UNjRfU1BFQyAiIiwgdWludCApOworICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ191aW50NjRfVmFsdWUsIG5hbWUsIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmYnVmICk7CisgICAgfTsgLy8gaWYKKyAgICAqIG91dCA9IHVpbnQ7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9pbnQKKworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ZpbGUoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGNoYXIgKiAgICAgICBzdWZmaXgsCisgICAgY2hhciAqICogICAgIG91dAorKSB7CisgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICBjaGFyICp0OworICAgIGludCBoYXNTdWZmaXg7CisgICAgX19rbXBfc3RyX2ZyZWUob3V0KTsKKyAgICB0ID0gKGNoYXIgKikgc3RycmNocih2YWx1ZSwgJy4nKTsKKyAgICBoYXNTdWZmaXggPSB0ICYmIF9fa21wX3N0cl9lcWYoIHQsIHN1ZmZpeCApOworICAgIHQgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMlcyIsIHZhbHVlLCBoYXNTdWZmaXggPyAiIiA6IHN1ZmZpeCApOworICAgIF9fa21wX2V4cGFuZF9maWxlX25hbWUoIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHQpOworICAgIF9fa21wX3N0cl9mcmVlKCZ0KTsKKyAgICAqIG91dCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZmlsZQorI2VuZGlmCisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYyBjaGFyICogcGFyX3JhbmdlX3RvX3ByaW50ID0gTlVMTDsKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2UoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGludCAqICAgICAgICBvdXRfcmFuZ2UsCisgICAgY2hhciAqICAgICAgIG91dF9yb3V0aW5lLAorICAgIGNoYXIgKiAgICAgICBvdXRfZmlsZSwKKyAgICBpbnQgKiAgICAgICAgb3V0X2xiLAorICAgIGludCAqICAgICAgICBvdXRfdWIKKykgeworICAgIHNpemVfdCBsZW4gPSBLTVBfU1RSTEVOKCB2YWx1ZSArIDEgKTsKKyAgICBwYXJfcmFuZ2VfdG9fcHJpbnQgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKzEgKTsKKyAgICBLTVBfU1RSTkNQWV9TKCBwYXJfcmFuZ2VfdG9fcHJpbnQsIGxlbiArIDEsIHZhbHVlLCBsZW4gKyAxKTsKKyAgICBfX2ttcF9wYXJfcmFuZ2UgPSArMTsKKyAgICBfX2ttcF9wYXJfcmFuZ2VfbGIgPSAwOworICAgIF9fa21wX3Bhcl9yYW5nZV91YiA9IElOVF9NQVg7CisgICAgZm9yICg7OykgeworICAgICAgICB1bnNpZ25lZCBpbnQgbGVuOworICAgICAgICBpZiAoKCB2YWx1ZSA9PSBOVUxMICkgfHwgKCAqdmFsdWUgPT0gJ1wwJyApKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAicm91dGluZSIsIHZhbHVlLCAnPScgKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBsZW4gPSBfX2ttcF9yZWFkc3RyX3dpdGhfc2VudGluZWwoIG91dF9yb3V0aW5lLAorICAgICAgICAgICAgICB2YWx1ZSwgS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTiAtIDEsICcsJyApOworICAgICAgICAgICAgaWYgKCBsZW4gPT0gMCApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJmaWxlbmFtZSIsIHZhbHVlLCAnPScgKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBsZW4gPSBfX2ttcF9yZWFkc3RyX3dpdGhfc2VudGluZWwoIG91dF9maWxlLAorICAgICAgICAgICAgICB2YWx1ZSwgS01QX1BBUl9SQU5HRV9GSUxFTkFNRV9MRU4gLSAxLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggbGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAicmFuZ2UiLCB2YWx1ZSwgJz0nICkpCisgICAgICAgICAgfHwgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImluY2xfcmFuZ2UiLCB2YWx1ZSwgJz0nICkpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICc9JyApICsgMTsKKyAgICAgICAgICAgIGlmICggS01QX1NTQ0FORiggdmFsdWUsICIlZDolZCIsIG91dF9sYiwgb3V0X3ViICkgIT0gMiApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRfcmFuZ2UgPSArMTsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJleGNsX3JhbmdlIiwgdmFsdWUsICc9JyApKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICc9JyApICsgMTsKKyAgICAgICAgICAgIGlmICggS01QX1NTQ0FORiggdmFsdWUsICIlZDolZCIsIG91dF9sYiwgb3V0X3ViKSAhPSAyICkgeworICAgICAgICAgICAgICAgIGdvdG8gcGFyX3JhbmdlX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dF9yYW5nZSA9IC0xOworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcGFyX3JhbmdlX2Vycm9yOgorICAgICAgICBLTVBfV0FSTklORyggUGFyUmFuZ2VTeW50YXgsIG5hbWUgKTsKKyAgICAgICAgX19rbXBfcGFyX3JhbmdlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlCisjZW5kaWYKKworaW50CitfX2ttcF9pbml0aWFsX3RocmVhZHNfY2FwYWNpdHkoIGludCByZXFfbnByb2MgKQoreworICAgIGludCBudGggPSAzMjsKKworICAgIC8qIE1JTiggTUFYKCAzMiwgNCAqICRPTVBfTlVNX1RIUkVBRFMsIDQgKiBvbXBfZ2V0X251bV9wcm9jcygpICksIF9fa21wX21heF9udGgpICovCisgICAgaWYgKG50aCA8ICg0ICogcmVxX25wcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiByZXFfbnByb2MpOworICAgIGlmIChudGggPCAoNCAqIF9fa21wX3hwcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiBfX2ttcF94cHJvYyk7CisKKyAgICBpZiAobnRoID4gX19rbXBfbWF4X250aCkKKyAgICAgICAgbnRoID0gX19rbXBfbWF4X250aDsKKworICAgIHJldHVybiBudGg7Cit9CisKKworaW50CitfX2ttcF9kZWZhdWx0X3RwX2NhcGFjaXR5KCBpbnQgcmVxX25wcm9jLCBpbnQgbWF4X250aCwgaW50IGFsbF90aHJlYWRzX3NwZWNpZmllZCkgeworICAgIGludCBudGggPSAxMjg7CisKKyAgICBpZihhbGxfdGhyZWFkc19zcGVjaWZpZWQpCisgICAgICAgIHJldHVybiBtYXhfbnRoOworICAgIC8qIE1JTiggTUFYICgxMjgsIDQgKiAkT01QX05VTV9USFJFQURTLCA0ICogb21wX2dldF9udW1fcHJvY3MoKSApLCBfX2ttcF9tYXhfbnRoICkgKi8KKyAgICBpZiAobnRoIDwgKDQgKiByZXFfbnByb2MpKQorICAgICAgICBudGggPSAoNCAqIHJlcV9ucHJvYyk7CisgICAgaWYgKG50aCA8ICg0ICogX19rbXBfeHByb2MpKQorICAgICAgICBudGggPSAoNCAqIF9fa21wX3hwcm9jKTsKKworICAgIGlmIChudGggPiBfX2ttcF9tYXhfbnRoKQorICAgICAgICBudGggPSBfX2ttcF9tYXhfbnRoOworCisgICAgcmV0dXJuIG50aDsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgcHJpbnQgZnVuY3Rpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Jvb2woIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBpbnQgdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX0JPT0w7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JXNcbiIsIG5hbWUsIHZhbHVlID8gInRydWUiIDogImZhbHNlIiApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2Jvb2wKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9pbnQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBpbnQgdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX0lOVDsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0lZFxuIiwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9pbnQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF91aW50NjQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBrbXBfdWludDY0IHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9VSU5UNjQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JSIgS01QX1VJTlQ2NF9TUEVDICJcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfdWludDY0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RyKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9TVFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JXNcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHNpemVfdCB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBidWZmZXIsIHZhbHVlICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0iLCBuYW1lICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCB2YWx1ZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJcbiIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3NpemUKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBQYXJzZSBhbmQgcHJpbnQgZnVuY3Rpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUxMX1RIUkVBRFMsIEtNUF9NQVhfVEhSRUFEUywgT01QX1RIUkVBRF9MSU1JVAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKworICAgIGttcF9zZXR0aW5nX3QgKiAqIHJpdmFscyA9IChrbXBfc2V0dGluZ190ICogKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICByYzsKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCByaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYWxsIiwgdmFsdWUsIDAgKSApIHsKKyAgICAgICAgX19rbXBfbWF4X250aCA9IF9fa21wX3hwcm9jOworICAgICAgICBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMSwgX19rbXBfc3lzX21heF9udGgsICYgX19rbXBfbWF4X250aCApOworICAgICAgICBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID0gMDsKKyAgICB9CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9tYXhfbnRoID09ICVkXG4iLCBfX2ttcF9tYXhfbnRoICkgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfbWF4X250aCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0JMT0NLVElNRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Jsb2NrdGltZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBfX2ttcF9jb252ZXJ0X3RvX21pbGxpc2Vjb25kcyggdmFsdWUgKTsKKyAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lIDwgMCApIHsKKyAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CisgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lID0gRkFMU0U7ICAvLyBSZXZlcnQgdG8gZGVmYXVsdCBhcyBpZiB2YXIgbm90IHNldC4KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lIDwgS01QX01JTl9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9NSU5fQkxPQ0tUSU1FOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggU21hbGxWYWx1ZSwgbmFtZSwgdmFsdWUgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIE1pblZhbHVlVXNpbmcsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID4gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9NQVhfQkxPQ0tUSU1FOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggTGFyZ2VWYWx1ZSwgbmFtZSwgdmFsdWUgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIE1heFZhbHVlVXNpbmcsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX2Vudl9ibG9ja3RpbWUgPSBUUlVFOyAgICAvLyBLTVBfQkxPQ0tUSU1FIHdhcyBzcGVjaWZpZWQuCisgICAgfTsgLy8gaWYKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgICAvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIG1vbml0b3IgdGhyZWFkIHdha2V1cCBpbnRlcnZhbHMgY29ycmVzcG9uZGluZyB0byBibG9ja3RpbWUuCisgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisjZW5kaWYKKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2Vudl9ibG9ja3RpbWUgPT0gJWRcbiIsIF9fa21wX2Vudl9ibG9ja3RpbWUgKSApOworICAgIGlmICggX19rbXBfZW52X2Jsb2NrdGltZSApIHsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSAlZFxuIiwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2Jsb2NrdGltZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Jsb2NrdGltZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Jsb2NrdGltZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRFVQTElDQVRFX0xJQl9PSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2R1cGxpY2F0ZV9saWJfb2soIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8qIGFjdHVhbGx5IHRoaXMgdmFyaWFibGUgaXMgbm90IHN1cHBvcnRlZCwKKyAgICAgICBwdXQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgYnVpbGRzIGFuZCBmb3Igc3RhdGljL2R5bmFtaWMgY29tYmluYXRpb24gKi8KKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZHVwbGljYXRlX2xpYnJhcnlfb2sgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2R1cGxpY2F0ZV9saWJfb2sKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kdXBsaWNhdGVfbGliX29rKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZHVwbGljYXRlX2xpYnJhcnlfb2sgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2R1cGxpY2F0ZV9saWJfb2sKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lOSEVSSVRfRlBfQ09OVFJPTAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2luaGVyaXRfZnBfY29udHJvbCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5oZXJpdF9mcF9jb250cm9sCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW5oZXJpdF9mcF9jb250cm9sKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisjaWYgS01QX0RFQlVHCisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICk7CisjZW5kaWYgLyogS01QX0RFQlVHICovCit9IC8vIF9fa21wX3N0Z19wcmludF9pbmhlcml0X2ZwX2NvbnRyb2wKKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0xJQlJBUlksIE9NUF9XQUlUX1BPTElDWQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgY2hhciBjb25zdCAqYmxvY2t0aW1lX3N0ciA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3koIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z193cF9kYXRhX3QgKiB3YWl0ID0gKGttcF9zdGdfd3BfZGF0YV90ICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHdhaXQtPnJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCB3YWl0LT5vbXAgKSB7CisgICAgICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiQUNUSVZFIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3R1cm5hcm91bmQ7CisgICAgICAgICAgICBpZiAoIGJsb2NrdGltZV9zdHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBLTVBfQkxPQ0tUSU1FIG5vdCBzcGVjaWZpZWQsIHNvIHNldCBkZWZhdWx0IHRvICJpbmZpbml0ZSIuCisgICAgICAgICAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfTUFYX0JMT0NLVElNRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiUEFTU0lWRSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAgICAgICAgICAgaWYgKCBibG9ja3RpbWVfc3RyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gS01QX0JMT0NLVElNRSBub3Qgc3BlY2lmaWVkLCBzbyBzZXQgZGVmYXVsdCB0byAwLgorICAgICAgICAgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJzZXJpYWwiLCAxLCB2YWx1ZSApICkgeyAgICAgICAgICAgICAvKiBTICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3NlcmlhbDsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAidGhyb3VnaHB1dCIsIDIsIHZhbHVlICkgKSB7ICAvKiBUSCAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0dXJuYXJvdW5kIiwgMiwgdmFsdWUgKSApIHsgIC8qIFRVICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3R1cm5hcm91bmQ7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImRlZGljYXRlZCIsIDEsIHZhbHVlICkgKSB7ICAgLyogRCAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90dXJuYXJvdW5kOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJtdWx0aXVzZXIiLCAxLCB2YWx1ZSApICkgeyAgIC8qIE0gKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9hdXhfc2V0X2xpYnJhcnkoIF9fa21wX2xpYnJhcnkgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3kKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF93YWl0X3BvbGljeSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z193cF9kYXRhX3QgKiB3YWl0ID0gKGttcF9zdGdfd3BfZGF0YV90ICopIGRhdGE7CisgICAgY2hhciBjb25zdCAqICAgICAgICB2YWx1ZSA9IE5VTEw7CisKKyAgICBpZiAoIHdhaXQtPm9tcCApIHsKKyAgICAgICAgc3dpdGNoICggX19rbXBfbGlicmFyeSApIHsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90dXJuYXJvdW5kIDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gIkFDVElWRSI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAiUEFTU0lWRSI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICB9OyAvLyBzd2l0Y2gKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKCBfX2ttcF9saWJyYXJ5ICkgeworICAgICAgICAgICAgY2FzZSBsaWJyYXJ5X3NlcmlhbCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJzZXJpYWwiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90dXJuYXJvdW5kIDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gInR1cm5hcm91bmQiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90aHJvdWdocHV0IDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gInRocm91Z2hwdXQiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9OyAvLyBpZgorCit9IC8vIF9fa21wX3N0Z19wcmludF93YWl0X3BvbGljeQorCisjaWYgS01QX1VTRV9NT05JVE9SCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9tb25pdG9yX3N0YWNrc2l6ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsCisgICAgICAgIHZhbHVlLAorICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUsCisgICAgICAgIEtNUF9NQVhfU1RLU0laRSwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgJiBfX2ttcF9tb25pdG9yX3N0a3NpemUsCisgICAgICAgIDEKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbW9uaXRvcl9zdGFja3NpemUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9tb25pdG9yX3N0YWNrc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBpZiAoICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPiAwICkKKyAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgfQorICAgIGlmICggIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA+IDAgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCAmJiBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iKTsKKyAgICB9CisKK30gLy8gX19rbXBfc3RnX3ByaW50X21vbml0b3Jfc3RhY2tzaXplCisjZW5kaWYgLy8gS01QX1VTRV9NT05JVE9SCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TRVRUSU5HUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NldHRpbmdzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfc2V0dGluZ3MgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3NldHRpbmdzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc2V0dGluZ3MoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9zZXR0aW5ncyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc2V0dGluZ3MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NUQUNLUEFECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3RhY2twYWQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoCisgICAgICAgIG5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIG5hbWUKKyAgICAgICAgdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgdmFsdWUKKyAgICAgICAgS01QX01JTl9TVEtQQURESU5HLCAgICAgICAgICAgICAgIC8vIE1pbiB2YWx1ZQorICAgICAgICBLTVBfTUFYX1NUS1BBRERJTkcsICAgICAgICAgICAgICAgLy8gTWF4IHZhbHVlCisgICAgICAgICYgX19rbXBfc3RrcGFkZGluZyAgICAgICAgICAgICAgICAvLyBWYXIgdG8gaW5pdGlhbGl6ZQorICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdGFja3BhZAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0YWNrcGFkKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9zdGtwYWRkaW5nICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdGFja3BhZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RBQ0tPRkZTRVQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdGFja29mZnNldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIG5hbWUKKyAgICAgICAgdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgdmFsdWUKKyAgICAgICAgS01QX01JTl9TVEtPRkZTRVQsICAgICAgICAgICAgICAgIC8vIE1pbiB2YWx1ZQorICAgICAgICBLTVBfTUFYX1NUS09GRlNFVCwgICAgICAgICAgICAgICAgLy8gTWF4IHZhbHVlCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAmIF9fa21wX3N0a29mZnNldCwgICAgICAgICAgICAgICAgLy8gVmFyIHRvIGluaXRpYWxpemUKKyAgICAgICAgMQorICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdGFja29mZnNldAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0YWNrb2Zmc2V0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X3NpemUoIGJ1ZmZlciwgbmFtZSwgX19rbXBfc3Rrb2Zmc2V0ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdGFja29mZnNldAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RBQ0tTSVpFLCBPTVBfU1RBQ0tTSVpFLCBHT01QX1NUQUNLU0laRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc3RnX3NzX2RhdGFfdCAqICBzdGFja3NpemUgPSAoa21wX3N0Z19zc19kYXRhX3QgKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHN0YWNrc2l6ZS0+cml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsICAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciBuYW1lCisgICAgICAgIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciB2YWx1ZQorICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUsICAgIC8vIE1pbiB2YWx1ZQorICAgICAgICBLTVBfTUFYX1NUS1NJWkUsICAgICAgICAgIC8vIE1heCB2YWx1ZQorICAgICAgICAmIF9fa21wX2Vudl9zdGtzaXplLCAgICAgIC8vCisgICAgICAgICYgX19rbXBfc3Rrc2l6ZSwgICAgICAgICAgLy8gVmFyIHRvIGluaXRpYWxpemUKKyAgICAgICAgc3RhY2tzaXplLT5mYWN0b3IKKyAgICApOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUKKworLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHByaW50aW5nIGJvdGggS01QX1NUQUNLU0laRSAoZmFjdG9yIGlzIDEpIGFuZCBPTVBfU1RBQ0tTSVpFIChmYWN0b3IgaXMgMTAyNCkuCisvLyBDdXJyZW50bHkgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHByaW50IE9NUF9TVEFDS1NJWkUgdmFsdWUgaW4gYnl0ZXMuIFdlIGNhbiBjb25zaWRlciBhZGRpbmcgdGhpcworLy8gcG9zc2liaWxpdHkgYnkgYSBjdXN0b21lciByZXF1ZXN0IGluIGZ1dHVyZS4KK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAga21wX3N0Z19zc19kYXRhX3QgKiAgc3RhY2tzaXplID0gKGttcF9zdGdfc3NfZGF0YV90ICopIGRhdGE7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCAoX19rbXBfc3Rrc2l6ZSAlIDEwMjQpID8gX19rbXBfc3Rrc2l6ZSAvIHN0YWNrc2l6ZS0+ZmFjdG9yIDogX19rbXBfc3Rrc2l6ZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9IiwgbmFtZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgKF9fa21wX3N0a3NpemUgJSAxMDI0KSA/IF9fa21wX3N0a3NpemUgLyBzdGFja3NpemUtPmZhY3RvciA6IF9fa21wX3N0a3NpemUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiXG4iICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9WRVJTSU9OCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfdmVyc2lvbiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX3ZlcnNpb24gKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3ZlcnNpb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF92ZXJzaW9uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfdmVyc2lvbiApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdmVyc2lvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfV0FSTklOR1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV93YXJuaW5ncyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzICk7CisgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzICE9IGttcF93YXJuaW5nc19vZmYpIHsgICAvLyBBQzogd2UgaGF2ZSBvbmx5IDAvMSB2YWx1ZXMgZG9jdW1lbnRlZCwKKyAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBrbXBfd2FybmluZ3NfZXhwbGljaXQ7IC8vICAgICBzbyByZXNldCBpdCB0byBleHBsaWNpdCBpbiBvcmRlciB0bworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRpc3Rpbmd1aXNoIGZyb20gZGVmYXVsdCBzZXR0aW5nCit9IC8vIF9fa21wX2Vudl9wYXJzZV93YXJuaW5ncworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3dhcm5pbmdzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgKTsgLy8gQUM6IFRPRE86IGNoYW5nZSB0byBwcmludF9pbnQ/Cit9IC8vIF9fa21wX2Vudl9wcmludF93YXJuaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChuZWVkcyBkb2N1bWVudGF0aW9uIGNoYW5nZSkuLi4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX05FU1RFRCwgT01QX05VTV9USFJFQURTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbmVzdGVkKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGZsdF9uZXN0ZWQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX25lc3RlZAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X25lc3RlZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RmbHRfbmVzdGVkICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9uZXN0ZWQKKworc3RhdGljIHZvaWQKK19fa21wX3BhcnNlX25lc3RlZF9udW1fdGhyZWFkcyggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplbnYsIGttcF9uZXN0ZWRfbnRocmVhZHNfdCAqbnRoX2FycmF5ICkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gZW52OworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBuZXh0OworCisgICAgaW50IHRvdGFsID0gMDsgICAgICAgICAgLy8gQ291bnQgZWxlbWVudHMgdGhhdCB3ZXJlIHNldC4gSXQnbGwgYmUgdXNlZCBhcyBhbiBhcnJheSBzaXplCisgICAgaW50IHByZXZfY29tbWEgPSBGQUxTRTsgLy8gRm9yIGNvcnJlY3QgcHJvY2Vzc2luZyBzZXF1ZW50aWFsIGNvbW1hcworCisgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGVudi4gdmFyIHN0cmluZworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgU0tJUF9XUyggbmV4dCApOworCisgICAgICAgIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbiBpbnRlZ2VyIG9yIG5vdCBhIGNvbW1hID0+IGVuZCBvZiBsaXN0CisgICAgICAgIGlmICggKCAoICpuZXh0IDwgJzAnICkgfHwgKCAqbmV4dCA+ICc5JyApICkgJiYgKCAqbmV4dCAhPScsJykgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggTnRoU3ludGF4RXJyb3IsIHZhciwgZW52ICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIGlzICcsJworICAgICAgICBpZiAoICpuZXh0ID09ICcsJyApIHsKKyAgICAgICAgICAgIC8vICcsJyBpcyB0aGUgZmlzcnQgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoIHRvdGFsID09IDAgfHwgcHJldl9jb21tYSApIHsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICAgICAgICBuZXh0Kys7IC8vc2tpcCAnLCcKKyAgICAgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgICAgIGlmICggKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JyApIHsKKyAgICAgICAgICAgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgY29uc3QgY2hhciAqdG1wID0gbmV4dDsKKyAgICAgICAgICAgIFNLSVBfV1MoIHRtcCApOworICAgICAgICAgICAgaWYgKCAoICpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnICkgJiYgKCAqdG1wID49ICcwJyAmJiAqdG1wIDw9ICc5JyApICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBOdGhTcGFjZXNOb3RBbGxvd2VkLCB2YXIsIGVudiApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0b3RhbCA+IDAgKTsKKyAgICBpZiggdG90YWwgPD0gMCApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIE50aFN5bnRheEVycm9yLCB2YXIsIGVudiApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheSBleGlzdHMKKyAgICBpZiAoICEgbnRoX2FycmF5LT5udGggKSB7CisgICAgICAgIC8vIEFsbG9jYXRlIGFuIGFycmF5IG9mIGRvdWJsZSBzaXplCisgICAgICAgIG50aF9hcnJheS0+bnRoID0gKCBpbnQgKiApS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCBpbnQgKSAqIHRvdGFsICogMiApOworICAgICAgICBpZiAoIG50aF9hcnJheS0+bnRoID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgIH0KKyAgICAgICAgbnRoX2FycmF5LT5zaXplID0gdG90YWwgKiAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggbnRoX2FycmF5LT5zaXplIDwgdG90YWwgKSB7CisgICAgICAgICAgICAvLyBJbmNyZWFzZSB0aGUgYXJyYXkgc2l6ZQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG50aF9hcnJheS0+c2l6ZSAqPSAyOworICAgICAgICAgICAgfSB3aGlsZSAoIG50aF9hcnJheS0+c2l6ZSA8IHRvdGFsICk7CisKKyAgICAgICAgICAgIG50aF9hcnJheS0+bnRoID0gKGludCAqKSBLTVBfSU5URVJOQUxfUkVBTExPQygKKyAgICAgICAgICAgICAgICBudGhfYXJyYXktPm50aCwgc2l6ZW9mKCBpbnQgKSAqIG50aF9hcnJheS0+c2l6ZSApOworICAgICAgICAgICAgaWYgKCBudGhfYXJyYXktPm50aCA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbnRoX2FycmF5LT51c2VkID0gdG90YWw7CisgICAgaW50IGkgPSAwOworCisgICAgcHJldl9jb21tYSA9IEZBTFNFOworICAgIHRvdGFsID0gMDsKKyAgICAvLyBTYXZlIHZhbHVlcyBpbiB0aGUgYXJyYXkKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIFNLSVBfV1MoIHNjYW4gKTsKKyAgICAgICAgaWYgKCAqc2NhbiA9PSAnXDAnICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIGlzICcsJworICAgICAgICBpZiAoICpzY2FuID09ICcsJyApIHsKKyAgICAgICAgICAgIC8vICcsJyBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgICAgICAgICBpZiAoIHRvdGFsID09IDAgKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIHN1cHBvc2VkIHRvIGJlIGVxdWFsIHRvIF9fa21wX2F2YWlsX3Byb2MgYnV0IGl0IGlzIHVua25vd24gYXQgdGhlIG1vbWVudC4KKyAgICAgICAgICAgICAgICAvLyBTbyBsZXQncyBwdXQgYSBwbGFjZWhvbGRlciAoI3RocmVhZHMgPSAwKSB0byBjb3JyZWN0IGl0IGxhdGVyLgorICAgICAgICAgICAgICAgIG50aF9hcnJheS0+bnRoW2krK10gPSAwOworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9ZWxzZSBpZiAoIHByZXZfY29tbWEgKSB7CisgICAgICAgICAgICAgICAgLy8gTnVtIHRocmVhZHMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHByZXZpb3VzIGxldmVsCisgICAgICAgICAgICAgICAgbnRoX2FycmF5LT5udGhbaV0gPSBudGhfYXJyYXktPm50aFtpIC0gMV07CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gVFJVRTsKKyAgICAgICAgICAgIHNjYW4rKzsgLy9za2lwICcsJworICAgICAgICAgICAgU0tJUF9XUyggc2NhbiApOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIGEgZGlnaXQKKyAgICAgICAgaWYgKCAqc2NhbiA+PSAnMCcgJiYgKnNjYW4gPD0gJzknICkgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IHNjYW47CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogbXNnICA9IE5VTEw7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggc2NhbiApOworICAgICAgICAgICAgdG90YWwrKzsKKworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqc2NhbiApOworICAgICAgICAgICAgaWYgKCBudW0gPCBLTVBfTUlOX05USCApIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBLTVBfTUlOX05USDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG51bSA+IF9fa21wX3N5c19tYXhfbnRoICkgeworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N5c19tYXhfbnRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggUGFyc2VTaXplSW50V2FybiwgdmFyLCBlbnYsIG1zZyApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgdmFyLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG50aF9hcnJheS0+bnRoW2krK10gPSBudW07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbnVtX3RocmVhZHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG9wdGlvbi4gT01QX05VTV9USFJFQURTIGlzIGEgbGlzdCBvZiBwb3NpdGl2ZSBpbnRlZ2VycyEKKyAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYWxsIiwgdmFsdWUsIDAgKSApIHsKKyAgICAgICAgLy8gVGhlIGFycmF5IG9mIDEgZWxlbWVudAorICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aCA9ICggaW50KiApS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCBpbnQgKSApOworICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLnNpemUgPSBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgPSAxOworICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aFswXSA9IF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfeHByb2M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcGFyc2VfbmVzdGVkX251bV90aHJlYWRzKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9uZXN0ZWRfbnRoICk7CisgICAgICAgIGlmICggX19rbXBfbmVzdGVkX250aC5udGggKSB7CisgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfbmVzdGVkX250aC5udGhbMF07CisgICAgICAgICAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPCBfX2ttcF9kZmx0X3RlYW1fbnRoICkgeworICAgICAgICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBfX2ttcF9kZmx0X3RlYW1fbnRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsgLy8gaWYKKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2RmbHRfdGVhbV9udGggPT0gJWRcbiIsIF9fa21wX2RmbHRfdGVhbV9udGggKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbnVtX3RocmVhZHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9udW1fdGhyZWFkcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoIF9fa21wX25lc3RlZF9udGgudXNlZCApIHsKKyAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJmJ1ZiApOworICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQ7IGkrKykgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJmJ1ZiwgIiVkIiwgX19rbXBfbmVzdGVkX250aC5udGhbaV0gKTsKKyAgICAgICAgICAgIGlmICggaSA8IF9fa21wX25lc3RlZF9udGgudXNlZCAtIDEgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJmJ1ZiwgIiwiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSclcydcbiIsIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfbnVtX3RocmVhZHMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3Blbk1QIDMuMDogS01QX1RBU0tJTkcsIE9NUF9NQVhfQUNUSVZFX0xFVkVMUywKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV90YXNraW5nKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgKGludCl0c2ttX21heCwgKGludCAqKSZfX2ttcF90YXNraW5nX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Rhc2tpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF90YXNraW5nKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF90YXNraW5nX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3Rhc2tpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgMSwgKGludCAqKSZfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Rhc2tfc3RlYWxpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3Rhc2tfc3RlYWxpbmcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9tYXhfYWN0aXZlX2xldmVscyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCwgJiBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9tYXhfYWN0aXZlX2xldmVscworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X21heF9hY3RpdmVfbGV2ZWxzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9tYXhfYWN0aXZlX2xldmVscworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZW5NUCA0LjA6IE9NUF9ERUZBVUxUX0RFVklDRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2RlZmF1bHRfZGV2aWNlKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLCB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wYXJzZV9pbnQobmFtZSwgdmFsdWUsIDAsIEtNUF9NQVhfREVGQVVMVF9ERVZJQ0VfTElNSVQsICZfX2ttcF9kZWZhdWx0X2RldmljZSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWZhdWx0X2RldmljZQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfZGVmYXVsdF9kZXZpY2Uoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWZhdWx0X2RldmljZSk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWZhdWx0X2RldmljZQorI2VuZGlmCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3Blbk1QIDQuNTogT01QX01BWF9UQVNLX1BSSU9SSVRZCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX21heF90YXNrX3ByaW9yaXR5KGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLCB2b2lkICpkYXRhKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgMCwgS01QX01BWF9UQVNLX1BSSU9SSVRZX0xJTUlULCAmX19rbXBfbWF4X3Rhc2tfcHJpb3JpdHkpOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbWF4X3Rhc2tfcHJpb3JpdHkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9tYXhfdGFza19wcmlvcml0eShrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KGJ1ZmZlciwgbmFtZSwgX19rbXBfbWF4X3Rhc2tfcHJpb3JpdHkpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbWF4X3Rhc2tfcHJpb3JpdHkKKyNlbmRpZiAvLyBPTVBfNDVfRU5BQkxFRAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRElTUF9OVU1fQlVGRkVSUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kaXNwX2J1ZmZlcnMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9zZXJpYWwpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52U2VyaWFsV2FybiwgbmFtZSApOworICAgICAgICByZXR1cm47CisgICAgfSAgIC8vIHJlYWQgdmFsdWUgYmVmb3JlIHNlcmlhbCBpbml0aWFsaXphdGlvbiBvbmx5CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDEsIEtNUF9NQVhfTlRILCAmIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kaXNwX2J1ZmZlcnMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kaXNwX2J1ZmZlcnMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kaXNwX2J1ZmZlcnMKKworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSE9UX1RFQU1TX01BWF9MRVZFTCwgS01QX0hPVF9URUFNU19NT0RFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX2xldmVsKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52UGFyYWxsZWxXYXJuLCBuYW1lICk7CisgICAgICAgIHJldHVybjsKKyAgICB9ICAgLy8gcmVhZCB2YWx1ZSBiZWZvcmUgZmlyc3QgcGFyYWxsZWwgb25seQorICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQsICYgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX2xldmVsCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX2xldmVsKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbGV2ZWwKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudlBhcmFsbGVsV2FybiwgbmFtZSApOworICAgICAgICByZXR1cm47CisgICAgfSAgIC8vIHJlYWQgdmFsdWUgYmVmb3JlIGZpcnN0IHBhcmFsbGVsIG9ubHkKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlULCAmIF9fa21wX2hvdF90ZWFtc19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbW9kZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9ob3RfdGVhbXNfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX21vZGUKKworI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9IQU5ETEVfU0lHTkFMUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfaGFuZGxlX3NpZ25hbHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCV9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9oYW5kbGVfc2lnbmFscyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaGFuZGxlX3NpZ25hbHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9oYW5kbGVfc2lnbmFscygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2hhbmRsZV9zaWduYWxzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9oYW5kbGVfc2lnbmFscworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9YX0RFQlVHLCBLTVBfREVCVUcsIEtNUF9ERUJVR19CVUZfKiwgS01QX0RJQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9ERUJVRworCisjZGVmaW5lIEtNUF9TVEdfWF9ERUJVRyggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfIyN4IyNfZGVidWcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeyAgICAgXAorCV9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAmIGttcF8jI3gjI19kZWJ1ZyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IC8qIF9fa21wX3N0Z19wYXJzZV94X2RlYnVnICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF8jI3gjI19kZWJ1Zygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeyBcCisJX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBrbXBfIyN4IyNfZGVidWcgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gLyogX19rbXBfc3RnX3ByaW50X3hfZGVidWcgKi8KKworS01QX1NUR19YX0RFQlVHKCBhICkKK0tNUF9TVEdfWF9ERUJVRyggYiApCitLTVBfU1RHX1hfREVCVUcoIGMgKQorS01QX1NUR19YX0RFQlVHKCBkICkKK0tNUF9TVEdfWF9ERUJVRyggZSApCitLTVBfU1RHX1hfREVCVUcoIGYgKQorCisjdW5kZWYgS01QX1NUR19YX0RFQlVHCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGludCBkZWJ1ZyA9IDA7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVgsICYgZGVidWcgKTsKKyAgICBpZiAoIGttcF9hX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2FfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2JfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfYl9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfY19kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9jX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9kX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2RfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2VfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfZV9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfZl9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9mX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGVidWdfYnVmICk7CisgICAgLy8gISEhIFRPRE86IE1vdmUgYnVmZmVyIGluaXRpYWxpemF0aW9uIG9mIG9mIHRoaXMgZmlsZSEgSXQgbWF5IHdvcmtzIGluY29ycmVjdGx5IGlmCisgICAgLy8gS01QX0RFQlVHX0JVRiBpcyBwYXJzZWQgYmVmb3JlIEtNUF9ERUJVR19CVUZfTElORVMgb3IgS01QX0RFQlVHX0JVRl9DSEFSUy4KKyAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApIHsKKwlpbnQgaTsKKwlpbnQgZWxlbWVudHMgPSBfX2ttcF9kZWJ1Z19idWZfbGluZXMgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnM7CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbGwgZW50cmllcyBpbiBkZWJ1ZyBidWZmZXIgdG8gZW1wdHkgKi8KKwlfX2ttcF9kZWJ1Z19idWZmZXIgPSAoY2hhciAqKSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBlbGVtZW50cyAqIHNpemVvZiggY2hhciApICk7CisJZm9yICggaSA9IDA7IGkgPCBlbGVtZW50czsgaSArPSBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgKQorCSAgIF9fa21wX2RlYnVnX2J1ZmZlcltpXSA9ICdcMCc7CisKKwlfX2ttcF9kZWJ1Z19jb3VudCA9IDA7CisgICAgfQorICAgIEtfRElBRyggMSwgKCAiX19rbXBfZGVidWdfYnVmID0gJWRcbiIsIF9fa21wX2RlYnVnX2J1ZiApICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kZWJ1Z19idWYoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWJ1Z19idWYgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1ZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9hdG9taWMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kZWJ1Z19idWZfYXRvbWljICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfYXRvbWljCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2F0b21pYygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RlYnVnX2J1Zl9hdG9taWMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9hdG9taWMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfY2hhcnMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoCisJbmFtZSwKKwl2YWx1ZSwKKwlLTVBfREVCVUdfQlVGX0NIQVJTX01JTiwKKwlJTlRfTUFYLAorCSYgX19rbXBfZGVidWdfYnVmX2NoYXJzCisgICAgKTsKK30gLy8gX19rbXBfc3RnX2RlYnVnX3BhcnNlX2J1Zl9jaGFycworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9jaGFycygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmX2NoYXJzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfY2hhcnMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfbGluZXMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoCisJbmFtZSwKKwl2YWx1ZSwKKwlLTVBfREVCVUdfQlVGX0xJTkVTX01JTiwKKwlJTlRfTUFYLAorCSYgX19rbXBfZGVidWdfYnVmX2xpbmVzCisgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9saW5lcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9saW5lcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfbGluZXMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kaWFnKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJiBrbXBfZGlhZyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGlhZworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RpYWcoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIGttcF9kaWFnICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kaWFnCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FMSUdOX0FMTE9DCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWxpZ25fYWxsb2MoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLAorICAgICAgICB2YWx1ZSwKKyAgICAgICAgQ0FDSEVfTElORSwKKyAgICAgICAgSU5UX01BWCwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgJiBfX2ttcF9hbGlnbl9hbGxvYywKKyAgICAgICAgMQorICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hbGlnbl9hbGxvYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FsaWduX2FsbG9jKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zaXplKCBidWZmZXIsIG5hbWUsIF9fa21wX2FsaWduX2FsbG9jICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hbGlnbl9hbGxvYworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfUExBSU5fQkFSUklFUiwgS01QX0ZPUktKT0lOX0JBUlJJRVIsIEtNUF9SRURVQ1RJT05fQkFSUklFUgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUT0RPOiBSZW1vdmUgX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lIHZhcmliYWxlLCByZW1vdmUgbG9vcHMgZnJvbSBwYXJzZSBhbmQgcHJpbnQKKy8vICAgICAgIGZ1bmN0aW9ucywgcGFzcyByZXF1aXJlZCBpbmZvIHRocm91Z2ggZGF0YSBhcmd1bWVudC4KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGNvbnN0IGNoYXIgKnZhcjsKKworICAgIC8qIC0tLS0tLS0tLS0gQmFycmllciBicmFuY2ggYml0IGNvbnRyb2wgLS0tLS0tLS0tLS0tICovCisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lWyBpIF07CisgICAgICAgIGlmICggKCBzdHJjbXAoIHZhciwgbmFtZSkgPT0gMCApICYmICggdmFsdWUgIT0gMCApICkgeworICAgICAgICAgICAgY2hhciAqY29tbWE7CisKKyAgICAgICAgICAgIGNvbW1hID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdID0gKCBrbXBfdWludDMyICkgX19rbXBfc3RyX3RvX2ludCggdmFsdWUsICcsJyApOworICAgICAgICAgICAgLyogaXMgdGhlcmUgYSBzcGVjaWZpZWQgcmVsZWFzZSBwYXJhbWV0ZXI/ICovCisgICAgICAgICAgICBpZiAoIGNvbW1hID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPSAoa21wX3VpbnQzMikgX19rbXBfc3RyX3RvX2ludCggY29tbWEgKyAxLCAwICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID4gS01QX01BWF9CUkFOQ0hfQklUUyApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQmFyclJlbGVhc2VWYWx1ZUludmFsaWQsIG5hbWUsIGNvbW1hICsgMSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbIGkgXSA+IEtNUF9NQVhfQlJBTkNIX0JJVFMgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBCYXJyR2F0aGVyVmFsdWVJbnZhbGlkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ191aW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0ICk7CisgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbIGkgXSA9ICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEtfRElBRygxLCAoIiVzID09ICVkLCVkXG4iLCBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXSwgXAorICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdLCBcCisgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzIFsgaSBdKSkKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lWyBpIF07CisgICAgICAgIGlmICggc3RyY21wKCB2YXIsIG5hbWUpID09IDAgICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQsJWQnXG4iLCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyBbIGkgXSwgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzIFsgaSBdKTsKKyAgICAgICAgfQorICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4sIEtNUF9GT1JLSk9JTl9CQVJSSUVSX1BBVFRFUk4sIEtNUF9SRURVQ1RJT05fQkFSUklFUl9QQVRURVJOCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRPRE86IFJlbW92ZSBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSB2YXJpYWJsZSwgcmVtb3ZlIGxvb3BzIGZyb20gcGFyc2UgYW5kIHByaW50IGZ1bmN0aW9ucywKKy8vICAgICAgIHBhc3MgcmVxdWlyZWQgZGF0YSB0byBmdW5jdGlvbnMgdGhyb3VnaCBkYXRhIGFyZ3VtZW50LgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFyOworICAgIC8qIC0tLS0tLS0tLS0gQmFycmllciBtZXRob2QgY29udHJvbCAtLS0tLS0tLS0tLS0gKi8KKworICAgIGZvciAoIGludCBpPWJzX3BsYWluX2JhcnJpZXI7IGk8YnNfbGFzdF9iYXJyaWVyOyBpKysgKSB7CisgICAgICAgIHZhciA9IF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdOworCisgICAgICAgIGlmICggKCBzdHJjbXAgKCB2YXIsIG5hbWUgKSA9PSAwICkgJiYgKCB2YWx1ZSAhPSAwICkgKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGNoYXIgKmNvbW1hID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJywnICk7CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBmaXJzdCBwYXJhbWV0ZXI6IGdhdGhlciBwYXR0ZXJuICovCisgICAgICAgICAgICBmb3IgKCBqID0gYnBfbGluZWFyX2JhcjsgajxicF9sYXN0X2JhcjsgaisrICkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9tYXRjaF93aXRoX3NlbnRpbmVsKCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVtqXSwgdmFsdWUsIDEsICcsJyApKSB7CisgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVyblsgaSBdID0gKGttcF9iYXJfcGF0X2UpIGo7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBqID09IGJwX2xhc3RfYmFyICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBCYXJyR2F0aGVyVmFsdWVJbnZhbGlkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3N0cl9WYWx1ZSwgbmFtZSwgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbIGJwX2xpbmVhcl9iYXIgXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBoYW5kbGUgc2Vjb25kIHBhcmFtZXRlcjogcmVsZWFzZSBwYXR0ZXJuICovCisgICAgICAgICAgICBpZiAoIGNvbW1hICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgZm9yICggaiA9IGJwX2xpbmVhcl9iYXI7IGogPCBicF9sYXN0X2JhcjsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbal0sIDEsIGNvbW1hICsgMSApICkgeworICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgaSBdID0gKGttcF9iYXJfcGF0X2UpIGo7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IGJwX2xhc3RfYmFyKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEJhcnJSZWxlYXNlVmFsdWVJbnZhbGlkLCBuYW1lLCBjb21tYSArIDEgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfc3RyX1ZhbHVlLCBuYW1lLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgYnBfbGluZWFyX2JhciBdICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFyOworICAgIGZvciAoIGludCBpPWJzX3BsYWluX2JhcnJpZXI7IGk8YnNfbGFzdF9iYXJyaWVyOyBpKysgKSB7CisgICAgICAgIHZhciA9IF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdOworICAgICAgICBpZiAoIHN0cmNtcCAoIHZhciwgbmFtZSApID09IDAgKSB7CisgICAgICAgICAgICBpbnQgaiA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBpIF07CisgICAgICAgICAgICBpbnQgayA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuIFsgaSBdOworICAgICAgICAgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWVbIGkgXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWVbIGkgXSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJXMnXG4iLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSBbIGogXSwgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWUgWyBrIF0pOworICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BQk9SVF9ERUxBWQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Fib3J0X2RlbGF5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLyBVbml0cyBvZiBLTVBfREVMQVlfQUJPUlQgYXJlIHNlY29uZHMsIHVuaXRzIG9mIF9fa21wX2Fib3J0X2RlbGF5IGlzIG1pbGxpc2Vjb25kcy4KKyAgICBpbnQgZGVsYXkgPSBfX2ttcF9hYm9ydF9kZWxheSAvIDEwMDA7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVggLyAxMDAwLCAmIGRlbGF5ICk7CisgICAgX19rbXBfYWJvcnRfZGVsYXkgPSBkZWxheSAqIDEwMDA7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hYm9ydF9kZWxheQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Fib3J0X2RlbGF5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9hYm9ydF9kZWxheSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWJvcnRfZGVsYXkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0NQVUlORk9fRklMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2NwdWluZm9fZmlsZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0ciggbmFtZSwgdmFsdWUsICYgX19rbXBfY3B1aW5mb19maWxlICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfY3B1aW5mb19maWxlID09ICVzXG4iLCBfX2ttcF9jcHVpbmZvX2ZpbGUgKSApOworICAgICNlbmRpZgorfSAvL19fa21wX3N0Z19wYXJzZV9jcHVpbmZvX2ZpbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9jcHVpbmZvX2ZpbGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2NwdWluZm9fZmlsZSApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nJXMnXG4iLCBfX2ttcF9jcHVpbmZvX2ZpbGUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICAjZW5kaWYKK30gLy9fX2ttcF9zdGdfcHJpbnRfY3B1aW5mb19maWxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JDRV9SRURVQ1RJT04sIEtNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGttcF9zdGdfZnJfZGF0YV90ICogcmVkdWN0aW9uID0gKGttcF9zdGdfZnJfZGF0YV90ICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJlZHVjdGlvbi0+cml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgaWYgKCByZWR1Y3Rpb24tPmZvcmNlICkgeworICAgICAgICBpZiggdmFsdWUgIT0gMCApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9zdHJfbWF0Y2goICJjcml0aWNhbCIsIDAsIHZhbHVlICkgKQorICAgICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IGNyaXRpY2FsX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgIGVsc2UgaWYoIF9fa21wX3N0cl9tYXRjaCggImF0b21pYyIsIDAsIHZhbHVlICkgKQorICAgICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICBlbHNlIGlmKCBfX2ttcF9zdHJfbWF0Y2goICJ0cmVlIiwgMCwgdmFsdWUgKSApCisgICAgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gdHJlZV9yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIFVua25vd25Gb3JjZVJlZHVjdGlvbiwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kZXRlcm1fcmVkICk7CisgICAgICAgIGlmKCBfX2ttcF9kZXRlcm1fcmVkICkgeworICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHRyZWVfcmVkdWNlX2Jsb2NrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID09ICVkXG4iLCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kICkgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z19mcl9kYXRhX3QgKiByZWR1Y3Rpb24gPSAoa21wX3N0Z19mcl9kYXRhX3QgKikgZGF0YTsKKyAgICBpZiAoIHJlZHVjdGlvbi0+Zm9yY2UgKSB7CisgICAgICAgIGlmKCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jaykgeworICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAiY3JpdGljYWwiKTsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9PSBhdG9taWNfcmVkdWNlX2Jsb2NrICkgeworICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAiYXRvbWljIik7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gdHJlZV9yZWR1Y2VfYmxvY2sgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJ0cmVlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZXRlcm1fcmVkICk7CisgICAgfQorCisKK30gLy8gX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RPUkFHRV9NQVAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdG9yYWdlX21hcCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICAidmVyYm9zZSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwICAgICAgICAgPSBUUlVFOworICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlID0gVFJVRTsKKyAgICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZV9zcGVjaWZpZWQgPSBUUlVFOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSA9IEZBTFNFOworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfc3RvcmFnZV9tYXAgKTsgLy8gISEhCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX3N0b3JhZ2VfbWFwCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3RvcmFnZV9tYXAoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgfHwgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZV9zcGVjaWZpZWQgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInZlcmJvc2UiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfc3RvcmFnZV9tYXAgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUxMX1RIUkVBRFBSSVZBVEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcHJpdmF0ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQgPyBfX2ttcF9tYXhfbnRoIDogMSwgX19rbXBfbWF4X250aCwKKyAgICAgICAgJiBfX2ttcF90cF9jYXBhY2l0eSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHByaXZhdGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcHJpdmF0ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfdHBfY2FwYWNpdHkgKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRk9SRUlHTl9USFJFQURTX1RIUkVBRFBSSVZBVEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2ZvcmVpZ25fdHAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9mb3JlaWduX3RwICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BRkZJTklUWSwgR09NUF9DUFVfQUZGSU5JVFksIEtNUF9UT1BPTE9HWV9NRVRIT0QKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKy8vCisvLyBQYXJzZSB0aGUgcHJvYyBpZCBsaXN0LiAgUmV0dXJuIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX3BhcnNlX2FmZmluaXR5X3Byb2NfaWRfbGlzdCggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplbnYsCisgICAgY29uc3QgY2hhciAqKm5leHRFbnYsIGNoYXIgKipwcm9jbGlzdCApCit7CisgICAgY29uc3QgY2hhciAqc2NhbiA9IGVudjsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gc2NhbjsKKyAgICBpbnQgZW1wdHkgPSBUUlVFOworCisgICAgKnByb2NsaXN0ID0gTlVMTDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBlbmQsIHN0cmlkZTsKKworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpuZXh0ID09ICd7JykgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ3snCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobnVtID49IDApOworCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBuZXh0Kys7ICAgICAvLyBza2lwICd9JworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbmV4dCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKG51bSA+PSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVtcHR5ID0gRkFMU0U7CisKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbiBpbnRlZ2VyID0+IGVuZCBvZiBsaXN0CisgICAgICAgIC8vCisgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgIGlmIChlbXB0eSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZTeW50YXhFcnJvciwgdmFyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyLgorICAgICAgICAvLworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdGFydCA+PSAwKTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGEgcmFuZ2UsIHRoZW4gZ28gb24uCisgICAgICAgIC8vCisgICAgICAgIGlmICgqbmV4dCAhPSAnLScpIHsKKyAgICAgICAgICAgIGVtcHR5ID0gRkFMU0U7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBpcyBhIHJhbmdlLiAgU2tpcCBvdmVyIHRoZSAnLScgYW5kIHJlYWQgaW4gdGhlIDJuZCBpbnQuCisgICAgICAgIC8vCisgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICctJworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgZW5kID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoZW5kID49IDApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGZvciBhIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgc3RyaWRlID0gMTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICc6JykgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEEgc3RyaWRlIGlzIHNwZWNpZmllZC4gIFNraXAgb3ZlciB0aGUgJzoiIGFuZCByZWFkIHRoZSAzcmQgaW50LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgICAgLy8gc2tpcCAnOicKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduID0gLTE7CisgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIERvIHNvbWUgcmFuZ2UgY2hlY2tzLgorICAgICAgICAvLworICAgICAgICBpZiAoc3RyaWRlID09IDApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZaZXJvU3RyaWRlLCB2YXIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN0YXJ0R3JlYXRlckVuZCwgdmFyLCBzdGFydCwgZW5kICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN0cmlkZUxlc3NaZXJvLCB2YXIsIHN0YXJ0LCBlbmQgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlbmQgLSBzdGFydCkgLyBzdHJpZGUgPiA2NTUzNiApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZSYW5nZVRvb0JpZywgdmFyLCBlbmQsIHN0YXJ0LCBzdHJpZGUgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGVtcHR5ID0gRkFMU0U7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgIH0KKworICAgICpuZXh0RW52ID0gbmV4dDsKKworICAgIHsKKyAgICAgICAgaW50IGxlbiA9IG5leHQgLSBlbnY7CisgICAgICAgIGNoYXIgKnJldGxpc3QgPSAoY2hhciAqKV9fa21wX2FsbG9jYXRlKChsZW4gKyAxKSAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIEtNUF9NRU1DUFlfUyhyZXRsaXN0LCAobGVuKzEpKnNpemVvZihjaGFyKSwgZW52LCBsZW4gKiBzaXplb2YoY2hhcikpOworICAgICAgICByZXRsaXN0W2xlbl0gPSAnXDAnOworICAgICAgICAqcHJvY2xpc3QgPSByZXRsaXN0OworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLworLy8gSWYgS01QX0FGRklOSVRZIGlzIHNwZWNpZmllZCB3aXRob3V0IGEgdHlwZSwgdGhlbgorLy8gX19rbXBfYWZmaW5pdHlfbm90eXBlIHNob3VsZCBwb2ludCB0byBpdHMgc2V0dGluZy4KKy8vCitzdGF0aWMga21wX3NldHRpbmdfdCAqX19rbXBfYWZmaW5pdHlfbm90eXBlID0gTlVMTDsKKworc3RhdGljIHZvaWQKK19fa21wX3BhcnNlX2FmZmluaXR5X2VudiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBlbnVtIGFmZmluaXR5X3R5cGUgICogb3V0X3R5cGUsCisgICAgY2hhciAgICAgICAgICAgICAgICAqKiBvdXRfcHJvY2xpc3QsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF92ZXJib3NlLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfd2FybiwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X3Jlc3BlY3QsCisgICAgZW51bSBhZmZpbml0eV9ncmFuICAqIG91dF9ncmFuLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfZ3Jhbl9sZXZlbHMsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9kdXBzLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfY29tcGFjdCwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X29mZnNldAorKQoreworICAgIGNoYXIgKiBidWZmZXIgPSBOVUxMOyAgICAvLyBDb3B5IG9mIGVudiB2YXIgdmFsdWUuCisgICAgY2hhciAqIGJ1ZiAgICA9IE5VTEw7ICAgIC8vIEJ1ZmZlciBmb3Igc3RydG9rX3IoKSBmdW5jdGlvbi4KKyAgICBjaGFyICogbmV4dCA9IE5VTEw7ICAgICAgLy8gZW5kIG9mIHRva2VuIC8gc3RhcnQgb2YgbmV4dC4KKyAgICBjb25zdCBjaGFyICogc3RhcnQ7ICAgICAgLy8gc3RhcnQgb2YgY3VycmVudCB0b2tlbiAoZm9yIGVyciBtc2dzKQorICAgIGludCAgICBjb3VudCAgPSAwOyAgICAgICAvLyBDb3VudGVyIG9mIHBhcnNlZCBpbnRlZ2VyIG51bWJlcnMuCisgICAgaW50ICAgIG51bWJlclsgMiBdOyAgICAgIC8vIFBhcnNlZCBudW1iZXJzLgorCisgICAgLy8gR3VhcmRzLgorICAgIGludCB0eXBlICAgICAgICAgPSAwOworICAgIGludCBwcm9jbGlzdCAgICAgPSAwOworICAgIGludCBtYXhfcHJvY2xpc3QgPSAwOworICAgIGludCB2ZXJib3NlICAgICAgPSAwOworICAgIGludCB3YXJuaW5ncyAgICAgPSAwOworICAgIGludCByZXNwZWN0ICAgICAgPSAwOworICAgIGludCBncmFuICAgICAgICAgPSAwOworICAgIGludCBkdXBzICAgICAgICAgPSAwOworCisgICAgS01QX0FTU0VSVCggdmFsdWUgIT0gTlVMTCApOworCisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZNaWRkbGVXYXJuLCBuYW1lICk7CisgICAgICAgIF9fa21wX2Vudl90b1ByaW50KCBuYW1lLCAwICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDEgKTsKKworICAgIGJ1ZmZlciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIHZhbHVlICk7ICAgICAgICAgLy8gQ29weSBlbnYgdmFyIHRvIGtlZXAgb3JpZ2luYWwgaW50YWN0LgorICAgIGJ1ZiA9IGJ1ZmZlcjsKKyAgICBTS0lQX1dTKGJ1Zik7CisKKyAgICAvLyBIZWxwZXIgbWFjcm9zLgorCisgICAgLy8KKyAgICAvLyBJZiB3ZSBzZWUgYSBwYXJzZSBlcnJvciwgZW1pdCBhIHdhcm5pbmcgYW5kIHNjYW4gdG8gdGhlIG5leHQgIiwiLgorICAgIC8vCisgICAgLy8gRklYTUUgLSB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkgdG8gcHJpbnQgYW4gZXJyb3IKKyAgICAvLyBtZXNzYWdlLCBob3BlZnVsbHkgd2l0aG91dCBvdmVyd3JpdHRpbmcgcGVpY2VzIG9mIGJ1Zi4KKyAgICAvLworICAgICNkZWZpbmUgRU1JVF9XQVJOKHNraXAsZXJybGlzdCkgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2hhciBjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHNraXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFNLSVBfVE8obmV4dCwgJywnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2ggPSAqbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKm5leHQgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX1dBUk5JTkcgZXJybGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKm5leHQgPSBjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHNraXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLCcpIG5leHQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnVmID0gbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyAgICAjZGVmaW5lIF9zZXRfcGFyYW0oX2d1YXJkLF92YXIsX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggX2d1YXJkID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfdmFyID0gX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIEZBTFNFLCAoIEFmZlBhcmFtRGVmaW5lZCwgbmFtZSwgc3RhcnQgKSApOyAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICsrIF9ndWFyZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisgICAgI2RlZmluZSBzZXRfdHlwZSh2YWwpICAgICAgICAgIF9zZXRfcGFyYW0oIHR5cGUsICAgICAqb3V0X3R5cGUsICAgICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X3ZlcmJvc2UodmFsKSAgICAgICBfc2V0X3BhcmFtKCB2ZXJib3NlLCAgKm91dF92ZXJib3NlLCAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF93YXJuaW5ncyh2YWwpICAgICAgX3NldF9wYXJhbSggd2FybmluZ3MsICpvdXRfd2FybiwgICAgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfcmVzcGVjdCh2YWwpICAgICAgIF9zZXRfcGFyYW0oIHJlc3BlY3QsICAqb3V0X3Jlc3BlY3QsICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X2R1cHModmFsKSAgICAgICAgICBfc2V0X3BhcmFtKCBkdXBzLCAgICAgKm91dF9kdXBzLCAgICAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF9wcm9jbGlzdCh2YWwpICAgICAgX3NldF9wYXJhbSggcHJvY2xpc3QsICpvdXRfcHJvY2xpc3QsICAgIHZhbCApCisKKyAgICAjZGVmaW5lIHNldF9ncmFuKHZhbCxsZXZlbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggZ3JhbiA9PSAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqb3V0X2dyYW4gPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqb3V0X2dyYW5fbGV2ZWxzID0gbGV2ZWxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIEZBTFNFLCAoIEFmZlBhcmFtRGVmaW5lZCwgbmFtZSwgc3RhcnQgKSApOyAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICsrIGdyYW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgIT0gTlVMTCApCisgICAgICAmJiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA+IDAgKSApOworIyBlbmRpZgorCisgICAgd2hpbGUgKCAqYnVmICE9ICdcMCcgKSB7CisgICAgICAgIHN0YXJ0ID0gbmV4dCA9IGJ1ZjsKKworICAgICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub25lIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9ub25lICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigic2NhdHRlciIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfc2NhdHRlciApOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyBlbmRpZgorICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImNvbXBhY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2NvbXBhY3QgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJsb2dpY2FsIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9sb2dpY2FsICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicGh5c2ljYWwiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X3BoeXNpY2FsICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZXhwbGljaXQiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2V4cGxpY2l0ICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiYmFsYW5jZWQiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2JhbGFuY2VkICk7CisjICBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyAgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJkaXNhYmxlZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfZGlzYWJsZWQgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ2ZXJib3NlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF92ZXJib3NlKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm92ZXJib3NlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF92ZXJib3NlKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIndhcm5pbmdzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF93YXJuaW5ncyggVFJVRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vd2FybmluZ3MiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3dhcm5pbmdzKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInJlc3BlY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3Jlc3BlY3QoIFRSVUUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub3Jlc3BlY3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3Jlc3BlY3QoIEZBTFNFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZHVwbGljYXRlcyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpCisgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCJkdXBzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF9kdXBzKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm9kdXBsaWNhdGVzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkKKyAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoIm5vZHVwcyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfZHVwcyggRkFMU0UgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJncmFudWxhcml0eSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpCisgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCJncmFuIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgIT0gJz0nKSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dCsrOyAgICAgIC8vIHNraXAgJz0nCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgaWYgKF9fa21wX21hdGNoX3N0cigiZmluZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fZmluZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInRocmVhZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fdGhyZWFkLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiY29yZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fY29yZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInBhY2thZ2UiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX3BhY2thZ2UsIC0xICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub2RlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9ub2RlLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImdyb3VwIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9ncm91cCwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworIyBlbmRpZiAvKiBLTVBfR1JPVVAgQUZGSU5JVFkgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpKSB7CisgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBuID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobiA+PSAwKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX2RlZmF1bHQsIG4gKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicHJvY2xpc3QiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgY2hhciAqdGVtcF9wcm9jbGlzdDsKKworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnPScKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBpZiAoKm5leHQgIT0gJ1snKSB7CisgICAgICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dCsrOyAgICAgIC8vIHNraXAgJ1snCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgaWYgKCEgX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KG5hbWUsIGJ1ZiwKKyAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopJm5leHQsICZ0ZW1wX3Byb2NsaXN0KSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gd2FybmluZyBhbHJlYWR5IGVtaXR0ZWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBTS0lQX1RPKG5leHQsICddJyk7CisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICddJykgbmV4dCsrOworICAgICAgICAgICAgICAgIFNLSVBfVE8obmV4dCwgJywnKTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJywnKSBuZXh0Kys7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnXScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnXScKKyAgICAgICAgICAgIHNldF9wcm9jbGlzdCggdGVtcF9wcm9jbGlzdCApOworICAgICAgICB9IGVsc2UgaWYgKCgqYnVmID49ICcwJykgJiYgKCpidWYgPD0gJzknKSkgeworICAgICAgICAgICAgLy8gUGFyc2UgaW50ZWdlciBudW1iZXJzIC0tIHBlcm11dGUgYW5kIG9mZnNldC4KKyAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgbiA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobiA+PSAwKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoIGNvdW50IDwgMiApIHsKKyAgICAgICAgICAgICAgICBudW1iZXJbIGNvdW50IF0gPSBuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTWFueVBhcmFtcywgbmFtZSwgc3RhcnQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICArKyBjb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0ICkgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqbmV4dCAhPSAnXDAnKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0ZW1wID0gbmV4dDsKKyAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCB0ZW1wICkgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgfSAvLyB3aGlsZQorCisgICAgI3VuZGVmIEVNSVRfV0FSTgorICAgICN1bmRlZiBfc2V0X3BhcmFtCisgICAgI3VuZGVmIHNldF90eXBlCisgICAgI3VuZGVmIHNldF92ZXJib3NlCisgICAgI3VuZGVmIHNldF93YXJuaW5ncworICAgICN1bmRlZiBzZXRfcmVzcGVjdAorICAgICN1bmRlZiBzZXRfZ3JhbnVsYXJpdHkKKworICAgIF9fa21wX3N0cl9mcmVlKChjb25zdCBjaGFyICoqKSAmYnVmZmVyKTsKKworICAgIGlmICggcHJvY2xpc3QgKSB7CisgICAgICAgIGlmICggISB0eXBlICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlByb2NMaXN0Tm9UeXBlLCBuYW1lICk7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZXhwbGljaXQgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmUHJvY0xpc3ROb3RFeHBsaWNpdCwgbmFtZSApOworICAgICAgICAgICAgS01QX0FTU0VSVCggKm91dF9wcm9jbGlzdCAhPSBOVUxMICk7CisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKm91dF9wcm9jbGlzdCApOworICAgICAgICAgICAgKm91dF9wcm9jbGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoICggKm91dF90eXBlICkgeworICAgICAgICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6CisgICAgICAgIGNhc2UgYWZmaW5pdHlfcGh5c2ljYWw6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAwIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDEgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZk1hbnlQYXJhbXNGb3JMb2dpYywgbmFtZSwgbnVtYmVyWyAxIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfYmFsYW5jZWQ6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfY29tcGFjdCA9IG51bWJlclsgMCBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggY291bnQgPiAxICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAxIF07CisgICAgICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9taWNfdHlwZSAhPSBub25fbWljICkgeworICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuVXNpbmcsICJLTVBfQUZGSU5JVFkiLCAiZmluZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuVXNpbmcsICJLTVBfQUZGSU5JVFkiLCAiY29yZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9zY2F0dGVyOgorICAgICAgICBjYXNlIGFmZmluaXR5X2NvbXBhY3Q6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgICpvdXRfY29tcGFjdCA9IG51bWJlclsgMCBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggY291bnQgPiAxICkgeworICAgICAgICAgICAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWyAxIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OiB7CisgICAgICAgICAgICBpZiAoICpvdXRfcHJvY2xpc3QgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9Qcm9jTGlzdCwgbmFtZSApOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZk5vUGFyYW0sIG5hbWUsICJleHBsaWNpdCIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9ub25lOiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgIm5vbmUiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2Rpc2FibGVkOiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImRpc2FibGVkIiApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9kZWZhdWx0OiB7CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImRlZmF1bHQiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCAwICk7CisgICAgICAgIH07CisgICAgfTsgLy8gc3dpdGNoCit9IC8vIF9fa21wX3BhcnNlX2FmZmluaXR5X2VudgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FmZmluaXR5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX2ttcF9wYXJzZV9hZmZpbml0eV9lbnYoIG5hbWUsIHZhbHVlLCAmIF9fa21wX2FmZmluaXR5X3R5cGUsCisgICAgICAmIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCAmIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UsCisgICAgICAmIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzLCAmIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaywKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfZ3JhbiwgJiBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscywKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfZHVwcywgJiBfX2ttcF9hZmZpbml0eV9jb21wYWN0LAorICAgICAgJiBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWZmaW5pdHkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hZmZpbml0eSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgfQorICAgIGlmICggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgInZlcmJvc2UiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAibm92ZXJib3NlIik7CisgICAgfQorICAgIGlmICggX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJ3YXJuaW5ncyIpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub3dhcm5pbmdzIik7CisgICAgfQorICAgIGlmICggS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAicmVzcGVjdCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIm5vcmVzcGVjdCIpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoIF9fa21wX2FmZmluaXR5X2dyYW4gKSB7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1kZWZhdWx0LCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2ZpbmU6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9ZmluZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl90aHJlYWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9dGhyZWFkLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2NvcmU6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9Y29yZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PXBhY2thZ2UsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fbm9kZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1ub2RlLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9ncm91cDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1ncm91cCwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9kdXBzICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgImR1cGxpY2F0ZXMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub2R1cGxpY2F0ZXMiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoICEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZGlzYWJsZWQiICk7CisgICAgfQorICAgIGVsc2Ugc3dpdGNoICggX19rbXBfYWZmaW5pdHlfdHlwZSApeworICAgICAgICBjYXNlIGFmZmluaXR5X25vbmU6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJub25lIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkIiwgInBoeXNpY2FsIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9sb2dpY2FsOgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQiLCAibG9naWNhbCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkLCVkIiwgImNvbXBhY3QiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCwlZCIsICJzY2F0dGVyIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCwgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9leHBsaWNpdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzPVslc10sJXMiLCAicHJvY2xpc3QiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCwgImV4cGxpY2l0IiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfYmFsYW5jZWQ6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCwlZCIsICJiYWxhbmNlZCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsIF9fa21wX2FmZmluaXR5X29mZnNldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZGlzYWJsZWQ6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJkaXNhYmxlZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZGVmYXVsdDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImRlZmF1bHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiPHVua25vd24+Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIidcbiIgKTsKK30gLy9fX2ttcF9zdGdfcHJpbnRfYWZmaW5pdHkKKworIyBpZmRlZiBLTVBfR09NUF9DT01QQVQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9nb21wX2NwdV9hZmZpbml0eSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGNvbnN0IGNoYXIgKiBuZXh0ID0gTlVMTDsKKyAgICBjaGFyICogdGVtcF9wcm9jbGlzdDsKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52TWlkZGxlV2FybiwgbmFtZSApOworICAgICAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDEgKTsKKworICAgIGlmICggX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KCBuYW1lLCB2YWx1ZSwgJm5leHQsCisgICAgICAmdGVtcF9wcm9jbGlzdCApKSB7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnXDAnKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gR09NUF9DUFVfQUZGSU5JVFkgPT4gZ3JhbnVsYXJpdHk9ZmluZSxleHBsaWNpdCxwcm9jbGlzdD0uLi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCA9IHRlbXBfcHJvY2xpc3Q7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyBlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCBuYW1lICk7CisgICAgICAgICAgICBpZiAodGVtcF9wcm9jbGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKil0ZW1wX3Byb2NsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2FybmluZyBhbHJlYWR5IGVtaXR0ZWQKKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9nb21wX2NwdV9hZmZpbml0eQorCisjIGVuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgT01QX1BMQUNFUyBwcm9jIGlkIGxpc3QgcGFyc2VyLiBIZXJlIGlzIHRoZSBncmFtbWFyOgorCitwbGFjZV9saXN0IDo9IHBsYWNlCitwbGFjZV9saXN0IDo9IHBsYWNlICwgcGxhY2VfbGlzdAorcGxhY2UgOj0gbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0gOiBzaWduZWQKK3BsYWNlIDo9IHsgc3VicGxhY2VsaXN0IH0KK3BsYWNlIDo9ICEgcGxhY2UgICAgICAgICAgICAgICAgICAvLyAobG93ZXN0IHByaW9yaXR5KQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZQorc3VicGxhY2VfbGlzdCA6PSBzdWJwbGFjZSAsIHN1YnBsYWNlX2xpc3QKK3N1YnBsYWNlIDo9IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0gOiBzaWduZWQKK3NpZ25lZCA6PSBudW0KK3NpZ25lZCA6PSArIHNpZ25lZAorc2lnbmVkIDo9IC0gc2lnbmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludAorX19rbXBfcGFyc2Vfc3VicGxhY2VfbGlzdCggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICoqc2NhbiApCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBjb3VudCwgc3RyaWRlOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgaW4gdGhlIHN0YXJ0aW5nIHByb2MgaWQKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgoKipzY2FuIDwgJzAnKSB8fCAoKipzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0YXJ0ID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiAhPSAnOicpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGNvdW50IHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCgqKnNjYW4gPCAnMCcpIHx8ICgqKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuICE9ICc6JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICcrJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduICo9IC0xOworICAgICAgICAgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnLScKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKCoqc2NhbiA8ICcwJykgfHwgKCoqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgICAqc2NhbiA9IG5leHQ7CisgICAgICAgIHN0cmlkZSAqPSBzaWduOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgYW5kICd9JworICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3BhcnNlX3BsYWNlKCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKiogc2NhbiApCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIC8vCisgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICd7JyAnIScgYW5kIG51bQorICAgIC8vCisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCoqc2NhbiA9PSAneycpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJ3snCisgICAgICAgIGlmICghIF9fa21wX3BhcnNlX3N1YnBsYWNlX2xpc3QodmFyLCBzY2FuKSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gIT0gJ30nKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJ30nCisgICAgfQorICAgIGVsc2UgaWYgKCoqc2NhbiA9PSAnIScpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJyEnCisgICAgICAgIHJldHVybiBfX2ttcF9wYXJzZV9wbGFjZSh2YXIsIHNjYW4pOyAvLychJyBoYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICc6JworICAgIH0KKyAgICBlbHNlIGlmICgoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpKSB7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGludCBwcm9jID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHByb2MgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludAorX19rbXBfcGFyc2VfcGxhY2VfbGlzdCggY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplbnYsIGNoYXIgKipwbGFjZV9saXN0ICkKK3sKKyAgICBjb25zdCBjaGFyICpzY2FuID0gZW52OworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBzY2FuOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGNvdW50LCBzdHJpZGU7CisKKyAgICAgICAgaWYgKCEgX19rbXBfcGFyc2VfcGxhY2UodmFyLCAmc2NhbikpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gIT0gJzonKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgc2NhbisrOyAgICAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBjb3VudCBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCgqc2NhbiA8ICcwJykgfHwgKCpzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiAhPSAnOicpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBzY2FuKys7ICAgICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJysnCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJy0nCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKCpzY2FuIDwgJzAnKSB8fCAoKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHsKKyAgICAgICAgaW50IGxlbiA9IHNjYW4gLSBlbnY7CisgICAgICAgIGNoYXIgKnJldGxpc3QgPSAoY2hhciAqKV9fa21wX2FsbG9jYXRlKChsZW4gKyAxKSAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIEtNUF9NRU1DUFlfUyhyZXRsaXN0LCAobGVuKzEpKnNpemVvZihjaGFyKSwgZW52LCBsZW4gKiBzaXplb2YoY2hhcikpOworICAgICAgICByZXRsaXN0W2xlbl0gPSAnXDAnOworICAgICAgICAqcGxhY2VfbGlzdCA9IHJldGxpc3Q7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3BsYWNlcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGludCBjb3VudDsKKyAgICBjb25zdCBjaGFyICpzY2FuID0gdmFsdWU7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHNjYW47CisgICAgY29uc3QgY2hhciAqa2luZCA9ICJcInRocmVhZHNcIiI7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIE9NUF9QUk9DX0JJTkQgaXMgbm90IHNwZWNpZmllZCBidXQgT01QX1BMQUNFUyBpcywKKyAgICAvLyB0aGVuIGxldCBPTVBfUFJPQ19CSU5EIGRlZmF1bHQgdG8gdHJ1ZS4KKyAgICAvLworICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfdHJ1ZTsKKyAgICB9CisKKyAgICAvL19fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworCisgICAgaWYgKCBfX2ttcF9tYXRjaF9zdHIoICJ0aHJlYWRzIiwgc2NhbiwgJm5leHQgKSApIHsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAga2luZCA9ICJcInRocmVhZHNcIiI7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9tYXRjaF9zdHIoICJjb3JlcyIsIHNjYW4sICZuZXh0ICkgKSB7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICBraW5kID0gIlwiY29yZXNcIiI7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9tYXRjaF9zdHIoICJzb2NrZXRzIiwgc2NhbiwgJm5leHQgKSApIHsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOworICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgIGtpbmQgPSAiXCJzb2NrZXRzXCIiOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMICkgeworICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgKTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX3BhcnNlX3BsYWNlX2xpc3QoIG5hbWUsIHZhbHVlLCAmX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgKSApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9leHBsaWNpdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX3RydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfdHJ1ZTsKKyAgICB9CisKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICggKnNjYW4gPT0gJ1wwJyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gUGFyc2Ugb3B0aW9uIGNvdW50IHBhcmFtZXRlciBpbiBwYXJlbnRoZXNlcworICAgIC8vCisgICAgaWYgKCAqc2NhbiAhPSAnKCcgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCBuYW1lLCBraW5kICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnKCcKKworICAgIFNLSVBfV1Moc2Nhbik7CisgICAgbmV4dCA9IHNjYW47CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgIHNjYW4gPSBuZXh0OworCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoICpzY2FuICE9ICcpJyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIG5hbWUsIGtpbmQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzY2FuKys7ICAgICAvLyBza2lwICcpJworCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoICpzY2FuICE9ICdcMCcgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCBzY2FuICk7CisgICAgfQorICAgIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSBjb3VudDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9wbGFjZXMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLAorICB2b2lkICogZGF0YSApCit7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgfQorICAgIGlmICggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPT0gMCApCisgICAgICB8fCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkKKyAgICAgIHx8ICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9mYWxzZSApICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9leHBsaWNpdCApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSclcydcbiIsIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2NvbXBhY3QgKSB7CisgICAgICAgIGludCBudW07CisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID4gMCApIHsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA+IDAgKSB7CisgICAgICAgICAgICBudW0gPSBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbnVtID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQgKSB7CisgICAgICAgICAgICBpZiAoIG51bSA+IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSd0aHJlYWRzKCVkKSdcbiIsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSd0aHJlYWRzJ1xuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsKKyAgICAgICAgICAgIGlmICggbnVtID4gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J2NvcmVzKCVkKScgXG4iLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nY29yZXMnXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlICkgeworICAgICAgICAgICAgaWYgKCBudW0gPiAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nc29ja2V0cyglZCknXG4iLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nc29ja2V0cydcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorfQorCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyMgaWYgKCEgT01QXzQwX0VOQUJMRUQpCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgaW50IGVuYWJsZWQ7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIGluIE9NUCAzLjEsIE9NUF9QUk9DX0JJTkQgaXMgc3RyaWN0bHkgYSBib29sZWFuCisgICAgLy8KKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgZW5hYmxlZCApOworICAgIGlmICggZW5hYmxlZCApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBPTVBfUFJPQ19CSU5EID0+IGdyYW51bGFyaXR5PWZpbmUsc2NhdHRlciBvbiBNSUMKKyAgICAgICAgICAgIC8vIE9NUF9QUk9DX0JJTkQgPT4gZ3JhbnVsYXJpdHk9Y29yZSxzY2F0dGVyIGVsc2V3aGVyZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9zY2F0dGVyOworIyAgaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgICAgICAgICBpZiggX19rbXBfbWljX3R5cGUgIT0gbm9uX21pYyApCisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgIGVsc2UKKyMgIGVuZGlmCisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgIH0KK30gLy8gX19rbXBfcGFyc2VfcHJvY19iaW5kCisKKyMgZW5kaWYgLyogaWYgKCEgT01QXzQwX0VOQUJMRUQpICovCisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV90b3BvbG9neV9tZXRob2QoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsCisgIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiYWxsIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGw7CisgICAgfQorIyBpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggIngyYXBpYyBpZCIsIDksIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggIngyYXBpY19pZCIsIDksIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggIngyYXBpYy1pZCIsIDksIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggIngyYXBpY2lkIiwgOCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgbGVhZiAxMSIsIDEzLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF9sZWFmXzExIiwgMTMsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLWxlYWYtMTEiLCAxMywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgbGVhZjExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkX2xlYWYxMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC1sZWFmMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmIDExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZl8xMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYtMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmMTEiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgMTEiLCA4LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF8xMSIsIDgsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLTExIiwgOCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQxMSIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYgMTEiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmXzExIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZi0xMSIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYxMSIsIDYsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiYXBpYyBpZCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImFwaWNfaWQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJhcGljLWlkIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiYXBpY2lkIiwgNiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgbGVhZiA0IiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkX2xlYWZfNCIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC1sZWFmLTQiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQgbGVhZjQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfbGVhZjQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtbGVhZjQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmIDQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmXzQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmLTQiLCAxMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmNCIsIDEwLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCA0IiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfNCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLTQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZDQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmIDQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmXzQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmLTQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmNCIsIDUsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FwaWNpZDsKKyAgICB9CisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiL3Byb2MvY3B1aW5mbyIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWluZm8iLCA1LCB2YWx1ZSApKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm87CisgICAgfQorIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZ3JvdXAiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDsKKyAgICB9CisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJmbGF0IiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZmxhdDsKKyAgICB9CisjIGlmIEtNUF9VU0VfSFdMT0MKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiaHdsb2MiLCAxLCB2YWx1ZSkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2h3bG9jOworICAgIH0KKyMgZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV90b3BvbG9neV9tZXRob2QKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF90b3BvbG9neV9tZXRob2QoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLAorICB2b2lkICogZGF0YSApIHsKKyMgaWYgS01QX0RFQlVHCisgICAgY2hhciBjb25zdCAqIHZhbHVlID0gTlVMTDsKKworICAgIHN3aXRjaCAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgKSB7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OgorICAgICAgICB2YWx1ZSA9ICJkZWZhdWx0IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDoKKyAgICAgICAgdmFsdWUgPSAiYWxsIjsKKyAgICAgICAgYnJlYWs7CisKKyMgIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkOgorICAgICAgICB2YWx1ZSA9ICJ4MkFQSUMgaWQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkOgorICAgICAgICB2YWx1ZSA9ICJBUElDIGlkIjsKKyAgICAgICAgYnJlYWs7CisjICBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm86CisgICAgICAgIHZhbHVlID0gImNwdWluZm8iOworICAgICAgICBicmVhazsKKworIyAgaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDoKKyAgICAgICAgdmFsdWUgPSAiZ3JvdXAiOworICAgICAgICBicmVhazsKKyMgIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9mbGF0OgorICAgICAgICB2YWx1ZSA9ICJmbGF0IjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorIyBlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X3RvcG9sb2d5X21ldGhvZAorCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLworLy8gT01QX1BST0NfQklORCAvIGJpbmQtdmFyIGlzIGZ1bmN0aW9uYWwgb24gYWxsIDQuMCBidWlsZHMsIGluY2x1ZGluZyBPUyBYKgorLy8gT01QX1BMQUNFUyAvIHBsYWNlLXBhcnRpdGlvbi12YXIgaXMgbm90LgorLy8KK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKSBkYXRhOworICAgIGludCByYzsKKworICAgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyggbmFtZSwgdmFsdWUsIHJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIGluIE9NUCA0LjAgT01QX1BST0NfQklORCBpcyBhIHZlY3RvciBvZiBwcm9jX2JpbmQgdHlwZXMuCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzICE9IE5VTEwpCisgICAgICAmJiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA+IDAgKSApOworCisgICAgY29uc3QgY2hhciAqYnVmID0gdmFsdWU7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKyAgICBpbnQgbnVtOworICAgIFNLSVBfV1MoIGJ1ZiApOworICAgIGlmICggKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpICkgeworICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgIEtNUF9BU1NFUlQoIG51bSA+PSAwICk7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbnVtID0gLTE7CisgICAgfQorCisgICAgbmV4dCA9IGJ1ZjsKKyAgICBpZiAoIF9fa21wX21hdGNoX3N0ciggImRpc2FibGVkIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGlzYWJsZWQ7CisjIGVuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICggKCBudW0gPT0gKGludClwcm9jX2JpbmRfZmFsc2UgKQorICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAiZmFsc2UiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworIyBlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX3RydWUgKQorICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAidHJ1ZSIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF90cnVlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGVudiB2YXIgc3RyaW5nCisgICAgICAgIC8vCisgICAgICAgIGNvbnN0IGNoYXIgKnNjYW47CisgICAgICAgIGludCBuZWxlbSA9IDE7CisgICAgICAgIGZvciAoIHNjYW4gPSBidWY7ICpzY2FuICE9ICdcMCc7IHNjYW4rKyApIHsKKyAgICAgICAgICAgIGlmICggKnNjYW4gPT0gJywnICkgeworICAgICAgICAgICAgICAgIG5lbGVtKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBDcmVhdGUgLyBleHBhbmQgdGhlIG5lc3RlZCBwcm9jX2JpbmQgYXJyYXkgYXMgbmVlZGVkCisgICAgICAgIC8vCisgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5zaXplIDwgbmVsZW0gKSB7CisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPSAoa21wX3Byb2NfYmluZF90ICopCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX1JFQUxMT0MoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcywKKyAgICAgICAgICAgICAgICBzaXplb2Yoa21wX3Byb2NfYmluZF90KSAqIG5lbGVtICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuc2l6ZSA9IG5lbGVtOworICAgICAgICB9CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IG5lbGVtOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNhdmUgdmFsdWVzIGluIHRoZSBuZXN0ZWQgcHJvY19iaW5kIGFycmF5CisgICAgICAgIC8vCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgZW51bSBrbXBfcHJvY19iaW5kX3QgYmluZDsKKworICAgICAgICAgICAgaWYgKCAoIG51bSA9PSAoaW50KXByb2NfYmluZF9tYXN0ZXIgKQorICAgICAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJtYXN0ZXIiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgICAgICAgICBiaW5kID0gcHJvY19iaW5kX21hc3RlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoIG51bSA9PSAoaW50KXByb2NfYmluZF9jbG9zZSApCisgICAgICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0ciggImNsb3NlIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgICAgICAgICAgICAgYmluZCA9IHByb2NfYmluZF9jbG9zZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoIG51bSA9PSAoaW50KXByb2NfYmluZF9zcHJlYWQgKQorICAgICAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJzcHJlYWQiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgICAgICAgICBiaW5kID0gcHJvY19iaW5kX3NwcmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgICAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbaSsrXSA9IGJpbmQ7CisgICAgICAgICAgICBpZiAoIGkgPj0gbmVsZW0gKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAqYnVmID09ICcsJyApOworICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgbmV4dCB2YWx1ZSBpZiBpdCB3YXMgc3BlY2lmaWVkIGFzIGFuIGludGVnZXIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICgqYnVmID49ICcwJykgJiYgKCpidWYgPD0gJzknKSApIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIG51bSA+PSAwICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG51bSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgIH0KKyAgICBpZiAoICpidWYgIT0gJ1wwJyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlRXh0cmFDaGFyc1dhcm4sIG5hbWUsIGJ1ZiApOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3Byb2NfYmluZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsCisgIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpbnQgbmVsZW0gPSBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQ7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXMiLCBuYW1lICk7CisgICAgfQorICAgIGlmICggbmVsZW0gPT0gMCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9JyIsIG5hbWUgKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBuZWxlbTsgaSsrICkgeworICAgICAgICAgICAgc3dpdGNoICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzW2ldICkgeworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX2ZhbHNlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgImZhbHNlIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfdHJ1ZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJ0cnVlIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfbWFzdGVyOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIm1hc3RlciIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX2Nsb3NlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgImNsb3NlIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfc3ByZWFkOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgInNwcmVhZCIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgcHJvY19iaW5kX2ludGVsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgImludGVsIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICJkZWZhdWx0IiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBpIDwgbmVsZW0gLSAxICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiwiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIiApOworICAgIH0KK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX0RZTkFNSUMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9vbXBfZHluYW1pYyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiAoX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfb21wX2R5bmFtaWMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfZHluYW1pYygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X29tcF9keW5hbWljCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfa21wX2R5bmFtaWNfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZQYXJhbGxlbFdhcm4sIG5hbWUgKTsKKyAgICAgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImxvYWQgYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxvYWRfYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxvYWQtYmFsYW5jZSIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxvYWRiYWxhbmNlIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiYmFsYW5jZSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY19sb2FkX2JhbGFuY2U7CisgICAgfQorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAidGhyZWFkIGxpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGhyZWFkX2xpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGhyZWFkLWxpbWl0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGhyZWFkbGltaXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsaW1pdCIsIDIsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQ7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJyYW5kb20iLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfcmFuZG9tOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9IC8vX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9rbXBfZHluYW1pY19tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKQoreworI2lmIEtNUF9ERUJVRworICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlczogJXMgXG4iLCBuYW1lLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyMgaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2xvYWRfYmFsYW5jZSApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAibG9hZCBiYWxhbmNlIiApOworICAgIH0KKyMgZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX3RocmVhZF9saW1pdCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAidGhyZWFkIGxpbWl0IiApOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19yYW5kb20gKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInJhbmRvbSIgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9BU1NFUlQoMCk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfa21wX2R5bmFtaWNfbW9kZQorCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9MT0FEX0JBTEFOQ0VfSU5URVJWQUwKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9sZF9iYWxhbmNlX2ludGVydmFsKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgZG91YmxlIGludGVydmFsID0gX19rbXBfY29udmVydF90b19kb3VibGUoIHZhbHVlICk7CisgICAgaWYgKCBpbnRlcnZhbCA+PSAwICkgeworICAgICAgICBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9sZF9iYWxhbmNlX2ludGVydmFsKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisjaWYgS01QX0RFQlVHCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JTguNmZcbiIsIG5hbWUsIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCApOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbG9hZF9iYWxhbmNlX2ludGVydmFsCisKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JTklUX0FUX0ZPUksKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pbml0X2F0X2ZvcmsoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayApOworICAgIGlmICggX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmsgKSB7CisgICAgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZCA9IFRSVUU7CisgICAgfTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2luaXRfYXRfZm9yaworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2luaXRfYXRfZm9yaygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW5pdF9hdF9mb3JrCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TQ0hFRFVMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NjaGVkdWxlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IEtNUF9TVFJMRU4oIHZhbHVlICk7CisgICAgICAgIGlmICggbGVuZ3RoID4gSU5UX01BWCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBMb25nVmFsdWUsIG5hbWUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKnNlbWljb2xvbjsKKyAgICAgICAgICAgIGlmKCB2YWx1ZVsgbGVuZ3RoIC0gMSBdID09ICciJyB8fCB2YWx1ZVsgbGVuZ3RoIC0xIF0gPT0gJ1wnJyApCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFVuYmFsYW5jZWRRdW90ZXMsIG5hbWUgKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjaGFyIHNlbnRpbmVsOworCisgICAgICAgICAgICAgICAgc2VtaWNvbG9uID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJzsnICk7CisgICAgICAgICAgICAgICAgaWYoICp2YWx1ZSAmJiBzZW1pY29sb24gIT0gdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbW1hID0gKGNoYXIgKikgc3RyY2hyKCB2YWx1ZSwgJywnICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjb21tYSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrY29tbWE7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbCA9ICcsJzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbCA9ICc7JzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAic3RhdGljIiwgdmFsdWUsIHNlbnRpbmVsICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImdyZWVkeSIsIGNvbW1hLCAnOycgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJiYWxhbmNlZCIsIGNvbW1hLCAnOycgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImd1aWRlZCIsIHZhbHVlLCBzZW50aW5lbCApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiaXRlcmF0aXZlIiwgY29tbWEsICc7JyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d1aWRlZCA9IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFuYWx5dGljYWwiLCBjb21tYSwgJzsnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5hbHl0aWNhbCBub3QgYWxsb3dlZCBmb3IgdG9vIG1hbnkgdGhyZWFkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d1aWRlZCA9IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggSW52YWxpZENsYXVzZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEVtcHR5Q2xhdXNlLCBuYW1lICk7CisgICAgICAgICAgICB9IHdoaWxlICggKHZhbHVlID0gc2VtaWNvbG9uID8gc2VtaWNvbG9uICsgMSA6IE5VTEwpICk7CisgICAgICAgIH0KKyAgICB9OyAvLyBpZgorCit9IC8vIF9fa21wX3N0Z19wYXJzZV9fc2NoZWR1bGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zY2hlZHVsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgfQorICAgIGlmICggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAic3RhdGljLGdyZWVkeSIpOworICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCAoIGJ1ZmZlciwgIiVzIiwgInN0YXRpYyxiYWxhbmNlZCIpOworICAgIH0KKyAgICBpZiAoIF9fa21wX2d1aWRlZCA9PSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOyVzJ1xuIiwgImd1aWRlZCxpdGVyYXRpdmUiKTsKKyAgICB9IGVsc2UgaWYgKCBfX2ttcF9ndWlkZWQgPT0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI7JXMnXG4iLCAiZ3VpZGVkLGFuYWx5dGljYWwiKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zY2hlZHVsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPTVBfU0NIRURVTEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9vbXBfc2NoZWR1bGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBzaXplX3QgICAgICBsZW5ndGg7CisgICAgaWYoIHZhbHVlICkgeworICAgICAgICBsZW5ndGggPSBLTVBfU1RSTEVOKCB2YWx1ZSApOworICAgICAgICBpZiggbGVuZ3RoICkgeworICAgICAgICAgICAgY2hhciAqY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIGlmKCB2YWx1ZVsgbGVuZ3RoIC0gMSBdID09ICciJyB8fCB2YWx1ZVsgbGVuZ3RoIC0xIF0gPT0gJ1wnJykKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggVW5iYWxhbmNlZFF1b3RlcywgbmFtZSApOworICAgICAgICAgICAgLyogZ2V0IHRoZSBzcGVjaWZpZWQgc2NoZWR1bGluZyBzdHlsZSAqLworICAgICAgICAgICAgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoImR5bmFtaWMiLCB2YWx1ZSwgJywnKSkgICAgICAgICAgLyogRFlOQU1JQyAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJndWlkZWQiLCB2YWx1ZSwgJywnKSkgICAgICAvKiBHVUlERUQgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQ7CisvLyBBQzogVE9ETzogYWRkIEFVVE8gc2NoZWR1bGUsIGFuZCBwcHJvYmFibHkgcmVtb3ZlIFRSQVBFWk9JREFMIChPTVAgMy4wIGRvZXMgbm90IGFsbG93IGl0KQorICAgICAgICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiYXV0byIsIHZhbHVlLCAnLCcpKSB7ICAgICAgIC8qIEFVVE8gKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfYXV0bzsKKyAgICAgICAgICAgICAgICBpZiggY29tbWEgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIElnbm9yZUNodW5rLCBuYW1lLCBjb21tYSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBjb21tYSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgidHJhcGV6b2lkYWwiLCB2YWx1ZSwgJywnKSkgLyogVFJBUEVaT0lEQUwgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfdHJhcGV6b2lkYWw7CisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJzdGF0aWMiLCB2YWx1ZSwgJywnKSkgICAgICAvKiBTVEFUSUMgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljOworI2lmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorICAgICAgICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgic3RhdGljX3N0ZWFsIiwgdmFsdWUsICcsJykpCisgICAgICAgICAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX3N0YXRpY19zdGVhbDsKKyNlbmRpZgorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IE5VTEw7IC8qIHNraXAgcHJvY2Vzc2luZyBvZiBjb21tYSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHZhbHVlICYmIGNvbW1hICkgeworICAgICAgICAgICAgICAgIF9fa21wX2Vudl9jaHVuayA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICBpZihfX2ttcF9zY2hlZCA9PSBrbXBfc2NoX3N0YXRpYykKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOworICAgICAgICAgICAgICAgICsrY29tbWE7CisgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSBfX2ttcF9zdHJfdG9faW50KCBjb21tYSwgMCApOworICAgICAgICAgICAgICAgIGlmICggX19rbXBfY2h1bmsgPCAxICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBJbnZhbGlkQ2h1bmssIG5hbWUsIGNvbW1hICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgX19rbXBfY2h1bmsgKTsKKy8vIEFDOiBuZXh0IGJsb2NrIGNvbW1lbnRlZCBvdXQgdW50aWwgS01QX0RFRkFVTFRfQ0hVTksgIT0gS01QX01JTl9DSFVOSyAodG8gaW1wcm92ZSBjb2RlIGNvdmVyYWdlIDopCisvLyAgICAgVGhlIGRlZmF1bHQgY2h1bmsgc2l6ZSBpcyAxIGFjY29yZGluZyB0byBzdGFuZGFyZCwgdGh1cyBtYWtpbmcgS01QX01JTl9DSFVOSyBub3QgMSB3ZSB3b3VsZCBpbnRyb2R1Y2UgbWVzczoKKy8vICAgICB3cm9uZyBjaHVuayBiZWNvbWVzIDEsIGJ1dCBpdCB3aWxsIGJlIGltcG9zc2libGUgdG8gZXhwbGljaXRlbHkgc2V0IDEsIGJlY2F1c2UgaXQgYmVjb21lcyBLTVBfTUlOX0NIVU5LLi4uCisvLyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9jaHVuayA8IEtNUF9NSU5fQ0hVTksgKSB7CisvLyAgICAgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSBLTVBfTUlOX0NIVU5LOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2NodW5rID4gS01QX01BWF9DSFVOSyApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfY2h1bmsgPSBLTVBfTUFYX0NIVU5LOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBMYXJnZUNodW5rLCBuYW1lLCBjb21tYSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIG5hbWUsIF9fa21wX2NodW5rICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfZW52X2NodW5rID0gRkFMU0U7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgS01QX1dBUk5JTkcoIEVtcHR5U3RyaW5nLCBuYW1lICk7CisgICAgfQorICAgIEtfRElBRygxLCAoIl9fa21wX3N0YXRpYyA9PSAlZFxuIiwgX19rbXBfc3RhdGljKSkKKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9ndWlkZWQgPT0gJWRcbiIsIF9fa21wX2d1aWRlZCkpCisgICAgS19ESUFHKDEsICgiX19rbXBfc2NoZWQgPT0gJWRcbiIsIF9fa21wX3NjaGVkKSkKKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9jaHVuayA9PSAlZFxuIiwgX19rbXBfY2h1bmspKQorfSAvLyBfX2ttcF9zdGdfcGFyc2Vfb21wX3NjaGVkdWxlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfb21wX3NjaGVkdWxlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9jaHVuayApIHsKKyAgICAgICAgc3dpdGNoICggX19rbXBfc2NoZWQgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgImR5bmFtaWMiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAiZ3VpZGVkIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgInRyYXBlem9pZGFsIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJzdGF0aWMiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgInN0YXRpY19zdGVhbCIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9hdXRvOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgImF1dG8iLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKCBfX2ttcF9zY2hlZCApIHsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAiZHluYW1pYyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgImd1aWRlZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgInRyYXBlem9pZGFsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgInN0YXRpYyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJzdGF0aWNfc3RlYWwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9hdXRvOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgImF1dG8iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X29tcF9zY2hlZHVsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQVRPTUlDX01PREUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hdG9taWNfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLy8gTW9kZXM6IDAgLS0gZG8gbm90IGNoYW5nZSBkZWZhdWx0OyAxIC0tIEludGVsIHBlcmYgbW9kZSwgMiAtLSBHT01QIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICBpbnQgbW9kZSA9IDA7CisgICAgaW50IG1heCAgPSAxOworICAgICNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgbWF4ID0gMjsKKyAgICAjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIG1heCwgJiBtb2RlICk7CisgICAgLy8gVE9ETzsgcGFyc2VfaW50IGlzIG5vdCB2ZXJ5IHN1aXRhYmxlIGZvciB0aGlzIGNhc2UuIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgaXQgaXMgYmV0dGVyIHRvIHVzZQorICAgIC8vIDAgcmF0aGVyIHRoYXQgbWF4IHZhbHVlLgorICAgIGlmICggbW9kZSA+IDAgKSB7CisgICAgICAgIF9fa21wX2F0b21pY19tb2RlID0gbW9kZTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYXRvbWljX21vZGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hdG9taWNfbW9kZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfYXRvbWljX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2F0b21pY19tb2RlCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0NPTlNJU1RFTkNZX0NIRUNLCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfY29uc2lzdGVuY3lfY2hlY2soIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJhbGwiLCB2YWx1ZSwgMCApICkgeworICAgICAgICAvLyBOb3RlLCB0aGlzIHdpbGwgbm90IHdvcmsgZnJvbSBrbXBfc2V0X2RlZmF1bHRzIGJlY2F1c2UgdGhfY29ucyBzdGFjayB3YXMgbm90IGFsbG9jYXRlZAorICAgICAgICAvLyBmb3IgZXhpc3RlZCB0aHJlYWQocykgdGh1cyB0aGUgZmlyc3QgX19rbXBfcHVzaF88Y29uc3RydWN0PiB3aWxsIGJyZWFrIHdpdGggYXNzZXJ0aW9uLgorICAgICAgICAvLyBUT0RPOiBhbGxvY2F0ZSB0aF9jb25zIGlmIGNhbGxlZCBmcm9tIGttcF9zZXRfZGVmYXVsdHMuCisgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayA9IFRSVUU7CisgICAgfSBlbHNlIGlmICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJub25lIiwgdmFsdWUsIDAgKSApIHsKKyAgICAgICAgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfY29uc2lzdGVuY3lfY2hlY2sKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9jb25zaXN0ZW5jeV9jaGVjaygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworI2lmIEtNUF9ERUJVRworICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICB2YWx1ZSA9ICJhbGwiOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlID0gIm5vbmUiOworICAgIH0KKworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCB2YWx1ZSApOworICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X2NvbnNpc3RlbmN5X2NoZWNrCisKKworI2lmIFVTRV9JVFRfQlVJTEQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JVFRfUFJFUEFSRV9ERUxBWQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgVVNFX0lUVF9OT1RJRlkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pdHRfcHJlcGFyZV9kZWxheSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIC8vIEV4cGVyaW1lbnRhbCBjb2RlOiBLTVBfSVRUX1BSRVBBUkVfREVMQVkgc3BlY2lmaWVzIG51bWJlcnQgb2YgbG9vcCBpdGVyYXRpb25zLgorICAgIGludCBkZWxheSA9IDA7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVgsICYgZGVsYXkgKTsKKyAgICBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSA9IGRlbGF5OworfSAvLyBfX2ttcF9zdHJfcGFyc2VfaXR0X3ByZXBhcmVfZGVsYXkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9pdHRfcHJlcGFyZV9kZWxheSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF91aW50NjQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgKTsKKworfSAvLyBfX2ttcF9zdHJfcHJpbnRfaXR0X3ByZXBhcmVfZGVsYXkKKworI2VuZGlmIC8vIFVTRV9JVFRfTk9USUZZCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTUFMTE9DX1BPT0xfSU5DUgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX21hbGxvY19wb29sX2luY3IoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgS01QX01JTl9NQUxMT0NfUE9PTF9JTkNSLAorICAgICAgICAgICAgS01QX01BWF9NQUxMT0NfUE9PTF9JTkNSLAorICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICYgX19rbXBfbWFsbG9jX3Bvb2xfaW5jciwKKyAgICAgICAgICAgIDEKKyAgICAgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX21hbGxvY19wb29sX2luY3IKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9tYWxsb2NfcG9vbF9pbmNyKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgX19rbXBfc3RnX3ByaW50X3NpemUoIGJ1ZmZlciwgbmFtZSwgX19rbXBfbWFsbG9jX3Bvb2xfaW5jciApOworCit9IC8vIF9rbXBfc3RnX3ByaW50X21hbGxvY19wb29sX2luY3IKKworCisjaWZkZWYgS01QX0RFQlVHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QQVJfUkFOR0UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2VfZW52KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZSgKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICYgX19rbXBfcGFyX3JhbmdlLAorICAgICAgICAgICAgX19rbXBfcGFyX3JhbmdlX3JvdXRpbmUsCisgICAgICAgICAgICBfX2ttcF9wYXJfcmFuZ2VfZmlsZW5hbWUsCisgICAgICAgICAgICAmIF9fa21wX3Bhcl9yYW5nZV9sYiwKKyAgICAgICAgICAgICYgX19rbXBfcGFyX3JhbmdlX3ViCisgICAgICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2VfZW52CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfcGFyX3JhbmdlX2Vudigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmIChfX2ttcF9wYXJfcmFuZ2UgIT0gMCkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHBhcl9yYW5nZV90b19wcmludCApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3Bhcl9yYW5nZV9lbnYKKworI2lmIEtNUF9VU0VfTU9OSVRPUgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1lJRUxEX0NZQ0xFLCBLTVBfWUlFTERfT04sIEtNUF9ZSUVMRF9PRkYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV95aWVsZF9jeWNsZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaW50IGZsYWcgPSBfX2ttcF95aWVsZF9jeWNsZTsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgZmxhZyApOworICAgIF9fa21wX3lpZWxkX2N5Y2xlID0gZmxhZzsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3lpZWxkX2N5Y2xlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfeWllbGRfY3ljbGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF95aWVsZF9jeWNsZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfeWllbGRfY3ljbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV95aWVsZF9vbiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAyLCBJTlRfTUFYLCAmIF9fa21wX3lpZWxkX29uX2NvdW50ICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV95aWVsZF9vbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3lpZWxkX29uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF95aWVsZF9vbl9jb3VudCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV95aWVsZF9vZmYoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMiwgSU5UX01BWCwgJiBfX2ttcF95aWVsZF9vZmZfY291bnQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3lpZWxkX29mZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3lpZWxkX29mZigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfeWllbGRfb2ZmX2NvdW50ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF95aWVsZF9vZmYKKyNlbmRpZiAvLyBLTVBfVVNFX01PTklUT1IKKworI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JTklUX1dBSVQsIEtNUF9ORVhUX1dBSVQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pbml0X3dhaXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgaW50IHdhaXQ7CisgICBLTVBfQVNTRVJUKCAoIF9fa21wX2luaXRfd2FpdCAmIDEgKSA9PSAwICk7CisgICB3YWl0ID0gX19rbXBfaW5pdF93YWl0IC8gMjsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgS01QX01JTl9JTklUX1dBSVQsIEtNUF9NQVhfSU5JVF9XQUlULCAmIHdhaXQgKTsKKyAgICBfX2ttcF9pbml0X3dhaXQgPSB3YWl0ICogMjsKKyAgICBLTVBfQVNTRVJUKCAoIF9fa21wX2luaXRfd2FpdCAmIDEgKSA9PSAwICk7CisgICAgX19rbXBfeWllbGRfaW5pdCA9IF9fa21wX2luaXRfd2FpdDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2luaXRfd2FpdAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2luaXRfd2FpdCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfaW5pdF93YWl0ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9pbml0X3dhaXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9uZXh0X3dhaXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGludCB3YWl0OworICAgIEtNUF9BU1NFUlQoICggX19rbXBfbmV4dF93YWl0ICYgMSApID09IDAgKTsKKyAgICB3YWl0ID0gX19rbXBfbmV4dF93YWl0IC8gMjsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgS01QX01JTl9ORVhUX1dBSVQsIEtNUF9NQVhfTkVYVF9XQUlULCAmIHdhaXQgKTsKKyAgICBfX2ttcF9uZXh0X3dhaXQgPSB3YWl0ICogMjsKKyAgICBLTVBfQVNTRVJUKCAoIF9fa21wX25leHRfd2FpdCAmIDEgKSA9PSAwICk7CisgICAgX19rbXBfeWllbGRfbmV4dCA9IF9fa21wX25leHRfd2FpdDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX25leHRfd2FpdAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X25leHRfd2FpdCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfbmV4dF93YWl0ICk7Cit9IC8vX19rbXBfc3RnX3ByaW50X25leHRfd2FpdAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9HVElEX01PREUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9ndGlkX21vZGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vCisgICAgLy8gTW9kZXM6CisgICAgLy8gICAwIC0tIGRvIG5vdCBjaGFuZ2UgZGVmYXVsdAorICAgIC8vICAgMSAtLSBzcCBzZWFyY2gKKyAgICAvLyAgIDIgLS0gdXNlICJrZXllZCIgVExTIHZhciwgaS5lLgorICAgIC8vICAgICAgICBwdGhyZWFkX2dldHNwZWNpZmljKExpbnV4KiBPUy9PUyBYKikgb3IgVGxzR2V0VmFsdWUoV2luZG93cyogT1MpCisgICAgLy8gICAzIC0tIF9fZGVjbHNwZWModGhyZWFkKSBUTFMgdmFyIGluIHRkYXRhIHNlY3Rpb24KKyAgICAvLworICAgIGludCBtb2RlID0gMDsKKyAgICBpbnQgbWF4ICA9IDI7CisgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgIG1heCA9IDM7CisgICAgI2VuZGlmIC8qIEtNUF9UREFUQV9HVElEICovCisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIG1heCwgJiBtb2RlICk7CisgICAgLy8gVE9ETzsgcGFyc2VfaW50IGlzIG5vdCB2ZXJ5IHN1aXRhYmxlIGZvciB0aGlzIGNhc2UuIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgaXQgaXMgYmV0dGVyIHRvIHVzZQorICAgIC8vIDAgcmF0aGVyIHRoYXQgbWF4IHZhbHVlLgorICAgIGlmICggbW9kZSA9PSAwICkgeworICAgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gVFJVRTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2d0aWRfbW9kZSA9IG1vZGU7CisgICAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBGQUxTRTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdHJfcGFyc2VfZ3RpZF9tb2RlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZ3RpZF9tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIDAgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZ3RpZF9tb2RlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfZ3RpZF9tb2RlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9OVU1fTE9DS1NfSU5fQkxPQ0sKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9sb2NrX2Jsb2NrKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgS01QX0lOVF9NQVgsICYgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrICk7Cit9IC8vIF9fa21wX3N0cl9wYXJzZV9sb2NrX2Jsb2NrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbG9ja19ibG9jaygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9sb2NrX2Jsb2NrCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9MT0NLX0tJTkQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisjIGRlZmluZSBLTVBfU1RPUkVfTE9DS19TRVEoYSkgKF9fa21wX3VzZXJfbG9ja19zZXEgPSBsb2Nrc2VxXyMjYSkKKyNlbHNlCisjIGRlZmluZSBLTVBfU1RPUkVfTE9DS19TRVEoYSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2xvY2tfa2luZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZMb2NrV2FybiwgbmFtZSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0YXMiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0IGFuZCBzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0X2FuZF9zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0LWFuZC1zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0IGFuZHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RfYW5kc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdC1hbmRzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0YW5kIHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RhbmRfc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdGFuZC1zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0YW5kc2V0IiwgMiwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa190YXM7CisgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUSh0YXMpOworICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImZ1dGV4IiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgaWYgKCBfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZSgpICkgeworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19mdXRleDsKKyAgICAgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShmdXRleCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggRnV0ZXhOb3RTdXBwb3J0ZWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAidGlja2V0IiwgMiwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa190aWNrZXQ7CisgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUSh0aWNrZXQpOworICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAicXVldWluZyIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInF1ZXVlIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19xdWV1aW5nOworICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEocXVldWluZyk7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJkcmRwYSB0aWNrZXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJkcmRwYV90aWNrZXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJkcmRwYS10aWNrZXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJkcmRwYXRpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kcmRwYTsKKyAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKGRyZHBhKTsKKyAgICB9CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJhZGFwdGl2ZSIsIDEsIHZhbHVlICkgICkgeworICAgICAgICBpZiggX19rbXBfY3B1aW5mby5ydG0gKSB7IC8vID8/PyBJcyBjcHVpbmZvIGF2YWlsYWJsZSBoZXJlPworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19hZGFwdGl2ZTsKKyAgICAgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShhZGFwdGl2ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWRhcHRpdmVOb3RTdXBwb3J0ZWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3F1ZXVpbmc7CisgICAgICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEocXVldWluZyk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIEtNUF9VU0VfVFNYCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCgicnRtIiwgMSwgdmFsdWUpICkgeworICAgICAgICBpZiAoIF9fa21wX2NwdWluZm8ucnRtICkgeworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19ydG07CisgICAgICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEocnRtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZGFwdGl2ZU5vdFN1cHBvcnRlZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICAgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShxdWV1aW5nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCJobGUiLCAxLCB2YWx1ZSkgKSB7CisgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfaGxlOworICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEoaGxlKTsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbG9ja19raW5kKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOworCisgICAgc3dpdGNoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgKSB7CisgICAgICAgIGNhc2UgbGtfZGVmYXVsdDoKKyAgICAgICAgdmFsdWUgPSAiZGVmYXVsdCI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfdGFzOgorICAgICAgICB2YWx1ZSA9ICJ0YXMiOworICAgICAgICBicmVhazsKKworI2lmIEtNUF9VU0VfRlVURVgKKyAgICAgICAgY2FzZSBsa19mdXRleDoKKyAgICAgICAgdmFsdWUgPSAiZnV0ZXgiOworICAgICAgICBicmVhazsKKyNlbmRpZgorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgS01QX1VTRV9UU1gKKyAgICAgICAgY2FzZSBsa19ydG06CisgICAgICAgIHZhbHVlID0gInJ0bSI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfaGxlOgorICAgICAgICB2YWx1ZSA9ICJobGUiOworICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICAgIGNhc2UgbGtfdGlja2V0OgorICAgICAgICB2YWx1ZSA9ICJ0aWNrZXQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX3F1ZXVpbmc6CisgICAgICAgIHZhbHVlID0gInF1ZXVpbmciOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX2RyZHBhOgorICAgICAgICB2YWx1ZSA9ICJkcmRwYSI7CisgICAgICAgIGJyZWFrOworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICAgICAgY2FzZSBsa19hZGFwdGl2ZToKKyAgICAgICAgdmFsdWUgPSAiYWRhcHRpdmUiOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KKworICAgIGlmICggdmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NQSU5fQkFDS09GRl9QQVJBTVMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gS01QX1NQSU5fQkFDS09GRl9QQVJBTVM9bWF4X2JhY2tvZmZbLG1pbl90aWNrXSAobWF4IGJhY2tvZmYgc2l6ZSwgbWluIHRpY2sgZm9yIG1hY2hpbmUgcGF1c2UpCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NwaW5fYmFja29mZl9wYXJhbXMoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIHZvaWQqIGRhdGEpCit7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHZhbHVlOworCisgICAgaW50IHRvdGFsID0gMDsgICAgICAgICAgLy8gQ291bnQgZWxlbWVudHMgdGhhdCB3ZXJlIHNldC4gSXQnbGwgYmUgdXNlZCBhcyBhbiBhcnJheSBzaXplCisgICAgaW50IHByZXZfY29tbWEgPSBGQUxTRTsgLy8gRm9yIGNvcnJlY3QgcHJvY2Vzc2luZyBzZXF1ZW50aWFsIGNvbW1hcworICAgIGludCBpOworCisgICAga21wX3VpbnQzMiBtYXhfYmFja29mZiA9IF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMubWF4X2JhY2tvZmY7CisgICAga21wX3VpbnQzMiBtaW5fdGljayA9IF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMubWluX3RpY2s7CisKKyAgICAvLyBSdW4gb25seSAzIGl0ZXJhdGlvbnMgYmVjYXVzZSBpdCBpcyBlbm91Z2ggdG8gcmVhZCB0d28gdmFsdWVzIG9yIGZpbmQgYSBzeW50YXggZXJyb3IKKyAgICBmb3IgKCBpID0gMDsgaSA8IDMgOyBpKyspIHsKKyAgICAgICAgU0tJUF9XUyggbmV4dCApOworCisgICAgICAgIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbiBpbnRlZ2VyIG9yIG5vdCBhIGNvbW1hIE9SIG51bWJlciBvZiB2YWx1ZXMgPiAyID0+IGVuZCBvZiBsaXN0CisgICAgICAgIGlmICggKCAoICpuZXh0IDwgJzAnIHx8ICpuZXh0ID4gJzknICkgJiYgKm5leHQgIT0nLCcgKSB8fCB0b3RhbCA+IDIgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggRW52U3ludGF4RXJyb3IsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIGlzICcsJworICAgICAgICBpZiAoICpuZXh0ID09ICcsJyApIHsKKyAgICAgICAgICAgIC8vICcsJyBpcyB0aGUgZmlzcnQgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoIHRvdGFsID09IDAgfHwgcHJldl9jb21tYSApIHsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICAgICAgICBuZXh0Kys7IC8vc2tpcCAnLCcKKyAgICAgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgICAgIGlmICggKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JyApIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBjb25zdCBjaGFyICpidWYgPSBuZXh0OworICAgICAgICAgICAgY2hhciBjb25zdCAqIG1zZyAgPSBOVUxMOworICAgICAgICAgICAgcHJldl9jb21tYSA9IEZBTFNFOworICAgICAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgICAgIHRvdGFsKys7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRtcCA9IG5leHQ7CisgICAgICAgICAgICBTS0lQX1dTKCB0bXAgKTsKKyAgICAgICAgICAgIGlmICggKCAqbmV4dCA9PSAnICcgfHwgKm5leHQgPT0gJ1x0JyApICYmICggKnRtcCA+PSAnMCcgJiYgKnRtcCA8PSAnOScgKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggRW52U3BhY2VzTm90QWxsb3dlZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgICAgIGlmICggbnVtIDw9IDAgKSB7IC8vIFRoZSBudW1iZXIgb2YgcmV0cmllcyBzaG91bGQgYmUgPiAwCisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb1NtYWxsICk7CisgICAgICAgICAgICAgICAgbnVtID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG51bSA+IEtNUF9JTlRfTUFYICkgeworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgICAgIG51bSA9IEtNUF9JTlRfTUFYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggUGFyc2VTaXplSW50V2FybiwgbmFtZSwgdmFsdWUsIG1zZyApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgbnVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggdG90YWwgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBtYXhfYmFja29mZiA9IG51bTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggdG90YWwgPT0gMiApIHsKKyAgICAgICAgICAgICAgICBtaW5fdGljayA9IG51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0b3RhbCA+IDAgKTsKKyAgICBpZiggdG90YWwgPD0gMCApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudlN5bnRheEVycm9yLCBuYW1lLCB2YWx1ZSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMubWF4X2JhY2tvZmYgPSBtYXhfYmFja29mZjsKKyAgICBfX2ttcF9zcGluX2JhY2tvZmZfcGFyYW1zLm1pbl90aWNrICAgID0gbWluX3RpY2s7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3Bpbl9iYWNrb2ZmX3BhcmFtcyhrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QqIG5hbWUsIHZvaWQqIGRhdGEpCit7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQsJWQnXG4iLCBfX2ttcF9zcGluX2JhY2tvZmZfcGFyYW1zLm1heF9iYWNrb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMubWluX3RpY2sgKTsKK30KKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FEQVBUSVZFX0xPQ0tfUFJPUFMsIEtNUF9TUEVDVUxBVElWRV9TVEFUU0ZJTEUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUGFyc2Ugb3V0IHZhbHVlcyBmb3IgdGhlIHR1bmFibGUgcGFyYW1ldGVycyBmcm9tIGEgc3RyaW5nIG9mIHRoZSBmb3JtCisvLyBLTVBfQURBUFRJVkVfTE9DS19QUk9QUz1tYXhfc29mdF9yZXRyaWVzWyxtYXhfYmFkbmVzc10KK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWRhcHRpdmVfbG9ja19wcm9wcyggY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmRhdGEgKQoreworICAgIGludCBtYXhfcmV0cmllcyA9IDA7CisgICAgaW50IG1heF9iYWRuZXNzID0gMDsKKworICAgIGNvbnN0IGNoYXIgKm5leHQgPSB2YWx1ZTsKKworICAgIGludCB0b3RhbCA9IDA7ICAgICAgICAgIC8vIENvdW50IGVsZW1lbnRzIHRoYXQgd2VyZSBzZXQuIEl0J2xsIGJlIHVzZWQgYXMgYW4gYXJyYXkgc2l6ZQorICAgIGludCBwcmV2X2NvbW1hID0gRkFMU0U7IC8vIEZvciBjb3JyZWN0IHByb2Nlc3Npbmcgc2VxdWVudGlhbCBjb21tYXMKKyAgICBpbnQgaTsKKworICAgIC8vIFNhdmUgdmFsdWVzIGluIHRoZSBzdHJ1Y3R1cmUgX19rbXBfc3BlY3VsYXRpdmVfYmFja29mZl9wYXJhbXMKKyAgICAvLyBSdW4gb25seSAzIGl0ZXJhdGlvbnMgYmVjYXVzZSBpdCBpcyBlbm91Z2ggdG8gcmVhZCB0d28gdmFsdWVzIG9yIGZpbmQgYSBzeW50YXggZXJyb3IKKyAgICBmb3IgKCBpID0gMDsgaSA8IDMgOyBpKyspIHsKKyAgICAgICAgU0tJUF9XUyggbmV4dCApOworCisgICAgICAgIGlmICggKm5leHQgPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIG5vdCBhbiBpbnRlZ2VyIG9yIG5vdCBhIGNvbW1hIE9SIG51bWJlciBvZiB2YWx1ZXMgPiAyID0+IGVuZCBvZiBsaXN0CisgICAgICAgIGlmICggKCAoICpuZXh0IDwgJzAnIHx8ICpuZXh0ID4gJzknICkgJiYgKm5leHQgIT0nLCcgKSB8fCB0b3RhbCA+IDIgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggRW52U3ludGF4RXJyb3IsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIGlzICcsJworICAgICAgICBpZiAoICpuZXh0ID09ICcsJyApIHsKKyAgICAgICAgICAgIC8vICcsJyBpcyB0aGUgZmlzcnQgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoIHRvdGFsID09IDAgfHwgcHJldl9jb21tYSApIHsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICAgICAgICBuZXh0Kys7IC8vc2tpcCAnLCcKKyAgICAgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgICAgIGlmICggKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JyApIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBjb25zdCBjaGFyICpidWYgPSBuZXh0OworICAgICAgICAgICAgY2hhciBjb25zdCAqIG1zZyAgPSBOVUxMOworICAgICAgICAgICAgcHJldl9jb21tYSA9IEZBTFNFOworICAgICAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgICAgIHRvdGFsKys7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRtcCA9IG5leHQ7CisgICAgICAgICAgICBTS0lQX1dTKCB0bXAgKTsKKyAgICAgICAgICAgIGlmICggKCAqbmV4dCA9PSAnICcgfHwgKm5leHQgPT0gJ1x0JyApICYmICggKnRtcCA+PSAnMCcgJiYgKnRtcCA8PSAnOScgKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggRW52U3BhY2VzTm90QWxsb3dlZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgICAgIGlmICggbnVtIDwgMCApIHsgLy8gVGhlIG51bWJlciBvZiByZXRyaWVzIHNob3VsZCBiZSA+PSAwCisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb1NtYWxsICk7CisgICAgICAgICAgICAgICAgbnVtID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG51bSA+IEtNUF9JTlRfTUFYICkgeworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgICAgIG51bSA9IEtNUF9JTlRfTUFYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggUGFyc2VTaXplSW50V2FybiwgbmFtZSwgdmFsdWUsIG1zZyApOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgbnVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggdG90YWwgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBtYXhfcmV0cmllcyA9IG51bTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggdG90YWwgPT0gMiApIHsKKyAgICAgICAgICAgICAgICBtYXhfYmFkbmVzcyA9IG51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0b3RhbCA+IDAgKTsKKyAgICBpZiggdG90YWwgPD0gMCApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudlN5bnRheEVycm9yLCBuYW1lLCB2YWx1ZSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9zb2Z0X3JldHJpZXMgPSBtYXhfcmV0cmllczsKKyAgICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFkbmVzcyA9IG1heF9iYWRuZXNzOworfQorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWRhcHRpdmVfbG9ja19wcm9wcyhrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lICk7CisgICAgfQorICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVkLCVkJ1xuIiwgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFkbmVzcyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWRhcHRpdmVfbG9ja19wcm9wcworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3BlY3VsYXRpdmVfc3RhdHNmaWxlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfZmlsZSggbmFtZSwgdmFsdWUsICIiLCAmIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3BlY3VsYXRpdmVfc3RhdHNmaWxlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHNmaWxlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICItIiwgMCwgX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlICkgICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJzdGRvdXQiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUgKTsKKyAgICB9CisKK30gLy8gX19rbXBfc3RnX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzZmlsZQorCisjZW5kaWYgLy8gS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9IV19TVUJTRVQgKHdhcyBLTVBfUExBQ0VfVEhSRUFEUykKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9od19zdWJzZXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIFZhbHVlIGV4YW1wbGU6IDVDeDJUeDE1TworICAgIC8vIFdoaWNoIG1lYW5zICJ1c2UgNSBjb3JlcyB3aXRoIG9mZnNldCAxNSwgMiB0aHJlYWRzIHBlciBjb3JlIgorICAgIC8vIEFDOiBleHRlbmRlZCB0byBzb2NrZXRzIGxldmVsLCBleGFtcGxlcyBvZgorICAgIC8vICAgICAidXNlIDIgc29ja2V0cyB3aXRoIG9mZnNldCA2LCAyIGNvcmVzIHdpdGggb2Zmc2V0IDIgcGVyIHNvY2tldCwgMiB0aHJlYWRzIHBlciBjb3JlIjoKKyAgICAvLyAgICAgMnMsNm8sMmMsMm8sMnQ7IDJzLDZvLDJjLDJ0LDJvOyAyc0A2LDJjQDIsMnQKKyAgICAvLyAgICAgVG8gbm90IGJyZWFrIGxlZ2FjeSBjb2RlIGNvcmUtb2Zmc2V0IGNhbiBiZSBsYXN0OworICAgIC8vICAgICBwb3N0Zml4ICJvIiBvciBwcmVmaXggQCBjYW4gYmUgb2Zmc2V0IGRlc2lnbmF0b3IuCisgICAgLy8gTm90ZTogbm90IGFsbCBzeW50YXggZXJyb3JzIGFyZSBhbmFseXplZCwgc29tZSBtYXkgYmUgc2tpcHBlZC4KKyNkZWZpbmUgQ0hFQ0tfREVMSU0oX3gpICAgKCooX3gpID09ICcsJyB8fCAqKF94KSA9PSAneCcpCisgICAgc3RhdGljIGludCBwYXJzZWQgPSAwOworICAgIGludCAgICAgICAgIG51bTsKKyAgICBpbnQgc2luZ2xlX3dhcm5pbmcgPSAwOworICAgIGludCBmbGFnUyA9IDAsIGZsYWdDID0gMCwgZmxhZ1QgPSAwLCBmbGFnU08gPSAwLCBmbGFnQ08gPSAwOworICAgIGNvbnN0IGNoYXIgKm5leHQgPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpwcmV2OworCisgICAgaWYoIHN0cmNtcChuYW1lLCAiS01QX1BMQUNFX1RIUkVBRFMiKSA9PSAwICkgeworICAgICAgICBLTVBfSU5GT1JNKEVudlZhckRlcHJlY2F0ZWQsbmFtZSwiS01QX0hXX1NVQlNFVCIpOworICAgICAgICBpZiggcGFyc2VkID09IDEgKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgcGFyc2VkIEtNUF9IV19TVUJTRVQKKyAgICAgICAgfQorICAgIH0KKyAgICBwYXJzZWQgPSAxOworCisgICAgU0tJUF9XUyhuZXh0KTsgIC8vIHNraXAgd2hpdGUgc3BhY2VzCisgICAgaWYgKCpuZXh0ID09ICdcMCcpCisgICAgICAgIHJldHVybjsgICAvLyBubyBkYXRhIHByb3ZpZGVkLCByZXRhaW4gZGVmYXVsdCB2YWx1ZXMKKyAgICBpZiggc3RyY21wKG5hbWUsICJLTVBfUExBQ0VfVEhSRUFEUyIpID09IDAgKSB7CisgICAgICAgIEtNUF9JTkZPUk0oRW52VmFyRGVwcmVjYXRlZCxuYW1lLCJLTVBfSFdfU1VCU0VUIik7CisgICAgICAgIGlmKCBwYXJzZWQgPT0gMSApIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBwYXJzZWQgS01QX0hXX1NVQlNFVAorICAgICAgICB9CisgICAgfQorICAgIHBhcnNlZCA9IDE7CisKKyAgICBTS0lQX1dTKG5leHQpOyAgLy8gc2tpcCB3aGl0ZSBzcGFjZXMKKyAgICBpZiAoKm5leHQgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuOyAgIC8vIG5vIGRhdGEgcHJvdmlkZWQsIHJldGFpbiBkZWZhdWx0IHZhbHVlcworICAgIC8vIEdldCBudW1fc29ja2V0cyBmaXJzdCAob3Igd2hhdGV2ZXIgc3BlY2lmaWVkKQorICAgIGlmICgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSB7CisgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChwcmV2LCAqbmV4dCk7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAncycgfHwgKm5leHQgPT0gJ1MnKSB7ICAvLyBlLmcuICIycyIKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9zb2NrZXRzID0gbnVtOworICAgICAgICAgICAgZmxhZ1MgPSAxOyAvLyBnb3QgbnVtIHNvY2tldHMKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnQCcpIHsgLy8gc29ja2V0IG9mZnNldCwgZS5nLiAiMnNANCIKKyAgICAgICAgICAgICAgICBmbGFnU08gPSAxOworICAgICAgICAgICAgICAgIHByZXYgPSArK25leHQ7ICAvLyBkb24ndCBhbGxvdyBzcGFjZXMgZm9yIHNpbXBsaWNpdHkKKyAgICAgICAgICAgICAgICBpZiAoISgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldEludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICdjJyB8fCAqbmV4dCA9PSAnQycpIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG51bTsKKyAgICAgICAgICAgIGZsYWdTID0gZmxhZ0MgPSAxOyAvLyBzb2NrZXRzIHdlcmUgbm90IHNwZWNpZmllZCAtIHVzZSBkZWZhdWx0CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ0AnKSB7IC8vIGNvcmUgb2Zmc2V0LCBlLmcuICIyY0A2IgorICAgICAgICAgICAgICAgIGZsYWdDTyA9IDE7CisgICAgICAgICAgICAgICAgcHJldiA9ICsrbmV4dDsgIC8vIGRvbid0IGFsbG93IHNwYWNlcyBmb3Igc2ltcGxpY2l0eQorICAgICAgICAgICAgICAgIGlmICghKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0SW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICAgICAgICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKENIRUNLX0RFTElNKG5leHQpKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07IC8vIG5vIGxldHRlci1kZXNpZ25hdG9yIC0gbnVtIGNvcmVzCisgICAgICAgICAgICBmbGFnUyA9IGZsYWdDID0gMTsgLy8gc29ja2V0cyB3ZXJlIG5vdCBzcGVjaWZpZWQgLSB1c2UgZGVmYXVsdAorICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICd0JyB8fCAqbmV4dCA9PSAnVCcpIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgLy8gc29ja2V0cywgY29yZXMgd2VyZSBub3Qgc3BlY2lmaWVkIC0gdXNlIGRlZmF1bHQKKyAgICAgICAgICAgIHJldHVybjsgICAvLyB3ZSBpZ25vcmUgb2Zmc2V0IHZhbHVlIGluIGNhc2UgYWxsIGNvcmVzIGFyZSB1c2VkCisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ1wwJykgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbnVtOworICAgICAgICAgICAgcmV0dXJuOyAgIC8vIHRoZSBvbmx5IHZhbHVlIHByb3ZpZGVkIC0gc2V0IG51bSBjb3JlcworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldEludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdTKTsgLy8gbnVtIHNvY2tldHMgc2hvdWxkIGFscmVhZHkgYmUgc2V0IGhlcmUKKyAgICBTS0lQX1dTKG5leHQpOworICAgIGlmICgqbmV4dCA9PSAnXDAnKQorICAgICAgICByZXR1cm47ICAgLy8gIiBuICAiIC0gc29tZXRoaW5nIGxpa2UgdGhpcworICAgIGlmIChDSEVDS19ERUxJTShuZXh0KSkgeworICAgICAgICBuZXh0Kys7ICAgLy8gc2tpcCBkZWxpbWl0ZXIKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICB9CisKKyAgICAvLyBHZXQgc2Vjb25kIHZhbHVlIChjb3VsZCBiZSBvZmZzZXQsIG51bV9jb3JlcywgbnVtX3RocmVhZHMpCisgICAgaWYgKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpIHsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdjJyB8fCAqbmV4dCA9PSAnQycpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ0MgPT0gMCk7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICBmbGFnQyA9IDE7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ0AnKSB7IC8vIGNvcmUgb2Zmc2V0LCBlLmcuICIyY0A2IgorICAgICAgICAgICAgICAgIGZsYWdDTyA9IDE7CisgICAgICAgICAgICAgICAgcHJldiA9ICsrbmV4dDsgIC8vIGRvbid0IGFsbG93IHNwYWNlcyBmb3Igc2ltcGxpY2l0eQorICAgICAgICAgICAgICAgIGlmICghKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0SW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICAgICAgICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICdvJyB8fCAqbmV4dCA9PSAnTycpIHsgLy8gb2Zmc2V0IHNwZWNpZmllZAorICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXREZXByZWNhdGVkKTsKKyAgICAgICAgICAgIHNpbmdsZV93YXJuaW5nID0gMTsKKyAgICAgICAgICAgIGlmIChmbGFnQykgeyAvLyB3aGV0aGVyIG51bV9jb3JlcyBhbHJlYWR5IHNwZWNpZmllZCAoc29ja2V0cyBza2lwcGVkKQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIWZsYWdDTyk7IC8vIGVpdGhlciAibyIgb3IgQCwgbm90IGJvdGgKKyAgICAgICAgICAgICAgICBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IG51bTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCghZmxhZ1NPKTsgLy8gZWl0aGVyICJvIiBvciBALCBub3QgYm90aAorICAgICAgICAgICAgICAgIF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQgPSBudW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ3QnIHx8ICpuZXh0ID09ICdUJykgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnVCA9PSAwKTsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgZmxhZ0MgPSAxOyAvLyBudW1fY29yZXMgY291bGQgYmUgc2tpcHBlZCA/CisgICAgICAgICAgICBmbGFnVCA9IDE7CisgICAgICAgICAgICBuZXh0Kys7IC8vIGNhbiBoYXZlIGNvcmUtb2Zmc2V0IHNwZWNpZmllZCBhZnRlciBudW0gdGhyZWFkcworICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ0MpOyAvLyA0eDIgbWVhbnMgNCBjb3JlcyAyIHRocmVhZHMgcGVyIGNvcmUKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgcmV0dXJuOyAgIC8vIHR3byB2YWx1ZXMgcHJvdmlkZWQgd2l0aG91dCBsZXR0ZXItZGVzaWduYXRvcgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldEludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTS0lQX1dTKG5leHQpOworICAgIGlmICgqbmV4dCA9PSAnXDAnKQorICAgICAgICByZXR1cm47ICAgLy8gIiBOcyxOYyAgIiAtIHNvbWV0aGluZyBsaWtlIHRoaXMKKyAgICBpZiAoQ0hFQ0tfREVMSU0obmV4dCkpIHsKKyAgICAgICAgbmV4dCsrOyAgIC8vIHNraXAgZGVsaW1pdGVyCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgfQorCisgICAgLy8gR2V0IHRoaXJkIHZhbHVlIChjb3VsZCBiZSBjb3JlLW9mZnNldCwgbnVtX2NvcmVzLCBudW1fdGhyZWFkcykKKyAgICBpZiAoKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JykgeworICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJ3QnIHx8ICpuZXh0ID09ICdUJykgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnVCA9PSAwKTsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgaWYgKGZsYWdDID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBudW1fY29yZXMgY291bGQgYmUgc2tpcHBlZCAoZS5nLiAycyw0bywydCkKKyAgICAgICAgICAgIGZsYWdUID0gMTsKKyAgICAgICAgICAgIG5leHQrKzsgLy8gY2FuIGhhdmUgY29yZS1vZmZzZXQgc3BlY2lmaWVkIGxhdGVyIChlLmcuIDJzLDFjLDJ0LDNvKQorICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICdjJyB8fCAqbmV4dCA9PSAnQycpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ0MgPT0gMCk7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICBmbGFnQyA9IDE7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAvL0tNUF9ERUJVR19BU1NFUlQoKm5leHQgIT0gJ0AnKTsgLy8gc29ja2V0IG9mZnNldCB1c2VkICJvIiBkZXNpZ25hdG9yCisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ28nIHx8ICpuZXh0ID09ICdPJykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXREZXByZWNhdGVkKTsKKyAgICAgICAgICAgIHNpbmdsZV93YXJuaW5nID0gMTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ0MpOworICAgICAgICAgICAgLy9LTVBfREVCVUdfQVNTRVJUKCFmbGFnU08pOyAvLyBzb2NrZXQgb2Zmc2V0IGNvdWxkbid0IHVzZSBAIGRlc2lnbmF0b3IKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldEludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdDKTsKKyAgICBTS0lQX1dTKG5leHQpOworICAgIGlmICggKm5leHQgPT0gJ1wwJyApCisgICAgICAgICAgICByZXR1cm47CisgICAgaWYgKENIRUNLX0RFTElNKG5leHQpKSB7CisgICAgICAgIG5leHQrKzsgICAvLyBza2lwIGRlbGltaXRlcgorICAgICAgICBTS0lQX1dTKG5leHQpOworICAgIH0KKworICAgIC8vIEdldCA0LXRoIHZhbHVlIChjb3VsZCBiZSBjb3JlLW9mZnNldCwgbnVtX3RocmVhZHMpCisgICAgaWYgKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpIHsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdvJyB8fCAqbmV4dCA9PSAnTycpIHsKKyAgICAgICAgICAgIGlmICghc2luZ2xlX3dhcm5pbmcpIHsgLy8gd2FybiBvbmNlCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXREZXByZWNhdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIWZsYWdTTyk7IC8vIHNvY2tldCBvZmZzZXQgY291bGRuJ3QgdXNlIEAgZGVzaWduYXRvcgorICAgICAgICAgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBudW07CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ3QnIHx8ICpuZXh0ID09ICdUJykgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnVCA9PSAwKTsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gbnVtOworICAgICAgICAgICAgZmxhZ1QgPSAxOworICAgICAgICAgICAgbmV4dCsrOyAvLyBjYW4gaGF2ZSBjb3JlLW9mZnNldCBzcGVjaWZpZWQgYWZ0ZXIgbnVtIHRocmVhZHMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0SW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU0tJUF9XUyhuZXh0KTsKKyAgICBpZiAoICpuZXh0ID09ICdcMCcgKQorICAgICAgICByZXR1cm47CisgICAgaWYgKENIRUNLX0RFTElNKG5leHQpKSB7CisgICAgICAgIG5leHQrKzsgICAvLyBza2lwIGRlbGltaXRlcgorICAgICAgICBTS0lQX1dTKG5leHQpOworICAgIH0KKworICAgIC8vIEdldCA1LXRoIHZhbHVlIChjb3VsZCBiZSBjb3JlLW9mZnNldCwgbnVtX3RocmVhZHMpCisgICAgaWYgKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpIHsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdvJyB8fCAqbmV4dCA9PSAnTycpIHsKKyAgICAgICAgICAgIGlmICghc2luZ2xlX3dhcm5pbmcpIHsgLy8gd2FybiBvbmNlCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXREZXByZWNhdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ1QpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCghZmxhZ1NPKTsgLy8gc29ja2V0IG9mZnNldCBjb3VsZG4ndCB1c2UgQCBkZXNpZ25hdG9yCisgICAgICAgICAgICBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IG51bTsKKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAndCcgfHwgKm5leHQgPT0gJ1QnKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdUID09IDApOworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBudW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldEludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0SW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgIH0KKyAgICByZXR1cm47CisjdW5kZWYgQ0hFQ0tfREVMSU0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9od19zdWJzZXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgKyBfX2ttcF9wbGFjZV9udW1fY29yZXMgKyBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSkgeworICAgICAgICBpbnQgY29tbWEgPSAwOworICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworICAgICAgICBpZihfX2ttcF9lbnZfZm9ybWF0KQorICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcz0nIiwgbmFtZSk7CisgICAgICAgIGlmIChfX2ttcF9wbGFjZV9udW1fc29ja2V0cykgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWRzIiwgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMpOworICAgICAgICAgICAgaWYgKF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQpCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiQCVkIiwgX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCk7CisgICAgICAgICAgICBjb21tYSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX3BsYWNlX251bV9jb3JlcykgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMlZGMiLCBjb21tYT8iLCI6IiIsIF9fa21wX3BsYWNlX251bV9jb3Jlcyk7CisgICAgICAgICAgICBpZiAoX19rbXBfcGxhY2VfY29yZV9vZmZzZXQpCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiQCVkIiwgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQpOworICAgICAgICAgICAgY29tbWEgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVzJWR0IiwgY29tbWE/IiwiOiIiLCBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMnXG4iLCBidWYuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKy8qCisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM6ICVzIFxuIiwgbmFtZSwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyovCisgICAgfQorfQorCisjaWYgVVNFX0lUVF9CVUlMRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUktKT0lOX0ZSQU1FUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZm9ya2pvaW5fZnJhbWVzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUktKT0lOX0ZSQU1FU19NT0RFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzX21vZGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCAzLCAmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXNfbW9kZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lcworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX0RJU1BMQVlfRU5WCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX29tcF9kaXNwbGF5X2VudiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiVkVSQk9TRSIsIDEsIHZhbHVlICkgKQorICAgIHsKKyAgICAgICAgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2Rpc3BsYXlfZW52ICk7CisgICAgfQorCit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfZGlzcGxheV9lbnYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfZGlzcGxheV9lbnYoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisgICAgaWYgKCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlICkKKyAgICB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgIlZFUkJPU0UiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGlzcGxheV9lbnYgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfZGlzcGxheV9lbnYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9vbXBfY2FuY2VsbGF0aW9uKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52UGFyYWxsZWxXYXJuLCBuYW1lICk7CisgICAgICAgIHJldHVybjsKKyAgICB9ICAgLy8gcmVhZCB2YWx1ZSBiZWZvcmUgZmlyc3QgcGFyYWxsZWwgb25seQorICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfY2FuY2VsbGF0aW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfb21wX2NhbmNlbGxhdGlvbigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX29tcF9jYW5jZWxsYXRpb24gKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X29tcF9jYW5jZWxsYXRpb24KKworI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRhYmxlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3N0YXRpYyBrbXBfc2V0dGluZ190IF9fa21wX3N0Z190YWJsZVtdID0geworCisgICAgeyAiS01QX0FMTF9USFJFQURTIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzLCAgICAgICAgX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRzLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9CTE9DS1RJTUUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ibG9ja3RpbWUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9ibG9ja3RpbWUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRFVQTElDQVRFX0xJQl9PSyIsICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZHVwbGljYXRlX2xpYl9vaywgICBfX2ttcF9zdGdfcHJpbnRfZHVwbGljYXRlX2xpYl9vaywgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0xJQlJBUlkiLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3dhaXRfcG9saWN5LCAgICAgICAgX19rbXBfc3RnX3ByaW50X3dhaXRfcG9saWN5LCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9NQVhfVEhSRUFEUyIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcywgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgICB7ICJLTVBfTU9OSVRPUl9TVEFDS1NJWkUiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbW9uaXRvcl9zdGFja3NpemUsICBfX2ttcF9zdGdfcHJpbnRfbW9uaXRvcl9zdGFja3NpemUsICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKyAgICB7ICJLTVBfU0VUVElOR1MiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc2V0dGluZ3MsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2V0dGluZ3MsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NUQUNLT0ZGU0VUIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrb2Zmc2V0LCAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0YWNrb2Zmc2V0LCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TVEFDS1NJWkUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdGFja3NpemUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU1RBQ0tQQUQiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2twYWQsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RhY2twYWQsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1ZFUlNJT04iLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3ZlcnNpb24sICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3ZlcnNpb24sICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9XQVJOSU5HUyIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV93YXJuaW5ncywgICAgICAgICAgIF9fa21wX3N0Z19wcmludF93YXJuaW5ncywgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKworICAgIHsgIk9NUF9ORVNURUQiLCAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9uZXN0ZWQsICAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9uZXN0ZWQsICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfTlVNX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbnVtX3RocmVhZHMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbnVtX3RocmVhZHMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1NUQUNLU0laRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZSwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZSwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiS01QX1RBU0tJTkciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Rhc2tpbmcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3Rhc2tpbmcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9UQVNLX1NURUFMSU5HX0NPTlNUUkFJTlQiLCAgICAgIF9fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nLCAgICAgIF9fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nLCAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfTUFYX0FDVElWRV9MRVZFTFMiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbWF4X2FjdGl2ZV9sZXZlbHMsICBfX2ttcF9zdGdfcHJpbnRfbWF4X2FjdGl2ZV9sZXZlbHMsICBOVUxMLCAwLCAwIH0sCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7ICJPTVBfREVGQVVMVF9ERVZJQ0UiLCAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVmYXVsdF9kZXZpY2UsICAgICBfX2ttcF9zdGdfcHJpbnRfZGVmYXVsdF9kZXZpY2UsICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIHsgIk9NUF9NQVhfVEFTS19QUklPUklUWSIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9tYXhfdGFza19wcmlvcml0eSwgIF9fa21wX3N0Z19wcmludF9tYXhfdGFza19wcmlvcml0eSwgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorICAgIHsgIk9NUF9USFJFQURfTElNSVQiLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcywgICAgICAgIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcywgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfV0FJVF9QT0xJQ1kiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3ksICAgICAgICBfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3ksICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RJU1BfTlVNX0JVRkZFUlMiLCAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Rpc3BfYnVmZmVycywgICAgICAgX19rbXBfc3RnX3ByaW50X2Rpc3BfYnVmZmVycywgICAgICAgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgeyAiS01QX0hPVF9URUFNU19NQVhfTEVWRUwiLCAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2hvdF90ZWFtc19sZXZlbCwgICAgX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19sZXZlbCwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9IT1RfVEVBTVNfTU9ERSIsICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbW9kZSwgICAgIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbW9kZSwgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgeyAiS01QX0hBTkRMRV9TSUdOQUxTIiwgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2hhbmRsZV9zaWduYWxzLCAgICAgX19rbXBfc3RnX3ByaW50X2hhbmRsZV9zaWduYWxzLCAgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgeyAiS01QX0lOSEVSSVRfRlBfQ09OVFJPTCIsICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2luaGVyaXRfZnBfY29udHJvbCwgX19rbXBfc3RnX3ByaW50X2luaGVyaXRfZnBfY29udHJvbCwgTlVMTCwgMCwgMCB9LAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIHsgIkdPTVBfU1RBQ0tTSVpFIiwgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCisgICAgeyAiS01QX0FfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2FfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9CX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9iX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQ19ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfY19kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfY19kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2RfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9FX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9lX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9lX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRl9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZl9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZl9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnLCAgICAgICAgICAgICAgTlVMTCwgLyogbm8gcHJpbnQgKi8gICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVR19CVUYiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWYsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWYsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUdfQlVGX0FUT01JQyIsICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2F0b21pYywgICBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2F0b21pYywgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHX0JVRl9DSEFSUyIsICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9jaGFycywgICAgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9jaGFycywgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVR19CVUZfTElORVMiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfbGluZXMsICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfbGluZXMsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRElBRyIsICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGlhZywgICAgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZGlhZywgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisKKyAgICB7ICJLTVBfUEFSX1JBTkdFIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlX2VudiwgICAgICBfX2ttcF9zdGdfcHJpbnRfcGFyX3JhbmdlX2VudiwgICAgICBOVUxMLCAwLCAwIH0sCisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgeyAiS01QX1lJRUxEX0NZQ0xFIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3lpZWxkX2N5Y2xlLCAgICAgICAgX19rbXBfc3RnX3ByaW50X3lpZWxkX2N5Y2xlLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ZSUVMRF9PTiIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV95aWVsZF9vbiwgICAgICAgICAgIF9fa21wX3N0Z19wcmludF95aWVsZF9vbiwgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfWUlFTERfT0ZGIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb2ZmLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb2ZmLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworICAgIHsgIktNUF9BTElHTl9BTExPQyIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hbGlnbl9hbGxvYywgICAgICAgIF9fa21wX3N0Z19wcmludF9hbGlnbl9hbGxvYywgICAgICAgIE5VTEwsIDAsIDAgfSwKKworICAgIHsgIktNUF9QTEFJTl9CQVJSSUVSIiwgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQsIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQsIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfUExBSU5fQkFSUklFUl9QQVRURVJOIiwgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuLCAgICBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUktKT0lOX0JBUlJJRVIiLCAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCwgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCwgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9GT1JLSk9JTl9CQVJSSUVSX1BBVFRFUk4iLCAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4sICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4sICAgIE5VTEwsIDAsIDAgfSwKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIHsgIktNUF9SRURVQ1RJT05fQkFSUklFUiIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQsIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQsIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfUkVEVUNUSU9OX0JBUlJJRVJfUEFUVEVSTiIsICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuLCAgICBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuLCAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKworICAgIHsgIktNUF9BQk9SVF9ERUxBWSIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hYm9ydF9kZWxheSwgICAgICAgIF9fa21wX3N0Z19wcmludF9hYm9ydF9kZWxheSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQ1BVSU5GT19GSUxFIiwgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfY3B1aW5mb19maWxlLCAgICAgICBfX2ttcF9zdGdfcHJpbnRfY3B1aW5mb19maWxlLCAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUkNFX1JFRFVDVElPTiIsICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbiwgICAgX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbiwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiIsICAgICAgIF9fa21wX3N0Z19wYXJzZV9mb3JjZV9yZWR1Y3Rpb24sICAgIF9fa21wX3N0Z19wcmludF9mb3JjZV9yZWR1Y3Rpb24sICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU1RPUkFHRV9NQVAiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RvcmFnZV9tYXAsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RvcmFnZV9tYXAsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0FMTF9USFJFQURQUklWQVRFIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRwcml2YXRlLCAgX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRwcml2YXRlLCAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9GT1JFSUdOX1RIUkVBRFNfVEhSRUFEUFJJVkFURSIsIF9fa21wX3N0Z19wYXJzZV9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZSwgX19rbXBfc3RnX3ByaW50X2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlLCAgICAgTlVMTCwgMCwgMCB9LAorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHsgIktNUF9BRkZJTklUWSIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hZmZpbml0eSwgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9hZmZpbml0eSwgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyMgaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgeyAiR09NUF9DUFVfQUZGSU5JVFkiLCAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2dvbXBfY3B1X2FmZmluaXR5LCAgTlVMTCwgLyogbm8gcHJpbnQgKi8gICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7ICJPTVBfUFJPQ19CSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfcHJvY19iaW5kLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1BMQUNFUyIsICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3BsYWNlcywgICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3BsYWNlcywgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBlbHNlCisgICAgeyAiT01QX1BST0NfQklORCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Byb2NfYmluZCwgICAgICAgICAgTlVMTCwgLyogbm8gcHJpbnQgKi8gICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgeyAiS01QX1RPUE9MT0dZX01FVEhPRCIsICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3RvcG9sb2d5X21ldGhvZCwgICAgX19rbXBfc3RnX3ByaW50X3RvcG9sb2d5X21ldGhvZCwgICAgTlVMTCwgMCwgMCB9LAorCisjZWxzZQorCisgICAgLy8KKyAgICAvLyBLTVBfQUZGSU5JVFkgaXMgbm90IHN1cHBvcnRlZCBvbiBPUyBYKiwgbm9yIGlzIE9NUF9QTEFDRVMuCisgICAgLy8gT01QX1BST0NfQklORCBhbmQgcHJvYy1iaW5kLXZhciBhcmUgc3VwcG9ydGVkLCBob3dldmVyLgorICAgIC8vCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgeyAiT01QX1BST0NfQklORCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Byb2NfYmluZCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3Byb2NfYmluZCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBlbmRpZgorCisjZW5kaWYgLy8gS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisgICAgeyAiS01QX0lOSVRfQVRfRk9SSyIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2luaXRfYXRfZm9yaywgICAgICAgX19rbXBfc3RnX3ByaW50X2luaXRfYXRfZm9yaywgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TQ0hFRFVMRSIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zY2hlZHVsZSwgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zY2hlZHVsZSwgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfU0NIRURVTEUiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfb21wX3NjaGVkdWxlLCAgICAgICBfX2ttcF9zdGdfcHJpbnRfb21wX3NjaGVkdWxlLCAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0FUT01JQ19NT0RFIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2F0b21pY19tb2RlLCAgICAgICAgX19rbXBfc3RnX3ByaW50X2F0b21pY19tb2RlLCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9DT05TSVNURU5DWV9DSEVDSyIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9jb25zaXN0ZW5jeV9jaGVjaywgIF9fa21wX3N0Z19wcmludF9jb25zaXN0ZW5jeV9jaGVjaywgIE5VTEwsIDAsIDAgfSwKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICB7ICJLTVBfSVRUX1BSRVBBUkVfREVMQVkiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaXR0X3ByZXBhcmVfZGVsYXksICBfX2ttcF9zdGdfcHJpbnRfaXR0X3ByZXBhcmVfZGVsYXksICBOVUxMLCAwLCAwIH0sCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgIHsgIktNUF9NQUxMT0NfUE9PTF9JTkNSIiwgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9tYWxsb2NfcG9vbF9pbmNyLCAgIF9fa21wX3N0Z19wcmludF9tYWxsb2NfcG9vbF9pbmNyLCAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfSU5JVF9XQUlUIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW5pdF93YWl0LCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfaW5pdF93YWl0LCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX05FWFRfV0FJVCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX25leHRfd2FpdCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X25leHRfd2FpdCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9HVElEX01PREUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ndGlkX21vZGUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9ndGlkX21vZGUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfRFlOQU1JQyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfb21wX2R5bmFtaWMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfb21wX2R5bmFtaWMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RZTkFNSUNfTU9ERSIsICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUsICAgX19rbXBfc3RnX3ByaW50X2ttcF9keW5hbWljX21vZGUsICAgTlVMTCwgMCwgMCB9LAorCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIHsgIktNUF9MT0FEX0JBTEFOQ0VfSU5URVJWQUwiLCAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9sZF9iYWxhbmNlX2ludGVydmFsLF9fa21wX3N0Z19wcmludF9sZF9iYWxhbmNlX2ludGVydmFsLE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisgICAgeyAiS01QX05VTV9MT0NLU19JTl9CTE9DSyIsICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2xvY2tfYmxvY2ssICAgICAgICAgX19rbXBfc3RnX3ByaW50X2xvY2tfYmxvY2ssICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9MT0NLX0tJTkQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9sb2NrX2tpbmQsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9sb2NrX2tpbmQsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU1BJTl9CQUNLT0ZGX1BBUkFNUyIsICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3Bpbl9iYWNrb2ZmX3BhcmFtcywgX19rbXBfc3RnX3ByaW50X3NwaW5fYmFja29mZl9wYXJhbXMsIE5VTEwsIDAsIDAgfSwKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgeyAiS01QX0FEQVBUSVZFX0xPQ0tfUFJPUFMiLCAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FkYXB0aXZlX2xvY2tfcHJvcHMsX19rbXBfc3RnX3ByaW50X2FkYXB0aXZlX2xvY2tfcHJvcHMsICBOVUxMLCAwLCAwIH0sCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgeyAiS01QX1NQRUNVTEFUSVZFX1NUQVRTRklMRSIsICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSxfX2ttcF9zdGdfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLCAgTlVMTCwgMCwgMCB9LAorI2VuZGlmCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIHsgIktNUF9QTEFDRV9USFJFQURTIiwgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9od19zdWJzZXQsICAgICAgX19rbXBfc3RnX3ByaW50X2h3X3N1YnNldCwgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0hXX1NVQlNFVCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2h3X3N1YnNldCwgICAgICBfX2ttcF9zdGdfcHJpbnRfaHdfc3Vic2V0LCAgICAgIE5VTEwsIDAsIDAgfSwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgeyAiS01QX0ZPUktKT0lOX0ZSQU1FUyIsICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lcywgICAgX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lcywgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9GT1JLSk9JTl9GUkFNRVNfTU9ERSIsICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXNfbW9kZSxfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzX21vZGUsICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIHsgIk9NUF9ESVNQTEFZX0VOViIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9vbXBfZGlzcGxheV9lbnYsICAgIF9fa21wX3N0Z19wcmludF9vbXBfZGlzcGxheV9lbnYsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfQ0FOQ0VMTEFUSU9OIiwgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfb21wX2NhbmNlbGxhdGlvbiwgICBfX2ttcF9zdGdfcHJpbnRfb21wX2NhbmNlbGxhdGlvbiwgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKyAgICB7ICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0KK307IC8vIHNldHRpbmdzCisKK3N0YXRpYyBpbnQgY29uc3QgX19rbXBfc3RnX2NvdW50ID0gc2l6ZW9mKCBfX2ttcF9zdGdfdGFibGUgKSAvIHNpemVvZigga21wX3NldHRpbmdfdCApOworCitzdGF0aWMgaW5saW5lCitrbXBfc2V0dGluZ190ICoKK19fa21wX3N0Z19maW5kKCBjaGFyIGNvbnN0ICogbmFtZSApIHsKKworICAgIGludCBpOworICAgIGlmICggbmFtZSAhPSBOVUxMICkgeworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKysgaSApIHsKKyAgICAgICAgICAgIGlmICggc3RyY21wKCBfX2ttcF9zdGdfdGFibGVbIGkgXS5uYW1lLCBuYW1lICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gJiBfX2ttcF9zdGdfdGFibGVbIGkgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGZvcgorICAgIH07IC8vIGlmCisgICAgcmV0dXJuIE5VTEw7CisKK30gLy8gX19rbXBfc3RnX2ZpbmQKKworCitzdGF0aWMgaW50CitfX2ttcF9zdGdfY21wKCB2b2lkIGNvbnN0ICogX2EsIHZvaWQgY29uc3QgKiBfYiApIHsKKyAgICBrbXBfc2V0dGluZ190ICogYSA9IChrbXBfc2V0dGluZ190ICopIF9hOworICAgIGttcF9zZXR0aW5nX3QgKiBiID0gKGttcF9zZXR0aW5nX3QgKikgX2I7CisKKyAgICAvLworICAgIC8vIFByb2Nlc3MgS01QX0FGRklOSVRZIGxhc3QuCisgICAgLy8gSXQgbmVlZHMgdG8gY29tZSBhZnRlciBPTVBfUExBQ0VTIGFuZCBHT01QX0NQVV9BRkZJTklUWS4KKyAgICAvLworICAgIGlmICggc3RyY21wKCBhLT5uYW1lLCAiS01QX0FGRklOSVRZIiApID09IDAgKSB7CisgICAgICAgIGlmICggc3RyY21wKCBiLT5uYW1lLCAiS01QX0FGRklOSVRZIiApID09IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHN0cmNtcCggYi0+bmFtZSwgIktNUF9BRkZJTklUWSIgKSA9PSAwICkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBzdHJjbXAoIGEtPm5hbWUsIGItPm5hbWUgKTsKK30gLy8gX19rbXBfc3RnX2NtcAorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfaW5pdCggdm9pZAorKSB7CisKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworICAgIGlmICggISBpbml0aWFsaXplZCApIHsKKworICAgICAgICAvLyBTb3J0IHRhYmxlLgorICAgICAgICBxc29ydCggX19rbXBfc3RnX3RhYmxlLCBfX2ttcF9zdGdfY291bnQgLSAxLCBzaXplb2YoIGttcF9zZXR0aW5nX3QgKSwgX19rbXBfc3RnX2NtcCApOworCisgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSAqX1NUQUNLU0laRSBkYXRhLgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX3N0YWNrc2l6ZSAgPSBfX2ttcF9zdGdfZmluZCggIktNUF9TVEFDS1NJWkUiICApOyAgICAgIC8vIDFzdCBwcmlvcml0eS4KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBnb21wX3N0YWNrc2l6ZSA9IF9fa21wX3N0Z19maW5kKCAiR09NUF9TVEFDS1NJWkUiICk7ICAgICAgLy8gMm5kIHByaW9yaXR5LgorI2VuZGlmCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3N0YWNrc2l6ZSAgPSBfX2ttcF9zdGdfZmluZCggIk9NUF9TVEFDS1NJWkUiICApOyAgICAgIC8vIDNyZCBwcmlvcml0eS4KKworICAgICAgICAgICAgLy8gISEhIHZvbGF0aWxlIGtleXdvcmQgaXMgSW50ZWwgKFIpIEMgQ29tcGlsZXIgYnVnIENRNDk5MDggd29ya2Fyb3VuZC4KKyAgICAgICAgICAgIC8vICEhISBDb21waWxlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHJpdmFscyBpcyB1c2VkIGFuZCBvcHRpbWl6ZXMgb3V0IGFzc2lnbm1lbnRzCisgICAgICAgICAgICAvLyAhISEgICAgIHJpdmFsc1sgaSArKyBdID0gLi4uOworICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDQgXTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3NzX2RhdGFfdCBrbXBfZGF0YSAgPSB7ICAgIDEsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfc3NfZGF0YV90IGdvbXBfZGF0YSA9IHsgMTAyNCwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisjZW5kaWYKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3NzX2RhdGFfdCBvbXBfZGF0YSAgPSB7IDEwMjQsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9zdGFja3NpemU7CisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBpZiAoIGdvbXBfc3RhY2tzaXplICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBnb21wX3N0YWNrc2l6ZTsKKyAgICAgICAgICAgIH07IC8vIGlmCisjZW5kaWYKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gb21wX3N0YWNrc2l6ZTsKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gTlVMTDsKKworICAgICAgICAgICAga21wX3N0YWNrc2l6ZS0+ZGF0YSA9ICYga21wX2RhdGE7CisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBpZiAoIGdvbXBfc3RhY2tzaXplICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgZ29tcF9zdGFja3NpemUtPmRhdGEgPSAmIGdvbXBfZGF0YTsKKyAgICAgICAgICAgIH07IC8vIGlmCisjZW5kaWYKKyAgICAgICAgICAgIG9tcF9zdGFja3NpemUtPmRhdGEgPSAmIG9tcF9kYXRhOworCisgICAgICAgIH0KKworICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0xJQlJBUlkgYW5kIE9NUF9XQUlUX1BPTElDWSBkYXRhLgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2xpYnJhcnkgICAgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfTElCUkFSWSIgKTsgICAgICAgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBvbXBfd2FpdF9wb2xpY3kgPSBfX2ttcF9zdGdfZmluZCggIk9NUF9XQUlUX1BPTElDWSIgKTsgICAgLy8gMm5kIHByaW9yaXR5LgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDMgXTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX3dwX2RhdGFfdCBrbXBfZGF0YSAgPSB7IDAsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfd3BfZGF0YV90IG9tcF9kYXRhICA9IHsgMSwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2xpYnJhcnk7CisgICAgICAgICAgICBpZiAoIG9tcF93YWl0X3BvbGljeSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gb21wX3dhaXRfcG9saWN5OworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gTlVMTDsKKworICAgICAgICAgICAga21wX2xpYnJhcnktPmRhdGEgID0gJiBrbXBfZGF0YTsKKyAgICAgICAgICAgIGlmICggb21wX3dhaXRfcG9saWN5ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgb21wX3dhaXRfcG9saWN5LT5kYXRhID0gJiBvbXBfZGF0YTsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgfQorCisgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBLTVBfQUxMX1RIUkVBRFMsIEtNUF9NQVhfVEhSRUFEUywgYW5kIE9NUF9USFJFQURfTElNSVQgZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9hbGxfdGhyZWFkcyAgPSBfX2ttcF9zdGdfZmluZCggIktNUF9BTExfVEhSRUFEUyIgICk7ICAvLyAxc3QgcHJpb3JpdHkuCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX21heF90aHJlYWRzICA9IF9fa21wX3N0Z19maW5kKCAiS01QX01BWF9USFJFQURTIiAgKTsgIC8vIDJuZCBwcmlvcml0eS4KKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBvbXBfdGhyZWFkX2xpbWl0ID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfVEhSRUFEX0xJTUlUIiApOyAgLy8gM3JkIHByaW9yaXR5LgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDQgXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfYWxsX3RocmVhZHM7CisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9tYXhfdGhyZWFkczsKKyAgICAgICAgICAgIGlmICggb21wX3RocmVhZF9saW1pdCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gb21wX3RocmVhZF9saW1pdDsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGttcF9hbGxfdGhyZWFkcy0+ZGF0YSA9ICh2b2lkKikmIHJpdmFsczsKKyAgICAgICAgICAgIGttcF9tYXhfdGhyZWFkcy0+ZGF0YSA9ICh2b2lkKikmIHJpdmFsczsKKyAgICAgICAgICAgIGlmICggb21wX3RocmVhZF9saW1pdCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIG9tcF90aHJlYWRfbGltaXQtPmRhdGEgPSAodm9pZCopJiByaXZhbHM7CisgICAgICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIH0KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgeyAvLyBJbml0aWFsaXplIEtNUF9BRkZJTklUWSwgR09NUF9DUFVfQUZGSU5JVFksIGFuZCBPTVBfUFJPQ19CSU5EIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfYWZmaW5pdHkgPSBfX2ttcF9zdGdfZmluZCggIktNUF9BRkZJTklUWSIgICk7ICAvLyAxc3QgcHJpb3JpdHkuCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBrbXBfYWZmaW5pdHkgIT0gTlVMTCApOworCisjIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGdvbXBfY3B1X2FmZmluaXR5ID0gX19rbXBfc3RnX2ZpbmQoICJHT01QX0NQVV9BRkZJTklUWSIgICk7ICAvLyAybmQgcHJpb3JpdHkuCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBnb21wX2NwdV9hZmZpbml0eSAhPSBOVUxMICk7CisjIGVuZGlmCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBvbXBfcHJvY19iaW5kID0gX19rbXBfc3RnX2ZpbmQoICJPTVBfUFJPQ19CSU5EIiApOyAgLy8gM3JkIHByaW9yaXR5LgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggb21wX3Byb2NfYmluZCAhPSBOVUxMICk7CisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgNCBdOworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9hZmZpbml0eTsKKworIyBpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gZ29tcF9jcHVfYWZmaW5pdHk7CisgICAgICAgICAgICBnb21wX2NwdV9hZmZpbml0eS0+ZGF0YSA9ICh2b2lkKikmIHJpdmFsczsKKyMgZW5kaWYKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBvbXBfcHJvY19iaW5kOworICAgICAgICAgICAgb21wX3Byb2NfYmluZC0+ZGF0YSA9ICh2b2lkKikmIHJpdmFsczsKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gTlVMTDsKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSBwbGFjZXNfcml2YWxzWyA0IF07CisgICAgICAgICAgICBpID0gMDsKKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF9wbGFjZXMgPSBfX2ttcF9zdGdfZmluZCggIk9NUF9QTEFDRVMiICk7ICAvLyAzcmQgcHJpb3JpdHkuCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBvbXBfcGxhY2VzICE9IE5VTEwgKTsKKworICAgICAgICAgICAgcGxhY2VzX3JpdmFsc1sgaSArKyBdID0ga21wX2FmZmluaXR5OworIyAgaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBwbGFjZXNfcml2YWxzWyBpICsrIF0gPSBnb21wX2NwdV9hZmZpbml0eTsKKyMgIGVuZGlmCisgICAgICAgICAgICBwbGFjZXNfcml2YWxzWyBpICsrIF0gPSBvbXBfcGxhY2VzOworICAgICAgICAgICAgb21wX3BsYWNlcy0+ZGF0YSA9ICh2b2lkKikmIHBsYWNlc19yaXZhbHM7CisgICAgICAgICAgICBwbGFjZXNfcml2YWxzWyBpICsrIF0gPSBOVUxMOworIyBlbmRpZgorICAgICAgICB9CisjZWxzZQorICAgIC8vIEtNUF9BRkZJTklUWSBub3Qgc3VwcG9ydGVkLCBzbyBPTVBfUFJPQ19CSU5EIGhhcyBubyByaXZhbHMuCisgICAgLy8gT01QX1BMQUNFUyBub3Qgc3VwcG9ydGVkIHlldC4KKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKyAgICAgICAgeyAvLyBJbml0aWFsaXplIEtNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiBhbmQgS01QX0ZPUkNFX1JFRFVDVElPTiBkYXRhLgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2ZvcmNlX3JlZCAgPSBfX2ttcF9zdGdfZmluZCggIktNUF9GT1JDRV9SRURVQ1RJT04iICk7ICAgICAgICAgLy8gMXN0IHByaW9yaXR5LgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9kZXRlcm1fcmVkID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04iICk7IC8vIDJuZCBwcmlvcml0eS4KKworICAgICAgICAgICAgLy8gISEhIHZvbGF0aWxlIGtleXdvcmQgaXMgSW50ZWwgKFIpIEMgQ29tcGlsZXIgYnVnIENRNDk5MDggd29ya2Fyb3VuZC4KKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyAzIF07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19mcl9kYXRhX3QgZm9yY2VfZGF0YSAgID0geyAxLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX2ZyX2RhdGFfdCBkZXRlcm1fZGF0YSAgPSB7IDAsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9mb3JjZV9yZWQ7CisgICAgICAgICAgICBpZiAoIGttcF9kZXRlcm1fcmVkICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfZGV0ZXJtX3JlZDsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGttcF9mb3JjZV9yZWQtPmRhdGEgPSAmIGZvcmNlX2RhdGE7CisgICAgICAgICAgICBpZiAoIGttcF9kZXRlcm1fcmVkICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAga21wX2RldGVybV9yZWQtPmRhdGEgID0gJiBkZXRlcm1fZGF0YTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0KKworICAgICAgICBpbml0aWFsaXplZCA9IDE7CisKKyAgICB9OyAvLyBpZgorCisgICAgLy8gUmVzZXQgZmxhZ3MuCisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF9zdGdfY291bnQ7ICsrIGkgKSB7CisgICAgICAgIF9fa21wX3N0Z190YWJsZVsgaSBdLnNldCA9IDA7CisgICAgfTsgLy8gZm9yCisKK30gLy8gX19rbXBfc3RnX2luaXQKKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlKAorICAgIGNoYXIgY29uc3QgKiBuYW1lLAorICAgIGNoYXIgY29uc3QgKiB2YWx1ZQorKSB7CisKKyAgICAvLyBPbiBXaW5kb3dzKiBPUyB0aGVyZSBhcmUgc29tZSBuYW1lbGVzcyB2YXJpYWJsZXMgbGlrZSAiQzo9QzpcIiAoeWVhaCwgcmVhbGx5IG5hbWVsZXNzLCB0aGV5IGFyZQorICAgIC8vIHByZXNlbnRlZCBpbiBlbnZpcm9ubWVudCBibG9jayBhcyAiPUM6PUNcXFx4MDA9RDo9RDpcXFx4MDAuLi4iLCBzbyBsZXQgdXMgc2tpcCB0aGVtLgorICAgIGlmICggbmFtZVsgMCBdID09IDAgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBrbXBfc2V0dGluZ190ICogc2V0dGluZyA9IF9fa21wX3N0Z19maW5kKCBuYW1lICk7CisgICAgICAgIGlmICggc2V0dGluZyAhPSBOVUxMICkgeworICAgICAgICAgICAgc2V0dGluZy0+cGFyc2UoIG5hbWUsIHZhbHVlLCBzZXR0aW5nLT5kYXRhICk7CisgICAgICAgICAgICBzZXR0aW5nLT5kZWZpbmVkID0gMTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorCit9IC8vIF9fa21wX3N0Z19wYXJzZQorCisKK3N0YXRpYyBpbnQKK19fa21wX3N0Z19jaGVja19yaXZhbHMoICAgICAgICAgIC8vIDAgLS0gT2ssIDEgLS0gZXJyb3JzIGZvdW5kLgorICAgIGNoYXIgY29uc3QgKiAgICAgICBuYW1lLCAgICAgLy8gTmFtZSBvZiB2YXJpYWJsZS4KKyAgICBjaGFyIGNvbnN0ICogICAgICAgdmFsdWUsICAgIC8vIFZhbHVlIG9mIHRoZSB2YXJpYWJsZS4KKyAgICBrbXBfc2V0dGluZ190ICogKiAgcml2YWxzICAgIC8vIExpc3Qgb2Ygcml2YWwgc2V0dGluZ3MgKHRoZSBsaXN0IG11c3QgaW5jbHVkZSBjdXJyZW50IG9uZSkuCispIHsKKworICAgIGlmICggcml2YWxzID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIExvb3AgdGhydSBoaWdoZXIgcHJpb3JpdHkgc2V0dGluZ3MgKGxpc3RlZCBiZWZvcmUgY3VycmVudCkuCisgICAgaW50IGkgPSAwOworICAgIGZvciAoIDsgc3RyY21wKCByaXZhbHNbIGkgXS0+bmFtZSwgbmFtZSApICE9IDA7IGkrKyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcml2YWxzWyBpIF0gIT0gTlVMTCApOworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBpZiAoIHJpdmFsc1sgaSBdID09IF9fa21wX2FmZmluaXR5X25vdHlwZSApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiBLTVBfQUZGSU5JVFkgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYSB0eXBlIG5hbWUsCisgICAgICAgICAgICAvLyBpdCBkb2VzIG5vdCByaXZhbCBPTVBfUFJPQ19CSU5EIG9yIEdPTVBfQ1BVX0FGRklOSVRZLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAoIHJpdmFsc1sgaSBdLT5zZXQgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3RnSWdub3JlZCwgbmFtZSwgcml2YWxzWyBpIF0tPm5hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIHdoaWxlCisKKyAgICArKyBpOyAvLyBTa2lwIGN1cnJlbnQgc2V0dGluZy4KKyAgICByZXR1cm4gMDsKKworfTsgLy8gX19rbXBfc3RnX2NoZWNrX3JpdmFscworCisKK3N0YXRpYyBpbnQKK19fa21wX2Vudl90b1ByaW50KCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IGZsYWcgKSB7CisgICAgaW50IHJjID0gMDsKKyAgICBrbXBfc2V0dGluZ190ICogc2V0dGluZyA9IF9fa21wX3N0Z19maW5kKCBuYW1lICk7CisgICAgaWYgKCBzZXR0aW5nICE9IE5VTEwgKSB7CisgICAgICAgIHJjID0gc2V0dGluZy0+ZGVmaW5lZDsKKyAgICAgICAgaWYgKCBmbGFnID49IDAgKSB7CisgICAgICAgICAgICBzZXR0aW5nLT5kZWZpbmVkID0gZmxhZzsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZAorX19rbXBfYXV4X2Vudl9pbml0aWFsaXplKCBrbXBfZW52X2Jsa190KiBibG9jayApIHsKKworICAgIGNoYXIgY29uc3QgKiB2YWx1ZTsKKworICAgIC8qIE9NUF9OVU1fVEhSRUFEUyAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiT01QX05VTV9USFJFQURTIiApOworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIG9tcGNfc2V0X251bV90aHJlYWRzKCBfX2ttcF9kZmx0X3RlYW1fbnRoICk7CisgICAgfQorCisgICAgLyogS01QX0JMT0NLVElNRSAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiS01QX0JMT0NLVElNRSIgKTsKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBrbXBjX3NldF9ibG9ja3RpbWUoIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7CisgICAgfQorCisgICAgLyogT01QX05FU1RFRCAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiT01QX05FU1RFRCIgKTsKKyAgICBpZiAoIHZhbHVlICkgeworICAgICAgICBvbXBjX3NldF9uZXN0ZWQoIF9fa21wX2RmbHRfbmVzdGVkICk7CisgICAgfQorCisgICAgLyogT01QX0RZTkFNSUMgKi8KKyAgICB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCBibG9jaywgIk9NUF9EWU5BTUlDIiApOworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYyApOworICAgIH0KKworfQorCit2b2lkCitfX2ttcF9lbnZfaW5pdGlhbGl6ZSggY2hhciBjb25zdCAqIHN0cmluZyApIHsKKworICAgIGttcF9lbnZfYmxrX3QgYmxvY2s7CisgICAgaW50ICAgICAgICAgICBpOworCisgICAgX19rbXBfc3RnX2luaXQoKTsKKworICAgIC8vIEhhY2shISEKKyAgICBpZiAoIHN0cmluZyA9PSBOVUxMICkgeworICAgICAgICAvLyBfX2ttcF9tYXhfbnRoID0gX19rbXBfc3lzX21heF9udGg7CisgICAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSBfX2ttcF9pbml0aWFsX3RocmVhZHNfY2FwYWNpdHkoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgc3RyaW5nICk7CisKKyAgICAvLworICAgIC8vIHVwZGF0ZSB0aGUgc2V0IGZsYWcgb24gYWxsIGVudHJpZXMgdGhhdCBoYXZlIGFuIGVudiB2YXIKKyAgICAvLworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsrIGkgKSB7CisgICAgICAgIGlmICgoIGJsb2NrLnZhcnNbIGkgXS5uYW1lID09IE5VTEwgKQorICAgICAgICAgIHx8ICggKmJsb2NrLnZhcnNbIGkgXS5uYW1lID09ICdcMCcpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGJsb2NrLnZhcnNbIGkgXS52YWx1ZSA9PSBOVUxMICkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAga21wX3NldHRpbmdfdCAqIHNldHRpbmcgPSBfX2ttcF9zdGdfZmluZCggYmxvY2sudmFyc1sgaSBdLm5hbWUgKTsKKyAgICAgICAgaWYgKCBzZXR0aW5nICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzZXR0aW5nLT5zZXQgPSAxOworICAgICAgICB9CisgICAgfTsgLy8gZm9yIGkKKworICAgIC8vIFdlIG5lZWQgdG8ga25vdyBpZiBibG9ja3RpbWUgd2FzIHNldCB3aGVuIHByb2Nlc3NpbmcgT01QX1dBSVRfUE9MSUNZCisgICAgYmxvY2t0aW1lX3N0ciA9IF9fa21wX2Vudl9ibGtfdmFyKCAmIGJsb2NrLCAiS01QX0JMT0NLVElNRSIgKTsKKworICAgIC8vIFNwZWNpYWwgY2FzZS4gSWYgd2UgcGFyc2UgZW52aXJvbm1lbnQsIG5vdCBhIHN0cmluZywgcHJvY2VzcyBLTVBfV0FSTklOR1MgZmlyc3QuCisgICAgaWYgKCBzdHJpbmcgPT0gTlVMTCApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIG5hbWUgID0gIktNUF9XQVJOSU5HUyI7CisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IF9fa21wX2Vudl9ibGtfdmFyKCAmIGJsb2NrLCBuYW1lICk7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZSggbmFtZSwgdmFsdWUgKTsKKyAgICB9OyAvLyBpZgorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIC8vCisgICAgLy8gU3BlY2lhbCBjYXNlLiBLTVBfQUZGSU5JVFkgaXMgbm90IGEgcml2YWwgdG8gb3RoZXIgYWZmaW5pdHkgZW52IHZhcnMKKyAgICAvLyBpZiBubyBhZmZpbml0eSB0eXBlIGlzIHNwZWNpZmllZC4gIFdlIHdhbnQgdG8gYWxsb3cKKyAgICAvLyBLTVBfQUZGSU5JVFk9W25vXSx2ZXJib3NlL1tub113YXJuaW5ncy9ldGMuICB0byBiZSBlbmFibGVkIHdoZW4KKyAgICAvLyBzcGVjaWZ5aW5nIHRoZSBhZmZpbml0eSB0eXBlIHZpYSBHT01QX0NQVV9BRkZJTklUWSBvciB0aGUgT01QIDQuMAorICAgIC8vIGFmZmluaXR5IG1lY2hhbmlzbS4KKyAgICAvLworICAgIF9fa21wX2FmZmluaXR5X25vdHlwZSA9IE5VTEw7CisgICAgY2hhciBjb25zdCAqYWZmX3N0ciA9IF9fa21wX2Vudl9ibGtfdmFyKCAmIGJsb2NrLCAiS01QX0FGRklOSVRZIiApOworICAgIGlmICggYWZmX3N0ciAhPSBOVUxMICkgeworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBpZiB0aGUgS01QX0FGRklOSVRZIHR5cGUgaXMgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcuCisgICAgICAgIC8vIFdlIGp1c3Qgc2VhcmNoIHRoZSBzdHJpbmcgZm9yICJjb21wYWN0IiwgInNjYXR0ZXIiLCBldGMuCisgICAgICAgIC8vIHdpdGhvdXQgcmVhbGx5IHBhcnNpbmcgdGhlIHN0cmluZy4gIFRoZSBzeW50YXggb2YgdGhlCisgICAgICAgIC8vIEtNUF9BRkZJTklUWSBlbnYgdmFyIGlzIHN1Y2ggdGhhdCBub25lIG9mIHRoZSBhZmZpbml0eQorICAgICAgICAvLyB0eXBlIG5hbWVzIGNhbiBhcHBlYXIgYW55d2hlcmUgb3RoZXIgdGhhdCB0aGUgdHlwZQorICAgICAgICAvLyBzcGVjaWZpZXIsIGV2ZW4gYXMgc3Vic3RyaW5ncy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSSBjYW4ndCBmaW5kIGEgY2FzZS1pbnNlbnNpdGl2ZSB2ZXJzaW9uIG9mIHN0cnN0ciBvbiBXaW5kb3dzKiBPUy4KKyAgICAgICAgLy8gVXNlIHRoZSBjYXNlLXNlbnNpdGl2ZSB2ZXJzaW9uIGZvciBub3cuCisgICAgICAgIC8vCisKKyMgaWYgS01QX09TX1dJTkRPV1MKKyMgIGRlZmluZSBGSU5EIHN0cnN0cgorIyBlbHNlCisjICBkZWZpbmUgRklORCBzdHJjYXNlc3RyCisjIGVuZGlmCisKKyAgICAgICAgaWYgKCAoIEZJTkQoIGFmZl9zdHIsICJub25lIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgInBoeXNpY2FsIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImxvZ2ljYWwiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiY29tcGFjdCIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJzY2F0dGVyIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImV4cGxpY2l0IiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImJhbGFuY2VkIiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgImRpc2FibGVkIiApID09IE5VTEwgKSApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X25vdHlwZSA9IF9fa21wX3N0Z19maW5kKCAiS01QX0FGRklOSVRZIiAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBIG5ldyBhZmZpbml0eSB0eXBlIGlzIHNwZWNpZmllZC4KKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBhZmZpbml0eSBmbGFncyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcywKKyAgICAgICAgICAgIC8vIGluIGNhc2UgdGhpcyBpcyBjYWxsZWQgZnJvbSBrbXBfc2V0X2RlZmF1bHRzKCkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2RlZmF1bHQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IGFmZmluaXR5X3Jlc3BlY3RfbWFza19kZWZhdWx0OworICAgICAgICB9CisjIHVuZGVmIEZJTkQKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIC8vCisgICAgICAgIC8vIEFsc28gcmVzZXQgdGhlIGFmZmluaXR5IGZsYWdzIGlmIE9NUF9QUk9DX0JJTkQgaXMgc3BlY2lmaWVkLgorICAgICAgICAvLworICAgICAgICBhZmZfc3RyID0gX19rbXBfZW52X2Jsa192YXIoICYgYmxvY2ssICJPTVBfUFJPQ19CSU5EIiApOworICAgICAgICBpZiAoIGFmZl9zdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kZWZhdWx0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZGVmYXVsdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdDsKKyAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgfQorCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvLworICAgIC8vIFNldCB1cCB0aGUgbmVzdGVkIHByb2MgYmluZCB0eXBlIHZlY3Rvci4KKyAgICAvLworICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9IChrbXBfcHJvY19iaW5kX3QgKikKKyAgICAgICAgICBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplb2Yoa21wX3Byb2NfYmluZF90KSApOworICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuc2l6ZSA9IDE7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2RlZmF1bHQ7CisjIGVsc2UKKyAgICAgICAgLy8gZGVmYXVsdCBwcm9jIGJpbmQgaXMgZmFsc2UgaWYgYWZmaW5pdHkgbm90IHN1cHBvcnRlZAorICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisjIGVuZGlmCisKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIC8vCisgICAgLy8gTm93IHByb2Nlc3MgYWxsIG9mIHRoZSBzZXR0aW5ncy4KKyAgICAvLworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsrIGkgKSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZSggYmxvY2sudmFyc1sgaSBdLm5hbWUsIGJsb2NrLnZhcnNbIGkgXS52YWx1ZSApOworICAgIH07IC8vIGZvciBpCisKKyAgICAvLworICAgIC8vIElmIHVzZXIgbG9ja3MgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQsIGRvbid0IHJlc2V0IHRoZSBsb2NrIHZwdHIgdGFibGUuCisgICAgLy8KKyAgICBpZiAoICEgX19rbXBfaW5pdF91c2VyX2xvY2tzICkgeworICAgICAgICBpZiAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2RlZmF1bHQgKSB7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3F1ZXVpbmc7CisgICAgICAgIH0KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICAgICBfX2ttcF9pbml0X2R5bmFtaWNfdXNlcl9sb2NrcygpOworI2Vsc2UKKyAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja192cHRycyggX19rbXBfdXNlcl9sb2NrX2tpbmQgKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc3RyaW5nICE9IE5VTEwpOyAvLyBrbXBfc2V0X2RlZmF1bHRzKCkgd2FzIGNhbGxlZAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF91c2VyX2xvY2tfa2luZCAhPSBsa19kZWZhdWx0ICk7CisgICAgICAgIC8vIEJpbmRzIGxvY2sgZnVuY3Rpb25zIGFnYWluIHRvIGZvbGxvdyB0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIGRpZmZlcmVudAorICAgICAgICAvLyBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sgdmFsdWVzLiBDYWxsaW5nIHRoaXMgYWdhaW4gaXMgaGFybWxlc3MgYXMgbG9uZworICAgICAgICAvLyBhcyB3ZSBkbyBub3QgYWxsb3cgbG9jayBraW5kIGNoYW5nZXMgYWZ0ZXIgbWFraW5nIGEgY2FsbCB0byBhbnkKKyAgICAgICAgLy8gdXNlciBsb2NrIGZ1bmN0aW9ucyAodHJ1ZSkuCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgX19rbXBfaW5pdF9keW5hbWljX3VzZXJfbG9ja3MoKTsKKyNlbHNlCisgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfdnB0cnMoIF9fa21wX3VzZXJfbG9ja19raW5kICk7CisjZW5kaWYKKyAgICB9CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKyAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAvLworICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIG1hY2hpbmUvT1MgaXMgYWN0dWFsbHkgY2FwYWJsZSBvZiBzdXBwb3J0aW5nCisgICAgICAgIC8vIGFmZmluaXR5LgorICAgICAgICAvLworICAgICAgICBjb25zdCBjaGFyICp2YXIgPSAiS01QX0FGRklOSVRZIjsKKyAgICAgICAgS01QQWZmaW5pdHk6OnBpY2tfYXBpKCk7CisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZCApIHsKKyAgICAgICAgICAgIEtNUF9BRkZJTklUWV9ESVNBQkxFKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5kZXRlcm1pbmVfY2FwYWJsZSh2YXIpOworICAgICAgICAgICAgaWYgKCAhIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8ICggX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0ICkKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lICkKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCApICkgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb3RTdXBwb3J0ZWQsIHZhciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gMDsKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkICkgIHsKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF90cnVlICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE9NUF9QUk9DX0JJTkQ9dHJ1ZSBtYXBzIHRvIE9NUF9QUk9DX0JJTkQ9c3ByZWFkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9zcHJlYWQ7CisgICAgICAgIH0KKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgICAgICBpZiAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIFdpbiA2NCBncm91cCBhZmZpbml0eSBzdHVmZiBpZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgICAgICAgICAgIC8vIHByb2Nlc3NvciBncm91cHMsIG9yIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpdCwgYW5kIE9NUCA0LjAKKyAgICAgICAgICAgIC8vIGFmZmluaXR5IGlzIG5vdCBpbiBlZmZlY3QuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAoICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSApCisgICAgICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0ICkKKyMgIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9kZWZhdWx0ICkgKQorIyAgZW5kaWYKKyAgICAgICAgICAgICAgfHwgKCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXAgKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9PSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyMgIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgIGVuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2dyb3VwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZ3JvdXAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICggX19rbXBfYWZmaW5pdHlfZ3JhbiAhPSBhZmZpbml0eV9ncmFuX2dyb3VwICkKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl9maW5lICkKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBfX2ttcF9hZmZpbml0eV9ncmFuICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9jb3JlOiBzdHIgPSAiY29yZSI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOiBzdHIgPSAicGFja2FnZSI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9ub2RlOiBzdHIgPSAibm9kZSI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZHcmFuVG9wR3JvdXAsIHZhciwgc3RyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2dyb3VwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIF9fa21wX2FmZmluaXR5X3R5cGUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDogc3RyID0gInBoeXNpY2FsIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9sb2dpY2FsOiBzdHIgPSAibG9naWNhbCI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDogc3RyID0gImNvbXBhY3QiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6IHN0ciA9ICJzY2F0dGVyIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9leHBsaWNpdDogc3RyID0gImV4cGxpY2l0IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gTUlDIG9uIHdpbmRvd3MsIHNvIG5vIGFmZmluaXR5X2JhbGFuY2VkIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmR3Jhbkdyb3VwVHlwZSwgdmFyLCBzdHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9PSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdCApIHsKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgaWYgKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfaW50ZWwgKQorICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gIT0gcHJvY19iaW5kX2RlZmF1bHQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQgKSB7CisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKKyAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX21pY190eXBlICE9IG5vbl9taWMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9taWNfdHlwZSAhPSBub25fbWljICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X3NjYXR0ZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkKKyAgICAgICAgICAgICAgICAgICYmICAoIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCApICkgeworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfbWljX3R5cGUgIT0gbm9uX21pYyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfdHlwZSAgICAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV90eXBlICAgICAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X2NvbXBhY3QgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfY29tcGFjdCAgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV9vZmZzZXQgICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X29mZnNldCAgICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV92ZXJib3NlICAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfZ3JhbiAgICAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9ncmFuICAgICAgICAgKSApOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfZGVmYXVsdCApOworIyBlbmRpZgorICAgIH0KKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgIGlmICggX19rbXBfdmVyc2lvbiApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdmVyc2lvbl8xKCk7CisgICAgfTsgLy8gaWYKKworICAgIC8vIFBvc3QtaW5pdGlhbGl6YXRpb24gc3RlcDogc29tZSBlbnYuIHZhcnMgbmVlZCB0aGVpciB2YWx1ZSdzIGZ1cnRoZXIgcHJvY2Vzc2luZworICAgIGlmICggc3RyaW5nICE9IE5VTEwpIHsgLy8ga21wX3NldF9kZWZhdWx0cygpIHdhcyBjYWxsZWQKKyAgICAgICAgX19rbXBfYXV4X2Vudl9pbml0aWFsaXplKCAmYmxvY2sgKTsKKyAgICB9CisKKyAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoICYgYmxvY2sgKTsKKworICAgIEtNUF9NQigpOworCit9IC8vIF9fa21wX2Vudl9pbml0aWFsaXplCisKKwordm9pZAorX19rbXBfZW52X3ByaW50KCkgeworCisgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICBpbnQgICAgICAgICAgIGk7CisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisKKyAgICBfX2ttcF9zdGdfaW5pdCgpOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgTlVMTCApOworICAgIF9fa21wX2Vudl9ibGtfc29ydCggJiBibG9jayApOworCisgICAgLy8gUHJpbnQgcmVhbCBlbnZpcm9ubWVudCB2YWx1ZXMuCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiVzXG5cbiIsIEtNUF9JMThOX1NUUiggVXNlclNldHRpbmdzICkgICk7CisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgY2hhciBjb25zdCAqIG5hbWUgID0gYmxvY2sudmFyc1sgaSBdLm5hbWU7CisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IGJsb2NrLnZhcnNbIGkgXS52YWx1ZTsKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgKCBLTVBfU1RSTEVOKCBuYW1lICkgPiA0ICYmIHN0cm5jbXAoIG5hbWUsICJLTVBfIiwgNCApID09IDAgKQorICAgICAgICAgICAgfHwgc3RybmNtcCggbmFtZSwgIk9NUF8iLCA0ICkgPT0gMAorICAgICAgICAgICAgI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgICAgIHx8IHN0cm5jbXAoIG5hbWUsICJHT01QXyIsIDUgKSA9PSAwCisgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0dPTVBfQ09NUEFUCisgICAgICAgICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIgICAlcz0lc1xuIiwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIlxuIiApOworCisgICAgLy8gUHJpbnQgaW50ZXJuYWwgKGVmZmVjdGl2ZSkgc2V0dGluZ3MuCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuXG4iLCBLTVBfSTE4Tl9TVFIoIEVmZmVjdGl2ZVNldHRpbmdzICkgKTsKKyAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfX2ttcF9zdGdfY291bnQ7ICsrIGkgKSB7CisgICAgICAgIGlmICggIF9fa21wX3N0Z190YWJsZVsgaSBdLnByaW50ICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfdGFibGVbIGkgXS5wcmludCggJiBidWZmZXIsIF9fa21wX3N0Z190YWJsZVsgaSBdLm5hbWUsIF9fa21wX3N0Z190YWJsZVsgaSBdLmRhdGEgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworCisgICAgX19rbXBfZW52X2Jsa19mcmVlKCAmIGJsb2NrICk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCit9IC8vIF9fa21wX2Vudl9wcmludAorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAordm9pZAorX19rbXBfZW52X3ByaW50XzIoKSB7CisKKyAgICBrbXBfZW52X2Jsa190IGJsb2NrOworICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworCisgICAgX19rbXBfZW52X2Zvcm1hdCA9IDE7CisKKyAgICBfX2ttcF9zdGdfaW5pdCgpOworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfaW5pdCggJiBibG9jaywgTlVMTCApOworICAgIF9fa21wX2Vudl9ibGtfc29ydCggJiBibG9jayApOworCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiVzXG4iLCBLTVBfSTE4Tl9TVFIoIERpc3BsYXlFbnZCZWdpbiApICApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgX09QRU5NUD0nJWQnXG4iLCBfX2ttcF9vcGVubXBfdmVyc2lvbiApOworCisgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICBpZiAoICBfX2ttcF9zdGdfdGFibGVbIGkgXS5wcmludCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICggKCBfX2ttcF9kaXNwbGF5X2VudiAmJiBzdHJuY21wKCBfX2ttcF9zdGdfdGFibGVbIGkgXS5uYW1lLCAiT01QXyIsIDQgKSA9PSAwICkgfHwgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSApICkgeworICAgICAgICAgICAgX19rbXBfc3RnX3RhYmxlWyBpIF0ucHJpbnQoICYgYnVmZmVyLCBfX2ttcF9zdGdfdGFibGVbIGkgXS5uYW1lLCBfX2ttcF9zdGdfdGFibGVbIGkgXS5kYXRhICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gZm9yCisKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCBLTVBfSTE4Tl9TVFIoIERpc3BsYXlFbnZFbmQgKSAgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIlxuIiApOworCisgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisKKyAgICBfX2ttcF9lbnZfYmxrX2ZyZWUoICYgYmxvY2sgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7CisKK30gLy8gX19rbXBfZW52X3ByaW50XzIKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisvLyBlbmQgb2YgZmlsZQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmggYi9yYzMvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzMmU2MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuaApAQCAtMCwwICsxLDUwIEBACisvKgorICoga21wX3NldHRpbmdzLmggLS0gSW5pdGlhbGl6ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfU0VUVElOR1NfSAorI2RlZmluZSBLTVBfU0VUVElOR1NfSAorCit2b2lkIF9fa21wX3Jlc2V0X2dsb2JhbF92YXJzKCB2b2lkICk7Cit2b2lkIF9fa21wX2Vudl9pbml0aWFsaXplKCBjaGFyIGNvbnN0ICogKTsKK3ZvaWQgX19rbXBfZW52X3ByaW50KCk7CisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQgX19rbXBfZW52X3ByaW50XzIoKTsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCitpbnQgX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBpbnQgcmVxX25wcm9jICk7Cit2b2lkIF9fa21wX2luaXRfZGZsdF90ZWFtX250aCgpOworaW50IF9fa21wX2NvbnZlcnRfdG9fbWlsbGlzZWNvbmRzKCBjaGFyIGNvbnN0ICogKTsKK2ludCBfX2ttcF9kZWZhdWx0X3RwX2NhcGFjaXR5KCBpbnQsIGludCwgaW50KTsKKworI2lmIEtNUF9NSUMKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfTkFNRSAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUgKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKHgpICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCB4ICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfQk9PTCAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSA/ICJUUlVFIiA6ICJGQUxTRSIgKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfSU5UICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclZCdcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1VJTlQ2NCAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJSIgS01QX1VJTlQ2NF9TUEVDICInXG4iLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSwgdmFsdWUgKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfU1RSICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCB2YWx1ZSApCisjZWxzZQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXMiLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUgKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKHgpICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyIsIEtNUF9JMThOX1NUUihIb3N0KSwgeCApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0JPT0wgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlID8gIlRSVUUiIDogIkZBTFNFIiApOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9JTlQgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVkJ1xuIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lLCB2YWx1ZSApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1VJTlQ2NCAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJSIgS01QX1VJTlQ2NF9TUEVDICInXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlICk7CisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1NUUiAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlICkKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1NFVFRJTkdTX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX3N0YXRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWUyNWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5jcHAKQEAgLTAsMCArMSw3MjMgQEAKKy8qKiBAZmlsZSBrbXBfc3RhdHMuY3BwCisgKiBTdGF0aXN0aWNzIGdhdGhlcmluZyBhbmQgcHJvY2Vzc2luZy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYXRleGl0CisjaW5jbHVkZSA8Y3RpbWU+CisKKyNkZWZpbmUgU1RSSU5HSVpFMih4KSAjeAorI2RlZmluZSBTVFJJTkdJWkUoeCkgU1RSSU5HSVpFMih4KQorCisjZGVmaW5lIGV4cGFuZE5hbWUobmFtZSxmbGFncyxpZ25vcmUpICB7U1RSSU5HSVpFKG5hbWUpLGZsYWdzfSwKK3N0YXRJbmZvIHRpbWVTdGF0Ojp0aW1lckluZm9bXSA9IHsKKyAgICBLTVBfRk9SRUFDSF9USU1FUihleHBhbmROYW1lLDApCisgICAgeyJUSU1FUl9MQVNUIiwgMH0KK307Citjb25zdCBzdGF0SW5mbyBjb3VudGVyOjpjb3VudGVySW5mb1tdID0geworICAgIEtNUF9GT1JFQUNIX0NPVU5URVIoZXhwYW5kTmFtZSwwKQorICAgIHsiQ09VTlRFUl9MQVNUIiwgMH0KK307CisjdW5kZWYgZXhwYW5kTmFtZQorCisjZGVmaW5lIGV4cGFuZE5hbWUoaWdub3JlMSxpZ25vcmUyLGlnbm9yZTMpICB7MC4wLDAuMCwwLjB9LAora21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnJnYl9jb2xvciBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6dGltZXJDb2xvckluZm9bXSA9IHsKKyAgICBLTVBfRk9SRUFDSF9USU1FUihleHBhbmROYW1lLDApCisgICAgezAuMCwwLjAsMC4wfQorfTsKKyN1bmRlZiBleHBhbmROYW1lCisKK2NvbnN0IGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpyZ2JfY29sb3Iga21wX3N0YXRzX291dHB1dF9tb2R1bGU6Omdsb2JhbENvbG9yQXJyYXlbXSA9IHsKKyAgICB7MS4wLCAwLjAsIDAuMH0sIC8vIHJlZAorICAgIHsxLjAsIDAuNiwgMC4wfSwgLy8gb3JhbmdlCisgICAgezEuMCwgMS4wLCAwLjB9LCAvLyB5ZWxsb3cKKyAgICB7MC4wLCAxLjAsIDAuMH0sIC8vIGdyZWVuCisgICAgezAuMCwgMC4wLCAxLjB9LCAvLyBibHVlCisgICAgezAuNiwgMC4yLCAwLjh9LCAvLyBwdXJwbGUKKyAgICB7MS4wLCAwLjAsIDEuMH0sIC8vIG1hZ2VudGEKKyAgICB7MC4wLCAwLjQsIDAuMn0sIC8vIGRhcmsgZ3JlZW4KKyAgICB7MS4wLCAxLjAsIDAuNn0sIC8vIGxpZ2h0IHllbGxvdworICAgIHswLjYsIDAuNCwgMC42fSwgLy8gZGlydHkgcHVycGxlCisgICAgezAuMCwgMS4wLCAxLjB9LCAvLyBjeWFuCisgICAgezEuMCwgMC40LCAwLjh9LCAvLyBwaW5rCisgICAgezAuNSwgMC41LCAwLjV9LCAvLyBncmV5CisgICAgezAuOCwgMC43LCAwLjV9LCAvLyBicm93bgorICAgIHswLjYsIDAuNiwgMS4wfSwgLy8gbGlnaHQgYmx1ZQorICAgIHsxLjAsIDAuNywgMC41fSwgLy8gcGVhY2gKKyAgICB7MC44LCAwLjUsIDEuMH0sIC8vIGxhdmVuZGVyCisgICAgezAuNiwgMC4wLCAwLjB9LCAvLyBkYXJrIHJlZAorICAgIHswLjcsIDAuNiwgMC4wfSwgLy8gZ29sZAorICAgIHswLjAsIDAuMCwgMC4wfSAgLy8gYmxhY2sKK307CisKKy8vIEVuc3VyZSB0aGF0IHRoZSBhdGV4aXQgaGFuZGxlciBvbmx5IHJ1bnMgb25jZS4KK3N0YXRpYyB1aW50MzJfdCBzdGF0c1ByaW50ZWQgPSAwOworCisvLyBvdXRwdXQgaW50ZXJmYWNlCitzdGF0aWMga21wX3N0YXRzX291dHB1dF9tb2R1bGUqIF9fa21wX3N0YXRzX2dsb2JhbF9vdXRwdXQgPSBOVUxMOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKiogc3RhdGlzdGljIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCit2b2lkIHN0YXRpc3RpYzo6YWRkU2FtcGxlKGRvdWJsZSBzYW1wbGUpCit7CisgICAgZG91YmxlIGRlbHRhID0gc2FtcGxlIC0gbWVhblZhbDsKKworICAgIHNhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQgKyAxOworICAgIG1lYW5WYWwgICAgID0gbWVhblZhbCArIGRlbHRhL3NhbXBsZUNvdW50OworICAgIG0yICAgICAgICAgID0gbTIgKyBkZWx0YSooc2FtcGxlIC0gbWVhblZhbCk7CisKKyAgICBtaW5WYWwgPSBzdGQ6Om1pbihtaW5WYWwsIHNhbXBsZSk7CisgICAgbWF4VmFsID0gc3RkOjptYXgobWF4VmFsLCBzYW1wbGUpOworfQorCitzdGF0aXN0aWMgJiBzdGF0aXN0aWM6Om9wZXJhdG9yKz0gKGNvbnN0IHN0YXRpc3RpYyAmIG90aGVyKQoreworICAgIGlmIChzYW1wbGVDb3VudCA9PSAwKQorICAgIHsKKyAgICAgICAgKnRoaXMgPSBvdGhlcjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHVpbnQ2NF90IG5ld1NhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQgKyBvdGhlci5zYW1wbGVDb3VudDsKKyAgICBkb3VibGUgZG5zYyAgPSBkb3VibGUobmV3U2FtcGxlQ291bnQpOworICAgIGRvdWJsZSBkc2MgICA9IGRvdWJsZShzYW1wbGVDb3VudCk7CisgICAgZG91YmxlIGRzY0J5ZG5zYyA9IGRzYy9kbnNjOworICAgIGRvdWJsZSBkb3NjICA9IGRvdWJsZShvdGhlci5zYW1wbGVDb3VudCk7CisgICAgZG91YmxlIGRlbHRhID0gb3RoZXIubWVhblZhbCAtIG1lYW5WYWw7CisKKyAgICAvLyBUcnkgdG8gb3JkZXIgdGhlc2UgY2FsY3VsYXRpb25zIHRvIGF2b2lkIG92ZXJmbG93cy4KKyAgICAvLyBJZiB0aGlzIHdlcmUgRm9ydHJhbiwgdGhlbiB0aGUgY29tcGlsZXIgd291bGQgbm90IGJlIGFibGUgdG8gcmUtb3JkZXIgb3ZlciBicmFja2V0cy4KKyAgICAvLyBJbiBDKysgaXQgbWF5IGJlIGxlZ2FsIHRvIGRvIHRoYXQgKHdlIGNlcnRhaW5seSBob3BlIGl0IGRvZXNuJ3QsIGFuZCBDQysgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgMm5kIGVkaXRpb24KKyAgICAvLyBzdWdnZXN0cyBpdCBzaG91bGRuJ3QsIHNpbmNlIGl0IHNheXMgdGhhdCBleHBsb2l0YXRpb24gb2YgYXNzb2NpYXRpdml0eSBjYW4gb25seSBiZSBtYWRlIGlmIHRoZSBvcGVyYXRpb24KKyAgICAvLyByZWFsbHkgaXMgYXNzb2NpYXRpdmUgKHdoaWNoIGZsb2F0aW5nIGFkZGl0aW9uIGlzbid0Li4uKSkuCisgICAgbWVhblZhbCAgICAgPSBtZWFuVmFsKmRzY0J5ZG5zYyArIG90aGVyLm1lYW5WYWwqKDEtZHNjQnlkbnNjKTsKKyAgICBtMiAgICAgICAgICA9IG0yICsgb3RoZXIubTIgKyBkc2NCeWRuc2MqZG9zYypkZWx0YSpkZWx0YTsKKyAgICBtaW5WYWwgICAgICA9IHN0ZDo6bWluIChtaW5WYWwsIG90aGVyLm1pblZhbCk7CisgICAgbWF4VmFsICAgICAgPSBzdGQ6Om1heCAobWF4VmFsLCBvdGhlci5tYXhWYWwpOworICAgIHNhbXBsZUNvdW50ID0gbmV3U2FtcGxlQ291bnQ7CisKKworICAgIHJldHVybiAqdGhpczsKK30KKwordm9pZCBzdGF0aXN0aWM6OnNjYWxlKGRvdWJsZSBmYWN0b3IpCit7CisgICAgbWluVmFsID0gbWluVmFsKmZhY3RvcjsKKyAgICBtYXhWYWwgPSBtYXhWYWwqZmFjdG9yOworICAgIG1lYW5WYWw9IG1lYW5WYWwqZmFjdG9yOworICAgIG0yICAgICA9IG0yKmZhY3RvcipmYWN0b3I7CisgICAgcmV0dXJuOworfQorCitzdGQ6OnN0cmluZyBzdGF0aXN0aWM6OmZvcm1hdChjaGFyIHVuaXQsIGJvb2wgdG90YWwpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gZm9ybWF0U0koc2FtcGxlQ291bnQsOSwnICcpOworCisgICAgaWYgKHNhbXBsZUNvdW50ID09IDApCisgICAgeworICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKDAuMCwgOSwgdW5pdCk7CisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0koMC4wLCA5LCB1bml0KTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSSgwLjAsIDksIHVuaXQpOworICAgICAgICBpZiAodG90YWwpCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKDAuMCwgOSwgdW5pdCk7CisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0koMC4wLCA5LCB1bml0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtaW5WYWwsICA5LCB1bml0KTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtZWFuVmFsLCA5LCB1bml0KTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtYXhWYWwsICA5LCB1bml0KTsKKyAgICAgICAgaWYgKHRvdGFsKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtZWFuVmFsKnNhbXBsZUNvdW50LCA5LCB1bml0KTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShnZXRTRCgpLCA5LCB1bml0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiBleHBsaWNpdFRpbWVyIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCit2b2lkIGV4cGxpY2l0VGltZXI6OnN0YXJ0KHRpbWVyX2UgdGltZXJFbnVtVmFsdWUpIHsKKyAgICBzdGFydFRpbWUgPSB0c2NfdGlja19jb3VudDo6bm93KCk7CisgICAgdG90YWxQYXVzZVRpbWUgPSAwOworICAgIGlmKHRpbWVTdGF0Ojpsb2dFdmVudCh0aW1lckVudW1WYWx1ZSkpIHsKKyAgICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+aW5jcmVtZW50TmVzdFZhbHVlKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBleHBsaWNpdFRpbWVyOjpzdG9wKHRpbWVyX2UgdGltZXJFbnVtVmFsdWUsIGttcF9zdGF0c19saXN0KiBzdGF0c19wdHIgLyogPSBudWxscHRyICovKSB7CisgICAgaWYgKHN0YXJ0VGltZS5nZXRWYWx1ZSgpID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIHRzY190aWNrX2NvdW50IGZpbmlzaFRpbWUgPSB0c2NfdGlja19jb3VudDo6bm93KCk7CisKKyAgICAvL3N0YXQtPmFkZFNhbXBsZSAoKHRzY190aWNrX2NvdW50Ojpub3coKSAtIHN0YXJ0VGltZSkudGlja3MoKSk7CisgICAgc3RhdC0+YWRkU2FtcGxlKCgoZmluaXNoVGltZSAtIHN0YXJ0VGltZSkgLSB0b3RhbFBhdXNlVGltZSkudGlja3MoKSk7CisKKyAgICBpZih0aW1lU3RhdDo6bG9nRXZlbnQodGltZXJFbnVtVmFsdWUpKSB7CisgICAgICAgIGlmKCFzdGF0c19wdHIpCisgICAgICAgICAgICBzdGF0c19wdHIgPSBfX2ttcF9zdGF0c190aHJlYWRfcHRyOworICAgICAgICBzdGF0c19wdHItPnB1c2hfZXZlbnQoc3RhcnRUaW1lLmdldFZhbHVlKCkgLSBfX2ttcF9zdGF0c19zdGFydF90aW1lLmdldFZhbHVlKCksIGZpbmlzaFRpbWUuZ2V0VmFsdWUoKSAtIF9fa21wX3N0YXRzX3N0YXJ0X3RpbWUuZ2V0VmFsdWUoKSwgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0TmVzdFZhbHVlKCksIHRpbWVyRW51bVZhbHVlKTsKKyAgICAgICAgc3RhdHNfcHRyLT5kZWNyZW1lbnROZXN0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKiBXZSBhY2NlcHQgdGhlIHJpc2sgdGhhdCB3ZSBkcm9wIGEgc2FtcGxlIGJlY2F1c2UgaXQgcmVhbGx5IGRpZCBzdGFydCBhdCB0PT0wLiAqLworICAgIHN0YXJ0VGltZSA9IDA7CisgICAgcmV0dXJuOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiBwYXJ0aXRpb25lZFRpbWVycyBtZW1iZXIgZnVuY3Rpb25zICoqKioqKioqKioqKiogKi8KK3BhcnRpdGlvbmVkVGltZXJzOjpwYXJ0aXRpb25lZFRpbWVycygpIHsKKyAgICB0aW1lcl9zdGFjay5yZXNlcnZlKDgpOworfQorCisvLyBhZGQgYSB0aW1lciB0byB0aGlzIGNvbGxlY3Rpb24gb2YgcGFydGl0aW9uZWQgdGltZXJzLgordm9pZCBwYXJ0aXRpb25lZFRpbWVyczo6YWRkX3RpbWVyKGV4cGxpY2l0X3RpbWVyX2UgdGltZXJfaW5kZXgsIGV4cGxpY2l0VGltZXIqIHRpbWVyX3BvaW50ZXIpIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKChpbnQpdGltZXJfaW5kZXggPCAoaW50KUVYUExJQ0lUX1RJTUVSX0xBU1QrMSk7CisgICAgdGltZXJzW3RpbWVyX2luZGV4XSA9IHRpbWVyX3BvaW50ZXI7Cit9CisKKy8vIGluaXRpYWxpemUgdGhlIHBhcml0aW9uZWQgdGltZXJzIHRvIGFuIGluaXRpYWwgdGltZXIKK3ZvaWQgcGFydGl0aW9uZWRUaW1lcnM6OmluaXQodGltZXJQYWlyIGluaXRfdGltZXJfcGFpcikgeworICAgIEtNUF9ERUJVR19BU1NFUlQodGhpcy0+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+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAga21wX3N0YXRzX2V2ZW50IGV2ID0gdGhlRXZlbnRzLT5hdChpKTsKKyAgICAgICAgcmdiX2NvbG9yIGNvbG9yID0gZ2V0RXZlbnRDb2xvcihldi5nZXRUaW1lck5hbWUoKSk7CisgICAgICAgIGZwcmludGYoZXZlbnRzT3V0LCAiJWQgJWx1ICVsdSAlMS4xZiByZ2IoJTEuMWYsJTEuMWYsJTEuMWYpICVzXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsCisgICAgICAgICAgICAgICAgZXYuZ2V0U3RhcnQoKSwKKyAgICAgICAgICAgICAgICBldi5nZXRTdG9wKCksCisgICAgICAgICAgICAgICAgMS4yIC0gKGV2LmdldE5lc3RMZXZlbCgpICogMC4yKSwKKyAgICAgICAgICAgICAgICBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLAorICAgICAgICAgICAgICAgIHRpbWVTdGF0OjpuYW1lKGV2LmdldFRpbWVyTmFtZSgpKQorICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjp3aW5kdXBFeHBsaWNpdFRpbWVycygpCit7CisgICAgLy8gV2luZCB1cCBhbnkgZXhwbGljaXQgdGltZXJzLiBXZSBhc3N1bWUgdGhhdCBpdCdzIGZhaXIgYXQgdGhpcyBwb2ludCB0byBqdXN0IHdhbGsgYWxsIHRoZSBleHBsY2l0IHRpbWVycyBpbiBhbGwgdGhyZWFkcworICAgIC8vIGFuZCBzYXkgIml0J3Mgb3ZlciIuCisgICAgLy8gSWYgdGhlIHRpbWVyIHdhc24ndCBydW5uaW5nLCB0aGlzIHdvbid0IHJlY29yZCBhbnl0aGluZyBhbnl3YXkuCisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGZvcihpdCA9IF9fa21wX3N0YXRzX2xpc3QtPmJlZ2luKCk7IGl0ICE9IF9fa21wX3N0YXRzX2xpc3QtPmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGttcF9zdGF0c19saXN0KiBwdHIgPSAqaXQ7CisgICAgICAgIHB0ci0+Z2V0UGFydGl0aW9uZWRUaW1lcnMoKS0+d2luZHVwKCk7CisgICAgICAgIGZvciAoaW50IHRpbWVyPTA7IHRpbWVyPEVYUExJQ0lUX1RJTUVSX0xBU1Q7IHRpbWVyKyspIHsKKyAgICAgICAgICAgIHB0ci0+Z2V0RXhwbGljaXRUaW1lcihleHBsaWNpdF90aW1lcl9lKHRpbWVyKSktPnN0b3AoKHRpbWVyX2UpdGltZXIsIHB0cik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50UGxvdGljdXNGaWxlKCkgeworICAgIGludCBpOworICAgIGludCBzaXplID0gX19rbXBfc3RhdHNfbGlzdC0+c2l6ZSgpOworICAgIEZJTEUqIHBsb3RPdXQgPSBmb3BlbihwbG90RmlsZU5hbWUsICJ3KyIpOworCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgcGFnZVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHBhZ2VzaXplOiAxNSAxMFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHNjYWxlOiAxLjBcblxuIik7CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBnZXRkYXRhXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgZmlsZTogJXNcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0ZpbGVOYW1lKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIGFyZWFkZWZcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICB0aXRsZTogT3Blbk1QIFNhbXBsaW5nIFRpbWVsaW5lXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgdGl0bGVkZXRhaWxzOiBhbGlnbj1jZW50ZXIgc2l6ZT0xNlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHJlY3RhbmdsZTogMSAxIDEzIDlcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICB4YXV0b3JhbmdlOiBkYXRhZmllbGQ9MiwzXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgeWF1dG9yYW5nZTogLTEgJWRcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgeGF4aXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzdHViczogaW5jXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc3R1YmRldGFpbHM6IHNpemU9MTJcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBsYWJlbDogVGltZSAodGlja3MpXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgbGFiZWxkZXRhaWxzOiBzaXplPTE0XG5cbiIpOworCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgeWF4aXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzdHViczogaW5jIDFcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzdHVicmFuZ2U6IDAgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzdHViZGV0YWlsczogc2l6ZT0xMlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGxhYmVsOiBUaHJlYWQgI1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGxhYmVsZGV0YWlsczogc2l6ZT0xNFxuXG4iLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZS0xKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIGJhcnNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBleGFjdGNvbG9yZmllbGQ6IDVcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBheGlzOiB4XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgbG9jZmllbGQ6IDFcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzZWdtZW50ZmllbGRzOiAyIDNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBiYXJ3aWR0aGZpZWxkOiA0XG5cbiIpOworCisgICAgLy8gY3JlYXRlIGxlZ2VuZCBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRpbWVyIGNvbG9yCisgICAgZm9yKGk9MDtpPFRJTUVSX0xBU1Q7aSsrKSB7CisgICAgICAgIGlmKHRpbWVTdGF0Ojpsb2dFdmVudCgodGltZXJfZSlpKSkgeworICAgICAgICAgICAgcmdiX2NvbG9yIGMgPSBnZXRFdmVudENvbG9yKCh0aW1lcl9lKWkpOworICAgICAgICAgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgbGVnZW5kZW50cnlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIHNhbXBsZXR5cGU6IGNvbG9yXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBsYWJlbDogJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIGRldGFpbHM6IHJnYiglMS4xZiwlMS4xZiwlMS4xZilcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVN0YXQ6Om5hbWUoKHRpbWVyX2UpaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuciwgYy5nLCBjLmIpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBsZWdlbmRcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBmb3JtYXQ6IGRvd25cbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBsb2NhdGlvbjogbWF4IG1heFxuXG4iKTsKKyAgICBmY2xvc2UocGxvdE91dCk7CisgICAgcmV0dXJuOworfQorCisvKgorICogUHJpbnQgc29tZSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQKKyAqICAgICogdGhlIGRhdGUgYW5kIHRpbWUgdGhpcyBleHBlcmltZW50IHJhbi4KKyAqICAgICogdGhlIG1hY2hpbmUgb24gd2hpY2ggaXQgcmFuLgorICogV2Ugb3V0cHV0IGFsbCBvZiB0aGlzIGFzIHN0eWxpc2VkIGNvbW1lbnRzLCB0aG91Z2ggd2UgbWF5IGRlY2lkZSB0byBwYXJzZSBzb21lIG9mIGl0LgorICovCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwcmludEhlYWRlckluZm8oRklMRSAqIHN0YXRzT3V0KQoreworICAgIHN0ZDo6dGltZV90IG5vdyA9IHN0ZDo6dGltZSgwKTsKKyAgICBjaGFyIGJ1ZmZlcls0MF07CisgICAgY2hhciBob3N0TmFtZVs4MF07CisKKyAgICBzdGQ6OnN0cmZ0aW1lKCZidWZmZXJbMF0sIHNpemVvZihidWZmZXIpLCAiJWMiLCBzdGQ6OmxvY2FsdGltZSgmbm93KSk7CisgICAgZnByaW50ZiAoc3RhdHNPdXQsICIjIFRpbWUgb2YgcnVuOiAlc1xuIiwgJmJ1ZmZlclswXSk7CisgICAgaWYgKGdldGhvc3RuYW1lKCZob3N0TmFtZVswXSwgc2l6ZW9mKGhvc3ROYW1lKSkgPT0gMCkKKyAgICAgICAgZnByaW50ZiAoc3RhdHNPdXQsIiMgSG9zdG5hbWU6ICVzXG4iLCAmaG9zdE5hbWVbMF0pOworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBmcHJpbnRmIChzdGF0c091dCwgIiMgQ1BVOiAgJXNcbiIsICZfX2ttcF9jcHVpbmZvLm5hbWVbMF0pOworICAgIGZwcmludGYgKHN0YXRzT3V0LCAiIyBGYW1pbHk6ICVkLCBNb2RlbDogJWQsIFN0ZXBwaW5nOiAlZFxuIiwgX19rbXBfY3B1aW5mby5mYW1pbHksIF9fa21wX2NwdWluZm8ubW9kZWwsIF9fa21wX2NwdWluZm8uc3RlcHBpbmcpOworICAgIGlmIChfX2ttcF9jcHVpbmZvLmZyZXF1ZW5jeSA9PSAwKQorICAgICAgICBmcHJpbnRmIChzdGF0c091dCwgIiMgTm9taW5hbCBmcmVxdWVuY3k6IFVua25vd25cbiIpOworICAgIGVsc2UKKyAgICAgICAgZnByaW50ZiAoc3RhdHNPdXQsICIjIE5vbWluYWwgZnJlcXVlbmN5OiAlc3pcbiIsIGZvcm1hdFNJKGRvdWJsZShfX2ttcF9jcHVpbmZvLmZyZXF1ZW5jeSksOSwnSCcpLmNfc3RyKCkpOworI2VuZGlmCit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6Om91dHB1dFN0YXRzKGNvbnN0IGNoYXIqIGhlYWRpbmcpCit7CisgICAgLy8gU3RvcCBhbGwgdGhlIGV4cGxpY2l0IHRpbWVycyBpbiBhbGwgdGhyZWFkcworICAgIC8vIERvIHRoaXMgYmVmb3JlIGRlY2xhcmluZyB0aGUgbG9jYWwgc3RhdGlzdGljcyBiZWNhdXNlIHRoYXkgaGF2ZSBjb25zdHJ1Y3RvcnMgc28gd2lsbCB0YWtlIHRpbWUgdG8gY3JlYXRlLgorICAgIHdpbmR1cEV4cGxpY2l0VGltZXJzKCk7CisKKyAgICBzdGF0aXN0aWMgYWxsU3RhdHNbVElNRVJfTEFTVF07CisgICAgc3RhdGlzdGljIHRvdGFsU3RhdHNbVElNRVJfTEFTVF07ICAgICAgICAgICAvKiBTeW50aGVzaXplZCwgY3Jvc3MgdGhyZWFkcyB2ZXJzaW9ucyBvZiBub3JtYWwgdGltZXIgc3RhdHMgKi8KKyAgICBzdGF0aXN0aWMgYWxsQ291bnRlcnNbQ09VTlRFUl9MQVNUXTsKKworICAgIEZJTEUgKiBzdGF0c091dCA9ICFvdXRwdXRGaWxlTmFtZS5lbXB0eSgpID8gZm9wZW4gKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksICJhKyIpIDogc3RkZXJyOworICAgIGlmICghc3RhdHNPdXQpCisgICAgICAgIHN0YXRzT3V0ID0gc3RkZXJyOworCisgICAgRklMRSAqIGV2ZW50c091dDsKKyAgICBpZiAoZXZlbnRQcmludGluZ0VuYWJsZWQoKSkgeworICAgICAgICBldmVudHNPdXQgPSBmb3BlbihldmVudHNGaWxlTmFtZSwgIncrIik7CisgICAgfQorCisgICAgcHJpbnRIZWFkZXJJbmZvIChzdGF0c091dCk7CisgICAgZnByaW50ZihzdGF0c091dCwgIiVzXG4iLGhlYWRpbmcpOworICAgIC8vIEFjY3VtdWxhdGUgYWNyb3NzIHRocmVhZHMuCisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBfX2ttcF9zdGF0c19saXN0LT5iZWdpbigpOyBpdCAhPSBfX2ttcF9zdGF0c19saXN0LT5lbmQoKTsgaXQrKykgeworICAgICAgICBpbnQgdCA9ICgqaXQpLT5nZXRHdGlkKCk7CisgICAgICAgIC8vIE91dHB1dCBwZXIgdGhyZWFkIHN0YXRzIGlmIHJlcXVlc3RlZC4KKyAgICAgICAgaWYgKHByaW50UGVyVGhyZWFkRmxhZykgeworICAgICAgICAgICAgZnByaW50ZiAoc3RhdHNPdXQsICJUaHJlYWQgJWRcbiIsIHQpOworICAgICAgICAgICAgcHJpbnRUaW1lclN0YXRzIChzdGF0c091dCwgKCppdCktPmdldFRpbWVycygpLCAwKTsKKyAgICAgICAgICAgIHByaW50Q291bnRlcnMgICAoc3RhdHNPdXQsICgqaXQpLT5nZXRDb3VudGVycygpKTsKKyAgICAgICAgICAgIGZwcmludGYgKHN0YXRzT3V0LCJcbiIpOworICAgICAgICB9CisgICAgICAgIC8vIE91dHB1dCBwZXIgdGhyZWFkIGV2ZW50cyBpZiByZXF1ZXN0ZWQuCisgICAgICAgIGlmIChldmVudFByaW50aW5nRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yIGV2ZW50cyA9ICgqaXQpLT5nZXRFdmVudFZlY3RvcigpOworICAgICAgICAgICAgcHJpbnRFdmVudHMoZXZlbnRzT3V0LCAmZXZlbnRzLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFjY3VtdWxhdGUgdGltZXJzLgorICAgICAgICBmb3IgKHRpbWVyX2UgcyA9IHRpbWVyX2UoMCk7IHM8VElNRVJfTEFTVDsgcyA9IHRpbWVyX2UocysxKSkgeworICAgICAgICAgICAgLy8gU2VlIGlmIHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lciB3aGVuIGFnZ3JlZ2F0aW5nCisgICAgICAgICAgICBpZiAoKHRpbWVTdGF0OjptYXN0ZXJPbmx5KHMpICYmICh0ICE9IDApKSB8fCAvLyBUaW1lciBpcyBvbmx5IHZhbGlkIG9uIHRoZSBtYXN0ZXIgYW5kIHRoaXMgdGhyZWFkIGlzIGEgd29ya2VyCisgICAgICAgICAgICAgICAgKHRpbWVTdGF0Ojp3b3JrZXJPbmx5KHMpICYmICh0ID09IDApKSAgICAvLyBUaW1lciBpcyBvbmx5IHZhbGlkIG9uIGEgd29ya2VyIGFuZCB0aGlzIHRocmVhZCBpcyB0aGUgbWFzdGVyCisgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRpc3RpYyAqIHRocmVhZFN0YXQgPSAoKml0KS0+Z2V0VGltZXIocyk7CisgICAgICAgICAgICBhbGxTdGF0c1tzXSArPSAqdGhyZWFkU3RhdDsKKworICAgICAgICAgICAgLy8gQWRkIFRvdGFsIHN0YXRzIGZvciB0aW1lcnMgdGhhdCBhcmUgdmFsaWQgaW4gbW9yZSB0aGFuIG9uZSB0aHJlYWQKKyAgICAgICAgICAgIGlmICghdGltZVN0YXQ6Om5vVG90YWwocykpCisgICAgICAgICAgICAgICAgdG90YWxTdGF0c1tzXS5hZGRTYW1wbGUodGhyZWFkU3RhdC0+Z2V0VG90YWwoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBY2N1bXVsYXRlIGNvdW50ZXJzLgorICAgICAgICBmb3IgKGNvdW50ZXJfZSBjID0gY291bnRlcl9lKDApOyBjPENPVU5URVJfTEFTVDsgYyA9IGNvdW50ZXJfZShjKzEpKSB7CisgICAgICAgICAgICBpZiAoY291bnRlcjo6bWFzdGVyT25seShjKSAmJiB0ICE9IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhbGxDb3VudGVyc1tjXS5hZGRTYW1wbGUgKCgqaXQpLT5nZXRDb3VudGVyKGMpLT5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChldmVudFByaW50aW5nRW5hYmxlZCgpKSB7CisgICAgICAgIHByaW50UGxvdGljdXNGaWxlKCk7CisgICAgICAgIGZjbG9zZShldmVudHNPdXQpOworICAgIH0KKworICAgIGZwcmludGYgKHN0YXRzT3V0LCAiQWdncmVnYXRlIGZvciBhbGwgdGhyZWFkc1xuIik7CisgICAgcHJpbnRUaW1lclN0YXRzIChzdGF0c091dCwgJmFsbFN0YXRzWzBdLCAmdG90YWxTdGF0c1swXSk7CisgICAgZnByaW50ZiAoc3RhdHNPdXQsICJcbiIpOworICAgIHByaW50Q291bnRlclN0YXRzIChzdGF0c091dCwgJmFsbENvdW50ZXJzWzBdKTsKKworICAgIGlmIChzdGF0c091dCAhPSBzdGRlcnIpCisgICAgICAgIGZjbG9zZShzdGF0c091dCk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqICBleHBvcnRlZCBDIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKiAqLworCisvLyBubyBuYW1lIG1hbmdsaW5nIGZvciB0aGVzZSBmdW5jdGlvbnMsIHdlIHdhbnQgdGhlIGMgZmlsZXMgdG8gYmUgYWJsZSB0byBnZXQgYXQgdGhlc2UgZnVuY3Rpb25zCitleHRlcm4gIkMiIHsKKwordm9pZCBfX2ttcF9yZXNldF9zdGF0cygpCit7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGZvcihpdCA9IF9fa21wX3N0YXRzX2xpc3QtPmJlZ2luKCk7IGl0ICE9IF9fa21wX3N0YXRzX2xpc3QtPmVuZCgpOyBpdCsrKSB7CisgICAgICAgIHRpbWVTdGF0ICogdGltZXJzICAgICA9ICgqaXQpLT5nZXRUaW1lcnMoKTsKKyAgICAgICAgY291bnRlciAqIGNvdW50ZXJzICAgID0gKCppdCktPmdldENvdW50ZXJzKCk7CisgICAgICAgIGV4cGxpY2l0VGltZXIgKiBlVGltZXJzID0gKCppdCktPmdldEV4cGxpY2l0VGltZXJzKCk7CisKKyAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQ8VElNRVJfTEFTVDsgdCsrKQorICAgICAgICAgICAgdGltZXJzW3RdLnJlc2V0KCk7CisKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGM8Q09VTlRFUl9MQVNUOyBjKyspCisgICAgICAgICAgICBjb3VudGVyc1tjXS5yZXNldCgpOworCisgICAgICAgIGZvciAoaW50IHQ9MDsgdDxFWFBMSUNJVF9USU1FUl9MQVNUOyB0KyspCisgICAgICAgICAgICBlVGltZXJzW3RdLnJlc2V0KCk7CisKKyAgICAgICAgLy8gcmVzZXQgdGhlIGV2ZW50IHZlY3RvciBzbyBhbGwgcHJldmlvdXMgZXZlbnRzIGFyZSAiZXJhc2VkIgorICAgICAgICAoKml0KS0+cmVzZXRFdmVudFZlY3RvcigpOworICAgIH0KK30KKworLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2V0IGFsbCBzdGF0cyBhbmQgc3RvcCBhbGwgdGhyZWFkcycgZXhwbGljaXQgdGltZXJzIGlmIHRoZXkgaGF2ZW4ndCBiZWVuIHN0b3BwZWQgYWxyZWFkeS4KK3ZvaWQgX19rbXBfb3V0cHV0X3N0YXRzKGNvbnN0IGNoYXIgKiBoZWFkaW5nKQoreworICAgIF9fa21wX3N0YXRzX2dsb2JhbF9vdXRwdXQtPm91dHB1dFN0YXRzKGhlYWRpbmcpOworICAgIF9fa21wX3Jlc2V0X3N0YXRzKCk7Cit9CisKK3ZvaWQgX19rbXBfYWNjdW11bGF0ZV9zdGF0c19hdF9leGl0KHZvaWQpCit7CisgICAgLy8gT25seSBkbyB0aGlzIG9uY2UuCisgICAgaWYgKEtNUF9YQ0hHX0ZJWEVEMzIoJnN0YXRzUHJpbnRlZCwgMSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgX19rbXBfb3V0cHV0X3N0YXRzKCJTdGF0aXN0aWNzIG9uIGV4aXQiKTsKK30KKwordm9pZCBfX2ttcF9zdGF0c19pbml0KHZvaWQpCit7CisgICAgX19rbXBfaW5pdF90YXNfbG9jayggJiBfX2ttcF9zdGF0c19sb2NrICk7CisgICAgX19rbXBfc3RhdHNfc3RhcnRfdGltZSA9IHRzY190aWNrX2NvdW50Ojpub3coKTsKKyAgICBfX2ttcF9zdGF0c19nbG9iYWxfb3V0cHV0ID0gbmV3IGttcF9zdGF0c19vdXRwdXRfbW9kdWxlKCk7CisgICAgX19rbXBfc3RhdHNfbGlzdCA9IG5ldyBrbXBfc3RhdHNfbGlzdCgpOworfQorCit2b2lkIF9fa21wX3N0YXRzX2Zpbmkodm9pZCkKK3sKKyAgICBfX2ttcF9hY2N1bXVsYXRlX3N0YXRzX2F0X2V4aXQoKTsKKyAgICBfX2ttcF9zdGF0c19saXN0LT5kZWFsbG9jYXRlKCk7CisgICAgZGVsZXRlIF9fa21wX3N0YXRzX2dsb2JhbF9vdXRwdXQ7CisgICAgZGVsZXRlIF9fa21wX3N0YXRzX2xpc3Q7Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3N0YXRzLmggYi9yYzMvcnVudGltZS9zcmMva21wX3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUyMWQyMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RhdHMuaApAQCAtMCwwICsxLDg3NyBAQAorI2lmbmRlZiBLTVBfU1RBVFNfSAorI2RlZmluZSBLTVBfU1RBVFNfSAorCisvKiogQGZpbGUga21wX3N0YXRzLmgKKyAqIEZ1bmN0aW9ucyBmb3IgY29sbGVjdGluZyBzdGF0aXN0aWNzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImttcF9jb25maWcuaCIKKworI2lmIEtNUF9TVEFUU19FTkFCTEVECisvKgorICogU3RhdGlzdGljcyBhY2N1bXVsYXRvci4KKyAqIEFjY3VtdWxhdGVzIG51bWJlciBvZiBzYW1wbGVzIGFuZCBjb21wdXRlcyBtaW4sIG1heCwgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uIG9uIHRoZSBmbHkuCisgKgorICogT25saW5lIHZhcmlhbmNlIGNhbGN1bGF0aW9uIGFsZ29yaXRobSBmcm9tIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWxnb3JpdGhtc19mb3JfY2FsY3VsYXRpbmdfdmFyaWFuY2UjT24tbGluZV9hbGdvcml0aG0KKyAqLworCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG5ldz4gLy8gcGxhY2VtZW50IG5ldworI2luY2x1ZGUgImttcF9zdGF0c190aW1pbmcuaCIKKworLyoKKyAqIEVuYWJsZSBkZXZlbG9wZXIgc3RhdGlzdGljcyBoZXJlIGlmIHlvdSB3YW50IHRoZW0uIFRoZXkgYXJlIG1vcmUgZGV0YWlsZWQgdGhhbiBpcyB1c2VmdWwgZm9yIGFwcGxpY2F0aW9uIGNoYXJhY3RlcmlzYXRpb24gYW5kCisgKiBhcmUgaW50ZW5kZWQgZm9yIHRoZSBydW50aW1lIGxpYnJhcnkgZGV2ZWxvcGVyLgorICovCisvLyAjZGVmaW5lIEtNUF9ERVZFTE9QRVJfU1RBVFMgMQorCisvKiEKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworICogXGJyaWVmIGZsYWdzIHRvIGRlc2NyaWJlIHRoZSBzdGF0aXN0aWMgKHRpbWVyIG9yIGNvdW50ZXIpCisgKgorICovCitlbnVtIHN0YXRzX2ZsYWdzX2UgeworICAgIG5vVG90YWwgICAgICA9IDE8PDAsICAgICAvLyE8IGRvIG5vdCBzaG93IGEgVE9UQUxfYWdncmVnYXRpb24gZm9yIHRoaXMgc3RhdGlzdGljCisgICAgb25seUluTWFzdGVyID0gMTw8MSwgICAgIC8vITwgc3RhdGlzdGljIGlzIHZhbGlkIG9ubHkgZm9yIG1hc3RlcgorICAgIG5vVW5pdHMgICAgICA9IDE8PDIsICAgICAvLyE8IHN0YXRpc3RpYyBkb2Vzbid0IG5lZWQgdW5pdHMgcHJpbnRlZCBuZXh0IHRvIGl0IGluIG91dHB1dAorICAgIG5vdEluTWFzdGVyICA9IDE8PDMsICAgICAvLyE8IHN0YXRpc3RpYyBpcyB2YWxpZCBvbmx5IGZvciBub24tbWFzdGVyIHRocmVhZHMKKyAgICBsb2dFdmVudCAgICAgPSAxPDw0ICAgICAgLy8hPCBzdGF0aXN0aWMgY2FuIGJlIGxvZ2dlZCBvbiB0aGUgZXZlbnQgdGltZWxpbmUgd2hlbiBLTVBfU1RBVFNfRVZFTlRTIGlzIG9uICh2YWxpZCBvbmx5IGZvciB0aW1lcnMpCit9OworCisvKiEKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworICogXGJyaWVmIHRoZSBzdGF0ZXMgd2hpY2ggYSB0aHJlYWQgY2FuIGJlIGluCisgKgorICovCitlbnVtIHN0YXRzX3N0YXRlX2UgeworICAgIElETEUsCisgICAgU0VSSUFMX1JFR0lPTiwKKyAgICBGT1JLX0pPSU5fQkFSUklFUiwKKyAgICBQTEFJTl9CQVJSSUVSLAorICAgIFRBU0tXQUlULAorICAgIFRBU0tZSUVMRCwKKyAgICBUQVNLR1JPVVAsCisgICAgSU1QTElDSVRfVEFTSywKKyAgICBFWFBMSUNJVF9UQVNLCit9OworCisvKiEKKyAqIFxicmllZiBBZGQgbmV3IGNvdW50ZXJzIHVuZGVyIEtNUF9GT1JFQUNIX0NPVU5URVIoKSBtYWNybyBpbiBrbXBfc3RhdHMuaAorICoKKyAqIEBwYXJhbSBtYWNybyBhIHVzZXIgZGVmaW5lZCBtYWNybyB0aGF0IHRha2VzIHRocmVlIGFyZ3VtZW50cyAtIG1hY3JvKENPVU5URVJfTkFNRSwgZmxhZ3MsIGFyZykKKyAqIEBwYXJhbSBhcmcgYSB1c2VyIGRlZmluZWQgYXJndW1lbnQgdG8gc2VuZCB0byB0aGUgdXNlciBkZWZpbmVkIG1hY3JvCisgKgorICogXGRldGFpbHMgQSBjb3VudGVyIGNvdW50cyB0aGUgb2NjdXJyZW5jZSBvZiBzb21lIGV2ZW50LgorICogRWFjaCB0aHJlYWQgYWNjdW11bGF0ZXMgaXRzIG93biBjb3VudCwgYXQgdGhlIGVuZCBvZiBleGVjdXRpb24gdGhlIGNvdW50cyBhcmUgYWdncmVnYXRlZCB0cmVhdGluZyBlYWNoIHRocmVhZAorICogYXMgYSBzZXBhcmF0ZSBtZWFzdXJlbWVudC4gKFVubGVzcyBvbmx5SW5NYXN0ZXIgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZXJlJ3Mgb25seSBhIHNpbmdsZSBtZWFzdXJlbWVudCkuCisgKiBUaGUgbWluLG1lYW4sbWF4IGFyZSB0aGVyZWZvcmUgdGhlIHZhbHVlcyBmb3IgdGhlIHRocmVhZHMuCisgKiBBZGRpbmcgdGhlIGNvdW50ZXIgaGVyZSBhbmQgdGhlbiBwdXR0aW5nIGEgS01QX0JMT0NLX0NPVU5URVIobmFtZSkgYXQgdGhlIHBvaW50IHlvdSB3YW50IHRvIGNvdW50IGlzIGFsbCB5b3UgbmVlZCB0byBkby4KKyAqIEFsbCBvZiB0aGUgdGFibGVzIGFuZCBwcmludGluZyBpcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIG1hY3JvLgorICogRm9ybWF0IGlzICJtYWNybyhuYW1lLCBmbGFncywgYXJnKSIKKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyAqLworI2RlZmluZSBLTVBfRk9SRUFDSF9DT1VOVEVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX1BBUkFMTEVMLCBzdGF0c19mbGFnc19lOjpvbmx5SW5NYXN0ZXIgfCBzdGF0c19mbGFnc19lOjpub1RvdGFsLCBhcmcpIFwKKyAgICBtYWNybyAoT01QX05FU1RFRF9QQVJBTExFTCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9GT1Jfc3RhdGljLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfRk9SX2R5bmFtaWMsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX0RJU1RSSUJVVEUsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9CQVJSSUVSLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfQ1JJVElDQUwsMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX1NJTkdMRSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9NQVNURVIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfVEVBTVMsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NldF9sb2NrLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF90ZXN0X2xvY2ssIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChSRURVQ0Vfd2FpdCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoUkVEVUNFX25vd2FpdCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9UQVNLWUlFTEQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfVEFTS0xPT1AsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVEFTS19leGVjdXRlZCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFRBU0tfY2FuY2VsbGVkLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChUQVNLX3N0b2xlbiwgMCwgYXJnKQorCisvKiEKKyAqIFxicmllZiBBZGQgbmV3IHRpbWVycyB1bmRlciBLTVBfRk9SRUFDSF9USU1FUigpIG1hY3JvIGluIGttcF9zdGF0cy5oCisgKgorICogQHBhcmFtIG1hY3JvIGEgdXNlciBkZWZpbmVkIG1hY3JvIHRoYXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzIC0gbWFjcm8oVElNRVJfTkFNRSwgZmxhZ3MsIGFyZykKKyAqIEBwYXJhbSBhcmcgYSB1c2VyIGRlZmluZWQgYXJndW1lbnQgdG8gc2VuZCB0byB0aGUgdXNlciBkZWZpbmVkIG1hY3JvCisgKgorICogXGRldGFpbHMgQSB0aW1lciBjb2xsZWN0cyBtdWx0aXBsZSBzYW1wbGVzIG9mIHNvbWUgY291bnQgaW4gZWFjaCB0aHJlYWQgYW5kIHRoZW4gZmluYWxseSBhZ2dyZWdhdGVzIGFsbGwgb2YgdGhlIHNhbXBsZXMgZnJvbSBhbGwgb2YgdGhlIHRocmVhZHMuCisgKiBGb3IgbW9zdCB0aW1lcnMgdGhlIHByaW50aW5nIGNvZGUgYWxzbyBwcm92aWRlcyBhbiBhZ2dyZWdhdGlvbiBvdmVyIHRoZSB0aHJlYWQgdG90YWxzLiBUaGVzZSBhcmUgcHJpbnRlZCBhcyBUT1RBTF9mb28uCisgKiBUaGUgY291bnQgaXMgbm9ybWFsbHkgYSB0aW1lIChpbiB0aWNrcyksIGhlbmNlIHRoZSBuYW1lICJ0aW1lciIuIChCdXQgY2FuIGJlIGFueSB2YWx1ZSwgc28gd2UgdXNlIHRoaXMgZm9yICJudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmb3JrIgorICogYXMgd2VsbCkuCisgKiBGb3IgdGltZXJzIHRoZSB0aHJlYWRzIGFyZSBub3Qgc2lnbmlmaWNhbnQsIGl0J3MgdGhlIGluZGl2aWR1YWwgb2JzZXJ2YXRpb25zIHRoYXQgY291bnQsIHNvIHRoZSBzdGF0aXN0aWNzIGFyZSBhdCB0aGF0IGxldmVsLgorICogRm9ybWF0IGlzICJtYWNybyhuYW1lLCBmbGFncywgYXJnKSIKKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcyCisgKi8KKyNkZWZpbmUgS01QX0ZPUkVBQ0hfVElNRVIobWFjcm8sIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF93b3JrZXJfdGhyZWFkX2xpZmUsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgXAorICAgIG1hY3JvIChGT1Jfc3RhdGljX3NjaGVkdWxpbmcsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoRk9SX2R5bmFtaWNfc2NoZWR1bGluZywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9jcml0aWNhbCwgIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfY3JpdGljYWxfd2FpdCwgIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NpbmdsZSwgICAgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9tYXN0ZXIsICAgIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfaWRsZSwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3BsYWluX2JhcnJpZXIsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9mb3JrX2JhcnJpZXIsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfam9pbl9iYXJyaWVyLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3BhcmFsbGVsLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF90YXNrX2ltbWVkaWF0ZSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfdGFza190YXNrd2FpdCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3Rhc2tfdGFza3lpZWxkLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF90YXNrX3Rhc2tncm91cCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfdGFza19qb2luX2JhciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3Rhc2tfcGxhaW5fYmFyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9zZXJpYWwsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfdGFza2xvb3Bfc2NoZWR1bGluZywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NldF9udW10aHJlYWRzLCAgICBzdGF0c19mbGFnc19lOjpub1VuaXRzIHwgc3RhdHNfZmxhZ3NfZTo6bm9Ub3RhbCwgYXJnKSBcCisgICAgbWFjcm8gKE9NUF9QQVJBTExFTF9hcmdzLCAgICAgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0cyB8IHN0YXRzX2ZsYWdzX2U6Om5vVG90YWwsIGFyZykgXAorICAgIG1hY3JvIChGT1Jfc3RhdGljX2l0ZXJhdGlvbnMsIHN0YXRzX2ZsYWdzX2U6Om5vVW5pdHMgfCBzdGF0c19mbGFnc19lOjpub1RvdGFsLCBhcmcpIFwKKyAgICBtYWNybyAoRk9SX2R5bmFtaWNfaXRlcmF0aW9ucyxzdGF0c19mbGFnc19lOjpub1VuaXRzIHwgc3RhdHNfZmxhZ3NfZTo6bm9Ub3RhbCwgYXJnKSBcCisgICAgS01QX0ZPUkVBQ0hfREVWRUxPUEVSX1RJTUVSKG1hY3JvLCBhcmcpCisKKworLy8gT01QX3N0YXJ0X2VuZCAgICAgICAgICAtLSBUaW1lIGZyb20gd2hlbiBPcGVuTVAgaXMgaW5pdGlhbGl6ZWQgdW50aWwgdGhlIHN0YXRzIGFyZSBwcmludGVkIGF0IGV4aXQKKy8vIE9NUF9zZXJpYWwgICAgICAgICAgICAgLS0gVGhyZWFkIHplcm8gdGltZSBleGVjdXRpbmcgc2VyaWFsIGNvZGUKKy8vIE9NUF93b3JrICAgICAgICAgICAgICAgLS0gRWxhcHNlZCB0aW1lIGluIGNvZGUgZGlzcGF0Y2hlZCBieSBhIGZvcmsgKG1lYXN1cmVkIGluIHRoZSB0aHJlYWQpCisvLyBPTVBfYmFycmllciAgICAgICAgICAgIC0tIFRpbWUgYXQgInJlYWwiIGJhcnJpZXJzIChpbmNsdWRlcyB0YXNrIHRpbWUpCisvLyBGT1Jfc3RhdGljX3NjaGVkdWxpbmcgIC0tIFRpbWUgc3BlbnQgZG9pbmcgc2NoZWR1bGluZyBmb3IgYSBzdGF0aWMgImZvciIKKy8vIEZPUl9keW5hbWljX3NjaGVkdWxpbmcgLS0gVGltZSBzcGVudCBkb2luZyBzY2hlZHVsaW5nIGZvciBhIGR5bmFtaWMgImZvciIKKy8vIE9NUF9pZGxlICAgICAgICAgICAgICAgLS0gV29ya2VyIHRocmVhZHMgdGltZSBzcGVudCB3YWl0aW5nIGZvciBpbmNsdXNpb24gaW4gYSBwYXJhbGxlbCByZWdpb24KKy8vIE9NUF9wbGFpbl9iYXJyaWVyICAgICAgLS0gVGltZSBzcGVudCBpbiBhIGJhcnJpZXIgY29uc3RydWN0CisvLyBPTVBfZm9ya19qb2luX2JhcnJpZXIgIC0tIFRpbWUgc3BlbnQgaW4gYSB0aGUgZm9yay1qb2luIGJhcnJpZXIgc3Vycm91bmRpbmcgYSBwYXJhbGxlbCByZWdpb24KKy8vIE9NUF9wYXJhbGxlbCAgICAgICAgICAgLS0gVGltZSBzcGVudCBpbnNpZGUgYSBwYXJhbGxlbCBjb25zdHJ1Y3QKKy8vIE9NUF90YXNrX2ltbWVkaWF0ZSAgICAgLS0gVGltZSBzcGVudCBleGVjdXRpbmcgbm9uLWRlZmVycmVkIHRhc2tzCisvLyBPTVBfdGFza190YXNrd2FpdCAgICAgIC0tIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRhc2tzIGluc2lkZSBhIHRhc2t3YWl0IGNvbnN0cnVjdAorLy8gT01QX3Rhc2tfdGFza3lpZWxkICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyB0YXNrcyBpbnNpZGUgYSB0YXNreWllbGQgY29uc3RydWN0CisvLyBPTVBfdGFza190YXNrZ3JvdXAgICAgIC0tIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRhc2tzIGluc2lkZSBhIHRhc2t5Z3JvdXAgY29uc3RydWN0CisvLyBPTVBfdGFza19qb2luX2JhciAgICAgIC0tIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRhc2tzIGluc2lkZSBhIGpvaW4gYmFycmllcgorLy8gT01QX3Rhc2tfcGxhaW5fYmFyICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyB0YXNrcyBpbnNpZGUgYSBiYXJyaWVyIGNvbnN0cnVjdAorLy8gT01QX3NpbmdsZSAgICAgICAgICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyBhICJzaW5nbGUiIHJlZ2lvbgorLy8gT01QX21hc3RlciAgICAgICAgICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyBhICJtYXN0ZXIiIHJlZ2lvbgorLy8gT01QX3NldF9udW10aHJlYWRzICAgICAtLSBWYWx1ZXMgcGFzc2VkIHRvIG9tcF9zZXRfbnVtX3RocmVhZHMKKy8vIE9NUF9QQVJBTExFTF9hcmdzICAgICAgLS0gTnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gYSBwYXJhbGxlbCByZWdpb24KKy8vIEZPUl9zdGF0aWNfaXRlcmF0aW9ucyAgLS0gTnVtYmVyIG9mIGF2YWlsYWJsZSBwYXJhbGxlbCBjaHVua3Mgb2Ygd29yayBpbiBhIHN0YXRpYyBmb3IKKy8vIEZPUl9keW5hbWljX2l0ZXJhdGlvbnMgLS0gTnVtYmVyIG9mIGF2YWlsYWJsZSBwYXJhbGxlbCBjaHVua3Mgb2Ygd29yayBpbiBhIGR5bmFtaWMgZm9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdGggYWRqdXN0IGZvciBhbnkgY2h1bmtpbmcsIHNvIGlmIHRoZXJlIHdlcmUgYW4gaXRlcmF0aW9uIGNvdW50IG9mIDIwIGJ1dCBhIGNodW5rIHNpemUgb2YgMTAsIHdlJ2QgcmVjb3JkIDIuCisKKyNpZiAoS01QX0RFVkVMT1BFUl9TVEFUUykKKy8vIFRpbWVycyB3aGljaCBhcmUgb2YgaW50ZXJlc3QgdG8gcnVudGltZSBsaWJyYXJ5IGRldmVsb3BlcnMsIG5vdCBlbmQgdXNlcnMuCisvLyBUaGVzZSBoYXZlIHRvIGJlIGV4cGxpY2l0bHkgZW5hYmxlZCBpbiBhZGRpdGlvbiB0byB0aGUgb3RoZXIgc3RhdHMuCisKKy8vIEtNUF9mb3JrX2JhcnJpZXIgICAgICAgLS0gdGltZSBpbiBfX2ttcF9mb3JrX2JhcnJpZXIKKy8vIEtNUF9qb2luX2JhcnJpZXIgICAgICAgLS0gdGltZSBpbiBfX2ttcF9qb2luX2JhcnJpZXIKKy8vIEtNUF9iYXJyaWVyICAgICAgICAgICAgLS0gdGltZSBpbiBfX2ttcF9iYXJyaWVyCisvLyBLTVBfZW5kX3NwbGl0X2JhcnJpZXIgIC0tIHRpbWUgaW4gX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIKKy8vIEtNUF9zZXR1cF9pY3ZfY29weSAgICAgLS0gdGltZSBpbiBfX2ttcF9zZXR1cF9pY3ZfY29weQorLy8gS01QX2ljdl9jb3B5ICAgICAgICAgICAtLSBzdGFydC9zdG9wIHRpbWVyIGZvciBhbnkgSUNWIGNvcHlpbmcKKy8vIEtNUF9saW5lYXJfZ2F0aGVyICAgICAgLS0gdGltZSBpbiBfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXIKKy8vIEtNUF9saW5lYXJfcmVsZWFzZSAgICAgLS0gdGltZSBpbiBfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlCisvLyBLTVBfdHJlZV9nYXRoZXIgICAgICAgIC0tIHRpbWUgaW4gX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcgorLy8gS01QX3RyZWVfcmVsZWFzZSAgICAgICAtLSB0aW1lIGluIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlCisvLyBLTVBfaHlwZXJfZ2F0aGVyICAgICAgIC0tIHRpbWUgaW4gX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIKKy8vIEtNUF9oeXBlcl9yZWxlYXNlICAgICAgLS0gdGltZSBpbiBfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UKKyMgZGVmaW5lIEtNUF9GT1JFQUNIX0RFVkVMT1BFUl9USU1FUihtYWNybywgYXJnKSBcCisgICAgbWFjcm8gKEtNUF9mb3JrX2NhbGwsIDAsIGFyZykgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfam9pbl9jYWxsLCAwLCBhcmcpICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2VuZF9zcGxpdF9iYXJyaWVyLCAwLCBhcmcpICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9oaWVyX2dhdGhlciwgMCwgYXJnKSAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfaGllcl9yZWxlYXNlLCAwLCBhcmcpICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2h5cGVyX2dhdGhlciwgMCwgYXJnKSAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF9oeXBlcl9yZWxlYXNlLCAwLCBhcmcpICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfbGluZWFyX2dhdGhlciwgMCwgYXJnKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2xpbmVhcl9yZWxlYXNlLCAwLCBhcmcpICAgICAgICAgICBcCisgICAgbWFjcm8gKEtNUF90cmVlX2dhdGhlciwgMCwgYXJnKSAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfdHJlZV9yZWxlYXNlLCAwLCBhcmcpICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVVNFUl9yZXN1bWUsIDAsIGFyZykgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFVTRVJfc3VzcGVuZCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChLTVBfYWxsb2NhdGVfdGVhbSwgMCwgYXJnKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX3NldHVwX2ljdl9jb3B5LCAwLCBhcmcpICAgICAgICAgICBcCisgICAgbWFjcm8gKFVTRVJfaWN2X2NvcHksIDAsIGFyZykKKyNlbHNlCisjIGRlZmluZSBLTVBfRk9SRUFDSF9ERVZFTE9QRVJfVElNRVIobWFjcm8sIGFyZykKKyNlbmRpZgorCisvKiEKKyAqIFxicmllZiBBZGQgbmV3IGV4cGxpY2l0IHRpbWVycyB1bmRlciBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUigpIG1hY3JvLgorICoKKyAqIEBwYXJhbSBtYWNybyBhIHVzZXIgZGVmaW5lZCBtYWNybyB0aGF0IHRha2VzIHRocmVlIGFyZ3VtZW50cyAtIG1hY3JvKFRJTUVSX05BTUUsIGZsYWdzLCBhcmcpCisgKiBAcGFyYW0gYXJnIGEgdXNlciBkZWZpbmVkIGFyZ3VtZW50IHRvIHNlbmQgdG8gdGhlIHVzZXIgZGVmaW5lZCBtYWNybworICoKKyAqIFx3YXJuaW5nIFlPVSBNVVNUIEhBVkUgVEhFIFNBTUUgTkFNRUQgVElNRVIgVU5ERVIgS01QX0ZPUkVBQ0hfVElNRVIoKSBPUiBFTFNFIEJBRCBUSElOR1MgV0lMTCBIQVBQRU4hCisgKgorICogXGRldGFpbHMgRXhwbGljaXQgdGltZXJzIGFyZSBvbmVzIHdoZXJlIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSB0aW1lciBpdHNlbGYgKGFzIHdlbGwgYXMgdGhlIGFjY3VtdWxhdGVkIHRpbWluZyBzdGF0aXN0aWNzKS4KKyAqIFdlIGFsbG9jYXRlIHRoZXNlIG9uIGEgcGVyLXRocmVhZCBiYXNpcywgYW5kIGV4cGxpY2l0bHkgc3RhcnQgYW5kIHN0b3AgdGhlbS4KKyAqIEJsb2NrIHRpbWVycyBqdXN0IGFsbG9jYXRlIHRoZSB0aW1lciBpdHNlbGYgb24gdGhlIHN0YWNrLCBhbmQgdXNlIHRoZSBkZXN0cnVjdG9yIHRvIG5vdGljZSBibG9jayBleGl0OyB0aGV5IGRvbid0CisgKiBuZWVkIHRvIGJlIGRlZmluZWQgaGVyZS4KKyAqIFRoZSBuYW1lIGhlcmUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoYXQgb2YgYSB0aW1lciBhYm92ZS4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9GT1JFQUNIX0VYUExJQ0lUX1RJTUVSKG1hY3JvLCBhcmcpIFwKKyAgICBLTVBfRk9SRUFDSF9USU1FUihtYWNybywgYXJnKQorCisjZGVmaW5lIEVOVU1FUkFURShuYW1lLGlnbm9yZSxwcmVmaXgpIHByZWZpeCMjbmFtZSwKK2VudW0gdGltZXJfZSB7CisgICAgS01QX0ZPUkVBQ0hfVElNRVIoRU5VTUVSQVRFLCBUSU1FUl8pCisgICAgVElNRVJfTEFTVAorfTsKKworZW51bSBleHBsaWNpdF90aW1lcl9lIHsKKyAgICBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUihFTlVNRVJBVEUsIEVYUExJQ0lUX1RJTUVSXykKKyAgICBFWFBMSUNJVF9USU1FUl9MQVNUCit9OworCitlbnVtIGNvdW50ZXJfZSB7CisgICAgS01QX0ZPUkVBQ0hfQ09VTlRFUihFTlVNRVJBVEUsIENPVU5URVJfKQorICAgIENPVU5URVJfTEFTVAorfTsKKyN1bmRlZiBFTlVNRVJBVEUKKworY2xhc3MgdGltZXJQYWlyIHsKKyAgICBleHBsaWNpdF90aW1lcl9lIHRpbWVyX2luZGV4OworICAgIHRpbWVyX2UgdGltZXI7CisgcHVibGljOgorICAgIHRpbWVyUGFpcihleHBsaWNpdF90aW1lcl9lIHRpLCB0aW1lcl9lIHQpIDogdGltZXJfaW5kZXgodGkpLCB0aW1lcih0KSB7fQorICAgIGlubGluZSBleHBsaWNpdF90aW1lcl9lIGdldF9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIHRpbWVyX2luZGV4OyB9CisgICAgaW5saW5lIHRpbWVyX2UgZ2V0X3RpbWVyKCkgY29uc3QgeyByZXR1cm4gdGltZXI7IH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdGltZXJQYWlyICYgcmhzKSB7CisgICAgICAgIHJldHVybiB0aGlzLT5nZXRfaW5kZXgoKSA9PSByaHMuZ2V0X2luZGV4KCk7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB0aW1lclBhaXIgJiByaHMpIHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKKyAgICB9Cit9OworCitjbGFzcyBzdGF0aXN0aWMKK3sKKyAgICBkb3VibGUgICBtaW5WYWw7CisgICAgZG91YmxlICAgbWF4VmFsOworICAgIGRvdWJsZSAgIG1lYW5WYWw7CisgICAgZG91YmxlICAgbTI7CisgICAgdWludDY0X3Qgc2FtcGxlQ291bnQ7CisKKyBwdWJsaWM6CisgICAgc3RhdGlzdGljKCkgeyByZXNldCgpOyB9CisgICAgc3RhdGlzdGljIChzdGF0aXN0aWMgY29uc3QgJm8pOiBtaW5WYWwoby5taW5WYWwpLCBtYXhWYWwoby5tYXhWYWwpLCBtZWFuVmFsKG8ubWVhblZhbCksIG0yKG8ubTIpLCBzYW1wbGVDb3VudChvLnNhbXBsZUNvdW50KSB7fQorCisgICAgZG91YmxlICAgZ2V0TWluKCkgICBjb25zdCB7IHJldHVybiBtaW5WYWw7IH0KKyAgICBkb3VibGUgICBnZXRNZWFuKCkgIGNvbnN0IHsgcmV0dXJuIG1lYW5WYWw7IH0KKyAgICBkb3VibGUgICBnZXRNYXgoKSAgIGNvbnN0IHsgcmV0dXJuIG1heFZhbDsgfQorICAgIHVpbnQ2NF90IGdldENvdW50KCkgY29uc3QgeyByZXR1cm4gc2FtcGxlQ291bnQ7IH0KKyAgICBkb3VibGUgICBnZXRTRCgpICAgIGNvbnN0IHsgcmV0dXJuIHNxcnQobTIvc2FtcGxlQ291bnQpOyB9CisgICAgZG91YmxlICAgZ2V0VG90YWwoKSBjb25zdCB7IHJldHVybiBzYW1wbGVDb3VudCptZWFuVmFsOyB9CisKKyAgICB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIG1pblZhbCA9ICBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpOworICAgICAgICBtYXhWYWwgPSAtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKTsKKyAgICAgICAgbWVhblZhbD0gMC4wOworICAgICAgICBtMiAgICAgPSAwLjA7CisgICAgICAgIHNhbXBsZUNvdW50ID0gMDsKKyAgICB9CisgICAgdm9pZCBhZGRTYW1wbGUoZG91YmxlIHNhbXBsZSk7CisgICAgdm9pZCBzY2FsZSAgICAoZG91YmxlIGZhY3Rvcik7CisgICAgdm9pZCBzY2FsZURvd24oZG91YmxlIGYpICB7IHNjYWxlICgxLi9mKTsgfQorICAgIHN0YXRpc3RpYyAmIG9wZXJhdG9yKz0gKHN0YXRpc3RpYyBjb25zdCAmIG90aGVyKTsKKworICAgIHN0ZDo6c3RyaW5nIGZvcm1hdChjaGFyIHVuaXQsIGJvb2wgdG90YWw9ZmFsc2UpIGNvbnN0OworfTsKKworc3RydWN0IHN0YXRJbmZvCit7CisgICAgY29uc3QgY2hhciAqIG5hbWU7CisgICAgdWludDMyX3QgICAgIGZsYWdzOworfTsKKworY2xhc3MgdGltZVN0YXQgOiBwdWJsaWMgc3RhdGlzdGljCit7CisgICAgc3RhdGljIHN0YXRJbmZvIHRpbWVySW5mb1tdOworCisgcHVibGljOgorICAgIHRpbWVTdGF0KCkgOiBzdGF0aXN0aWMoKSB7fQorICAgIHN0YXRpYyBjb25zdCBjaGFyICogbmFtZSh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5uYW1lOyB9CisgICAgc3RhdGljIGJvb2wgIG5vVG90YWwgICAgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm9Ub3RhbDsgICAgICB9CisgICAgc3RhdGljIGJvb2wgIG1hc3Rlck9ubHkgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyOyB9CisgICAgc3RhdGljIGJvb2wgIHdvcmtlck9ubHkgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm90SW5NYXN0ZXI7ICB9CisgICAgc3RhdGljIGJvb2wgIG5vVW5pdHMgICAgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0czsgICAgICB9CisgICAgc3RhdGljIGJvb2wgIGxvZ0V2ZW50ICAgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQ7ICAgICB9CisgICAgc3RhdGljIHZvaWQgIGNsZWFyRXZlbnRGbGFncygpICAgICAgeworICAgICAgICBmb3IoaW50IGk9MDtpPFRJTUVSX0xBU1Q7aSsrKSB7CisgICAgICAgICAgICB0aW1lckluZm9baV0uZmxhZ3MgJj0gKH4oc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQpKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIFdoZXJlIHdlIG5lZWQgZXhwbGljaXRseSB0byBzdGFydCBhbmQgZW5kIHRoZSB0aW1lciwgdGhpcyB2ZXJzaW9uIGNhbiBiZSB1c2VkCisvLyBTaW5jZSB0aGVzZSB0aW1lcnMgbm9ybWFsbHkgYXJlbid0IG5pY2VseSBzY29wZWQsIHNvIGRvbid0IGhhdmUgYSBnb29kIHBsYWNlIHRvIGxpdmUKKy8vIG9uIHRoZSBzdGFjayBvZiB0aGUgdGhyZWFkLCB0aGV5J3JlIG1vcmUgd29yayB0byB1c2UuCitjbGFzcyBleHBsaWNpdFRpbWVyCit7CisgICAgdGltZVN0YXQgKiBzdGF0OworICAgIHRzY190aWNrX2NvdW50IHN0YXJ0VGltZTsKKyAgICB0c2NfdGlja19jb3VudCBwYXVzZVN0YXJ0VGltZTsKKyAgICB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QgdG90YWxQYXVzZVRpbWU7CisKKyBwdWJsaWM6CisgICAgZXhwbGljaXRUaW1lciAoKSA6IHN0YXQoMCksIHN0YXJ0VGltZSgwKSwgcGF1c2VTdGFydFRpbWUoMCksIHRvdGFsUGF1c2VUaW1lKCkgeyB9CisgICAgZXhwbGljaXRUaW1lciAodGltZVN0YXQgKiBzKSA6IHN0YXQocyksIHN0YXJ0VGltZSgpLCBwYXVzZVN0YXJ0VGltZSgwKSwgdG90YWxQYXVzZVRpbWUoKSB7IH0KKworICAgIHZvaWQgc2V0U3RhdCAodGltZVN0YXQgKnMpIHsgc3RhdCA9IHM7IH0KKyAgICB2b2lkIHN0YXJ0KHRpbWVyX2UgdGltZXJFbnVtVmFsdWUpOworICAgIHZvaWQgcGF1c2UoKSB7IHBhdXNlU3RhcnRUaW1lID0gdHNjX3RpY2tfY291bnQ6Om5vdygpOyB9CisgICAgdm9pZCByZXN1bWUoKSB7IHRvdGFsUGF1c2VUaW1lICs9ICh0c2NfdGlja19jb3VudDo6bm93KCkgLSBwYXVzZVN0YXJ0VGltZSk7IH0KKyAgICB2b2lkIHN0b3AodGltZXJfZSB0aW1lckVudW1WYWx1ZSwga21wX3N0YXRzX2xpc3QqIHN0YXRzX3B0ciA9IG51bGxwdHIpOworICAgIHZvaWQgcmVzZXQoKSB7IHN0YXJ0VGltZSA9IDA7IHBhdXNlU3RhcnRUaW1lID0gMDsgdG90YWxQYXVzZVRpbWUgPSAwOyB9Cit9OworCisvLyBXaGVyZSBhbGwgeW91IG5lZWQgaXMgdG8gdGltZSBhIGJsb2NrLCB0aGlzIGlzIGVub3VnaC4KKy8vIChJdCBhdm9pZHMgdGhlIG5lZWQgdG8gaGF2ZSBhbiBleHBsaWNpdCBlbmQsIGxlYXZpbmcgdGhlIHNjb3BlIHN1ZmZpY2VzLikKK2NsYXNzIGJsb2NrVGltZXIgOiBwdWJsaWMgZXhwbGljaXRUaW1lcgoreworICAgIHRpbWVyX2UgdGltZXJFbnVtVmFsdWU7CisgcHVibGljOgorICAgIGJsb2NrVGltZXIgKHRpbWVTdGF0ICogcywgdGltZXJfZSBuZXdUaW1lckVudW1WYWx1ZSkgOiB0aW1lckVudW1WYWx1ZShuZXdUaW1lckVudW1WYWx1ZSksIGV4cGxpY2l0VGltZXIocykgeyBzdGFydCh0aW1lckVudW1WYWx1ZSk7IH0KKyAgICB+YmxvY2tUaW1lcigpIHsgc3RvcCh0aW1lckVudW1WYWx1ZSk7IH0KK307CisKKy8vIFdoZXJlIHlvdSBuZWVkIHRvIHBhcnRpdGlvbiBhIHRocmVhZHMgY2xvY2sgdGlja3MgaW50byBzZXBhcmF0ZSBzdGF0ZXMKKy8vIGUuZy4sIGEgcGFydGl0aW9uZWRUaW1lcnMgY2xhc3Mgd2l0aCB0d28gdGltZXJzIG9mIEVYRUNVVElOR19UQVNLLCBhbmQKKy8vICAgRE9JTkdfTk9USElORyB3b3VsZCByZW5kZXIgdGhlc2UgY29uZGl0aW9uczoKKy8vICAgdGltZShFWEVDVVRJTkdfVEFTSykgKyB0aW1lKERPSU5HX05PVEhJTkcpID0gdG90YWwgdGltZSB0aHJlYWQgaXMgYWxpdmUKKy8vICAgTm8gY2xvY2sgdGljayBpbiB0aGUgRVhFQ1VUSU5HX1RBU0sgaXMgYSBtZW1iZXIgb2YgRE9JTkdfTk9USElORyBhbmQgdmljZSB2ZXJzYQorY2xhc3MgcGFydGl0aW9uZWRUaW1lcnMKK3sKKyBwcml2YXRlOgorICAgIGV4cGxpY2l0VGltZXIqIHRpbWVyc1tFWFBMSUNJVF9USU1FUl9MQVNUKzFdOworICAgIHN0ZDo6dmVjdG9yPHRpbWVyUGFpcj4gdGltZXJfc3RhY2s7CisgcHVibGljOgorICAgIHBhcnRpdGlvbmVkVGltZXJzKCk7CisgICAgdm9pZCBhZGRfdGltZXIoZXhwbGljaXRfdGltZXJfZSB0aW1lcl9pbmRleCwgZXhwbGljaXRUaW1lciogdGltZXJfcG9pbnRlcik7CisgICAgdm9pZCBpbml0KHRpbWVyUGFpciB0aW1lcl9pbmRleCk7CisgICAgdm9pZCBwdXNoKHRpbWVyUGFpciB0aW1lcl9pbmRleCk7CisgICAgdm9pZCBwb3AoKTsKKyAgICB2b2lkIHdpbmR1cCgpOworfTsKKworLy8gU3BlY2lhbCB3cmFwcGVyIGFyb3VuZCB0aGUgcGFydGlvbmVkIHRpbWVycyB0byBhaWQgdGltaW5nIGNvZGUgYmxvY2tzCisvLyBJdCBhdm9pZHMgdGhlIG5lZWQgdG8gaGF2ZSBhbiBleHBsaWNpdCBlbmQsIGxlYXZpbmcgdGhlIHNjb3BlIHN1ZmZpY2VzLgorY2xhc3MgYmxvY2tQYXJ0aXRpb25lZFRpbWVyCit7CisgICAgcGFydGl0aW9uZWRUaW1lcnMqIHBhcnRfdGltZXJzOworICAgIHRpbWVyUGFpciB0aW1lcl9wYWlyOworIHB1YmxpYzoKKyAgICBibG9ja1BhcnRpdGlvbmVkVGltZXIocGFydGl0aW9uZWRUaW1lcnMqIHB0LCB0aW1lclBhaXIgdHApIDogcGFydF90aW1lcnMocHQpLCB0aW1lcl9wYWlyKHRwKSB7IHBhcnRfdGltZXJzLT5wdXNoKHRpbWVyX3BhaXIpOyB9CisgICB+YmxvY2tQYXJ0aXRpb25lZFRpbWVyKCkgeyBwYXJ0X3RpbWVycy0+cG9wKCk7IH0KK307CisKKy8vIFNwZWNpYWwgd3JhcHBlciBhcm91bmQgdGhlIHRocmVhZCBzdGF0ZSB0byBhaWQgaW4ga2VlcGluZyBzdGF0ZSBpbiBjb2RlIGJsb2NrcworLy8gSXQgYXZvaWRzIHRoZSBuZWVkIHRvIGhhdmUgYW4gZXhwbGljaXQgZW5kLCBsZWF2aW5nIHRoZSBzY29wZSBzdWZmaWNlcy4KK2NsYXNzIGJsb2NrVGhyZWFkU3RhdGUKK3sKKyAgICBzdGF0c19zdGF0ZV9lKiBzdGF0ZV9wb2ludGVyOworICAgIHN0YXRzX3N0YXRlX2UgIG9sZF9zdGF0ZTsKKyBwdWJsaWM6CisgICAgYmxvY2tUaHJlYWRTdGF0ZShzdGF0c19zdGF0ZV9lKiB0aHJlYWRfc3RhdGVfcG9pbnRlciwgc3RhdHNfc3RhdGVfZSBuZXdfc3RhdGUpIDogc3RhdGVfcG9pbnRlcih0aHJlYWRfc3RhdGVfcG9pbnRlciksIG9sZF9zdGF0ZSgqdGhyZWFkX3N0YXRlX3BvaW50ZXIpIHsKKyAgICAgICAgKnN0YXRlX3BvaW50ZXIgPSBuZXdfc3RhdGU7CisgICAgfQorICAgfmJsb2NrVGhyZWFkU3RhdGUoKSB7ICpzdGF0ZV9wb2ludGVyID0gb2xkX3N0YXRlOyAgfQorfTsKKworLy8gSWYgYWxsIHlvdSB3YW50IGlzIGEgY291bnQsIHRoZW4geW91IGNhbiB1c2UgdGhpcy4uLgorLy8gVGhlIGluZGl2aWR1YWwgcGVyLXRocmVhZCBjb3VudHMgd2lsbCBiZSBhZ2dyZWdhdGVkIGludG8gYSBzdGF0aXN0aWMgYXQgcHJvZ3JhbSBleGl0LgorY2xhc3MgY291bnRlcgoreworICAgIHVpbnQ2NF90IHZhbHVlOworICAgIHN0YXRpYyBjb25zdCBzdGF0SW5mbyBjb3VudGVySW5mb1tdOworCisgcHVibGljOgorICAgIGNvdW50ZXIoKSA6IHZhbHVlKDApIHt9CisgICAgdm9pZCBpbmNyZW1lbnQoKSB7IHZhbHVlKys7IH0KKyAgICB1aW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisgICAgdm9pZCByZXNldCgpIHsgdmFsdWUgPSAwOyB9CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBuYW1lKGNvdW50ZXJfZSBlKSB7IHJldHVybiBjb3VudGVySW5mb1tlXS5uYW1lOyB9CisgICAgc3RhdGljIGJvb2wgIG1hc3Rlck9ubHkgKGNvdW50ZXJfZSBlKSB7IHJldHVybiBjb3VudGVySW5mb1tlXS5mbGFncyAmIHN0YXRzX2ZsYWdzX2U6Om9ubHlJbk1hc3RlcjsgfQorfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIENsYXNzIHRvIGltcGxlbWVudCBhbiBldmVudAorCisgICAgVGhlcmUgYXJlIGZvdXIgY29tcG9uZW50cyB0byBhbiBldmVudDogc3RhcnQgdGltZSwgc3RvcCB0aW1lCisgICAgbmVzdF9sZXZlbCwgYW5kIHRpbWVyX25hbWUuCisgICAgVGhlIHN0YXJ0IGFuZCBzdG9wIHRpbWUgc2hvdWxkIGJlIG9idmlvdXMgKHJlY29yZGVkIGluIGNsb2NrIHRpY2tzKS4KKyAgICBUaGUgbmVzdF9sZXZlbCByZWxhdGVzIHRvIHRoZSBiYXIgd2lkdGggaW4gdGhlIHRpbWVsaW5lIGdyYXBoLgorICAgIFRoZSB0aW1lcl9uYW1lIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHRpbWVyIGV2ZW50IHRyaWdnZXJlZCB0aGlzIGV2ZW50LgorCisgICAgdGhlIGludGVyZmFjZSB0byB0aGlzIGNsYXNzIGlzIHRocm91Z2ggZm91ciByZWFkLW9ubHkgb3BlcmF0aW9uczoKKyAgICAxKSBnZXRTdGFydCgpICAgICAtLSByZXR1cm5zIHRoZSBzdGFydCB0aW1lIGFzIDY0IGJpdCBpbnRlZ2VyCisgICAgMikgZ2V0U3RvcCgpICAgICAgLS0gcmV0dXJucyB0aGUgc3RvcCB0aW1lIGFzIDY0IGJpdCBpbnRlZ2VyCisgICAgMykgZ2V0TmVzdExldmVsKCkgLS0gcmV0dXJucyB0aGUgbmVzdCBsZXZlbCBvZiB0aGUgZXZlbnQKKyAgICA0KSBnZXRUaW1lck5hbWUoKSAtLSByZXR1cm5zIHRoZSB0aW1lciBuYW1lIHRoYXQgdHJpZ2dlcmVkIGV2ZW50CisKKyAgICAqTU9SRSBPTiBORVNUX0xFVkVMKgorICAgIFRoZSBuZXN0IGxldmVsIGlzIHVzZWQgaW4gdGhlIGJhciBncmFwaCB0aGF0IHJlcHJlc2VudHMgdGhlIHRpbWVsaW5lLgorICAgIEl0cyBtYWluIHB1cnBvc2UgaXMgZm9yIHNob3dpbmcgaG93IGV2ZW50cyBhcmUgbmVzdGVkIGluc2lkZSBlYWNob3RoZXIuCisgICAgRm9yIGV4YW1wbGUsIHNheSBldmVudHMsIEEsIEIsIGFuZCBDIGFyZSByZWNvcmRlZC4gIElmIHRoZSB0aW1lbGluZQorICAgIGxvb2tzIGxpa2UgdGhpczoKKworQmVnaW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gVGltZQorICAgICAgICAgfCAgICB8ICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgICAgQSAgICBCICAgICAgICAgIEMgICAgICAgIEMgICAgICAgICAgQiAgICAgICAgICAgICAgQQorICAgICAgIHN0YXJ0IHN0YXJ0ICAgICBzdGFydCAgICAgZW5kICAgICAgICBlbmQgICAgICAgICAgICBlbmQKKworICAgICAgIFRoZW4gQSwgQiwgQyB3aWxsIGhhdmUgYSBuZXN0IGxldmVsIG9mIDEsIDIsIDMgcmVzcGVjdGl2ZWx5LgorICAgICAgIFRoZXNlIHZhbHVlcyBhcmUgdGhlbiB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgYmFyd2lkdGggc28geW91IGNhbgorICAgICAgIHNlZSB0aGF0IGluc2lkZSBBLCBCIGhhcyBvY2N1cnJlZCwgYW5kIGluc2lkZSBCLCBDIGhhcyBvY2N1cnJlZC4KKyAgICAgICBDdXJyZW50bHksIHRoaXMgaXMgc2hvd24gd2l0aCBBJ3MgYmFyIHdpZHRoIGJlaW5nIGxhcmdlciB0aGFuIEIncworICAgICAgIGJhciB3aWR0aCwgYW5kIEIncyBiYXIgd2lkdGggYmVpbmcgbGFyZ2VyIHRoYW4gQydzIGJhciB3aWR0aC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworY2xhc3Mga21wX3N0YXRzX2V2ZW50IHsKKyAgICB1aW50NjRfdCBzdGFydDsKKyAgICB1aW50NjRfdCBzdG9wOworICAgIGludCBuZXN0X2xldmVsOworICAgIHRpbWVyX2UgdGltZXJfbmFtZTsKKyBwdWJsaWM6CisgICAga21wX3N0YXRzX2V2ZW50KCkgOiBzdGFydCgwKSwgc3RvcCgwKSwgbmVzdF9sZXZlbCgwKSwgdGltZXJfbmFtZShUSU1FUl9MQVNUKSB7fQorICAgIGttcF9zdGF0c19ldmVudCh1aW50NjRfdCBzdHJ0LCB1aW50NjRfdCBzdHAsIGludCBuc3QsIHRpbWVyX2Ugbm1lKSA6IHN0YXJ0KHN0cnQpLCBzdG9wKHN0cCksIG5lc3RfbGV2ZWwobnN0KSwgdGltZXJfbmFtZShubWUpIHt9CisgICAgaW5saW5lIHVpbnQ2NF90ICBnZXRTdGFydCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0OyB9CisgICAgaW5saW5lIHVpbnQ2NF90ICBnZXRTdG9wKCkgY29uc3QgIHsgcmV0dXJuIHN0b3A7ICB9CisgICAgaW5saW5lIGludCAgICAgICBnZXROZXN0TGV2ZWwoKSBjb25zdCB7IHJldHVybiBuZXN0X2xldmVsOyB9CisgICAgaW5saW5lIHRpbWVyX2UgICBnZXRUaW1lck5hbWUoKSBjb25zdCB7IHJldHVybiB0aW1lcl9uYW1lOyB9Cit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgQ2xhc3MgdG8gaW1wbGVtZW50IGEgZHluYW1pY2FsbHkgZXhwYW5kYWJsZSBhcnJheSBvZiBldmVudHMKKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgZXZlbnQgMSB8IGV2ZW50IDIgfCBldmVudCAzIHwgZXZlbnQgNCB8IC4uLiB8IGV2ZW50IE4gfAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQW4gZXZlbnQgaXMgcHVzaGVkIG9udG8gdGhlIGJhY2sgb2YgdGhpcyBhcnJheSBhdCBldmVyeQorICAgIGV4cGxpY2l0VGltZXItPnN0b3AoKSBjYWxsLiAgVGhlIGV2ZW50IHJlY29yZHMgdGhlIHRocmVhZCAjLAorICAgIHN0YXJ0IHRpbWUsIHN0b3AgdGltZSwgYW5kIG5lc3QgbGV2ZWwgcmVsYXRlZCB0byB0aGUgYmFyIHdpZHRoLgorCisgICAgVGhlIGV2ZW50IHZlY3RvciBzdGFydHMgYXQgc2l6ZSBJTklUX1NJWkUgYW5kIGdyb3dzIChkb3VibGVzIGluIHNpemUpCisgICAgaWYgbmVlZGVkLiAgQW4gaW1wbGljYXRpb24gb2YgdGhpcyBiZWhhdmlvciBpcyB0aGF0IGxvZyhOKQorICAgIHJlYWxsb2NhdGlvbnMgYXJlIG5lZWRlZCAod2hlcmUgTiBpcyBudW1iZXIgb2YgZXZlbnRzKS4gIElmIHlvdSB3YW50CisgICAgdG8gYXZvaWQgcmVhbGxvY2F0aW9ucywgdGhlbiBzZXQgSU5JVF9TSVpFIHRvIGEgbGFyZ2UgdmFsdWUuCisKKyAgICB0aGUgaW50ZXJmYWNlIHRvIHRoaXMgY2xhc3MgaXMgdGhyb3VnaCBzaXggb3BlcmF0aW9uczoKKyAgICAxKSByZXNldCgpIC0tIHNldHMgdGhlIGludGVybmFsX3NpemUgYmFjayB0byAwIGJ1dCBkb2VzIG5vdCBkZWFsbG9jYXRlIGFueSBtZW1vcnkKKyAgICAyKSBzaXplKCkgIC0tIHJldHVybnMgdGhlIG51bWJlciBvZiB2YWxpZCBlbGVtZW50cyBpbiB0aGUgdmVjdG9yCisgICAgMykgcHVzaF9iYWNrKHN0YXJ0LCBzdG9wLCBuZXN0LCB0aW1lcl9uYW1lKSAtLSBwdXNoZXMgYW4gZXZlbnQgb250bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJhY2sgb2YgdGhlIGFycmF5CisgICAgNCkgZGVhbGxvY2F0ZSgpIC0tIGZyZWVzIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZWN0b3IKKyAgICA1KSBzb3J0KCkgLS0gc29ydHMgdGhlIHZlY3RvciBieSBzdGFydCB0aW1lCisgICAgNikgb3BlcmF0b3JbaW5kZXhdIG9yIGF0KGluZGV4KSAtLSByZXR1cm5zIGV2ZW50IHJlZmVyZW5jZSBhdCB0aGF0IGluZGV4CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK2NsYXNzIGttcF9zdGF0c19ldmVudF92ZWN0b3IgeworICAgIGttcF9zdGF0c19ldmVudCogZXZlbnRzOworICAgIGludCBpbnRlcm5hbF9zaXplOworICAgIGludCBhbGxvY2F0ZWRfc2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IElOSVRfU0laRSA9IDEwMjQ7CisgcHVibGljOgorICAgIGttcF9zdGF0c19ldmVudF92ZWN0b3IoKSB7CisgICAgICAgIGV2ZW50cyA9IChrbXBfc3RhdHNfZXZlbnQqKV9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfc3RhdHNfZXZlbnQpKklOSVRfU0laRSk7CisgICAgICAgIGludGVybmFsX3NpemUgPSAwOworICAgICAgICBhbGxvY2F0ZWRfc2l6ZSA9IElOSVRfU0laRTsKKyAgICB9CisgICB+a21wX3N0YXRzX2V2ZW50X3ZlY3RvcigpIHt9CisgICAgaW5saW5lIHZvaWQgcmVzZXQoKSB7IGludGVybmFsX3NpemUgPSAwOyB9CisgICAgaW5saW5lIGludCAgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsX3NpemU7IH0KKyAgICB2b2lkIHB1c2hfYmFjayh1aW50NjRfdCBzdGFydF90aW1lLCB1aW50NjRfdCBzdG9wX3RpbWUsIGludCBuZXN0X2xldmVsLCB0aW1lcl9lIG5hbWUpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmKGludGVybmFsX3NpemUgPT0gYWxsb2NhdGVkX3NpemUpIHsKKyAgICAgICAgICAgIGttcF9zdGF0c19ldmVudCogdG1wID0gKGttcF9zdGF0c19ldmVudCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9zdGF0c19ldmVudCkqYWxsb2NhdGVkX3NpemUqMik7CisgICAgICAgICAgICBmb3IoaT0wO2k8aW50ZXJuYWxfc2l6ZTtpKyspIHRtcFtpXSA9IGV2ZW50c1tpXTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoZXZlbnRzKTsKKyAgICAgICAgICAgIGV2ZW50cyA9IHRtcDsKKyAgICAgICAgICAgIGFsbG9jYXRlZF9zaXplKj0yOworICAgICAgICB9CisgICAgICAgIGV2ZW50c1tpbnRlcm5hbF9zaXplXSA9IGttcF9zdGF0c19ldmVudChzdGFydF90aW1lLCBzdG9wX3RpbWUsIG5lc3RfbGV2ZWwsIG5hbWUpOworICAgICAgICBpbnRlcm5hbF9zaXplKys7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdm9pZCBkZWFsbG9jYXRlKCk7CisgICAgdm9pZCBzb3J0KCk7CisgICAgY29uc3Qga21wX3N0YXRzX2V2ZW50ICYgb3BlcmF0b3JbXShpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50c1tpbmRleF07IH0KKyAgICAgICAgICBrbXBfc3RhdHNfZXZlbnQgJiBvcGVyYXRvcltdKGludCBpbmRleCkgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorICAgIGNvbnN0IGttcF9zdGF0c19ldmVudCAmIGF0KGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorICAgICAgICAgIGttcF9zdGF0c19ldmVudCAmIGF0KGludCBpbmRleCkgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIENsYXNzIHRvIGltcGxlbWVudCBhIGRvdWJseS1saW5rZWQsIGNpcmN1bGFyLCBzdGF0aXN0aWNzIGxpc3QKKworICAgIHwtLS18IC0tLT4gfC0tLXwgLS0tPiB8LS0tfCAtLS0+IHwtLS18IC0tLT4gLi4uIG5leHQKKyAgICB8ICAgfCAgICAgIHwgICB8ICAgICAgfCAgIHwgICAgICB8ICAgfAorICAgIHwtLS18IDwtLS0gfC0tLXwgPC0tLSB8LS0tfCA8LS0tIHwtLS18IDwtLS0gLi4uIHByZXYKKyAgICBTZW50aW5lbCAgIGZpcnN0ICAgICAgc2Vjb25kICAgICB0aGlyZAorICAgIE5vZGUgICAgICAgbm9kZSAgICAgICBub2RlICAgICAgIG5vZGUKKworICAgIFRoZSBTZW50aW5lbCBOb2RlIGlzIHRoZSB1c2VyIGhhbmRsZSBvbiB0aGUgbGlzdC4KKyAgICBUaGUgZmlyc3Qgbm9kZSBjb3JyZXNwb25kcyB0byB0aHJlYWQgMCdzIHN0YXRpc3RpY3MuCisgICAgVGhlIHNlY29uZCBub2RlIGNvcnJlc3BvbmRzIHRvIHRocmVhZCAxJ3Mgc3RhdGlzdGljcyBhbmQgc28gb24uLi4KKworICAgIEVhY2ggbm9kZSBoYXMgYSBfdGltZXJzLCBfY291bnRlcnMsIGFuZCBfZXhwbGljaXRUaW1lcnMgYXJyYXkgdG8KKyAgICBob2xkIHRoYXQgdGhyZWFkJ3Mgc3RhdGlzdGljcy4gIFRoZSBfZXhwbGljaXRUaW1lcnMKKyAgICBwb2ludCB0byB0aGUgY29ycmVjdCBfdGltZXIgYW5kIHVwZGF0ZSBpdHMgc3RhdGlzdGljcyBhdCBldmVyeSBzdG9wKCkgY2FsbC4KKyAgICBUaGUgZXhwbGljaXRUaW1lcnMnIHBvaW50ZXJzIGFyZSBzZXQgdXAgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgIEVhY2ggbm9kZSBhbHNvIGhhcyBhbiBldmVudCB2ZWN0b3IgdG8gaG9sZCB0aGF0IHRocmVhZCdzIHRpbWluZyBldmVudHMuCisgICAgVGhlIGV2ZW50IHZlY3RvciBleHBhbmRzIGFzIG5lY2Vzc2FyeSBhbmQgcmVjb3JkcyB0aGUgc3RhcnQtc3RvcCB0aW1lcworICAgIGZvciBlYWNoIHRpbWVyLgorCisgICAgVGhlIG5lc3RMZXZlbCB2YXJpYWJsZSBpcyBmb3IgcGxvdHRpbmcgZXZlbnRzIGFuZCBpcyByZWxhdGVkCisgICAgdG8gdGhlIGJhciB3aWR0aCBpbiB0aGUgdGltZWxpbmUgZ3JhcGguCisKKyAgICBFdmVyeSB0aHJlYWQgd2lsbCBoYXZlIGEgX190aHJlYWQgbG9jYWwgcG9pbnRlciB0byBpdHMgbm9kZSBpbgorICAgIHRoZSBsaXN0LiAgVGhlIHNlbnRpbmVsIG5vZGUgaXMgdXNlZCBieSB0aGUgbWFzdGVyIHRocmVhZCB0bworICAgIHN0b3JlICJkdW1teSIgc3RhdGlzdGljcyBiZWZvcmUgX19rbXBfY3JlYXRlX3dvcmtlcigpIGlzIGNhbGxlZC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworY2xhc3Mga21wX3N0YXRzX2xpc3QgeworICAgIGludCBndGlkOworICAgIHRpbWVTdGF0ICAgICAgX3RpbWVyc1tUSU1FUl9MQVNUKzFdOworICAgIGNvdW50ZXIgICAgICAgX2NvdW50ZXJzW0NPVU5URVJfTEFTVCsxXTsKKyAgICBleHBsaWNpdFRpbWVyIF9leHBsaWNpdFRpbWVyc1tFWFBMSUNJVF9USU1FUl9MQVNUKzFdOworICAgIHBhcnRpdGlvbmVkVGltZXJzIF9wYXJ0aXRpb25lZFRpbWVyczsKKyAgICBpbnQgICAgICAgICAgIF9uZXN0TGV2ZWw7IC8vIG9uZSBwZXIgdGhyZWFkCisgICAga21wX3N0YXRzX2V2ZW50X3ZlY3RvciBfZXZlbnRfdmVjdG9yOworICAgIGttcF9zdGF0c19saXN0KiBuZXh0OworICAgIGttcF9zdGF0c19saXN0KiBwcmV2OworICAgIHN0YXRzX3N0YXRlX2Ugc3RhdGU7CisgICAgaW50IHRocmVhZF9pc19pZGxlX2ZsYWc7CisgcHVibGljOgorICAgIGttcF9zdGF0c19saXN0KCkgOiBfbmVzdExldmVsKDApLCBfZXZlbnRfdmVjdG9yKCksIG5leHQodGhpcyksIHByZXYodGhpcyksCisgICAgICBzdGF0ZShJRExFKSwgdGhyZWFkX2lzX2lkbGVfZmxhZygwKSB7CisjZGVmaW5lIGRvSW5pdChuYW1lLGlnbm9yZTEsaWdub3JlMikgXAorICAgICAgICBnZXRFeHBsaWNpdFRpbWVyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSktPnNldFN0YXQoZ2V0VGltZXIoVElNRVJfIyNuYW1lKSk7IFwKKyAgICAgICAgX3BhcnRpdGlvbmVkVGltZXJzLmFkZF90aW1lcihFWFBMSUNJVF9USU1FUl8jI25hbWUsIGdldEV4cGxpY2l0VGltZXIoRVhQTElDSVRfVElNRVJfIyNuYW1lKSk7CisgICAgICAgIEtNUF9GT1JFQUNIX0VYUExJQ0lUX1RJTUVSKGRvSW5pdCwwKTsKKyN1bmRlZiBkb0luaXQKKyAgICB9CisgICB+a21wX3N0YXRzX2xpc3QoKSB7IH0KKyAgICBpbmxpbmUgdGltZVN0YXQgKiAgICAgIGdldFRpbWVyKHRpbWVyX2UgaWR4KSAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICZfdGltZXJzW2lkeF07IH0KKyAgICBpbmxpbmUgY291bnRlciAgKiAgICAgIGdldENvdW50ZXIoY291bnRlcl9lIGlkeCkgICAgICAgICAgICAgIHsgcmV0dXJuICZfY291bnRlcnNbaWR4XTsgfQorICAgIGlubGluZSBleHBsaWNpdFRpbWVyICogZ2V0RXhwbGljaXRUaW1lcihleHBsaWNpdF90aW1lcl9lIGlkeCkgeyByZXR1cm4gJl9leHBsaWNpdFRpbWVyc1tpZHhdOyB9CisgICAgaW5saW5lIHBhcnRpdGlvbmVkVGltZXJzICogZ2V0UGFydGl0aW9uZWRUaW1lcnMoKSAgICAgICAgICAgICB7IHJldHVybiAmX3BhcnRpdGlvbmVkVGltZXJzOyB9CisgICAgaW5saW5lIHRpbWVTdGF0ICogICAgICBnZXRUaW1lcnMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBfdGltZXJzOyB9CisgICAgaW5saW5lIGNvdW50ZXIgICogICAgICBnZXRDb3VudGVycygpICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBfY291bnRlcnM7IH0KKyAgICBpbmxpbmUgZXhwbGljaXRUaW1lciAqIGdldEV4cGxpY2l0VGltZXJzKCkgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9leHBsaWNpdFRpbWVyczsgfQorICAgIGlubGluZSBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yICYgZ2V0RXZlbnRWZWN0b3IoKSAgICAgICAgICAgICAgeyByZXR1cm4gX2V2ZW50X3ZlY3RvcjsgfQorICAgIGlubGluZSB2b2lkIHJlc2V0RXZlbnRWZWN0b3IoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBfZXZlbnRfdmVjdG9yLnJlc2V0KCk7IH0KKyAgICBpbmxpbmUgdm9pZCBpbmNyZW1lbnROZXN0VmFsdWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgX25lc3RMZXZlbCsrOyB9CisgICAgaW5saW5lIGludCAgZ2V0TmVzdFZhbHVlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBfbmVzdExldmVsOyB9CisgICAgaW5saW5lIHZvaWQgZGVjcmVtZW50TmVzdFZhbHVlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IF9uZXN0TGV2ZWwtLTsgfQorICAgIGlubGluZSBpbnQgIGdldEd0aWQoKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZ3RpZDsgfQorICAgIGlubGluZSB2b2lkIHNldEd0aWQoaW50IG5ld2d0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBndGlkID0gbmV3Z3RpZDsgfQorICAgIGlubGluZSB2b2lkIHNldFN0YXRlKHN0YXRzX3N0YXRlX2UgbmV3c3RhdGUpICAgICAgICAgICAgICAgICAgeyBzdGF0ZSA9IG5ld3N0YXRlOyB9CisgICAgaW5saW5lIHN0YXRzX3N0YXRlX2UgZ2V0U3RhdGUoKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzdGF0ZTsgfQorICAgIGlubGluZSBzdGF0c19zdGF0ZV9lICogZ2V0U3RhdGVQb2ludGVyKCkgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gJnN0YXRlOyB9CisgICAgaW5saW5lIGJvb2wgIGlzSWRsZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0aHJlYWRfaXNfaWRsZV9mbGFnPT0xOyB9CisgICAgaW5saW5lIHZvaWQgc2V0SWRsZUZsYWcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHRocmVhZF9pc19pZGxlX2ZsYWcgPSAxOyB9CisgICAgaW5saW5lIHZvaWQgcmVzZXRJZGxlRmxhZygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHRocmVhZF9pc19pZGxlX2ZsYWcgPSAwOyB9CisgICAga21wX3N0YXRzX2xpc3QqIHB1c2hfYmFjayhpbnQgZ3RpZCk7IC8vIHJldHVybnMgbmV3bHkgY3JlYXRlZCBsaXN0IG5vZGUKKyAgICBpbmxpbmUgdm9pZCAgICAgcHVzaF9ldmVudCh1aW50NjRfdCBzdGFydF90aW1lLCB1aW50NjRfdCBzdG9wX3RpbWUsIGludCBuZXN0X2xldmVsLCB0aW1lcl9lIG5hbWUpIHsKKyAgICAgICAgX2V2ZW50X3ZlY3Rvci5wdXNoX2JhY2soc3RhcnRfdGltZSwgc3RvcF90aW1lLCBuZXN0X2xldmVsLCBuYW1lKTsKKyAgICB9CisgICAgdm9pZCBkZWFsbG9jYXRlKCk7CisgICAgY2xhc3MgaXRlcmF0b3I7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGJlZ2luKCk7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGVuZCgpOworICAgIGludCBzaXplKCk7CisgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICBrbXBfc3RhdHNfbGlzdCogcHRyOworICAgICAgICBmcmllbmQga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjpiZWdpbigpOworICAgICAgICBmcmllbmQga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjplbmQoKTsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoKTsKKyAgICAgICB+aXRlcmF0b3IoKTsKKyAgICAgICAgaXRlcmF0b3Igb3BlcmF0b3IrKygpOworICAgICAgICBpdGVyYXRvciBvcGVyYXRvcisrKGludCBkdW1teSk7CisgICAgICAgIGl0ZXJhdG9yIG9wZXJhdG9yLS0oKTsKKyAgICAgICAgaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQgZHVtbXkpOworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3IgJiByaHMpOworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJiByaHMpOworICAgICAgICBrbXBfc3RhdHNfbGlzdCogb3BlcmF0b3IqKCkgY29uc3Q7IC8vIGRlcmVmZXJlbmNlIG9wZXJhdG9yCisgICAgfTsKK307CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCBvdXRwdXQgZnVuY3Rpb25zIGFuZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisKKyAgIFRoaXMgbW9kdWxlIGhvbGRzIGZpbGVuYW1lcyBmb3IgdmFyaW91cyBvdXRwdXRzIChub3JtYWwgc3RhdHMsIGV2ZW50cywgcGxvdCBmaWxlKSwKKyAgIGFzIHdlbGwgYXMgY29sb3JpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBwbG90IGZpbGUuCisKKyAgIFRoZSBmaWxlbmFtZXMgYW5kIGZsYWdzIHZhcmlhYmxlcyBhcmUgcmVhZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgIFRoZXNlIGFyZSByZWFkIG9uY2UgYnkgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBnbG9iYWwgdmFyaWFibGUgX19rbXBfc3RhdHNfb3V0cHV0CisgICB3aGljaCBjYWxscyBpbml0KCkuCisKKyAgIER1cmluZyB0aGlzIGluaXQoKSBjYWxsLCBldmVudCBmbGFncyBmb3IgdGhlIHRpbWVTdGF0Ojp0aW1lckluZm9bXSBnbG9iYWwgYXJyYXkKKyAgIGFyZSBjbGVhcmVkIGlmIEtNUF9TVEFUU19FVkVOVFMgaXMgbm90IHRydWUgKG9uLCAxLCB5ZXMpLgorCisgICBUaGUgb25seSBpbnRlcmZhY2UgZnVuY3Rpb24gdGhhdCBpcyBwdWJsaWMgaXMgb3V0cHV0U3RhdHMoaGVhZGluZykuICBUaGlzIGZ1bmN0aW9uCisgICBzaG91bGQgcHJpbnQgb3V0IGV2ZXJ5dGhpbmcgaXQgbmVlZHMgdG8sIGVpdGhlciB0byBmaWxlcyBvciBzdGRlcnIsCisgICBkZXBlbmRpbmcgb24gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBkZXNjcmliZWQgYmVsb3cKKworICAgRU5WSVJPTk1FTlQgVkFSSUFCTEVTOgorICAgS01QX1NUQVRTX0ZJTEUgLS0gaWYgc2V0LCBhbGwgc3RhdGlzdGljcyAobm90IGV2ZW50cykgd2lsbCBiZSBwcmludGVkIHRvIHRoaXMgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgcHJpbnQgdG8gc3RkZXJyCisgICBLTVBfU1RBVFNfVEhSRUFEUyAtLSBpZiBzZXQgdG8gIm9uIiwgdGhlbiB3aWxsIHByaW50IHBlciB0aHJlYWQgc3RhdGlzdGljcyB0byBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9TVEFUU19GSUxFIG9yIHN0ZGVycgorICAgS01QX1NUQVRTX1BMT1RfRklMRSAtLSBpZiBzZXQsIHByaW50IHRoZSBwbG90aWN1cyBwbG90IGZpbGUgdG8gdGhpcyBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCB0aGUgcGxvdCBmaWxlIGlzIHNlbnQgdG8gImV2ZW50cy5wbHQiCisgICBLTVBfU1RBVFNfRVZFTlRTIC0tIGlmIHNldCB0byAib24iLCB0aGVuIGxvZyBldmVudHMsIG90aGVyd2lzZSwgZG9uJ3QgbG9nIGV2ZW50cworICAgS01QX1NUQVRTX0VWRU5UU19GSUxFIC0tIGlmIHNldCwgYWxsIGV2ZW50cyBhcmUgb3V0cHV0dGVkIHRvIHRoaXMgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIG91dHB1dCBpcyBzZW50IHRvICJldmVudHMuZGF0IgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitjbGFzcyBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSB7CisKKyBwdWJsaWM6CisgICAgc3RydWN0IHJnYl9jb2xvciB7CisgICAgICAgIGZsb2F0IHI7CisgICAgICAgIGZsb2F0IGc7CisgICAgICAgIGZsb2F0IGI7CisgICAgfTsKKworIHByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0RmlsZU5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGV2ZW50c0ZpbGVOYW1lOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBwbG90RmlsZU5hbWU7CisgICAgc3RhdGljIGludCBwcmludFBlclRocmVhZEZsYWc7CisgICAgc3RhdGljIGludCBwcmludFBlclRocmVhZEV2ZW50c0ZsYWc7CisgICAgc3RhdGljIGNvbnN0IHJnYl9jb2xvciBnbG9iYWxDb2xvckFycmF5W107CisgICAgc3RhdGljICAgICAgIHJnYl9jb2xvciB0aW1lckNvbG9ySW5mb1tdOworCisgICAgdm9pZCBpbml0KCk7CisgICAgc3RhdGljIHZvaWQgc2V0dXBFdmVudENvbG9ycygpOworICAgIHN0YXRpYyB2b2lkIHByaW50UGxvdGljdXNGaWxlKCk7CisgICAgc3RhdGljIHZvaWQgcHJpbnRIZWFkZXJJbmZvKEZJTEUgKnN0YXRzT3V0KTsKKyAgICBzdGF0aWMgdm9pZCBwcmludFRpbWVyU3RhdHMoRklMRSAqc3RhdHNPdXQsIHN0YXRpc3RpYyBjb25zdCAqIHRoZVN0YXRzLCBzdGF0aXN0aWMgY29uc3QgKiB0b3RhbFN0YXRzKTsKKyAgICBzdGF0aWMgdm9pZCBwcmludENvdW50ZXJTdGF0cyhGSUxFICpzdGF0c091dCwgc3RhdGlzdGljIGNvbnN0ICogdGhlU3RhdHMpOworICAgIHN0YXRpYyB2b2lkIHByaW50Q291bnRlcnMoRklMRSAqIHN0YXRzT3V0LCBjb3VudGVyIGNvbnN0ICogdGhlQ291bnRlcnMpOworICAgIHN0YXRpYyB2b2lkIHByaW50RXZlbnRzKEZJTEUgKiBldmVudHNPdXQsIGttcF9zdGF0c19ldmVudF92ZWN0b3IqIHRoZUV2ZW50cywgaW50IGd0aWQpOworICAgIHN0YXRpYyByZ2JfY29sb3IgZ2V0RXZlbnRDb2xvcih0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVyQ29sb3JJbmZvW2VdOyB9CisgICAgc3RhdGljIHZvaWQgd2luZHVwRXhwbGljaXRUaW1lcnMoKTsKKyAgICBib29sIGV2ZW50UHJpbnRpbmdFbmFibGVkKCkgY29uc3QgICAgICAgICB7IHJldHVybiBwcmludFBlclRocmVhZEV2ZW50c0ZsYWc7IH0KKworIHB1YmxpYzoKKyAgICBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSgpIHsgaW5pdCgpOyB9CisgICAgdm9pZCBvdXRwdXRTdGF0cyhjb25zdCBjaGFyKiBoZWFkaW5nKTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK3ZvaWQgX19rbXBfc3RhdHNfaW5pdCgpOwordm9pZCBfX2ttcF9zdGF0c19maW5pKCk7Cit2b2lkIF9fa21wX3Jlc2V0X3N0YXRzKCk7Cit2b2lkIF9fa21wX291dHB1dF9zdGF0cyhjb25zdCBjaGFyICopOwordm9pZCBfX2ttcF9hY2N1bXVsYXRlX3N0YXRzX2F0X2V4aXQodm9pZCk7CisvLyB0aHJlYWQgbG9jYWwgcG9pbnRlciB0byBzdGF0cyBub2RlIHdpdGhpbiBsaXN0CitleHRlcm4gX190aHJlYWQga21wX3N0YXRzX2xpc3QqIF9fa21wX3N0YXRzX3RocmVhZF9wdHI7CisvLyBoZWFkIHRvIHN0YXRzIGxpc3QuCitleHRlcm4ga21wX3N0YXRzX2xpc3QqIF9fa21wX3N0YXRzX2xpc3Q7CisvLyBsb2NrIGZvciBfX2ttcF9zdGF0c19saXN0CitleHRlcm4ga21wX3Rhc19sb2NrX3QgIF9fa21wX3N0YXRzX2xvY2s7CisvLyByZWZlcmVuY2Ugc3RhcnQgdGltZQorZXh0ZXJuIHRzY190aWNrX2NvdW50IF9fa21wX3N0YXRzX3N0YXJ0X3RpbWU7CisvLyBpbnRlcmZhY2UgdG8gb3V0cHV0CitleHRlcm4ga21wX3N0YXRzX291dHB1dF9tb2R1bGUgX19rbXBfc3RhdHNfb3V0cHV0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvLyBTaW1wbGUsIHN0YW5kYXJkIGludGVyZmFjZXMgdGhhdCBkcm9wIG91dCBjb21wbGV0ZWx5IGlmIHN0YXRzIGFyZW4ndCBlbmFibGVkCisKKworLyohCisgKiBcYnJpZWYgVXNlcyBzcGVjaWZpZWQgdGltZXIgKG5hbWUpIHRvIHRpbWUgY29kZSBibG9jay4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aW1lciBuYW1lIGFzIHNwZWNpZmllZCB1bmRlciB0aGUgS01QX0ZPUkVBQ0hfVElNRVIoKSBtYWNybworICoKKyAqIFxkZXRhaWxzIFVzZSBLTVBfVElNRV9CTE9DSyhuYW1lKSBtYWNybyB0byB0aW1lIGEgY29kZSBibG9jay4gIFRoaXMgd2lsbCByZWNvcmQgdGhlIHRpbWUgdGFrZW4gaW4gdGhlIGJsb2NrCisgKiBhbmQgdXNlIHRoZSBkZXN0cnVjdG9yIHRvIHN0b3AgdGhlIHRpbWVyLiAgQ29udmVuaWVudCEKKyAqIFdpdGggdGhpcyBkZWZpbml0aW9uIHlvdSBjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgS01QX1RJTUVfQkxPQ0sgaW4gdGhlIHNhbWUgY29kZSBibG9jay4KKyAqIEkgZG9uJ3QgdGhpbmsgdGhhdCdzIGEgcHJvYmxlbS4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9USU1FX0JMT0NLKG5hbWUpIFwKKyAgICBibG9ja1RpbWVyIF9fQkxPQ0tUSU1FX18oX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0VGltZXIoVElNRVJfIyNuYW1lKSwgVElNRVJfIyNuYW1lKQorCisvKiEKKyAqIFxicmllZiBBZGRzIHZhbHVlIHRvIHNwZWNpZmllZCB0aW1lciAobmFtZSkuCisgKgorICogQHBhcmFtIG5hbWUgdGltZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlIEtNUF9GT1JFQUNIX1RJTUVSKCkgbWFjcm8KKyAqIEBwYXJhbSB2YWx1ZSBkb3VibGUgcHJlY2lzaW9uIHNhbXBsZSB2YWx1ZSB0byBhZGQgdG8gc3RhdGlzdGljcyBmb3IgdGhlIHRpbWVyCisgKgorICogXGRldGFpbHMgVXNlIEtNUF9DT1VOVF9WQUxVRShuYW1lLCB2YWx1ZSkgbWFjcm8gdG8gYWRkIGEgcGFydGljdWxhciB2YWx1ZSB0byBhIHRpbWVyIHN0YXRpc3RpY3MuCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfQ09VTlRfVkFMVUUobmFtZSwgdmFsdWUpIFwKKyAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRUaW1lcihUSU1FUl8jI25hbWUpLT5hZGRTYW1wbGUodmFsdWUpCisKKy8qIQorICogXGJyaWVmIEluY3JlbWVudHMgc3BlY2lmaWVkIGNvdW50ZXIgKG5hbWUpLgorICoKKyAqIEBwYXJhbSBuYW1lIGNvdW50ZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlIEtNUF9GT1JFQUNIX0NPVU5URVIoKSBtYWNybworICoKKyAqIFxkZXRhaWxzIFVzZSBLTVBfQ09VTlRfQkxPQ0sobmFtZSwgdmFsdWUpIG1hY3JvIHRvIGluY3JlbWVudCBhIHN0YXRpc3RpY3MgY291bnRlciBmb3IgdGhlIGV4ZWN1dGluZyB0aHJlYWQuCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfQ09VTlRfQkxPQ0sobmFtZSkgXAorICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0Q291bnRlcihDT1VOVEVSXyMjbmFtZSktPmluY3JlbWVudCgpCisKKy8qIQorICogXGJyaWVmICJTdGFydHMiIGFuIGV4cGxpY2l0IHRpbWVyIHdoaWNoIHdpbGwgbmVlZCBhIGNvcnJlc3BvbmRpbmcgS01QX1NUT1BfRVhQTElDSVRfVElNRVIoKSBtYWNyby4KKyAqCisgKiBAcGFyYW0gbmFtZSBleHBsaWNpdCB0aW1lciBuYW1lIGFzIHNwZWNpZmllZCB1bmRlciB0aGUgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoKSBtYWNybworICoKKyAqIFxkZXRhaWxzIFVzZSB0byBzdGFydCBhIHRpbWVyLiAgVGhpcyB3aWxsIG5lZWQgYSBjb3JyZXNwb25kaW5nIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKCkKKyAqIG1hY3JvIHRvIHN0b3AgdGhlIHRpbWVyIHVubGlrZSB0aGUgS01QX1RJTUVfQkxPQ0sobmFtZSkgbWFjcm8gd2hpY2ggaGFzIGFuIGltcGxpY2l0IHN0b3BwaW5nIG1hY3JvIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBjb2RlIGJsb2NrLiAgQWxsIGV4cGxpY2l0IHRpbWVycyBhcmUgc3RvcHBlZCBhdCBsaWJyYXJ5IGV4aXQgdGltZSBiZWZvcmUgdGhlIGZpbmFsIHN0YXRpc3RpY3MgYXJlIG91dHB1dHRlZC4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihuYW1lKSBcCisgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0RXhwbGljaXRUaW1lcihFWFBMSUNJVF9USU1FUl8jI25hbWUpLT5zdGFydChUSU1FUl8jI25hbWUpCisKKy8qIQorICogXGJyaWVmICJTdG9wcyIgYW4gZXhwbGljaXQgdGltZXIuCisgKgorICogQHBhcmFtIG5hbWUgZXhwbGljaXQgdGltZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlIEtNUF9GT1JFQUNIX0VYUExJQ0lUX1RJTUVSKCkgbWFjcm8KKyAqCisgKiBcZGV0YWlscyBVc2UgS01QX1NUT1BfRVhQTElDSVRfVElNRVIobmFtZSkgdG8gc3RvcCBhIHRpbWVyLiAgV2hlbiB0aGlzIGlzIGRvbmUsIHRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG5hbWUpCisgKiBhbmQgdGhpcyBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuYW1lKSB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0aW1lcidzIHN0YXQgdmFsdWUuICBUaGUgdGltZXIgd2lsbCB0aGVuIGJlIHJlc2V0LgorICogQWZ0ZXIgdGhlIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG5hbWUpIG1hY3JvIGlzIGNhbGxlZCwgYW5vdGhlciBjYWxsIHRvIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihuYW1lKSB3aWxsIHN0YXJ0IHRoZSB0aW1lciBvbmNlIGFnYWluLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX1NUT1BfRVhQTElDSVRfVElNRVIobmFtZSkgXAorICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldEV4cGxpY2l0VGltZXIoRVhQTElDSVRfVElNRVJfIyNuYW1lKS0+c3RvcChUSU1FUl8jI25hbWUpCisKKy8qIQorICogXGJyaWVmIE91dHB1dHMgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRpc3RpY3MgYW5kIHJlc2V0IHRoZW0uCisgKgorICogQHBhcmFtIGhlYWRpbmdfc3RyaW5nIGhlYWRpbmcgcHV0IGFib3ZlIHRoZSBmaW5hbCBzdGF0cyBvdXRwdXQKKyAqCisgKiBcZGV0YWlscyBFeHBsaWNpdGx5IHN0b3BzIGFsbCB0aW1lcnMgYW5kIG91dHB1dHMgYWxsIHN0YXRzLgorICogRW52aXJvbm1lbnQgdmFyaWFibGUsIGBPTVBUQl9TVEFUU0ZJTEU9ZmlsZW5hbWVgLCBjYW4gYmUgdXNlZCB0byBvdXRwdXQgdGhlIHN0YXRzIHRvIGEgZmlsZW5hbWUgaW5zdGVhZCBvZiBzdGRlcnIKKyAqIEVudmlyb25tZW50IHZhcmlhYmxlLCBgT01QVEJfU1RBVFNUSFJFQURTPXRydWV8dW5kZWZpbmVkYCwgY2FuIGJlIHVzZWQgdG8gb3V0cHV0IHRocmVhZCBzcGVjaWZpYyBzdGF0cworICogRm9yIG5vdyB0aGUgYE9NUFRCX1NUQVRTVEhSRUFEU2AgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGVpdGhlciBiZSBkZWZpbmVkIHdpdGggYW55IHZhbHVlLCB3aGljaCB3aWxsIHByaW50IG91dCB0aHJlYWQKKyAqIHNwZWNpZmljIHN0YXRzLCBvciBpdCBjYW4gYmUgdW5kZWZpbmVkIChub3Qgc3BlY2lmaWVkIGluIHRoZSBlbnZpcm9ubWVudCkgYW5kIHRocmVhZCBzcGVjaWZpYyBzdGF0cyB3b24ndCBiZSBwcmludGVkCisgKiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBhbGwgc3RhdGlzdGljcyBhcmUgcmVzZXQgd2hlbiB0aGlzIG1hY3JvIGlzIGNhbGxlZC4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9PVVRQVVRfU1RBVFMoaGVhZGluZ19zdHJpbmcpIFwKKyAgICBfX2ttcF9vdXRwdXRfc3RhdHMoaGVhZGluZ19zdHJpbmcpCisKKy8qIQorICogXGJyaWVmIEluaXRpYWxpemVzIHRoZSBwYXJpdGlvbmVkIHRpbWVycyB0byBiZWdpbiB3aXRoIG5hbWUuCisgKgorICogQHBhcmFtIG5hbWUgdGltZXIgd2hpY2ggeW91IHdhbnQgdGhpcyB0aHJlYWQgdG8gYmVnaW4gd2l0aAorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX0lOSVRfUEFSVElUSU9ORURfVElNRVJTKG5hbWUpIFwKKyAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRQYXJ0aXRpb25lZFRpbWVycygpLT5pbml0KHRpbWVyUGFpcihFWFBMSUNJVF9USU1FUl8jI25hbWUsIFRJTUVSXyMjbmFtZSkpCisKKyNkZWZpbmUgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0sobmFtZSkgXAorICAgIGJsb2NrUGFydGl0aW9uZWRUaW1lciBfX1BCTE9DS1RJTUVfXyhfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRQYXJ0aXRpb25lZFRpbWVycygpLCBcCisgICAgICAgIHRpbWVyUGFpcihFWFBMSUNJVF9USU1FUl8jI25hbWUsIFRJTUVSXyMjbmFtZSkpCisKKyNkZWZpbmUgS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIobmFtZSkgXAorICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldFBhcnRpdGlvbmVkVGltZXJzKCktPnB1c2godGltZXJQYWlyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSwgVElNRVJfIyNuYW1lKSkKKworI2RlZmluZSBLTVBfUE9QX1BBUlRJVElPTkVEX1RJTUVSKCkgXAorICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldFBhcnRpdGlvbmVkVGltZXJzKCktPnBvcCgpCisKKyNkZWZpbmUgS01QX1NFVF9USFJFQURfU1RBVEUoc3RhdGVfbmFtZSkgXAorICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPnNldFN0YXRlKHN0YXRlX25hbWUpCisKKyNkZWZpbmUgS01QX0dFVF9USFJFQURfU1RBVEUoKSBcCisgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0U3RhdGUoKQorCisjZGVmaW5lIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKHN0YXRlX25hbWUpIFwKKyAgICBibG9ja1RocmVhZFN0YXRlIF9fQlRIUkVBRFNUQVRFX18oX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0U3RhdGVQb2ludGVyKCksIHN0YXRlX25hbWUpCisKKy8qIQorICogXGJyaWVmIHJlc2V0cyBhbGwgc3RhdHMgKGNvdW50ZXJzIHRvIDAsIHRpbWVycyB0byAwIGVsYXBzZWQgdGlja3MpCisgKgorICogXGRldGFpbHMgUmVzZXQgYWxsIHN0YXRzIGZvciBhbGwgdGhyZWFkcy4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9SRVNFVF9TVEFUUygpICBfX2ttcF9yZXNldF9zdGF0cygpCisKKyNpZiAoS01QX0RFVkVMT1BFUl9TVEFUUykKKyMgZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhuKSAgICAgICAgICAgICBLTVBfVElNRV9CTE9DSyhuKQorIyBkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9WQUxVRShuLHYpICAgICAgICAgIEtNUF9DT1VOVF9WQUxVRShuLHYpCisjIGRlZmluZSBLTVBfQ09VTlRfREVWRUxPUEVSX0JMT0NLKG4pICAgICAgICAgICAgS01QX0NPVU5UX0JMT0NLKG4pCisjIGRlZmluZSBLTVBfU1RBUlRfREVWRUxPUEVSX0VYUExJQ0lUX1RJTUVSKG4pICAgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG4pCisjIGRlZmluZSBLTVBfU1RPUF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgICAgS01QX1NUT1BfRVhQTElDSVRfVElNRVIobikKKyMgZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhuKSBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhuKQorI2Vsc2UKKy8vIE51bGwgZGVmaW5pdGlvbnMKKyMgZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhuKSAgICAgICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfVkFMVUUobix2KSAgICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfQkxPQ0sobikgICAgICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9TVEFSVF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9TVE9QX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhuKSAoKHZvaWQpMCkKKyNlbmRpZgorCisjZWxzZSAvLyBLTVBfU1RBVFNfRU5BQkxFRAorCisvLyBOdWxsIGRlZmluaXRpb25zCisjZGVmaW5lIEtNUF9USU1FX0JMT0NLKG4pICAgICAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfQ09VTlRfVkFMVUUobix2KSAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX0JMT0NLKG4pICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihuKSAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuKSAgICAoKHZvaWQpMCkKKworI2RlZmluZSBLTVBfT1VUUFVUX1NUQVRTKGhlYWRpbmdfc3RyaW5nKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1JFU0VUX1NUQVRTKCkgICgodm9pZCkwKQorCisjZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhuKSAgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9WQUxVRShuLHYpICAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfQ09VTlRfREVWRUxPUEVSX0JMT0NLKG4pICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TVEFSVF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUT1BfREVWRUxPUEVSX0VYUExJQ0lUX1RJTUVSKG4pICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfSU5JVF9QQVJUSVRJT05FRF9USU1FUlMobmFtZSkgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKG5hbWUpICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKG4pICgodm9pZCkwKQorI2RlZmluZSBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihuYW1lKSAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9QT1BfUEFSVElUSU9ORURfVElNRVIoKSAgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NFVF9USFJFQURfU1RBVEUoc3RhdGVfbmFtZSkgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfR0VUX1RIUkVBRF9TVEFURSgpICAgICAgICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKHN0YXRlX25hbWUpICAoKHZvaWQpMCkKKyNlbmRpZiAgLy8gS01QX1NUQVRTX0VOQUJMRUQKKworI2VuZGlmIC8vIEtNUF9TVEFUU19ICmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjZWNjOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmNwcApAQCAtMCwwICsxLDE0NCBAQAorLyoqIEBmaWxlIGttcF9zdGF0c190aW1pbmcuY3BwCisgKiBUaW1pbmcgZnVuY3Rpb25zCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9zdGF0c190aW1pbmcuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworI2lmIEtNUF9IQVZFX1RJQ0tfVElNRQorIyBpZiBLTVBfTUlDCitkb3VibGUgdHNjX3RpY2tfY291bnQ6OnRpY2tfdGltZSgpCit7CisgICAgLy8gcHJldHR5IGJhZCBhc3N1bXB0aW9uIG9mIDFHSHogY2xvY2sgZm9yIE1JQworICAgIHJldHVybiAxLygoZG91YmxlKTEwMDAqMS5lNik7Cit9CisjIGVsaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisvLyBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBDUFVJRCBpbmZvcm1hdGlvbgorZG91YmxlIHRzY190aWNrX2NvdW50Ojp0aWNrX3RpbWUoKQoreworICAgIHN0YXRpYyBkb3VibGUgcmVzdWx0ID0gMC4wOworCisgICAgaWYgKHJlc3VsdCA9PSAwLjApCisgICAgeworICAgICAgICBrbXBfY3B1aWRfdCBjcHVpbmZvOworICAgICAgICBjaGFyIGJyYW5kWzI1Nl07CisKKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDB4ODAwMDAwMDAsIDAsICZjcHVpbmZvKTsKKyAgICAgICAgbWVtc2V0KGJyYW5kLCAwLCBzaXplb2YoYnJhbmQpKTsKKyAgICAgICAgaW50IGlkcyA9IGNwdWluZm8uZWF4OworCisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGk9MjsgaTwoaWRzXjB4ODAwMDAwMDApKzI7IGkrKykKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZChpIHwgMHg4MDAwMDAwMCwgMCwgKGttcF9jcHVpZF90KikoYnJhbmQrKGktMikqc2l6ZW9mKGttcF9jcHVpZF90KSkpOworCisgICAgICAgIGNoYXIgKiBzdGFydCA9ICZicmFuZFswXTsKKyAgICAgICAgZm9yICg7KnN0YXJ0ID09ICcgJzsgc3RhcnQrKykKKyAgICAgICAgICAgIDsKKworICAgICAgICBjaGFyICogZW5kID0gYnJhbmQgKyBLTVBfU1RSTEVOKGJyYW5kKSAtIDM7CisgICAgICAgIHVpbnQ2NF90IG11bHRpcGxpZXI7CisKKyAgICAgICAgaWYgKCplbmQgPT0gJ00nKSBtdWx0aXBsaWVyID0gMTAwMExMKjEwMDBMTDsKKyAgICAgICAgZWxzZSBpZiAoKmVuZCA9PSAnRycpIG11bHRpcGxpZXIgPSAxMDAwTEwqMTAwMExMKjEwMDBMTDsKKyAgICAgICAgZWxzZSBpZiAoKmVuZCA9PSAnVCcpIG11bHRpcGxpZXIgPSAxMDAwTEwqMTAwMExMKjEwMDBMTCoxMDAwTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY291dCA8PCAiRXJyb3IgZGV0ZXJtaW5pbmcgbXVsdGlwbGllciAnIiA8PCAqZW5kIDw8ICInXG4iOworICAgICAgICAgICAgZXhpdCAoLTEpOworICAgICAgICB9CisgICAgICAgICplbmQgPSAwOworICAgICAgICB3aGlsZSAoKmVuZCAhPSAnICcpIGVuZC0tOworICAgICAgICBlbmQrKzsKKworICAgICAgICBkb3VibGUgZnJlcSA9IHN0cnRvZChlbmQsICZzdGFydCk7CisgICAgICAgIGlmIChmcmVxID09IDAuMCkKKyAgICAgICAgeworICAgICAgICAgICAgY291dCA8PCAiRXJyb3IgY2FsY3VsYXRpbmcgZnJlcXVlbmN5ICIgPDwgIGVuZCA8PCAiXG4iOworICAgICAgICAgICAgZXhpdCAoLTEpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gKChkb3VibGUpMS4wKS8oZnJlcSAqIG11bHRpcGxpZXIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorIyBlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBib29sIHVzZVNJID0gdHJ1ZTsKKworLy8gUmV0dXJuIGEgZm9ybWF0dGVkIHN0cmluZyBhZnRlciBub3JtYWxpc2luZyB0aGUgdmFsdWUgaW50bworLy8gZW5naW5lZXJpbmcgc3R5bGUgYW5kIHVzaW5nIGEgc3VpdGFibGUgdW5pdCBwcmVmaXggKGUuZy4gbXMsIHVzLCBucykuCitzdGQ6OnN0cmluZyBmb3JtYXRTSShkb3VibGUgaW50ZXJ2YWwsIGludCB3aWR0aCwgY2hhciB1bml0KQoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zOworCisgICAgaWYgKHVzZVNJKQorICAgIHsKKyAgICAgICAgLy8gUHJlc2VydmUgYWNjdXJhY3kgZm9yIHNtYWxsIG51bWJlcnMsIHNpbmNlIHdlIG9ubHkgbXVsdGlwbHkgYW5kIHRoZSBwb3NpdGl2ZSBwb3dlcnMKKyAgICAgICAgLy8gb2YgdGVuIGFyZSBwcmVjaXNlbHkgcmVwcmVzZW50YWJsZS4KKyAgICAgICAgc3RhdGljIHN0cnVjdCB7IGRvdWJsZSBzY2FsZTsgY2hhciBwcmVmaXg7IH0gcmFuZ2VzW10gPSB7CisgICAgICAgICAgICB7MS5lMTIsJ2YnfSwKKyAgICAgICAgICAgIHsxLmU5LCAncCd9LAorICAgICAgICAgICAgezEuZTYsICduJ30sCisgICAgICAgICAgICB7MS5lMywgJ3UnfSwKKyAgICAgICAgICAgIHsxLjAsICAnbSd9LAorICAgICAgICAgICAgezEuZS0zLCcgJ30sCisgICAgICAgICAgICB7MS5lLTYsJ2snfSwKKyAgICAgICAgICAgIHsxLmUtOSwnTSd9LAorICAgICAgICAgICAgezEuZS0xMiwnRyd9LAorICAgICAgICAgICAgezEuZS0xNSwnVCd9LAorICAgICAgICAgICAgezEuZS0xOCwnUCd9LAorICAgICAgICAgICAgezEuZS0yMSwnRSd9LAorICAgICAgICAgICAgezEuZS0yNCwnWid9LAorICAgICAgICAgICAgezEuZS0yNywnWSd9CisgICAgICAgIH07CisKKyAgICAgICAgaWYgKGludGVydmFsID09IDAuMCkKKyAgICAgICAgeworICAgICAgICAgICAgb3MgPDwgc3RkOjpzZXR3KHdpZHRoLTMpIDw8IHN0ZDo6cmlnaHQgPDwgIjAuMDAiIDw8IHN0ZDo6c2V0dygzKSA8PCB1bml0OworICAgICAgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBuZWdhdGl2ZSA9IGZhbHNlOworICAgICAgICBpZiAoaW50ZXJ2YWwgPCAwLjApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5lZ2F0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgIGludGVydmFsID0gLWludGVydmFsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPChpbnQpKHNpemVvZihyYW5nZXMpL3NpemVvZihyYW5nZXNbMF0pKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW50ZXJ2YWwqcmFuZ2VzW2ldLnNjYWxlIDwgMS5lMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRlcnZhbCA9IGludGVydmFsICogMTAwMC5lMCAqIHJhbmdlc1tpXS5zY2FsZTsKKyAgICAgICAgICAgICAgICBvcyA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDIpIDw8IHN0ZDo6c2V0dyh3aWR0aC0zKSA8PCBzdGQ6OnJpZ2h0IDw8CisgICAgICAgICAgICAgICAgICAgIChuZWdhdGl2ZSA/IC1pbnRlcnZhbCA6IGludGVydmFsKSA8PCBzdGQ6OnNldHcoMikgPDwgcmFuZ2VzW2ldLnByZWZpeCA8PCBzdGQ6OnNldHcoMSkgPDwgdW5pdDsKKworICAgICAgICAgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBvcyA8PCBzdGQ6OnNldHByZWNpc2lvbigyKSA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6cmlnaHQgPDwgc3RkOjpzZXR3KHdpZHRoLTMpIDw8IGludGVydmFsIDw8IHN0ZDo6c2V0dygzKSA8PCB1bml0OworCisgICAgcmV0dXJuIG9zLnN0cigpOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwNWQ5NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmgKQEAgLTAsMCArMSwxMTIgQEAKKyNpZm5kZWYgS01QX1NUQVRTX1RJTUlOR19ICisjZGVmaW5lIEtNUF9TVEFUU19USU1JTkdfSAorCisvKiogQGZpbGUga21wX3N0YXRzX3RpbWluZy5oCisgKiBBY2Nlc3MgdG8gcmVhbCB0aW1lIGNsb2NrIGFuZCB0aW1lcnMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSAia21wX29zLmgiCisjaWYgS01QX0hBVkVfWDg2SU5UUklOX0gKKyMgaW5jbHVkZSA8eDg2aW50cmluLmg+CisjZW5kaWYKKworY2xhc3MgdHNjX3RpY2tfY291bnQgeworICBwcml2YXRlOgorICAgIGludDY0X3QgbXlfY291bnQ7CisKKyAgcHVibGljOgorICAgIGNsYXNzIHRzY19pbnRlcnZhbF90IHsKKyAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgZXhwbGljaXQgdHNjX2ludGVydmFsX3QoaW50NjRfdCBfdmFsdWUpIDogdmFsdWUoX3ZhbHVlKSB7fQorICAgICBwdWJsaWM6CisgICAgICAgIHRzY19pbnRlcnZhbF90KCkgOiB2YWx1ZSgwKSB7fTsgLy8gQ29uc3RydWN0IDAgdGltZSBkdXJhdGlvbgorI2lmIEtNUF9IQVZFX1RJQ0tfVElNRQorICAgICAgICBkb3VibGUgc2Vjb25kcygpIGNvbnN0OyAvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiBhIHRpbWUgaW50ZXJ2YWwgaW4gc2Vjb25kcworI2VuZGlmCisgICAgICAgIGRvdWJsZSB0aWNrcygpIGNvbnN0IHsgcmV0dXJuIGRvdWJsZSh2YWx1ZSk7IH0KKyAgICAgICAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisgICAgICAgIHRzY19pbnRlcnZhbF90JiBvcGVyYXRvcj0oaW50NjRfdCBudmFsdWUpIHsgdmFsdWUgPSBudmFsdWU7IHJldHVybiAqdGhpczsgfQorCisgICAgICAgIGZyaWVuZCBjbGFzcyB0c2NfdGlja19jb3VudDsKKworICAgICAgICBmcmllbmQgdHNjX2ludGVydmFsX3Qgb3BlcmF0b3ItKGNvbnN0IHRzY190aWNrX2NvdW50JiB0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0c2NfdGlja19jb3VudCYgdDApOworICAgICAgICBmcmllbmQgdHNjX2ludGVydmFsX3Qgb3BlcmF0b3ItKGNvbnN0IHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCYgaTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90JiBpMCk7CisgICAgICAgIGZyaWVuZCB0c2NfaW50ZXJ2YWxfdCYgb3BlcmF0b3IrPSh0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QmIGkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QmIGkwKTsKKyAgICB9OworCisjaWYgS01QX0hBVkVfX19CVUlMVElOX1JFQURDWUNMRUNPVU5URVIKKyAgICB0c2NfdGlja19jb3VudCgpIDogbXlfY291bnQoc3RhdGljX2Nhc3Q8aW50NjRfdD4oX19idWlsdGluX3JlYWRjeWNsZWNvdW50ZXIoKSkpIHt9CisjZWxpZiBLTVBfSEFWRV9fX1JEVFNDCisgICAgdHNjX3RpY2tfY291bnQoKSA6IG15X2NvdW50KHN0YXRpY19jYXN0PGludDY0X3Q+KF9fcmR0c2MoKSkpIHt9OworI2Vsc2UKKyMgZXJyb3IgTXVzdCBoYXZlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBkZWZpbmVkCisjZW5kaWYKKyAgICB0c2NfdGlja19jb3VudChpbnQ2NF90IHZhbHVlKSA6IG15X2NvdW50KHZhbHVlKSB7fTsKKyAgICBpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gbXlfY291bnQ7IH0KKyAgICB0c2NfdGlja19jb3VudCBsYXRlciAodHNjX3RpY2tfY291bnQgY29uc3Qgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG15X2NvdW50ID4gb3RoZXIubXlfY291bnQgPyAoKnRoaXMpIDogb3RoZXI7CisgICAgfQorICAgIHRzY190aWNrX2NvdW50IGVhcmxpZXIodHNjX3RpY2tfY291bnQgY29uc3Qgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG15X2NvdW50IDwgb3RoZXIubXlfY291bnQgPyAoKnRoaXMpIDogb3RoZXI7CisgICAgfQorI2lmIEtNUF9IQVZFX1RJQ0tfVElNRQorICAgIHN0YXRpYyBkb3VibGUgdGlja190aW1lKCk7IC8vIHJldHVybnMgc2Vjb25kcyBwZXIgY3ljbGUgKHBlcmlvZCkgb2YgY2xvY2sKKyNlbmRpZgorICAgIHN0YXRpYyB0c2NfdGlja19jb3VudCBub3coKSB7IHJldHVybiB0c2NfdGlja19jb3VudCgpOyB9IC8vIHJldHVybnMgdGhlIHJkdHNjIHJlZ2lzdGVyIHZhbHVlCisgICAgZnJpZW5kIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCBvcGVyYXRvci0oY29uc3QgdHNjX3RpY2tfY291bnQmIHQxLCBjb25zdCB0c2NfdGlja19jb3VudCYgdDApOworfTsKKworaW5saW5lIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCBvcGVyYXRvci0oY29uc3QgdHNjX3RpY2tfY291bnQmIHQxLCBjb25zdCB0c2NfdGlja19jb3VudCYgdDApCit7CisgICAgcmV0dXJuIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCggdDEubXlfY291bnQtdDAubXlfY291bnQgKTsKK30KKworaW5saW5lIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCBvcGVyYXRvci0oY29uc3QgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90JiBpMSwgY29uc3QgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90JiBpMCkKK3sKKyAgICByZXR1cm4gdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90KCBpMS52YWx1ZS1pMC52YWx1ZSApOworfQorCitpbmxpbmUgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90JiBvcGVyYXRvcis9KHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCYgaTEsIGNvbnN0IHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCYgaTApCit7CisgICAgaTEudmFsdWUgKz0gaTAudmFsdWU7CisgICAgcmV0dXJuIGkxOworfQorCisjaWYgS01QX0hBVkVfVElDS19USU1FCitpbmxpbmUgZG91YmxlIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdDo6c2Vjb25kcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZhbHVlKnRpY2tfdGltZSgpOworfQorI2VuZGlmCisKK2V4dGVybiBzdGQ6OnN0cmluZyBmb3JtYXRTSShkb3VibGUgaW50ZXJ2YWwsIGludCB3aWR0aCwgY2hhciB1bml0KTsKKworaW5saW5lIHN0ZDo6c3RyaW5nIGZvcm1hdFNlY29uZHMoZG91YmxlIGludGVydmFsLCBpbnQgd2lkdGgpCit7CisgICAgcmV0dXJuIGZvcm1hdFNJKGludGVydmFsLCB3aWR0aCwgJ1MnKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIGZvcm1hdFRpY2tzKGRvdWJsZSBpbnRlcnZhbCwgaW50IHdpZHRoKQoreworICAgIHJldHVybiBmb3JtYXRTSShpbnRlcnZhbCwgd2lkdGgsICdUJyk7Cit9CisKKyNlbmRpZiAvLyBLTVBfU1RBVFNfVElNSU5HX0gKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RyLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDYzM2FkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdHIuY3BwCkBAIC0wLDAgKzEsODgwIEBACisvKgorICoga21wX3N0ci5jcHAgLS0gU3RyaW5nIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPiAgICAvLyB2YV8qCisjaW5jbHVkZSA8c3RkaW8uaD4gICAgIC8vIHZzbnByaW50ZigpCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgIC8vIG1hbGxvYygpLCByZWFsbG9jKCkKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU3RyaW5nIGJ1ZmZlci4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFVzYWdlOgorCisgICAgICAgIC8vIERlY2xhcmUgYnVmZmVyIGFuZCBpbml0aWFsaXplIGl0LgorICAgICAgICBrbXBfc3RyX2J1Zl90ICBidWZmZXI7CisJX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgICAgIC8vIFByaW50IHRvIGJ1ZmZlci4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJFcnJvciBpbiBmaWxlIFwiJXNcIiBsaW5lICVkXG4iLCAiZm9vLmMiLCAxMiApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgICA8JXM+XG4iLCBsaW5lICk7CisKKyAgICAgICAgLy8gVXNlIGJ1ZmZlciBjb250ZW50cy4gYnVmZmVyLnN0ciBpcyBhIHBvaW50ZXIgdG8gZGF0YSwgYnVmZmVyLnVzZWQgaXMgYSBudW1iZXIgb2YgcHJpbnRlZAorICAgICAgICAvLyBjaGFyYWN0ZXJzIChub3QgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHplcm8pLgorICAgICAgICB3cml0ZSggZmQsIGJ1ZmZlci5zdHIsIGJ1ZmZlci51c2VkICk7CisKKyAgICAgICAgLy8gRnJlZSBidWZmZXIuCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKworICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRldGFjaCBhbGxvY2F0ZWQgbWVtb3J5IGZyb20gYnVmZmVyOgorICAgICAgICBfX2ttcF9zdHJfYnVmX2RldGFjaCggJiBidWZmZXIgKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5zdHI7ICAgIC8vIFRoYXQgbWVtb3J5IHNob3VsZCBiZSBmcmVlZCBldmVudHVhbGx5LgorCisKKyAgICBOb3RlczoKKworICAgICAgICAqIEJ1ZmZlciB1c2VycyBtYXkgdXNlIGJ1ZmZlci5zdHIgYW5kIGJ1ZmZlci51c2VkLiBVc2VycyBzaG91bGQgbm90IGNoYW5nZSBhbnkgZmllbGRzIG9mCisgICAgICAgICAgYnVmZmVyIGRpcmVjdGx5LgorCisgICAgICAgICogYnVmZmVyLnN0ciBpcyBuZXZlciBOVUxMLiBJZiBidWZmZXIgaXMgZW1wdHksIGJ1ZmZlci5zdHIgcG9pbnRzIHRvIGVtcHR5IHN0cmluZyAoIiIpLgorCisgICAgICAgICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGJ1ZmZlciB1c2VzIHN0YWNrIG1lbW9yeSAoYnVmZmVyLmJ1bGspIGZpcnN0LiBJZiBzdGFjayBtZW1vcnkgaXMKKyAgICAgICAgICBleGhhdXN0ZWQsIGJ1ZmZlciBhbGxvY2F0ZXMgbWVtb3J5IG9uIGhlYXAgYnkgbWFsbG9jKCksIGFuZCByZWFsbG9jYXRlcyBpdCBieSByZWFsbG9jKCkKKyAgICAgICAgICBhcyBhbW91bnQgb2YgdXNlZCBtZW1vcnkgZ3Jvd3MuCisKKyAgICAgICAgKiBCdWZmZXIgZG91YmxlcyBhbW91bnQgb2YgYWxsb2NhdGVkIG1lbW9yeSBlYWNoIHRpbWUgaXQgaXMgZXhoYXVzdGVkLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvLyBUT0RPOiBfX2ttcF9zdHJfYnVmX3ByaW50KCkgY2FuIHVzZSB0aHJlYWQgbG9jYWwgbWVtb3J5IGFsbG9jYXRvci4KKworI2RlZmluZSBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGIpLT5zdHIgIT0gTlVMTCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnNpemUgPj0gc2l6ZW9mKCAoYiktPmJ1bGsgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSAlIHNpemVvZiggKGIpLT5idWxrICkgPT0gMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKHVuc2lnbmVkKShiKS0+dXNlZCA8IChiKS0+c2l6ZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnNpemUgPT0gc2l6ZW9mKCAoYiktPmJ1bGsgKSA/IChiKS0+c3RyID09ICYgKGIpLT5idWxrWyAwIF0gOiAxICk7ICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSA+IHNpemVvZiggKGIpLT5idWxrICkgPyAoYiktPnN0ciAhPSAmIChiKS0+YnVsa1sgMCBdIDogMSApOyAgIFwKKyAgICB9CisKK3ZvaWQKKyBfX2ttcF9zdHJfYnVmX2NsZWFyKAorICAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIGlmICggYnVmZmVyLT51c2VkID4gMCApIHsKKyAgICAgICAgYnVmZmVyLT51c2VkID0gMDsKKyAgICAgICAgYnVmZmVyLT5zdHJbIDAgXSA9IDA7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdHJfYnVmX2NsZWFyCisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9yZXNlcnZlKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsCisgICAgaW50ICAgICAgICAgICAgIHNpemUKKykgeworCisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID49IDAgKTsKKworICAgIGlmICggYnVmZmVyLT5zaXplIDwgKHVuc2lnbmVkIGludClzaXplICkgeworCisgICAgICAgIC8vIENhbGN1bGF0ZSBidWZmZXIgc2l6ZS4KKyAgICAgICAgZG8geworICAgICAgICAgICAgYnVmZmVyLT5zaXplICo9IDI7CisgICAgICAgIH0gd2hpbGUgKCBidWZmZXItPnNpemUgPCAodW5zaWduZWQgaW50KXNpemUgKTsKKworICAgICAgICAvLyBFbmxhcmdlIGJ1ZmZlci4KKyAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSAmIGJ1ZmZlci0+YnVsa1sgMCBdICkgeworICAgICAgICAgICAgYnVmZmVyLT5zdHIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBidWZmZXItPnNpemUgKTsKKyAgICAgICAgICAgIGlmICggYnVmZmVyLT5zdHIgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIEtNUF9NRU1DUFlfUyggYnVmZmVyLT5zdHIsIGJ1ZmZlci0+c2l6ZSwgYnVmZmVyLT5idWxrLCBidWZmZXItPnVzZWQgKyAxICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXItPnN0ciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBidWZmZXItPnN0ciwgYnVmZmVyLT5zaXplICk7CisgICAgICAgICAgICBpZiAoIGJ1ZmZlci0+c3RyID09IE5VTEwgKSB7CisJCUtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisKKyAgICB9OyAvLyBpZgorCisgICAgS01QX0RFQlVHX0FTU0VSVCggYnVmZmVyLT5zaXplID4gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGJ1ZmZlci0+c2l6ZSA+PSAodW5zaWduZWQpc2l6ZSApOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisKK30gLy8gX19rbXBfc3RyX2J1Zl9yZXNlcnZlCisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9kZXRhY2goCisgICAga21wX3N0cl9idWZfdCAqICBidWZmZXIKKykgeworCisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKworICAgIC8vIElmIGludGVybmFsIGJ1bGsgaXMgdXNlZCwgYWxsb2NhdGUgbWVtb3J5IGFuZCBjb3B5IGl0LgorICAgIGlmICggYnVmZmVyLT5zaXplIDw9IHNpemVvZiggYnVmZmVyLT5idWxrICkgKSB7CisgICAgICAgIGJ1ZmZlci0+c3RyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggYnVmZmVyLT5zaXplICk7CisgICAgICAgIGlmICggYnVmZmVyLT5zdHIgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBLTVBfTUVNQ1BZX1MoIGJ1ZmZlci0+c3RyLCBidWZmZXItPnNpemUsIGJ1ZmZlci0+YnVsaywgYnVmZmVyLT51c2VkICsgMSApOworICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfc3RyX2J1Zl9kZXRhY2gKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX2ZyZWUoCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZmZlcgorKSB7CisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKyAgICBpZiAoIGJ1ZmZlci0+c2l6ZSA+IHNpemVvZiggYnVmZmVyLT5idWxrICkgKSB7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBidWZmZXItPnN0ciApOworICAgIH07IC8vIGlmCisgICAgYnVmZmVyLT5zdHIgID0gYnVmZmVyLT5idWxrOworICAgIGJ1ZmZlci0+c2l6ZSA9IHNpemVvZiggYnVmZmVyLT5idWxrICk7CisgICAgYnVmZmVyLT51c2VkID0gMDsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdHJfYnVmX2ZyZWUKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX2NhdCgKKyAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLAorICAgIGNoYXIgY29uc3QgKiAgICBzdHIsCisgICAgaW50ICAgICAgICAgICAgIGxlbgorKSB7CisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGxlbiA+PSAwICk7CisgICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCBidWZmZXIsIGJ1ZmZlci0+dXNlZCArIGxlbiArIDEgKTsKKyAgICBLTVBfTUVNQ1BZKCBidWZmZXItPnN0ciArIGJ1ZmZlci0+dXNlZCwgc3RyLCBsZW4gKTsKKyAgICBidWZmZXItPnN0clsgYnVmZmVyLT51c2VkICsgbGVuIF0gPSAwOworICAgIGJ1ZmZlci0+dXNlZCArPSBsZW47CisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKK30gLy8gX19rbXBfc3RyX2J1Zl9jYXQKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX3ZwcmludCgKKyAgICBrbXBfc3RyX2J1Zl90ICogIGJ1ZmZlciwKKyAgICBjaGFyIGNvbnN0ICogICAgIGZvcm1hdCwKKyAgICB2YV9saXN0ICAgICAgICAgIGFyZ3MKKykgeworCisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKworICAgIGZvciAoIDsgOyApIHsKKworICAgICAgICBpbnQgY29uc3QgZnJlZSA9IGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+dXNlZDsKKyAgICAgICAgaW50ICAgICAgIHJjOworICAgICAgICBpbnQgICAgICAgc2l6ZTsKKworICAgICAgICAvLyBUcnkgdG8gZm9ybWF0IHN0cmluZy4KKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBPbiBMaW51eCogT1MgSW50ZWwoUikgNjQsIHZzbnByaW50ZigpIG1vZGlmaWVzIGFyZ3MgYXJndW1lbnQsIHNvIHZzbnByaW50ZigpIGNyYXNoZXMgaWYgaXQKKyAgICAgICAgICAgICAgICBpcyBjYWxsZWQgZm9yIHRoZSBzZWNvbmQgdGltZSB3aXRoIHRoZSBzYW1lIGFyZ3MuIFRvIHByZXZlbnQgdGhlIGNyYXNoLCB3ZSBoYXZlIHRvCisgICAgICAgICAgICAgICAgcGFzcyBhIGZyZXNoIGludGFjdCBjb3B5IG9mIGFyZ3MgdG8gdnNucHJpbnRmKCkgb24gZWFjaCBpdGVyYXRpb24uCisKKyAgICAgICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCBzdGFuZGFyZCB2YV9jb3B5KCkgbWFjcm8gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzKiBPUy4gSG93ZXZlciwgaXQKKyAgICAgICAgICAgICAgICBzZWVtcyB2c25wcmludGYoKSBkb2VzIG5vdCBtb2RpZnkgYXJncyBhcmd1bWVudCBvbiBXaW5kb3dzKiBPUy4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICNpZiAhIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgdmFfbGlzdCBfYXJnczsKKyAgICAgICAgICAgICAgICBfX3ZhX2NvcHkoIF9hcmdzLCBhcmdzICk7ICAvLyBNYWtlIGNvcHkgb2YgYXJncy4KKyAgICAgICAgICAgICAgICAjZGVmaW5lIGFyZ3MgX2FyZ3MgICAgICAgICAvLyBTdWJzdGl0dXRlIGFyZ3Mgd2l0aCBpdHMgY29weSwgX2FyZ3MuCisgICAgICAgICAgICAjZW5kaWYgLy8gS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIHJjID0gS01QX1ZTTlBSSU5URiggYnVmZmVyLT5zdHIgKyBidWZmZXItPnVzZWQsIGZyZWUsIGZvcm1hdCwgYXJncyApOworICAgICAgICAgICAgI2lmICEgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAjdW5kZWYgYXJncyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc3Vic3RpdHV0aW9uLgorICAgICAgICAgICAgICAgIHZhX2VuZCggX2FyZ3MgKTsKKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gZXJyb3JzLCBzdHJpbmcgaGFzIGJlZW4gZm9ybWF0dGVkLgorICAgICAgICBpZiAoIHJjID49IDAgJiYgcmMgPCBmcmVlICkgeworICAgICAgICAgICAgYnVmZmVyLT51c2VkICs9IHJjOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRXJyb3Igb2NjdXJyZWQsIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICAgIGlmICggcmMgPj0gMCApIHsKKyAgICAgICAgICAgIC8vIEM5OS1jb25mb3JtaW5nIGltcGxlbWVudGF0aW9uIG9mIHZzbnByaW50ZiByZXR1cm5zIHJlcXVpcmVkIGJ1ZmZlciBzaXplLgorICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+dXNlZCArIHJjICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9sZGVyIGltcGxlbWVudGF0aW9ucyBqdXN0IHJldHVybiAtMS4gRG91YmxlIGJ1ZmZlciBzaXplLgorICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSAqIDI7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRW5sYXJnZSBidWZmZXIuCisgICAgICAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSggYnVmZmVyLCBzaXplICk7CisKKyAgICAgICAgLy8gQW5kIHRyeSBhZ2Fpbi4KKworICAgIH07IC8vIGZvcmV2ZXIKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGJ1ZmZlci0+c2l6ZSA+IDAgKTsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworCit9IC8vIF9fa21wX3N0cl9idWZfdnByaW50CisKKwordm9pZAorX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICBrbXBfc3RyX2J1Zl90ICogIGJ1ZmZlciwKKyAgICBjaGFyIGNvbnN0ICogICAgIGZvcm1hdCwKKyAgICAuLi4KKykgeworCisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KCBhcmdzLCBmb3JtYXQgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ZwcmludCggYnVmZmVyLCBmb3JtYXQsIGFyZ3MgKTsKKyAgICB2YV9lbmQoIGFyZ3MgKTsKKworfSAvLyBfX2ttcF9zdHJfYnVmX3ByaW50CisKKworLyoKKyAgICBUaGUgZnVuY3Rpb24gcHJpbnRzIHNwZWNpZmllZCBzaXplIHRvIGJ1ZmZlci4gU2l6ZSBpcyBleHByZXNzZWQgdXNpbmcgYmlnZ2VzdCBwb3NzaWJsZSB1bml0LCBmb3IKKyAgICBleGFtcGxlIDEwMjQgaXMgcHJpbnRlZCBhcyAiMWsiLgorKi8KKwordm9pZAorX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWYsCisgICAgc2l6ZV90ICAgICAgICAgIHNpemUKKykgeworCisgICAgY2hhciBjb25zdCAqIG5hbWVzW10gPSB7ICIiLCAiayIsICJNIiwgIkciLCAiVCIsICJQIiwgIkUiLCAiWiIsICJZIiB9OworICAgIGludCBjb25zdCAgICB1bml0cyAgID0gc2l6ZW9mKCBuYW1lcyApIC8gc2l6ZW9mKCBjaGFyIGNvbnN0ICogKTsKKyAgICBpbnQgICAgICAgICAgdSAgICAgICA9IDA7CisgICAgaWYgKCBzaXplID4gMCApIHsKKyAgICAgICAgd2hpbGUgKCAoIHNpemUgJSAxMDI0ID09IDAgKSAmJiAoIHUgKyAxIDwgdW5pdHMgKSApIHsKKyAgICAgICAgICAgIHNpemUgPSBzaXplIC8gMTAyNDsKKyAgICAgICAgICAgICsrIHU7CisgICAgICAgIH07IC8vIHdoaWxlCisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZiwgIiUiIEtNUF9TSVpFX1RfU1BFQyAiJXMiLCBzaXplLCBuYW1lc1sgdSBdICk7CisKK30gLy8gX19rbXBfc3RyX2J1Zl9wcmludF9zaXplCisKKwordm9pZAorX19rbXBfc3RyX2ZuYW1lX2luaXQoCisgICAga21wX3N0cl9mbmFtZV90ICogZm5hbWUsCisgICAgY2hhciBjb25zdCAqICAgICAgcGF0aAorKSB7CisKKyAgICBmbmFtZS0+cGF0aCA9IE5VTEw7CisgICAgZm5hbWUtPmRpciAgPSBOVUxMOworICAgIGZuYW1lLT5iYXNlID0gTlVMTDsKKworICAgIGlmICggcGF0aCAhPSBOVUxMICkgeworICAgICAgICBjaGFyICogc2xhc2ggPSBOVUxMOyAgICAvLyBQb2ludGVyIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBkaXIuCisgICAgICAgIGNoYXIgKiBiYXNlICA9IE5VTEw7ICAgIC8vIFBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBiYXNlbmFtZS4KKyAgICAgICAgZm5hbWUtPnBhdGggPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBwYXRoICk7CisgICAgICAgICAgICAvLyBPcmlnaW5hbCBjb2RlIHVzZWQgc3RyZHVwKCkgZnVuY3Rpb24gdG8gY29weSBhIHN0cmluZywgYnV0IG9uIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0IGl0CisgICAgICAgICAgICAvLyBjYXVzZXMgYXNzZXJ0aW9vbiBpZCBkZWJ1ZyBoZWFwLCBzbyBJIGhhZCB0byByZXBsYWNlIHN0cmR1cCB3aXRoIF9fa21wX3N0cl9mb3JtYXQoKS4KKyAgICAgICAgaWYgKCBLTVBfT1NfV0lORE9XUyApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9yZXBsYWNlKCBmbmFtZS0+cGF0aCwgJ1xcJywgJy8nICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGZuYW1lLT5kaXIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBmbmFtZS0+cGF0aCApOworICAgICAgICBzbGFzaCA9IHN0cnJjaHIoIGZuYW1lLT5kaXIsICcvJyApOworICAgICAgICBpZiAoIEtNUF9PU19XSU5ET1dTICYmIHNsYXNoID09IE5VTEwgKSB7ICAgICAgICAgICAvLyBPbiBXaW5kb3dzKiBPUywgaWYgc2xhc2ggbm90IGZvdW5kLAorICAgICAgICAgICAgY2hhciBmaXJzdCA9IFRPTE9XRVIoIGZuYW1lLT5kaXJbIDAgXSApOyAgICAgLy8gbG9vayBmb3IgZHJpdmUuCisgICAgICAgICAgICBpZiAoICdhJyA8PSBmaXJzdCAmJiBmaXJzdCA8PSAneicgJiYgZm5hbWUtPmRpclsgMSBdID09ICc6JyApIHsKKyAgICAgICAgICAgICAgICBzbGFzaCA9ICYgZm5hbWUtPmRpclsgMSBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgYmFzZSA9ICggc2xhc2ggPT0gTlVMTCA/IGZuYW1lLT5kaXIgOiBzbGFzaCArIDEgKTsKKyAgICAgICAgZm5hbWUtPmJhc2UgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBiYXNlICk7ICAgIC8vIENvcHkgYmFzZW5hbWUKKyAgICAgICAgKiBiYXNlID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0cnVuY2F0ZSBkaXIuCisgICAgfTsgLy8gaWYKKworfSAvLyBrbXBfc3RyX2ZuYW1lX2luaXQKKworCit2b2lkCitfX2ttcF9zdHJfZm5hbWVfZnJlZSgKKyAgICBrbXBfc3RyX2ZuYW1lX3QgKiBmbmFtZQorKSB7CisgICAgX19rbXBfc3RyX2ZyZWUoIChjaGFyIGNvbnN0ICoqKSggJiBmbmFtZS0+cGF0aCApICk7CisgICAgX19rbXBfc3RyX2ZyZWUoIChjaGFyIGNvbnN0ICoqKSggJiBmbmFtZS0+ZGlyICApICk7CisgICAgX19rbXBfc3RyX2ZyZWUoIChjaGFyIGNvbnN0ICoqKSggJiBmbmFtZS0+YmFzZSApICk7Cit9IC8vIGttcF9zdHJfZm5hbWVfZnJlZQorCisKK2ludAorX19rbXBfc3RyX2ZuYW1lX21hdGNoKAorICAgIGttcF9zdHJfZm5hbWVfdCBjb25zdCAqIGZuYW1lLAorICAgIGNoYXIgY29uc3QgKiAgICAgICAgICAgIHBhdHRlcm4KKykgeworCisgICAgaW50IGRpcl9tYXRjaCAgPSAxOworICAgIGludCBiYXNlX21hdGNoID0gMTsKKworICAgIGlmICggcGF0dGVybiAhPSBOVUxMICkgeworICAgICAgICBrbXBfc3RyX2ZuYW1lX3QgcHRybjsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2luaXQoICYgcHRybiwgcGF0dGVybiApOworICAgICAgICBkaXJfbWF0Y2ggPQorICAgICAgICAgICAgc3RyY21wKCBwdHJuLmRpciwgIiovIiApID09IDAKKyAgICAgICAgICAgIHx8CisgICAgICAgICAgICAoIGZuYW1lLT5kaXIgIT0gTlVMTCAmJiBfX2ttcF9zdHJfZXFmKCBmbmFtZS0+ZGlyLCBwdHJuLmRpciApICk7CisgICAgICAgIGJhc2VfbWF0Y2ggPQorICAgICAgICAgICAgc3RyY21wKCBwdHJuLmJhc2UsICIqIiApID09IDAKKyAgICAgICAgICAgIHx8CisgICAgICAgICAgICAoIGZuYW1lLT5iYXNlICE9IE5VTEwgJiYgX19rbXBfc3RyX2VxZiggZm5hbWUtPmJhc2UsIHB0cm4uYmFzZSApICk7CisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCAmIHB0cm4gKTsKKyAgICB9OyAvLyBpZgorCisgICAgcmV0dXJuIGRpcl9tYXRjaCAmJiBiYXNlX21hdGNoOworCit9IC8vIF9fa21wX3N0cl9mbmFtZV9tYXRjaAorCisKK2ttcF9zdHJfbG9jX3QKK19fa21wX3N0cl9sb2NfaW5pdCgKKyAgICBjaGFyIGNvbnN0ICogcHNvdXJjZSwKKyAgICBpbnQgICAgICAgICAgaW5pdF9mbmFtZQorKSB7CisKKyAgICBrbXBfc3RyX2xvY190IGxvYzsKKworICAgIGxvYy5fYnVsayA9IE5VTEw7CisgICAgbG9jLmZpbGUgID0gTlVMTDsKKyAgICBsb2MuZnVuYyAgPSBOVUxMOworICAgIGxvYy5saW5lICA9IDA7CisgICAgbG9jLmNvbCAgID0gMDsKKworICAgIGlmICggcHNvdXJjZSAhPSBOVUxMICkgeworCisgICAgICAgIGNoYXIgKiBzdHIgICA9IE5VTEw7CisgICAgICAgIGNoYXIgKiBkdW1teSA9IE5VTEw7CisgICAgICAgIGNoYXIgKiBsaW5lICA9IE5VTEw7CisgICAgICAgIGNoYXIgKiBjb2wgICA9IE5VTEw7CisKKyAgICAgICAgLy8gQ29weSBwc291cmNlIHRvIGtlZXAgaXQgaW50YWN0LgorICAgICAgICBsb2MuX2J1bGsgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBwc291cmNlICk7CisKKyAgICAgICAgLy8gUGFyc2UgcHNvdXJjZSBzdHJpbmc6ICI7ZmlsZTtmdW5jO2xpbmU7Y29sOzsiCisgICAgICAgIHN0ciA9IGxvYy5fYnVsazsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBkdW1teSwgICAgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBsb2MuZmlsZSwgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBsb2MuZnVuYywgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBsaW5lLCAgICAgJiBzdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBzdHIsICc7JywgJiBjb2wsICAgICAgJiBzdHIgKTsKKworICAgICAgICAvLyBDb252ZXJ0IGxpbmUgYW5kIGNvbCBpbnRvIG51bWJlcmljIHZhbHVlcy4KKyAgICAgICAgaWYgKCBsaW5lICE9IE5VTEwgKSB7CisgICAgICAgICAgICBsb2MubGluZSA9IGF0b2koIGxpbmUgKTsKKyAgICAgICAgICAgIGlmICggbG9jLmxpbmUgPCAwICkgeworICAgICAgICAgICAgICAgIGxvYy5saW5lID0gMDsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggY29sICE9IE5VTEwgKSB7CisgICAgICAgICAgICBsb2MuY29sID0gYXRvaSggY29sICk7CisgICAgICAgICAgICBpZiAoIGxvYy5jb2wgPCAwICkgeworICAgICAgICAgICAgICAgIGxvYy5jb2wgPSAwOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9zdHJfZm5hbWVfaW5pdCggJiBsb2MuZm5hbWUsIGluaXRfZm5hbWUgPyBsb2MuZmlsZSA6IE5VTEwgKTsKKworICAgIHJldHVybiBsb2M7CisKK30gLy8ga21wX3N0cl9sb2NfaW5pdAorCisKK3ZvaWQKK19fa21wX3N0cl9sb2NfZnJlZSgKKyAgICBrbXBfc3RyX2xvY190ICogbG9jCispIHsKKyAgICBfX2ttcF9zdHJfZm5hbWVfZnJlZSggJiBsb2MtPmZuYW1lICk7CisgICAgX19rbXBfc3RyX2ZyZWUoKGNvbnN0IGNoYXIgKiopICYobG9jLT5fYnVsaykpOworICAgIGxvYy0+ZmlsZSAgPSBOVUxMOworICAgIGxvYy0+ZnVuYyAgPSBOVUxMOworfSAvLyBrbXBfc3RyX2xvY19mcmVlCisKKworCisvKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gY29tcGFyZSBmaWxlIG5hbWVzLiBPbiBXaW5kb3dzKiBPUyBmaWxlIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLAorICAgIHNvIGZ1bmN0aW9ucyBwZXJmb3JtcyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24uIE9uIExpbnV4KiBPUyBpdCBwZXJmb3JtcyBjYXNlLXNlbnNpdGl2ZQorICAgIGNvbXBhcmlzb24uCisgICAgTm90ZTogVGhlIGZ1bmN0aW9uIHJldHVybnMgKnRydWUqIGlmIHN0cmluZ3MgYXJlICplcXVhbCouCisqLworCitpbnQKK19fa21wX3N0cl9lcWYoICAgICAgICAgLy8gVHJ1ZSwgaWYgc3RyaW5ncyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBjaGFyIGNvbnN0ICogbGhzLCAgLy8gRmlyc3Qgc3RyaW5nLgorICAgIGNoYXIgY29uc3QgKiByaHMgICAvLyBTZWNvbmQgc3RyaW5nLgorKSB7CisgICAgaW50IHJlc3VsdDsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgcmVzdWx0ID0gKCBfc3RyaWNtcCggbGhzLCByaHMgKSA9PSAwICk7CisgICAgI2Vsc2UKKyAgICAgICAgcmVzdWx0ID0gKCBzdHJjbXAoIGxocywgcmhzICkgPT0gMCApOworICAgICNlbmRpZgorICAgIHJldHVybiByZXN1bHQ7Cit9IC8vIF9fa21wX3N0cl9lcWYKKworCisvKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBzcHJpbnRmLCBidXQgaXQgKmFsbG9jYXRlcyogbmV3IGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBmcmVlZCBldmVudHVhbGx5IGJ5CisgICAgX19rbXBfc3RyX2ZyZWUoKS4gVGhlIGZ1bmN0aW9uIGlzIHZlcnkgY29udmVuaWVudCBmb3IgY29uc3RydWN0aW5nIHN0cmluZ3MsIGl0IHN1Y2Nlc3NmdWxseQorICAgIHJlcGxhY2VzIHN0cmR1cCgpLCBzdHJjYXQoKSwgaXQgZnJlZXMgcHJvZ3JhbW1lciBmcm9tIGJ1ZmZlciBhbGxvY2F0aW9ucyBhbmQgaGVscHMgdG8gYXZvaWQKKyAgICBidWZmZXIgb3ZlcmZsb3dzLiBFeGFtcGxlczoKKworICAgICAgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBvcmlnICk7ICAgICAgICAgICAgICAvLyBzdHJkdXAoKSwgZG8gbm90IGNhcmUgYWJvdXQgYnVmZmVyIHNpemUuCisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmIHN0ciApOworICAgICAgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMlcyIsIG9yaWcxLCBvcmlnMiApOyAgICAvLyBzdHJjYXQoKSwgZG8gbm90IGNhcmUgYWJvdXQgYnVmZmVyIHNpemUuCisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmIHN0ciApOworICAgICAgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMvJXMudHh0IiwgcGF0aCwgZmlsZSApOyAvLyBjb25zdHJ1Y3Rpbmcgc3RyaW5nLgorICAgICAgICBfX2ttcF9zdHJfZnJlZSggJiBzdHIgKTsKKworICAgIFBlcmZvcm1hbmNlIG5vdGU6CisgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSB3aXRoIG1hbGxvYygpIGNhbGxzLCBzbyBkbyBub3QgY2FsbCBpdCBmcm9tCisgICAgICAgIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGNvZGUuIEluIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGNvZGUgY29uc2lkZXIgdXNpbmcga21wX3N0cl9idWZfdAorICAgICAgICBpbnN0ZWFkLCBzaW5jZSBpdCB1c2VzIHN0YWNrLWFsbG9jYXRlZCBidWZmZXIgZm9yIHNob3J0IHN0cmluZ3MuCisKKyAgICBXaHkgZG9lcyB0aGlzIGZ1bmN0aW9uIHVzZSBtYWxsb2MoKT8KKyAgICAgICAgMS4gX19rbXBfYWxsb2NhdGUoKSByZXR1cm5zIGNhY2hlLWFsaWduZWQgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLiBUaGVyZSBhcmUgbm8KKyAgICAgICAgICAgcmVhc29ucyBpbiB1c2luZyBfX2ttcF9hbGxvY2F0ZSgpIGZvciBzdHJpbmdzIGR1ZSB0byBleHRyYSBvdmVyaGVhZCB3aGlsZSBjYWNoZS1hbGlnbmVkCisgICAgICAgICAgIG1lbW9yeSBpcyBub3QgbmVjZXNzYXJ5LgorICAgICAgICAyLiBfX2ttcF90aHJlYWRfbWFsbG9jKCkgY2Fubm90IGJlIHVzZWQgYmVjYXVzZSBpdCByZXF1aXJlcyBwb2ludGVyIHRvIHRocmVhZCBzdHJ1Y3R1cmUuCisgICAgICAgICAgIFdlIG5lZWQgdG8gcGVyZm9ybSBzdHJpbmcgb3BlcmF0aW9ucyBkdXJpbmcgbGlicmFyeSBzdGFydHVwIChmb3IgZXhhbXBsZSwgaW4KKyAgICAgICAgICAgX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwKCkpIHdoZW4gbm8gdGhyZWFkIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCB5ZXQuCisgICAgU28gc3RhbmRhcmQgbWFsbG9jKCkgaXMgdGhlIG9ubHkgYXZhaWxhYmxlIG9wdGlvbi4KKyovCisKK2NoYXIgKgorX19rbXBfc3RyX2Zvcm1hdCggICAgICAgICAgIC8vIEFsbG9jYXRlZCBzdHJpbmcuCisgICAgY2hhciBjb25zdCAqIGZvcm1hdCwgICAgLy8gRm9ybWF0IHN0cmluZy4KKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBwYXJhbWV0ZXJzLgorKSB7CisKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgaW50ICAgICBzaXplICAgPSA1MTI7CisgICAgY2hhciAqICBidWZmZXIgPSBOVUxMOworICAgIGludCAgICAgcmM7CisKKyAgICAvLyBBbGxvY2F0ZSBidWZmZXIuCisgICAgYnVmZmVyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZSApOworICAgIGlmICggYnVmZmVyID09IE5VTEwgKSB7CisJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgIH07IC8vIGlmCisKKyAgICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZvcm1hdCBzdHJpbmcuCisgICAgICAgIHZhX3N0YXJ0KCBhcmdzLCBmb3JtYXQgKTsKKyAgICAgICAgcmMgPSBLTVBfVlNOUFJJTlRGKCBidWZmZXIsIHNpemUsIGZvcm1hdCwgYXJncyApOworICAgICAgICB2YV9lbmQoIGFyZ3MgKTsKKworICAgICAgICAvLyBObyBlcnJvcnMsIHN0cmluZyBoYXMgYmVlbiBmb3JtYXR0ZWQuCisgICAgICAgIGlmICggcmMgPj0gMCAmJiByYyA8IHNpemUgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAgICAgICAgaWYgKCByYyA+PSAwICkgeworICAgICAgICAgICAgLy8gQzk5LWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24gb2YgdnNucHJpbnRmIHJldHVybnMgcmVxdWlyZWQgYnVmZmVyIHNpemUuCisgICAgICAgICAgICBzaXplID0gcmMgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT2xkZXIgaW1wbGVtZW50YXRpb25zIGp1c3QgcmV0dXJuIC0xLgorICAgICAgICAgICAgc2l6ZSA9IHNpemUgKiAyOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIEVubGFyZ2UgYnVmZmVyIGFuZCB0cnkgYWdhaW4uCisgICAgICAgIGJ1ZmZlciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBidWZmZXIsIHNpemUgKTsKKyAgICAgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsKKyAgICAJICAgIEtNUF9GQVRBTCggTWVtb3J5QWxsb2NGYWlsZWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGZvcmV2ZXIKKworICAgIHJldHVybiBidWZmZXI7CisKK30gLy8gZnVuYyBfX2ttcF9zdHJfZm9ybWF0CisKKwordm9pZAorX19rbXBfc3RyX2ZyZWUoCisgICAgY2hhciBjb25zdCAqICogc3RyCispIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSAqIHN0ciApOworICAgICogc3RyID0gTlVMTDsKK30gLy8gZnVuYyBfX2ttcF9zdHJfZnJlZQorCisKKy8qIElmIGxlbiBpcyB6ZXJvLCByZXR1cm5zIHRydWUgaWZmIHRhcmdldCBhbmQgZGF0YSBoYXZlIGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2guCisgICBJZiBsZW4gaXMgbmVnYXRpdmUsIHJldHVybnMgdHJ1ZSBpZmYgdGFyZ2V0IGlzIGEgY2FzZS1pbnNlbnNpdGl2ZSBzdWJzdHJpbmcgb2YgZGF0YS4KKyAgIElmIGxlbiBpcyBwb3NpdGl2ZSwgcmV0dXJucyB0cnVlIGlmZiB0YXJnZXQgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBvZiBkYXRhIG9yCisgICAgIHZpY2UgdmVyc2EsIGFuZCBuZWl0aGVyIGlzIHNob3J0ZXIgdGhhbiBsZW4uCisqLworaW50CitfX2ttcF9zdHJfbWF0Y2goCisgICAgY2hhciBjb25zdCAqIHRhcmdldCwKKyAgICBpbnQgICAgICAgICAgbGVuLAorICAgIGNoYXIgY29uc3QgKiBkYXRhCispIHsKKyAgICBpbnQgaTsKKyAgICBpZiAoIHRhcmdldCA9PSBOVUxMIHx8IGRhdGEgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH07IC8vIGlmCisgICAgZm9yICggaSA9IDA7IHRhcmdldFtpXSAmJiBkYXRhW2ldOyArKyBpICkgeworICAgICAgICBpZiAoIFRPTE9XRVIoIHRhcmdldFtpXSApICE9IFRPTE9XRVIoIGRhdGFbaV0gKSApIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IgaQorICAgIHJldHVybiAoICggbGVuID4gMCApID8gaSA+PSBsZW4gOiAoICEgdGFyZ2V0W2ldICYmICggbGVuIHx8ICEgZGF0YVtpXSApICkgKTsKK30gLy8gX19rbXBfc3RyX21hdGNoCisKKworaW50CitfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIGNoYXIgY29uc3QgKiBkYXRhICkgeworICAgIGludCByZXN1bHQgPQorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJmYWxzZSIsICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIm9mZiIsICAgICAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiMCIsICAgICAgIDEsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIuZmFsc2UuIiwgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi5mLiIsICAgICAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAibm8iLCAgICAgIDEsIGRhdGEgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBfX2ttcF9zdHJfbWF0Y2hfZmFsc2UKKworCitpbnQKK19fa21wX3N0cl9tYXRjaF90cnVlKCBjaGFyIGNvbnN0ICogZGF0YSApIHsKKyAgICBpbnQgcmVzdWx0ID0KKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAidHJ1ZSIsICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIm9uIiwgICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIxIiwgICAgICAxLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiLnRydWUuIiwgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi50LiIsICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJ5ZXMiLCAgICAxLCBkYXRhICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gX19rbXBfc3RyX21hdGNoX3RydWUKKwordm9pZAorX19rbXBfc3RyX3JlcGxhY2UoCisgICAgY2hhciAqIHN0ciwKKyAgICBjaGFyICAgc2VhcmNoX2ZvciwKKyAgICBjaGFyICAgcmVwbGFjZV93aXRoCispIHsKKworICAgIGNoYXIgKiBmb3VuZCA9IE5VTEw7CisKKyAgICBmb3VuZCA9IHN0cmNociggc3RyLCBzZWFyY2hfZm9yICk7CisgICAgd2hpbGUgKCBmb3VuZCApIHsKKyAgICAgICAgKiBmb3VuZCA9IHJlcGxhY2Vfd2l0aDsKKyAgICAgICAgZm91bmQgPSBzdHJjaHIoIGZvdW5kICsgMSwgc2VhcmNoX2ZvciApOworICAgIH07IC8vIHdoaWxlCisKK30gLy8gX19rbXBfc3RyX3JlcGxhY2UKKworCit2b2lkCitfX2ttcF9zdHJfc3BsaXQoCisgICAgY2hhciAqICBzdHIsICAgIC8vIEk6IFN0cmluZyB0byBzcGxpdC4KKyAgICBjaGFyICAgIGRlbGltLCAgLy8gSTogQ2hhcmFjdGVyIHRvIHNwbGl0IG9uLgorICAgIGNoYXIgKiogaGVhZCwgICAvLyBPOiBQb2ludGVyIHRvIGhlYWQgKG1heSBiZSBOVUxMKS4KKyAgICBjaGFyICoqIHRhaWwgICAgLy8gTzogUG9pbnRlciB0byB0YWlsIChtYXkgYmUgTlVMTCkuCispIHsKKyAgICBjaGFyICogaCA9IHN0cjsKKyAgICBjaGFyICogdCA9IE5VTEw7CisgICAgaWYgKCBzdHIgIT0gTlVMTCApIHsKKyAgICAgICAgY2hhciAqIHB0ciA9IHN0cmNociggc3RyLCBkZWxpbSApOworICAgICAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICAgICAgKiBwdHIgID0gMDsKKyAgICAgICAgICAgIHQgPSBwdHIgKyAxOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgaWYgKCBoZWFkICE9IE5VTEwgKSB7CisgICAgICAgICogaGVhZCA9IGg7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHRhaWwgIT0gTlVMTCApIHsKKyAgICAgICAgKiB0YWlsID0gdDsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdHJfc3BsaXQKKworLyoKKyAgICBzdHJ0b2tfcigpIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyogT1MuIFRoaXMgZnVuY3Rpb24gcmVpbXBsZW1lbnRzIHN0cnRva19yKCkuCisqLworY2hhciAqCitfX2ttcF9zdHJfdG9rZW4oCisgICAgY2hhciAqICAgICAgIHN0ciwgICAvLyBTdHJpbmcgdG8gc3BsaXQgaW50byB0b2tlbnMuIE5vdGU6IFN0cmluZyAqaXMqIG1vZGlmaWVkIQorICAgIGNoYXIgY29uc3QgKiBkZWxpbSwgLy8gRGVsaW1pdGVycy4KKyAgICBjaGFyICoqICAgICAgYnVmICAgIC8vIEludGVybmFsIGJ1ZmZlci4KKykgeworICAgIGNoYXIgKiB0b2tlbiA9IE5VTEw7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8vIE9uIFdpbmRvd3MqIE9TIHRoZXJlIGlzIG5vIHN0cnRva19yKCkgZnVuY3Rpb24uIExldCB1cyBpbXBsZW1lbnQgaXQuCisgICAgICAgIGlmICggc3RyICE9IE5VTEwgKSB7CisgICAgICAgICAgICAqIGJ1ZiA9IHN0cjsgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNhbGwsIGluaXRpYWxpemUgYnVmLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAqIGJ1ZiArPSBzdHJzcG4oICogYnVmLCBkZWxpbSApOyAgICAgICAvLyBTa2lwIGxlYWRpbmcgZGVsaW1pdGVycy4KKyAgICAgICAgaWYgKCAqKiBidWYgIT0gMCApIHsgICAgICAgICAgICAgICAgICAgLy8gUmVzdCBvZiB0aGUgc3RyaW5nIGlzIG5vdCB5ZXQgZW1wdHkuCisgICAgICAgICAgICB0b2tlbiA9ICogYnVmOyAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBpdCBhcyByZXN1bHQuCisgICAgICAgICAgICAqIGJ1ZiArPSBzdHJjc3BuKCAqIGJ1ZiwgZGVsaW0gKTsgIC8vIFNraXAgbm9uLWRlbGltaXRlcnMuCisgICAgICAgICAgICBpZiAoICoqIGJ1ZiAhPSAwICkgeyAgICAgICAgICAgICAgIC8vIFJlc3Qgb2YgdGhlIHN0cmluZyBpcyBub3QgeWV0IGVtcHR5LgorICAgICAgICAgICAgICAgICoqIGJ1ZiA9IDA7ICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgdG9rZW4gaGVyZS4KKyAgICAgICAgICAgICAgICAqIGJ1ZiArPSAxOyAgICAgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBidWYgdG8gc3RhcnQgd2l0aCB0aGUgbmV4dCB0b2tlbiBuZXh0IHRpbWUuCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgIC8vIE9uIExpbnV4KiBPUyBhbmQgT1MgWCosIHN0cnRva19yKCkgaXMgYXZhaWxhYmxlLiBMZXQgdXMgdXNlIGl0LgorICAgICAgICB0b2tlbiA9IHN0cnRva19yKCBzdHIsIGRlbGltLCBidWYgKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gdG9rZW47Cit9OyAvLyBfX2ttcF9zdHJfdG9rZW4KKworCitpbnQKK19fa21wX3N0cl90b19pbnQoCisgICAgY2hhciBjb25zdCAqIHN0ciwKKyAgICBjaGFyICAgICAgICAgc2VudGluZWwKKykgeworICAgIGludCByZXN1bHQsIGZhY3RvcjsKKyAgICBjaGFyIGNvbnN0ICogdDsKKworICAgIHJlc3VsdCA9IDA7CisKKyAgICBmb3IgKHQgPSBzdHI7ICp0ICE9ICdcMCc7ICsrdCkgeworICAgICAgICBpZiAoKnQgPCAnMCcgfHwgKnQgPiAnOScpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIDEwKSArICgqdCAtICcwJyk7CisgICAgfQorCisgICAgc3dpdGNoICgqdCkgeworICAgIGNhc2UgJ1wwJzogICAgICAgICAgLyogdGhlIGN1cnJlbnQgZGVmYXVsdCBmb3Igbm8gc3VmZml4IGlzIGJ5dGVzICovCisJZmFjdG9yID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYic6IGNhc2UgJ0InOiAvKiBieXRlcyAqLworCSsrdDsKKwlmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdrJzogY2FzZSAnSyc6IC8qIGtpbG8tYnl0ZXMgKi8KKwkrK3Q7CisJZmFjdG9yID0gMTAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOiAvKiBtZWdhLWJ5dGVzICovCisJKyt0OworCWZhY3RvciA9ICgxMDI0ICogMTAyNCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisJaWYoKnQgIT0gc2VudGluZWwpCisJICAgIHJldHVybiAoLTEpOworCXQgPSAiIjsKKwlmYWN0b3IgPSAxOworICAgIH0KKworICAgIGlmIChyZXN1bHQgPiAoSU5UX01BWCAvIGZhY3RvcikpCisJcmVzdWx0ID0gSU5UX01BWDsKKyAgICBlbHNlCisJcmVzdWx0ICo9IGZhY3RvcjsKKworICAgIHJldHVybiAoKnQgIT0gMCA/IDAgOiByZXN1bHQpOworCit9IC8vIF9fa21wX3N0cl90b19pbnQKKworCisvKgorICAgIFRoZSByb3V0aW5lIHBhcnNlcyBpbnB1dCBzdHJpbmcuIEl0IGlzIGV4cGVjdGVkIGl0IGlzIGEgdW5zaWduZWQgaW50ZWdlciB3aXRoIG9wdGlvbmFsIHVuaXQuCisgICAgVW5pdHMgYXJlOiAiYiIgZm9yIGJ5dGVzLCAia2IiIG9yIGp1c3QgImsiIGZvciBraWxvYnl0ZXMsICJtYiIgb3IgIm0iIGZvciBtZWdhYnl0ZXMsIC4uLiwgInliIgorICAgIG9yICJ5IiBmb3IgeW90dGFieXRlcy4gOi0pIFVuaXQgbmFtZSBpcyBjYXNlLWluc2Vuc2l0aXZlLiBUaGUgcm91dGluZSByZXR1cm5zIDAgaWYgZXZlcnl0aGluZyBpcworICAgIG9rLCBvciBlcnJvciBjb2RlOiAtMSBpbiBjYXNlIG9mIG92ZXJmbG93LCAtMiBpbiBjYXNlIG9mIHVua25vd24gdW5pdC4gKnNpemUgaXMgc2V0IHRvIHBhcnNlZAorICAgIHZhbHVlLiBJbiBjYXNlIG9mIG92ZXJmbG93ICpzaXplIGlzIHNldCB0byBLTVBfU0laRV9UX01BWCwgaW4gY2FzZSBvZiB1bmtub3duIHVuaXQgKnNpemUgaXMgc2V0CisgICAgdG8gemVyby4KKyovCit2b2lkCitfX2ttcF9zdHJfdG9fc2l6ZSggICAgICAgICAvLyBSOiBFcnJvciBjb2RlLgorICAgIGNoYXIgY29uc3QgKiAgIHN0ciwgICAgLy8gSTogU3RyaW5nIG9mIGNoYXJhY3RlcnMsIHVuc2lnbmVkIG51bWJlciBhbmQgdW5pdCAoImIiLCAia2IiLCBldGMpLgorICAgIHNpemVfdCAqICAgICAgIG91dCwgICAgLy8gTzogUGFyc2VkIG51bWJlci4KKyAgICBzaXplX3QgICAgICAgICBkZmFjdG9yLCAvLyBJOiBUaGUgZmFjdG9yIGlmIG5vbmUgb2YgdGhlIGxldHRlcnMgc3BlY2lmaWVkLgorICAgIGNoYXIgY29uc3QgKiAqIGVycm9yICAgLy8gTzogTnVsbCBpZiBldmVyeXRoaW5nIGlzIG9rLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KKykgeworCisgICAgc2l6ZV90IHZhbHVlICAgID0gMDsKKyAgICBzaXplX3QgZmFjdG9yICAgPSAwOworICAgIGludCAgICBvdmVyZmxvdyA9IDA7CisgICAgaW50ICAgIGkgICAgICAgID0gMDsKKyAgICBpbnQgICAgZGlnaXQ7CisKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0ciAhPSBOVUxMICk7CisKKyAgICAvLyBTa2lwIHNwYWNlcy4KKyAgICB3aGlsZSAoIHN0clsgaSBdID09ICcgJyB8fCBzdHJbIGkgXSA9PSAnXHQnKSB7CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIFBhcnNlIG51bWJlci4KKyAgICBpZiAoIHN0clsgaSBdIDwgJzAnIHx8IHN0clsgaSBdID4gJzknICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBOb3RBTnVtYmVyICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIGRvIHsKKyAgICAgICAgZGlnaXQgPSBzdHJbIGkgXSAtICcwJzsKKyAgICAgICAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCAoIHZhbHVlID4gKCBLTVBfU0laRV9UX01BWCAtIGRpZ2l0ICkgLyAxMCApOworICAgICAgICB2YWx1ZSA9ICggdmFsdWUgKiAxMCApICsgZGlnaXQ7CisgICAgICAgICsrIGk7CisgICAgfSB3aGlsZSAoIHN0clsgaSBdID49ICcwJyAmJiBzdHJbIGkgXSA8PSAnOScgKTsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcgKSB7CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIFBhcnNlIHVuaXQuCisgICAgI2RlZmluZSBfY2FzZSggY2gsIGV4cCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBjaCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIGNoIC0gKCAnYScgLSAnQScgKSA6IHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplX3Qgc2hpZnQgPSAoZXhwKSAqIDEwOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICsrIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBzaGlmdCA8IHNpemVvZiggc2l6ZV90ICkgKiA4ICkgeyAgICAgICBcCisgICAgICAgICAgICAgICAgZmFjdG9yID0gKHNpemVfdCkoIDEgKSA8PCBzaGlmdDsgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBicmVhazsKKyAgICBzd2l0Y2ggKCBzdHJbIGkgXSApIHsKKyAgICAgICAgX2Nhc2UoICdrJywgMSApOyAvLyBLaWxvCisgICAgICAgIF9jYXNlKCAnbScsIDIgKTsgLy8gTWVnYQorICAgICAgICBfY2FzZSggJ2cnLCAzICk7IC8vIEdpZ2EKKyAgICAgICAgX2Nhc2UoICd0JywgNCApOyAvLyBUZXJhCisgICAgICAgIF9jYXNlKCAncCcsIDUgKTsgLy8gUGV0YQorICAgICAgICBfY2FzZSggJ2UnLCA2ICk7IC8vIEV4YQorICAgICAgICBfY2FzZSggJ3onLCA3ICk7IC8vIFpldHRhCisgICAgICAgIF9jYXNlKCAneScsIDggKTsgLy8gWW90dGEKKyAgICAgICAgLy8gT29wcy4gTm8gbW9yZSB1bml0cy4uLgorICAgIH07IC8vIHN3aXRjaAorICAgICN1bmRlZiBfY2FzZQorICAgIGlmICggc3RyWyBpIF0gPT0gJ2InIHx8IHN0clsgaSBdID09ICdCJyApIHsgICAgLy8gU2tpcCBvcHRpb25hbCAiYiIuCisJaWYgKCBmYWN0b3IgPT0gMCApIHsKKwkgICAgZmFjdG9yID0gMTsKKwl9CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoICEgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyB8fCBzdHJbIGkgXSA9PSAwICkgKSB7IC8vIEJhZCB1bml0CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIEJhZFVuaXQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIGZhY3RvciA9PSAwICkgeworCWZhY3RvciA9IGRmYWN0b3I7CisgICAgfQorCisgICAgLy8gQXBwbHkgZmFjdG9yLgorICAgIG92ZXJmbG93ID0gb3ZlcmZsb3cgfHwgKCB2YWx1ZSA+ICggS01QX1NJWkVfVF9NQVggLyBmYWN0b3IgKSApOworICAgIHZhbHVlICo9IGZhY3RvcjsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcgKSB7CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIGlmICggc3RyWyBpIF0gIT0gMCApIHsKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggSWxsZWdhbENoYXJhY3RlcnMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIG92ZXJmbG93ICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICogb3V0ID0gS01QX1NJWkVfVF9NQVg7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgKiBlcnJvciA9IE5VTEw7CisgICAgKiBvdXQgPSB2YWx1ZTsKKworfSAvLyBfX2ttcF9zdHJfdG9fc2l6ZQorCisKK3ZvaWQKK19fa21wX3N0cl90b191aW50KCAgICAgICAgIC8vIFI6IEVycm9yIGNvZGUuCisgICAgY2hhciBjb25zdCAqICAgc3RyLCAgICAvLyBJOiBTdHJpbmcgb2YgY2hhcmFjdGVycywgdW5zaWduZWQgbnVtYmVyLgorICAgIGttcF91aW50NjQgKiAgIG91dCwgICAgLy8gTzogUGFyc2VkIG51bWJlci4KKyAgICBjaGFyIGNvbnN0ICogKiBlcnJvciAgIC8vIE86IE51bGwgaWYgZXZlcnl0aGluZyBpcyBvaywgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCispIHsKKworICAgIHNpemVfdCB2YWx1ZSAgICA9IDA7CisgICAgaW50ICAgIG92ZXJmbG93ID0gMDsKKyAgICBpbnQgICAgaSAgICAgICAgPSAwOworICAgIGludCAgICBkaWdpdDsKKworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RyICE9IE5VTEwgKTsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcgKSB7CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIFBhcnNlIG51bWJlci4KKyAgICBpZiAoIHN0clsgaSBdIDwgJzAnIHx8IHN0clsgaSBdID4gJzknICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBOb3RBTnVtYmVyICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIGRvIHsKKyAgICAgICAgZGlnaXQgPSBzdHJbIGkgXSAtICcwJzsKKyAgICAgICAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCAoIHZhbHVlID4gKCBLTVBfU0laRV9UX01BWCAtIGRpZ2l0ICkgLyAxMCApOworICAgICAgICB2YWx1ZSA9ICggdmFsdWUgKiAxMCApICsgZGlnaXQ7CisgICAgICAgICsrIGk7CisgICAgfSB3aGlsZSAoIHN0clsgaSBdID49ICcwJyAmJiBzdHJbIGkgXSA8PSAnOScgKTsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcgKSB7CisgICAgICAgICsrIGk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIGlmICggc3RyWyBpIF0gIT0gMCApIHsKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggSWxsZWdhbENoYXJhY3RlcnMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIG92ZXJmbG93ICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICogb3V0ID0gKGttcF91aW50NjQpIC0xOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgICogZXJyb3IgPSBOVUxMOworICAgICogb3V0ID0gdmFsdWU7CisKK30gLy8gX19rbXBfc3RyX3RvX3VuaXQKKworCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3N0ci5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTcxYmJhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdHIuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIGttcF9zdHIuaCAtLSBTdHJpbmcgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9TVFJfSAorI2RlZmluZSBLTVBfU1RSX0gKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAia21wX29zLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBkZWZpbmUgc3RyZHVwICAgIF9zdHJkdXAKKyNlbmRpZgorCisvKiAgc29tZSBtYWNyb3MgdG8gcmVwbGFjZSBjdHlwZS5oIGZ1bmN0aW9ucyAgKi8KKyNkZWZpbmUgVE9MT1dFUihjKQkoKCgoYykgPj0gJ0EnKSAmJiAoKGMpIDw9ICdaJykpID8gKChjKSArICdhJyAtICdBJykgOiAoYykpCisKK3N0cnVjdCBrbXBfc3RyX2J1ZiB7CisgICAgY2hhciAgICAgICAqIHN0cjsgICAgICAgICAvLyBQb2ludGVyIHRvIGJ1ZmZlciBjb250ZW50LCByZWFkIG9ubHkuCisgICAgdW5zaWduZWQgaW50IHNpemU7ICAgICAgICAvLyBEbyBub3QgY2hhbmdlIHRoaXMgZmllbGQhCisgICAgaW50ICAgICAgICAgIHVzZWQ7ICAgICAgICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkIHRvIGJ1ZmZlciwgcmVhZCBvbmx5LgorICAgIGNoYXIgICAgICAgICBidWxrWyA1MTIgXTsgLy8gRG8gbm90IHVzZSB0aGlzIGZpZWxkIQorfTsgLy8gc3RydWN0IGttcF9zdHJfYnVmCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RyX2J1ZiAga21wX3N0cl9idWZfdDsKKworI2RlZmluZSBfX2ttcF9zdHJfYnVmX2luaXQoIGIgKSAgIHsgKGIpLT5zdHIgPSAoYiktPmJ1bGs7IChiKS0+c2l6ZSA9IHNpemVvZiggKGIpLT5idWxrICk7IChiKS0+dXNlZCA9IDA7IChiKS0+YnVsa1sgMCBdID0gMDsgfQorCit2b2lkICAgX19rbXBfc3RyX2J1Zl9jbGVhcigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOwordm9pZCAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgaW50IHNpemUgKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX2RldGFjaCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOwordm9pZCAgIF9fa21wX3N0cl9idWZfZnJlZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOwordm9pZCAgIF9fa21wX3N0cl9idWZfY2F0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogc3RyLCBpbnQgbGVuICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl92cHJpbnQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBmb3JtYXQsIHZhX2xpc3QgYXJncyApOwordm9pZCAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApOwordm9pZCAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgc2l6ZV90IHNpemUgKTsKKworLyoKKyAgICBGaWxlIG5hbWUgcGFyc2VyLiBVc2FnZToKKworICAgICAgICBrbXBfc3RyX2ZuYW1lX3QgZm5hbWUgPSBfX2ttcF9zdHJfZm5hbWVfaW5pdCggcGF0aCApOworICAgICAgICAvLyBVc2UgZm5hbWUucGF0aCAoY29weSBvZiBvcmlnaW5hbCBwYXRoICksIGZuYW1lLmRpciwgZm5hbWUuYmFzZS4KKyAgICAgICAgLy8gTm90ZSBmbmFtZS5kaXIgY29uY2F0ZW5hdGVkIHdpdGggZm5hbWUuYmFzZSBnaXZlcyBleGFjdCBjb3B5IG9mIHBhdGguCisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCAmIGZuYW1lICk7CisKKyovCitzdHJ1Y3Qga21wX3N0cl9mbmFtZSB7CisgICAgY2hhciAqIHBhdGg7CisgICAgY2hhciAqIGRpcjsKKyAgICBjaGFyICogYmFzZTsKK307IC8vIHN0cnVjdCBrbXBfc3RyX2ZuYW1lCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RyX2ZuYW1lIGttcF9zdHJfZm5hbWVfdDsKK3ZvaWQgX19rbXBfc3RyX2ZuYW1lX2luaXQoIGttcF9zdHJfZm5hbWVfdCAqIGZuYW1lLCBjaGFyIGNvbnN0ICogcGF0aCApOwordm9pZCBfX2ttcF9zdHJfZm5hbWVfZnJlZSgga21wX3N0cl9mbmFtZV90ICogZm5hbWUgKTsKKy8vIENvbXBhcmVzIGZpbGUgbmFtZSB3aXRoIHNwZWNpZmllZCBwYXRlcm4uIElmIHBhdHRlcm4gaXMgTlVMTCwgYW55IGZuYW1lIG1hdGNoZWQuCitpbnQgX19rbXBfc3RyX2ZuYW1lX21hdGNoKCBrbXBfc3RyX2ZuYW1lX3QgY29uc3QgKiBmbmFtZSwgY2hhciBjb25zdCAqIHBhdHRlcm4gKTsKKworLyoKKyAgICBUaGUgY29tcGlsZXIgcHJvdmlkZXMgc291cmNlIGxvY2F0aW9ucyBpbiBzdHJpbmcgZm9ybSAiO2ZpbGU7ZnVuYztsaW5lO2NvbDs7Ii4gSXQgbm90IG5vdAorICAgIGNvbnZlbmllbnQgZm9yIG1hbnVwdWxhdGlvbi4gVGhlc2Ugc3RydWN0dXJlIGtlZXBzIHNvdXJjZSBsb2NhdGlvbiBpbiBtb3JlIGNvbnZlbmllbnQgZm9ybS4KKyAgICBVc2FnZToKKworICAgICAgICBrbXBfc3RyX2xvY190IGxvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggaWRlbnQtPnBzb3VyY2UsIDAgKTsKKyAgICAgICAgLy8gdXNlIGxvYy5maWxlLCBsb2MuZnVuYywgbG9jLmxpbmUsIGxvYy5jb2wuCisgICAgICAgIC8vIGxvYy5mbmFtZSBpcyBhdmFpbGFibGUgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBvZiBfX2ttcF9zdHJfbG9jX2luaXQgaXMgdHJ1ZS4KKyAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmIGxvYyApOworCisgICAgSWYgcHNvdXJjZSBpcyBOVUxMIG9yIGRvZXMgbm90IGZvbGxvdyBmb3JtYXQgYWJvdmUsIGZpbGUgYW5kL29yIGZ1bmMgbWF5IGJlIE5VTEwgcG9pbnRlcnMuCisqLworc3RydWN0IGttcF9zdHJfbG9jIHsKKyAgICBjaGFyICogICAgICAgICAgX2J1bGs7ICAvLyBEbyBub3QgdXNlIHRoaWQgZmllbGQuCisgICAga21wX3N0cl9mbmFtZV90IGZuYW1lOyAgLy8gV2lsbCBiZSBpbml0aWFsaXplZCBpZiBpbml0X2ZuYW1lIGlzIHRydWUuCisgICAgY2hhciAqICAgICAgICAgIGZpbGU7CisgICAgY2hhciAqICAgICAgICAgIGZ1bmM7CisgICAgaW50ICAgICAgICAgICAgIGxpbmU7CisgICAgaW50ICAgICAgICAgICAgIGNvbDsKK307IC8vIHN0cnVjdCBrbXBfc3RyX2xvYwordHlwZWRlZiBzdHJ1Y3Qga21wX3N0cl9sb2Mga21wX3N0cl9sb2NfdDsKK2ttcF9zdHJfbG9jX3QgX19rbXBfc3RyX2xvY19pbml0KCBjaGFyIGNvbnN0ICogcHNvdXJjZSwgaW50IGluaXRfZm5hbWUgKTsKK3ZvaWQgX19rbXBfc3RyX2xvY19mcmVlKCBrbXBfc3RyX2xvY190ICogbG9jICk7CisKK2ludCAgICBfX2ttcF9zdHJfZXFmKCBjaGFyIGNvbnN0ICogbGhzLCBjaGFyIGNvbnN0ICogcmhzICk7CitjaGFyICogX19rbXBfc3RyX2Zvcm1hdCggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7Cit2b2lkICAgX19rbXBfc3RyX2ZyZWUoIGNoYXIgY29uc3QgKiAqIHN0ciApOworaW50ICAgIF9fa21wX3N0cl9tYXRjaCggY2hhciBjb25zdCAqIHRhcmdldCwgaW50IGxlbiwgY2hhciBjb25zdCAqIGRhdGEgKTsKK2ludCAgICBfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoIGNoYXIgY29uc3QgKiBkYXRhICk7CitpbnQgICAgX19rbXBfc3RyX21hdGNoX3RydWUoIGNoYXIgY29uc3QgKiBkYXRhICk7Cit2b2lkICAgX19rbXBfc3RyX3JlcGxhY2UoIGNoYXIgKiBzdHIsIGNoYXIgc2VhcmNoX2ZvciwgY2hhciByZXBsYWNlX3dpdGggKTsKK3ZvaWQgICBfX2ttcF9zdHJfc3BsaXQoIGNoYXIgKiBzdHIsIGNoYXIgZGVsaW0sIGNoYXIgKiogaGVhZCwgY2hhciAqKiB0YWlsICk7CitjaGFyICogX19rbXBfc3RyX3Rva2VuKCBjaGFyICogc3RyLCBjaGFyIGNvbnN0ICogZGVsaW0sIGNoYXIgKiogYnVmICk7CitpbnQgICAgX19rbXBfc3RyX3RvX2ludCggY2hhciBjb25zdCAqIHN0ciwgY2hhciBzZW50aW5lbCApOworCit2b2lkIF9fa21wX3N0cl90b19zaXplKCBjaGFyIGNvbnN0ICogc3RyLCBzaXplX3QgKiBvdXQsIHNpemVfdCBkZmFjdG9yLCBjaGFyIGNvbnN0ICogKiBlcnJvciApOwordm9pZCBfX2ttcF9zdHJfdG9fdWludCggY2hhciBjb25zdCAqIHN0ciwga21wX3VpbnQ2NCAqIG91dCwgY2hhciBjb25zdCAqICogZXJyb3IgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9TVFJfSAorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3N0dWIuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdHViLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWI3Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdHViLmNwcApAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIGttcF9zdHViLmNwcCAtLSBzdHViIHZlcnNpb25zIG9mIHVzZXItY2FsbGFibGUgT3Blbk1QIFJUIGZ1bmN0aW9ucy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJvbXAuaCIgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmVuYW1pbmdzLgorI2luY2x1ZGUgImttcC5oIiAgICAgICAgICAgICAgICAvLyBLTVBfREVGQVVMVF9TVEtTSVpFCisjaW5jbHVkZSAia21wX3N0dWIuaCIKKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworLy8gTW92ZWQgZnJvbSBvbXAuaAorI2RlZmluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisjZGVmaW5lIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgb21wY19zZXRfc2NoZWR1bGUKKyNkZWZpbmUgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisjZGVmaW5lIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAgb21wY19nZXRfdGVhbV9zaXplCisKKyNkZWZpbmUgb21wX3NldF9udW1fdGhyZWFkcyAgICAgICAgICBvbXBjX3NldF9udW1fdGhyZWFkcworI2RlZmluZSBvbXBfc2V0X2R5bmFtaWMgICAgICAgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMKKyNkZWZpbmUgb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICBvbXBjX3NldF9uZXN0ZWQKKyNkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyNkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworI2RlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorI2RlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyNkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworI2RlZmluZSBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMgICAgIGttcGNfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMKKyNkZWZpbmUga21wX21hbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX21hbGxvYworI2RlZmluZSBrbXBfYWxpZ25lZF9tYWxsb2MgICAgICAgICAgIGttcGNfYWxpZ25lZF9tYWxsb2MKKyNkZWZpbmUga21wX2NhbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX2NhbGxvYworI2RlZmluZSBrbXBfcmVhbGxvYyAgICAgICAgICAgICAgICAgIGttcGNfcmVhbGxvYworI2RlZmluZSBrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgIGttcGNfZnJlZQorCitzdGF0aWMgZG91YmxlIGZyZXF1ZW5jeSA9IDAuMDsKKworLy8gSGVscGVyIGZ1bmN0aW9ucy4KK3N0YXRpYyBzaXplX3QgX19rbXBzX2luaXQoKSB7CisgICAgc3RhdGljIGludCAgICBpbml0aWFsaXplZCA9IDA7CisgICAgc3RhdGljIHNpemVfdCBkdW1teSA9IDA7CisgICAgaWYgKCAhIGluaXRpYWxpemVkICkgeworCisgICAgICAgIC8vIFRPRE86IEFuYWx5emUgS01QX1ZFUlNJT04gZW52aXJvbm1lbnQgdmFyaWFibGUsIHByaW50CisgICAgICAgIC8vIF9fa21wX3ZlcnNpb25fY29weXJpZ2h0IGFuZCBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWUuCisgICAgICAgIC8vIFdBUk5JTkc6IERvIG5vdCB1c2UgImZwcmludGYoIHN0ZGVyciwgLi4uICkiIGJlY2F1c2UgaXQgd2lsbCBjYXVzZQorICAgICAgICAvLyB1bnJlc29sdmVkICJfX2lvYiIgc3ltYm9sIChzZWUgQzcwMDgwKS4gV2UgbmVlZCB0byBleHRyYWN0CisgICAgICAgIC8vIF9fa21wX3ByaW50ZigpIHN0dWZmIGZyb20ga21wX3J1bnRpbWUuY3BwIGFuZCB1c2UgaXQuCisKKyAgICAgICAgLy8gVHJpY2sgd2l0aCBkdW1teSB2YXJpYWJsZSBmb3JjZXMgbGlua2VyIHRvIGtlZXAgX19rbXBfdmVyc2lvbl9jb3B5cmlnaHQKKyAgICAgICAgLy8gYW5kIF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZSBzdHJpbmdzIGluIGV4ZWN1dGFibGUgZmlsZSAoaW4gY2FzZSBvZgorICAgICAgICAvLyBzdGF0aWMgbGlua2FnZSkuIFdoZW4gS01QX1ZFUlNJT04gYW5hbHlzaXMgaXMgaW1wbGVtZW50ZWQsIGR1bW15CisgICAgICAgIC8vIHZhcmlhYmxlIHNob3VsZCBiZSBkZWxldGVkLCBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHZvaWQuCisgICAgICAgIGR1bW15ID0gX19rbXBfdmVyc2lvbl9jb3B5cmlnaHQgLSBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWU7CisKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBMQVJHRV9JTlRFR0VSIGZyZXE7CisgICAgICAgICAgICBCT09MIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koICYgZnJlcSApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gZG91YmxlKCBmcmVxLlF1YWRQYXJ0ICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAjZW5kaWYKKworICAgICAgICBpbml0aWFsaXplZCA9IDE7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gZHVtbXk7Cit9OyAvLyBfX2ttcHNfaW5pdAorCisjZGVmaW5lIGkgX19rbXBzX2luaXQoKTsKKworLyogc2V0IEFQSSBmdW5jdGlvbnMgKi8KK3ZvaWQgb21wX3NldF9udW1fdGhyZWFkcyggb21wX2ludF90IG51bV90aHJlYWRzICkgeyBpOyB9Cit2b2lkIG9tcF9zZXRfZHluYW1pYyggb21wX2ludF90IGR5bmFtaWMgKSAgICAgICAgIHsgaTsgX19rbXBzX3NldF9keW5hbWljKCBkeW5hbWljICk7IH0KK3ZvaWQgb21wX3NldF9uZXN0ZWQoIG9tcF9pbnRfdCBuZXN0ZWQgKSAgICAgICAgICAgeyBpOyBfX2ttcHNfc2V0X25lc3RlZCggbmVzdGVkICk7ICAgfQordm9pZCBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBvbXBfaW50X3QgbWF4X2FjdGl2ZV9sZXZlbHMgKSB7IGk7IH0KK3ZvaWQgb21wX3NldF9zY2hlZHVsZSggb21wX3NjaGVkX3Qga2luZCwgb21wX2ludF90IG1vZGlmaWVyICkgeyBpOyBfX2ttcHNfc2V0X3NjaGVkdWxlKCAoa21wX3NjaGVkX3Qpa2luZCwgbW9kaWZpZXIgKTsgfQoraW50IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggb21wX2ludF90IGxldmVsICkgeyBpOyByZXR1cm4gKCBsZXZlbCApID8gKCAtMSApIDogKCAwICk7IH0KK2ludCBvbXBfZ2V0X3RlYW1fc2l6ZSggb21wX2ludF90IGxldmVsICkgeyBpOyByZXR1cm4gKCBsZXZlbCApID8gKCAtMSApIDogKCAxICk7IH0KK2ludCBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApIHsgaTsgcmV0dXJuIC0xOyB9CitpbnQga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApIHsgaTsgcmV0dXJuIC0xOyB9CitpbnQga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jKCBpbnQgcHJvYywgdm9pZCAqKm1hc2sgKSB7IGk7IHJldHVybiAtMTsgfQorCisvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZSggb21wX2ludF90IGFyZyApICAgeyBpOyBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggYXJnICk7IH0KK3ZvaWQga21wX3NldF9zdGFja3NpemVfcyggc2l6ZV90IGFyZyApICAgIHsgaTsgX19rbXBzX3NldF9zdGFja3NpemUoIGFyZyApOyB9Cit2b2lkIGttcF9zZXRfYmxvY2t0aW1lKCBvbXBfaW50X3QgYXJnICkgICB7IGk7IF9fa21wc19zZXRfYmxvY2t0aW1lKCBhcmcgKTsgfQordm9pZCBrbXBfc2V0X2xpYnJhcnkoIG9tcF9pbnRfdCBhcmcgKSAgICAgeyBpOyBfX2ttcHNfc2V0X2xpYnJhcnkoIGFyZyApOyB9Cit2b2lkIGttcF9zZXRfZGVmYXVsdHMoIGNoYXIgY29uc3QgKiBzdHIgKSB7IGk7IH0KK3ZvaWQga21wX3NldF9kaXNwX251bV9idWZmZXJzKCBvbXBfaW50X3QgYXJnICkgeyBpOyB9CisKKy8qIEtNUCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuICovCit2b2lkICoga21wX21hbGxvYyggc2l6ZV90IHNpemUgKSAgICAgICAgICAgICAgICAgeyBpOyByZXR1cm4gbWFsbG9jKCBzaXplICk7IH0KK3ZvaWQgKiBrbXBfYWxpZ25lZF9tYWxsb2MoIHNpemVfdCBzeiwgc2l6ZV90IGEgKSB7CisgICAgaTsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIGVycm5vID0gRU5PU1lTOyAvLyBub3Qgc3VwcG9ydGVkCisgICAgcmV0dXJuIE5VTEw7ICAgIC8vIG5vIHN0YW5kYXJkIGFsaWduZWQgYWxsb2NhdG9yIG9uIFdpbmRvd3MgKHByZSAtIEMxMSkKKyNlbHNlCisgICAgdm9pZCAqcmVzOworICAgIGludCBlcnI7CisgICAgaWYoIGVyciA9IHBvc2l4X21lbWFsaWduKCAmcmVzLCBhLCBzeiApICkgeworICAgICAgICBlcnJubyA9IGVycjsgLy8gY2FuIGJlIEVJTlZBTCBvciBFTk9NRU0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXM7CisjZW5kaWYKK30KK3ZvaWQgKiBrbXBfY2FsbG9jKCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgKSB7IGk7IHJldHVybiBjYWxsb2MoIG5lbGVtLCBlbHNpemUgKTsgfQordm9pZCAqIGttcF9yZWFsbG9jKCB2b2lkICpwdHIsIHNpemVfdCBzaXplICkgICAgIHsgaTsgcmV0dXJuIHJlYWxsb2MoIHB0ciwgc2l6ZSApOyB9Cit2b2lkICAga21wX2ZyZWUoIHZvaWQgKiBwdHIgKSAgICAgICAgICAgICAgICAgICAgeyBpOyBmcmVlKCBwdHIgKTsgfQorCitzdGF0aWMgaW50IF9fa21wc19ibG9ja3RpbWUgPSBJTlRfTUFYOworCit2b2lkIF9fa21wc19zZXRfYmxvY2t0aW1lKCBpbnQgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX2Jsb2NrdGltZSA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9ibG9ja3RpbWUKKworaW50IF9fa21wc19nZXRfYmxvY2t0aW1lKCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19ibG9ja3RpbWU7Cit9IC8vIF9fa21wc19nZXRfYmxvY2t0aW1lCisKK3N0YXRpYyBpbnQgX19rbXBzX2R5bmFtaWMgPSAwOworCit2b2lkIF9fa21wc19zZXRfZHluYW1pYyggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19keW5hbWljID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2R5bmFtaWMKKworaW50IF9fa21wc19nZXRfZHluYW1pYyggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfZHluYW1pYzsKK30gLy8gX19rbXBzX2dldF9keW5hbWljCisKK3N0YXRpYyBpbnQgX19rbXBzX2xpYnJhcnkgPSAxMDAwOworCit2b2lkIF9fa21wc19zZXRfbGlicmFyeSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19saWJyYXJ5ID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2xpYnJhcnkKKworaW50IF9fa21wc19nZXRfbGlicmFyeSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfbGlicmFyeTsKK30gLy8gX19rbXBzX2dldF9saWJyYXJ5CisKK3N0YXRpYyBpbnQgX19rbXBzX25lc3RlZCA9IDA7CisKK3ZvaWQgX19rbXBzX3NldF9uZXN0ZWQoIGludCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfbmVzdGVkID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X25lc3RlZAorCitpbnQgX19rbXBzX2dldF9uZXN0ZWQoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX25lc3RlZDsKK30gLy8gX19rbXBzX2dldF9uZXN0ZWQKKworc3RhdGljIHNpemVfdCBfX2ttcHNfc3RhY2tzaXplID0gS01QX0RFRkFVTFRfU1RLU0laRTsKKwordm9pZCBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19zdGFja3NpemUgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfc3RhY2tzaXplCisKK2ludCBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfc3RhY2tzaXplOworfSAvLyBfX2ttcHNfZ2V0X3N0YWNrc2l6ZQorCitzdGF0aWMga21wX3NjaGVkX3QgX19rbXBzX3NjaGVkX2tpbmQgICAgID0ga21wX3NjaGVkX2RlZmF1bHQ7CitzdGF0aWMgaW50ICAgICAgICAgX19rbXBzX3NjaGVkX21vZGlmaWVyID0gMDsKKworICAgIHZvaWQgX19rbXBzX3NldF9zY2hlZHVsZSgga21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICkgeworICAgICAgICBpOworICAgICAgICBfX2ttcHNfc2NoZWRfa2luZCAgICAgPSBraW5kOworICAgICAgICBfX2ttcHNfc2NoZWRfbW9kaWZpZXIgPSBtb2RpZmllcjsKKyAgICB9IC8vIF9fa21wc19zZXRfc2NoZWR1bGUKKworICAgIHZvaWQgX19rbXBzX2dldF9zY2hlZHVsZSgga21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIgKSB7CisgICAgICAgIGk7CisgICAgICAgICpraW5kICAgICA9IF9fa21wc19zY2hlZF9raW5kOworICAgICAgICAqbW9kaWZpZXIgPSBfX2ttcHNfc2NoZWRfbW9kaWZpZXI7CisgICAgfSAvLyBfX2ttcHNfZ2V0X3NjaGVkdWxlCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCitzdGF0aWMga21wX3Byb2NfYmluZF90IF9fa21wc19wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZmFsc2U7CisKK3ZvaWQgX19rbXBzX3NldF9wcm9jX2JpbmQoIGttcF9wcm9jX2JpbmRfdCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfcHJvY19iaW5kID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X3Byb2NfYmluZAorCitrbXBfcHJvY19iaW5kX3QgX19rbXBzX2dldF9wcm9jX2JpbmQoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX3Byb2NfYmluZDsKK30gLy8gX19rbXBzX2dldF9wcm9jX2JpbmQKKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKK2RvdWJsZSBfX2ttcHNfZ2V0X3d0aW1lKCB2b2lkICkgeworICAgIC8vIEVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIChpbiBzZWNvbmQpIGZyb20gInNvbWV0aW1lIGluIHRoZSBwYXN0Ii4KKyAgICBkb3VibGUgd3RpbWUgPSAwLjA7CisgICAgaTsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgaWYgKCBmcmVxdWVuY3kgPiAwLjAgKSB7CisgICAgICAgICAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICAgICAgICAgIEJPT0wgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgbm93ICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICB3dGltZSA9IGRvdWJsZSggbm93LlF1YWRQYXJ0ICkgLyBmcmVxdWVuY3k7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgIC8vIGdldHRpbWVvZmRheSgpIHJldHVybnMgc2Vjb25kcyBhbmQgbWljcm9zZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4KKyAgICAgICAgc3RydWN0IHRpbWV2YWwgIHR2YWw7CisgICAgICAgIGludCAgICAgICAgICAgICByYzsKKyAgICAgICAgcmMgPSBnZXR0aW1lb2ZkYXkoICYgdHZhbCwgTlVMTCApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICB3dGltZSA9IChkb3VibGUpKCB0dmFsLnR2X3NlYyApICsgMS4wRS0wNiAqIChkb3VibGUpKCB0dmFsLnR2X3VzZWMgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IEFzc2VydCBvciBhYm9ydCBoZXJlLgorICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorICAgIHJldHVybiB3dGltZTsKK307IC8vIF9fa21wc19nZXRfd3RpbWUKKworZG91YmxlIF9fa21wc19nZXRfd3RpY2soIHZvaWQgKSB7CisgICAgLy8gTnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlIGNsb2NrIHRpY2tzLgorICAgIGRvdWJsZSB3dGljayA9IDAuMDsKKyAgICBpOworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICB7CisgICAgICAgICAgICBEV09SRCBpbmNyZW1lbnQ7CisgICAgICAgICAgICBEV09SRCBhZGp1c3RtZW50OworICAgICAgICAgICAgQk9PTCAgZGlzYWJsZWQ7CisgICAgICAgICAgICBCT09MICByYzsKKyAgICAgICAgICAgIHJjID0gR2V0U3lzdGVtVGltZUFkanVzdG1lbnQoICYgYWRqdXN0bWVudCwgJiBpbmNyZW1lbnQsICYgZGlzYWJsZWQgKTsKKyAgICAgICAgICAgIGlmICggcmMgKSB7CisgICAgICAgICAgICAgICAgd3RpY2sgPSAxLjBFLTA3ICogKGRvdWJsZSkoIGRpc2FibGVkID8gaW5jcmVtZW50IDogYWRqdXN0bWVudCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBBc3NlcnQgb3IgYWJvcnQgaGVyZS4KKyAgICAgICAgICAgICAgICB3dGljayA9IDEuMEUtMDM7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9CisgICAgI2Vsc2UKKyAgICAgICAgLy8gVE9ETzogZ2V0dGltZW9mZGF5KCkgcmV0dXJucyBpbiBtaWNyb3NlY29uZHMsIGJ1dCB3aGF0IHRoZSBwcmVjaXNpb24/CisgICAgICAgIHd0aWNrID0gMS4wRS0wNjsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gd3RpY2s7Cit9OyAvLyBfX2ttcHNfZ2V0X3d0aWNrCisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjZmZhMwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBrbXBfc3R1Yi5oCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NUVUJfSAorI2RlZmluZSBLTVBfU1RVQl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKK3ZvaWQgX19rbXBzX3NldF9ibG9ja3RpbWUoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9ibG9ja3RpbWUoIHZvaWQgKTsKK3ZvaWQgX19rbXBzX3NldF9keW5hbWljKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfZHluYW1pYyggdm9pZCApOwordm9pZCBfX2ttcHNfc2V0X2xpYnJhcnkoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9saWJyYXJ5KCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfbmVzdGVkKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfbmVzdGVkKCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfc3RhY2tzaXplKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfc3RhY2tzaXplKCk7CisKKyNpZm5kZWYgS01QX1NDSEVEX1RZUEVfREVGSU5FRAorI2RlZmluZSBLTVBfU0NIRURfVFlQRV9ERUZJTkVECit0eXBlZGVmIGVudW0ga21wX3NjaGVkIHsKKyAgICBrbXBfc2NoZWRfc3RhdGljICAgICAgICAgICAgPSAxLCAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgKDMzKQorICAgIGttcF9zY2hlZF9keW5hbWljICAgICAgICAgICA9IDIsIC8vIG1hcHBlZCB0byBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAoMzUpCisgICAga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMywgLy8gbWFwcGVkIHRvIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICgzNikKKyAgICBrbXBfc2NoZWRfYXV0byAgICAgICAgICAgICAgPSA0LCAvLyBtYXBwZWQgdG8ga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgKDM4KQorICAgIGttcF9zY2hlZF9kZWZhdWx0ID0ga21wX3NjaGVkX3N0YXRpYyAgIC8vIGRlZmF1bHQgc2NoZWR1bGluZworfSBrbXBfc2NoZWRfdDsKKyNlbmRpZgordm9pZCBfX2ttcHNfc2V0X3NjaGVkdWxlKCBrbXBfc2NoZWRfdCBraW5kLCBpbnQgbW9kaWZpZXIgKTsKK3ZvaWQgX19rbXBzX2dldF9zY2hlZHVsZSgga21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkIF9fa21wc19zZXRfcHJvY19iaW5kKCBrbXBfcHJvY19iaW5kX3QgYXJnICk7CitrbXBfcHJvY19iaW5kX3QgX19rbXBzX2dldF9wcm9jX2JpbmQoIHZvaWQgKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCitkb3VibGUgX19rbXBzX2dldF93dGltZSgpOworZG91YmxlIF9fa21wc19nZXRfd3RpY2soKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9TVFVCX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF90YXNrZGVwcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiZjBiMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwCkBAIC0wLDAgKzEsNTkzIEBACisvKgorICoga21wX3Rhc2tkZXBzLmNwcAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyNkZWZpbmUgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUIDEKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vVE9ETzogSW1wcm92ZSBtZW1vcnkgYWxsb2NhdGlvbj8ga2VlcCBhIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBzdHJ1Y3R1cmVzPyBhbGxvY2F0ZSBpbiBibG9ja3M/IHJlLXVzZSBsaXN0IGZpbmlzaGVkIGxpc3QgZW50cmllcz8KKy8vVE9ETzogZG9uJ3QgdXNlIGF0b21pYyByZWYgY291bnRlcnMgZm9yIHN0YWNrLWFsbG9jYXRlZCBub2Rlcy4KKy8vVE9ETzogZmluZCBhbiBhbHRlcm5hdGUgdG8gYXRvbWljIHJlZnMgZm9yIGhlYXAtYWxsb2NhdGVkIG5vZGVzPworLy9UT0RPOiBGaW5pc2ggZ3JhcGggb3V0cHV0IHN1cHBvcnQKKy8vVE9ETzoga21wX2xvY2tfdCBzZWVtcyBhIHRhZCB0byBiaWcgKGFuZCBoZWF2eSB3ZWlnaHQpIGZvciB0aGlzLiBDaGVjayBvdGhlciBydW50aW1lIGxvY2tzCisvL1RPRE86IEFueSBJVFQgc3VwcG9ydCBuZWVkZWQ/CisKKyNpZmRlZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKK3N0YXRpYyBrbXBfaW50MzIga21wX25vZGVfaWRfc2VlZCA9IDA7CisjZW5kaWYKKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbm9kZSAoIGttcF9kZXBub2RlX3QgKm5vZGUgKQoreworICAgIG5vZGUtPmRuLnRhc2sgPSBOVUxMOyAvLyBzZXQgdG8gbnVsbCBpbml0aWFsbHksIGl0IHdpbGwgcG9pbnQgdG8gdGhlIHJpZ2h0IHRhc2sgb25jZSBkZXBlbmRlbmNlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkCisgICAgbm9kZS0+ZG4uc3VjY2Vzc29ycyA9IE5VTEw7CisgICAgX19rbXBfaW5pdF9sb2NrKCZub2RlLT5kbi5sb2NrKTsKKyAgICBub2RlLT5kbi5ucmVmcyA9IDE7IC8vIGluaXQgY3JlYXRlcyB0aGUgZmlyc3QgcmVmZXJlbmNlIHRvIHRoZSBub2RlCisjaWZkZWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAgbm9kZS0+ZG4uaWQgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCZrbXBfbm9kZV9pZF9zZWVkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGttcF9kZXBub2RlX3QgKgorX19rbXBfbm9kZV9yZWYgKCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCZub2RlLT5kbi5ucmVmcyk7CisgICAgcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfbm9kZV9kZXJlZiAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfdCAqbm9kZSApCit7CisgICAgaWYgKCFub2RlKSByZXR1cm47CisKKyAgICBrbXBfaW50MzIgbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoJm5vZGUtPmRuLm5yZWZzKSAtIDE7CisgICAgaWYgKCBuID09IDAgKSB7CisgICAgICAgIEtNUF9BU1NFUlQobm9kZS0+ZG4ubnJlZnMgPT0gMCk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsbm9kZSk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsbm9kZSk7CisjZW5kaWYKKyAgICB9Cit9CisKKyNkZWZpbmUgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLG4pIF9fa21wX2FjcXVpcmVfbG9jaygmKG4pLT5kbi5sb2NrLChndGlkKSkKKyNkZWZpbmUgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLG4pIF9fa21wX3JlbGVhc2VfbG9jaygmKG4pLT5kbi5sb2NrLChndGlkKSkKKworc3RhdGljIHZvaWQKK19fa21wX2RlcG5vZGVfbGlzdF9mcmVlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwbm9kZV9saXN0ICpsaXN0ICk7CisKK2VudW0geworICAgIEtNUF9ERVBIQVNIX09USEVSX1NJWkUgPSA5NywKKyAgICBLTVBfREVQSEFTSF9NQVNURVJfU0laRSA9IDk5NworfTsKKworc3RhdGljIGlubGluZSBrbXBfaW50MzIKK19fa21wX2RlcGhhc2hfaGFzaCAoIGttcF9pbnRwdHJfdCBhZGRyLCBzaXplX3QgaHNpemUgKQoreworICAgIC8vVE9ETyBhbHRlcm5hdGUgdG8gdHJ5OiBzZXQgPSAoKChBZGRyNjQpKGFkZHJVc2VmdWxCaXRzICogOS42MTgpKSAlIG1fbnVtX3NldHMgKTsKKyAgICByZXR1cm4gKChhZGRyID4+IDYpIF4gKGFkZHIgPj4gMikpICUgaHNpemU7Cit9CisKK3N0YXRpYyBrbXBfZGVwaGFzaF90ICoKK19fa21wX2RlcGhhc2hfY3JlYXRlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza2RhdGFfdCAqY3VycmVudF90YXNrICkKK3sKKyAgICBrbXBfZGVwaGFzaF90ICpoOworCisgICAgc2l6ZV90IGhfc2l6ZTsKKworICAgIGlmICggY3VycmVudF90YXNrLT50ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0lNUExJQ0lUICkKKyAgICAgICAgaF9zaXplID0gS01QX0RFUEhBU0hfTUFTVEVSX1NJWkU7CisgICAgZWxzZQorICAgICAgICBoX3NpemUgPSBLTVBfREVQSEFTSF9PVEhFUl9TSVpFOworCisgICAga21wX2ludDMyIHNpemUgPQorICAgICAgICBoX3NpemUgKiBzaXplb2Yoa21wX2RlcGhhc2hfZW50cnlfdCAqKSArIHNpemVvZihrbXBfZGVwaGFzaF90KTsKKworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIGggPSAoa21wX2RlcGhhc2hfdCAqKSBfX2ttcF9mYXN0X2FsbG9jYXRlKCB0aHJlYWQsIHNpemUgKTsKKyNlbHNlCisgICAgaCA9IChrbXBfZGVwaGFzaF90ICopIF9fa21wX3RocmVhZF9tYWxsb2MoIHRocmVhZCwgc2l6ZSApOworI2VuZGlmCisgICAgaC0+c2l6ZSA9IGhfc2l6ZTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGgtPm5lbGVtZW50cyA9IDA7CisgICAgaC0+bmNvbmZsaWN0cyA9IDA7CisjZW5kaWYKKyAgICBoLT5idWNrZXRzID0gKGttcF9kZXBoYXNoX2VudHJ5ICoqKShoKzEpOworCisgICAgZm9yICggc2l6ZV90IGkgPSAwOyBpIDwgaF9zaXplOyBpKysgKQorICAgICAgICBoLT5idWNrZXRzW2ldID0gMDsKKworICAgIHJldHVybiBoOworfQorCit2b2lkCitfX2ttcF9kZXBoYXNoX2ZyZWVfZW50cmllcyhrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBoYXNoX3QgKmgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoLT5zaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGgtPmJ1Y2tldHNbaV0pIHsKKyAgICAgICAgICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgKm5leHQ7CisgICAgICAgICAgICBmb3IgKGttcF9kZXBoYXNoX2VudHJ5X3QgKmVudHJ5ID0gaC0+YnVja2V0c1tpXTsgZW50cnk7IGVudHJ5ID0gbmV4dCkgeworICAgICAgICAgICAgICAgIG5leHQgPSBlbnRyeS0+bmV4dF9pbl9idWNrZXQ7CisgICAgICAgICAgICAgICAgX19rbXBfZGVwbm9kZV9saXN0X2ZyZWUodGhyZWFkLGVudHJ5LT5sYXN0X2lucyk7CisgICAgICAgICAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsZW50cnktPmxhc3Rfb3V0KTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgICAgICAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLGVudHJ5KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX2ZyZWUodGhyZWFkLGVudHJ5KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgaC0+YnVja2V0c1tpXSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX2RlcGhhc2hfZnJlZShrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBoYXNoX3QgKmgpCit7CisgICAgX19rbXBfZGVwaGFzaF9mcmVlX2VudHJpZXModGhyZWFkLCBoKTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLGgpOworI2Vsc2UKKyAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsaCk7CisjZW5kaWYKK30KKworc3RhdGljIGttcF9kZXBoYXNoX2VudHJ5ICoKK19fa21wX2RlcGhhc2hfZmluZCAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcGhhc2hfdCAqaCwga21wX2ludHB0cl90IGFkZHIgKQoreworICAgIGttcF9pbnQzMiBidWNrZXQgPSBfX2ttcF9kZXBoYXNoX2hhc2goYWRkcixoLT5zaXplKTsKKworICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgKmVudHJ5OworICAgIGZvciAoIGVudHJ5ID0gaC0+YnVja2V0c1tidWNrZXRdOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dF9pbl9idWNrZXQgKQorICAgICAgICBpZiAoIGVudHJ5LT5hZGRyID09IGFkZHIgKSBicmVhazsKKworICAgIGlmICggZW50cnkgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gY3JlYXRlIGVudHJ5LiBUaGlzIGlzIG9ubHkgZG9uZSBieSBvbmUgdGhyZWFkIHNvIG5vIGxvY2tpbmcgcmVxdWlyZWQKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgZW50cnkgPSAoa21wX2RlcGhhc2hfZW50cnlfdCAqKSBfX2ttcF9mYXN0X2FsbG9jYXRlKCB0aHJlYWQsIHNpemVvZihrbXBfZGVwaGFzaF9lbnRyeV90KSApOworI2Vsc2UKKyAgICAgICAgZW50cnkgPSAoa21wX2RlcGhhc2hfZW50cnlfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNpemVvZihrbXBfZGVwaGFzaF9lbnRyeV90KSApOworI2VuZGlmCisgICAgICAgIGVudHJ5LT5hZGRyID0gYWRkcjsKKyAgICAgICAgZW50cnktPmxhc3Rfb3V0ID0gTlVMTDsKKyAgICAgICAgZW50cnktPmxhc3RfaW5zID0gTlVMTDsKKyAgICAgICAgZW50cnktPm5leHRfaW5fYnVja2V0ID0gaC0+YnVja2V0c1tidWNrZXRdOworICAgICAgICBoLT5idWNrZXRzW2J1Y2tldF0gPSBlbnRyeTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaC0+bmVsZW1lbnRzKys7CisgICAgICAgIGlmICggZW50cnktPm5leHRfaW5fYnVja2V0ICkgaC0+bmNvbmZsaWN0cysrOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIGttcF9kZXBub2RlX2xpc3RfdCAqCitfX2ttcF9hZGRfbm9kZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfbGlzdF90ICpsaXN0LCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgKm5ld19oZWFkOworCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgbmV3X2hlYWQgPSAoa21wX2RlcG5vZGVfbGlzdF90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUodGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV9saXN0X3QpKTsKKyNlbHNlCisgICAgbmV3X2hlYWQgPSAoa21wX2RlcG5vZGVfbGlzdF90ICopIF9fa21wX3RocmVhZF9tYWxsb2ModGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV9saXN0X3QpKTsKKyNlbmRpZgorCisgICAgbmV3X2hlYWQtPm5vZGUgPSBfX2ttcF9ub2RlX3JlZihub2RlKTsKKyAgICBuZXdfaGVhZC0+bmV4dCA9IGxpc3Q7CisKKyAgICByZXR1cm4gbmV3X2hlYWQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXBub2RlX2xpc3RfZnJlZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfbGlzdCAqbGlzdCApCit7CisgICAga21wX2RlcG5vZGVfbGlzdCAqbmV4dDsKKworICAgIGZvciAoIDsgbGlzdCA7IGxpc3QgPSBuZXh0ICkgeworICAgICAgICBuZXh0ID0gbGlzdC0+bmV4dDsKKworICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxsaXN0LT5ub2RlKTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxsaXN0KTsKKyNlbHNlCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxsaXN0KTsKKyNlbmRpZgorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF90cmFja19kZXBlbmRlbmNlICgga21wX2RlcG5vZGVfdCAqc291cmNlLCBrbXBfZGVwbm9kZV90ICpzaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrX3QgKnNpbmtfdGFzayApCit7CisjaWZkZWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrX3NvdXJjZSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHNvdXJjZS0+ZG4udGFzayk7CisgICAgLy8gZG8gbm90IHVzZSBzaW5rLT5kbi50YXNrIGFzIHRoYXQgaXMgb25seSBmaWxsZWQgYWZ0ZXIgdGhlIGRlcGVuZGVuY2llcworICAgIC8vIGFyZSBhbHJlYWR5IHByb2Nlc3NlZCEKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tfc2luayA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHNpbmtfdGFzayk7CisKKyAgICBfX2ttcF9wcmludGYoIiVkKCVzKSAtPiAlZCglcylcbiIsIHNvdXJjZS0+ZG4uaWQsIHRhc2tfc291cmNlLT50ZF9pZGVudC0+cHNvdXJjZSwgc2luay0+ZG4uaWQsIHRhc2tfc2luay0+dGRfaWRlbnQtPnBzb3VyY2UpOworI2VuZGlmCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAvKiBPTVBUIHRyYWNrcyBkZXBlbmRlbmNlcyBiZXR3ZWVuIHRhc2sgKGE9c291cmNlLCBiPXNpbmspIGluIHdoaWNoCisgICAgICAgdGFzayBhIGJsb2NrcyB0aGUgZXhlY3V0aW9uIG9mIGIgdGhyb3VnaCB0aGUgb21wdF9uZXdfZGVwZW5kZW5jZV9jYWxsYmFjayAqLworICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZV9wYWlyKSkKKyAgICB7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogdGFza19zb3VyY2UgPSBLTVBfVEFTS19UT19UQVNLREFUQShzb3VyY2UtPmRuLnRhc2spOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tfc2luayA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHNpbmtfdGFzayk7CisKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZV9wYWlyKSgKKyAgICAgICAgICB0YXNrX3NvdXJjZS0+b21wdF90YXNrX2luZm8udGFza19pZCwKKyAgICAgICAgICB0YXNrX3NpbmstPm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgIH0KKyNlbmRpZiAvKiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRSAqLworfQorCit0ZW1wbGF0ZTwgYm9vbCBmaWx0ZXIgPgorc3RhdGljIGlubGluZSBrbXBfaW50MzIKK19fa21wX3Byb2Nlc3NfZGVwcyAoIGttcF9pbnQzMiBndGlkLCBrbXBfZGVwbm9kZV90ICpub2RlLCBrbXBfZGVwaGFzaF90ICpoYXNoLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXBfYmFycmllcixrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrX3QgKnRhc2sgKQoreworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3Byb2Nlc3NfZGVwczwlZD46IFQjJWQgcHJvY2Vzc2luZyAlZCBkZXBlbmRlbmNpZXMgOiBkZXBfYmFycmllciA9ICVkXG4iLCBmaWx0ZXIsIGd0aWQsIG5kZXBzLCBkZXBfYmFycmllciApICk7CisKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX2ludDMyIG5wcmVkZWNlc3NvcnM9MDsKKyAgICBmb3IgKCBrbXBfaW50MzIgaSA9IDA7IGkgPCBuZGVwcyA7IGkrKyApIHsKKyAgICAgICAgY29uc3Qga21wX2RlcGVuZF9pbmZvX3QgKiBkZXAgPSAmZGVwX2xpc3RbaV07CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChkZXAtPmZsYWdzLmluKTsKKworICAgICAgICBpZiAoIGZpbHRlciAmJiBkZXAtPmJhc2VfYWRkciA9PSAwICkgY29udGludWU7IC8vIHNraXAgZmlsdGVyZWQgZW50cmllcworCisgICAgICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgKmluZm8gPSBfX2ttcF9kZXBoYXNoX2ZpbmQodGhyZWFkLGhhc2gsZGVwLT5iYXNlX2FkZHIpOworICAgICAgICBrbXBfZGVwbm9kZV90ICpsYXN0X291dCA9IGluZm8tPmxhc3Rfb3V0OworCisgICAgICAgIGlmICggZGVwLT5mbGFncy5vdXQgJiYgaW5mby0+bGFzdF9pbnMgKSB7CisgICAgICAgICAgICBmb3IgKCBrbXBfZGVwbm9kZV9saXN0X3QgKiBwID0gaW5mby0+bGFzdF9pbnM7IHA7IHAgPSBwLT5uZXh0ICkgeworICAgICAgICAgICAgICAgIGttcF9kZXBub2RlX3QgKiBpbmRlcCA9IHAtPm5vZGU7CisgICAgICAgICAgICAgICAgaWYgKCBpbmRlcC0+ZG4udGFzayApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLGluZGVwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmRlcC0+ZG4udGFzayApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3RyYWNrX2RlcGVuZGVuY2UoaW5kZXAsbm9kZSx0YXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVwLT5kbi5zdWNjZXNzb3JzID0gX19rbXBfYWRkX25vZGUodGhyZWFkLCBpbmRlcC0+ZG4uc3VjY2Vzc29ycywgbm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSg0MCwoIl9fa21wX3Byb2Nlc3NfZGVwczwlZD46IFQjJWQgYWRkaW5nIGRlcGVuZGVuY2UgZnJvbSAlcCB0byAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcixndGlkLCBLTVBfVEFTS19UT19UQVNLREFUQShpbmRlcC0+ZG4udGFzayksIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBucHJlZGVjZXNzb3JzKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLGluZGVwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2RlcG5vZGVfbGlzdF9mcmVlKHRocmVhZCxpbmZvLT5sYXN0X2lucyk7CisgICAgICAgICAgICBpbmZvLT5sYXN0X2lucyA9IE5VTEw7CisKKyAgICAgICAgfSBlbHNlIGlmICggbGFzdF9vdXQgJiYgbGFzdF9vdXQtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICBLTVBfQUNRVUlSRV9ERVBOT0RFKGd0aWQsbGFzdF9vdXQpOworICAgICAgICAgICAgaWYgKCBsYXN0X291dC0+ZG4udGFzayApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90cmFja19kZXBlbmRlbmNlKGxhc3Rfb3V0LG5vZGUsdGFzayk7CisgICAgICAgICAgICAgICAgbGFzdF9vdXQtPmRuLnN1Y2Nlc3NvcnMgPSBfX2ttcF9hZGRfbm9kZSh0aHJlYWQsIGxhc3Rfb3V0LT5kbi5zdWNjZXNzb3JzLCBub2RlKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSg0MCwoIl9fa21wX3Byb2Nlc3NfZGVwczwlZD46IFQjJWQgYWRkaW5nIGRlcGVuZGVuY2UgZnJvbSAlcCB0byAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLGd0aWQsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKGxhc3Rfb3V0LT5kbi50YXNrKSwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykpKTsKKworICAgICAgICAgICAgICAgIG5wcmVkZWNlc3NvcnMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9SRUxFQVNFX0RFUE5PREUoZ3RpZCxsYXN0X291dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGRlcF9iYXJyaWVyICkgeworICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHN5bmMgcG9pbnQgaW4gdGhlIHNlcmlhbCBzZXF1ZW5jZSwgdGhlbiB0aGUgcHJldmlvdXMgb3V0cHV0cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBjb21wbGV0ZWQgYWZ0ZXIKKyAgICAgICAgICAgIC8vIHRoZSBleGVjdXRpb24gb2YgdGhpcyB0YXNrIHNvIHRoZSBwcmV2aW91cyBvdXRwdXQgbm9kZXMgY2FuIGJlIGNsZWFyZWQuCisgICAgICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxsYXN0X291dCk7CisgICAgICAgICAgICBpbmZvLT5sYXN0X291dCA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIGRlcC0+ZmxhZ3Mub3V0ICkgeworICAgICAgICAgICAgICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLGxhc3Rfb3V0KTsKKyAgICAgICAgICAgICAgICBpbmZvLT5sYXN0X291dCA9IF9fa21wX25vZGVfcmVmKG5vZGUpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgaW5mby0+bGFzdF9pbnMgPSBfX2ttcF9hZGRfbm9kZSh0aHJlYWQsIGluZm8tPmxhc3RfaW5zLCBub2RlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfcHJvY2Vzc19kZXBzPCVkPjogVCMlZCBmb3VuZCAlZCBwcmVkZWNlc3NvcnNcbiIsIGZpbHRlciwgZ3RpZCwgbnByZWRlY2Vzc29ycyApICk7CisKKyAgICByZXR1cm4gbnByZWRlY2Vzc29yczsKK30KKworI2RlZmluZSBOT19ERVBfQkFSUklFUiAoZmFsc2UpCisjZGVmaW5lIERFUF9CQVJSSUVSICh0cnVlKQorCisvLyByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaGFzIGFueSBvdXRzdGFuZGluZyBkZXBlbmRlbmNlCitzdGF0aWMgYm9vbAorX19rbXBfY2hlY2tfZGVwcyAoIGttcF9pbnQzMiBndGlkLCBrbXBfZGVwbm9kZV90ICpub2RlLCBrbXBfdGFza190ICp0YXNrLCBrbXBfZGVwaGFzaF90ICpoYXNoLCBib29sIGRlcF9iYXJyaWVyLAorICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApCit7CisgICAgaW50IGk7CisKKyNpZiBLTVBfREVCVUcKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisjZW5kaWYKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9jaGVja19kZXBzOiBUIyVkIGNoZWNraW5nIGRlcGVuZGVuY2llcyBmb3IgdGFzayAlcCA6ICVkIHBvc3NpYmx5IGFsaWFzZWQgZGVwZW5kZW5jaWVzLCAlZCBub24tYWxpYXNlZCBkZXBlZGVuY2llcyA6IGRlcF9iYXJyaWVyPSVkIC5cbiIsIGd0aWQsIHRhc2tkYXRhLCBuZGVwcywgbmRlcHNfbm9hbGlhcywgZGVwX2JhcnJpZXIgKSApOworCisgICAgLy8gRmlsdGVyIGRlcHMgaW4gZGVwX2xpc3QKKyAgICAvLyBUT0RPOiBEaWZmZXJlbnQgYWxnb3JpdGhtIGZvciBsYXJnZSBkZXBfbGlzdCAoID4gMTAgPyApCisgICAgZm9yICggaSA9IDA7IGkgPCBuZGVwczsgaSArKyApIHsKKyAgICAgICAgaWYgKCBkZXBfbGlzdFtpXS5iYXNlX2FkZHIgIT0gMCApCisgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IGkrMTsgaiA8IG5kZXBzOyBqKysgKQorICAgICAgICAgICAgICAgIGlmICggZGVwX2xpc3RbaV0uYmFzZV9hZGRyID09IGRlcF9saXN0W2pdLmJhc2VfYWRkciApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwX2xpc3RbaV0uZmxhZ3MuaW4gfD0gZGVwX2xpc3Rbal0uZmxhZ3MuaW47CisgICAgICAgICAgICAgICAgICAgIGRlcF9saXN0W2ldLmZsYWdzLm91dCB8PSBkZXBfbGlzdFtqXS5mbGFncy5vdXQ7CisgICAgICAgICAgICAgICAgICAgIGRlcF9saXN0W2pdLmJhc2VfYWRkciA9IDA7IC8vIE1hcmsgaiBlbGVtZW50IGFzIHZvaWQKKyAgICAgICAgICAgICAgICB9CisgICAgfQorCisgICAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIGF0b21pYyBhcyBubyBvdGhlciB0aHJlYWQgaXMgZ29pbmcgdG8gYmUgYWNjZXNzaW5nIHRoaXMgbm9kZSBqdXN0IHlldAorICAgIC8vIG5wcmVkZWNlc3NvcnMgaXMgc2V0IC0xIHRvIGVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIHJlbGVhc2luZyB0YXNrcyBxdWV1ZXMgdGhpcyB0YXNrIGJlZm9yZSB3ZSBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgYWxsIHRoZSBkZXBlbmRlbmNpZXMKKyAgICBub2RlLT5kbi5ucHJlZGVjZXNzb3JzID0gLTE7CisKKyAgICAvLyB1c2VkIHRvIHBhY2sgYWxsIG5wcmVkZWNlc3NvcnMgYWRkaXRpb25zIGludG8gYSBzaW5nbGUgYXRvbWljIG9wZXJhdGlvbiBhdCB0aGUgZW5kCisgICAgaW50IG5wcmVkZWNlc3NvcnM7CisKKyAgICBucHJlZGVjZXNzb3JzID0gX19rbXBfcHJvY2Vzc19kZXBzPHRydWU+KGd0aWQsIG5vZGUsIGhhc2gsIGRlcF9iYXJyaWVyLAorICAgICAgbmRlcHMsIGRlcF9saXN0LCB0YXNrKTsKKyAgICBucHJlZGVjZXNzb3JzICs9IF9fa21wX3Byb2Nlc3NfZGVwczxmYWxzZT4oZ3RpZCwgbm9kZSwgaGFzaCwgZGVwX2JhcnJpZXIsCisgICAgICBuZGVwc19ub2FsaWFzLCBub2FsaWFzX2RlcF9saXN0LCB0YXNrKTsKKworICAgIG5vZGUtPmRuLnRhc2sgPSB0YXNrOworICAgIEtNUF9NQigpOworCisgICAgLy8gQWNjb3VudCBmb3Igb3VyIGluaXRpYWwgZmFrZSB2YWx1ZQorICAgIG5wcmVkZWNlc3NvcnMrKzsKKworICAgIC8vIFVwZGF0ZSBwcmVkZWNlc3NvcnMgYW5kIG9idGFpbiBjdXJyZW50IHZhbHVlIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBzdGlsbCBhbnkgb3V0c3RhbmRpZyBkZXBlbmRlbmNlcyAoc29tZSB0YXNrcyBtYXkgaGF2ZSBmaW5pc2hlZCB3aGlsZSB3ZSBwcm9jZXNzZWQgdGhlIGRlcGVuZGVuY2VzKQorICAgIG5wcmVkZWNlc3NvcnMgPSBLTVBfVEVTVF9USEVOX0FERDMyKCZub2RlLT5kbi5ucHJlZGVjZXNzb3JzLCBucHJlZGVjZXNzb3JzKSArIG5wcmVkZWNlc3NvcnM7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9jaGVja19kZXBzOiBUIyVkIGZvdW5kICVkIHByZWRlY2Vzc29ycyBmb3IgdGFzayAlcCBcbiIsIGd0aWQsIG5wcmVkZWNlc3NvcnMsIHRhc2tkYXRhICkgKTsKKworICAgIC8vIGJleW9uZCB0aGlzIHBvaW50IHRoZSB0YXNrIGNvdWxkIGJlIHF1ZXVlZCAoYW5kIGV4ZWN1dGVkKSBieSBhIHJlbGVhc2luZyB0YXNrLi4uCisgICAgcmV0dXJuIG5wcmVkZWNlc3NvcnMgPiAwID8gdHJ1ZSA6IGZhbHNlOworfQorCit2b2lkCitfX2ttcF9yZWxlYXNlX2RlcHMgKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tkYXRhX3QgKnRhc2sgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfZGVwbm9kZV90ICpub2RlID0gdGFzay0+dGRfZGVwbm9kZTsKKworICAgIGlmICggdGFzay0+dGRfZGVwaGFzaCApIHsKKyAgICAgICAgS0FfVFJBQ0UoNDAsICgiX19rbXBfcmVsZWFzZV9kZXBzOiBUIyVkIGZyZWVpbmcgZGVwZW5kZW5jaWVzIGhhc2ggb2YgdGFzayAlcC5cbiIsIGd0aWQsIHRhc2sgKSApOworICAgICAgICBfX2ttcF9kZXBoYXNoX2ZyZWUodGhyZWFkLHRhc2stPnRkX2RlcGhhc2gpOworICAgICAgICB0YXNrLT50ZF9kZXBoYXNoID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoICFub2RlICkgcmV0dXJuOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVsZWFzZV9kZXBzOiBUIyVkIG5vdGlmeWluZyBzdWNjZXNzb3JzIG9mIHRhc2sgJXAuXG4iLCBndGlkLCB0YXNrICkgKTsKKworICAgIEtNUF9BQ1FVSVJFX0RFUE5PREUoZ3RpZCxub2RlKTsKKyAgICBub2RlLT5kbi50YXNrID0gTlVMTDsgLy8gbWFyayB0aGlzIHRhc2sgYXMgZmluaXNoZWQsIHNvIG5vIG5ldyBkZXBlbmRlbmNpZXMgYXJlIGdlbmVyYXRlZAorICAgIEtNUF9SRUxFQVNFX0RFUE5PREUoZ3RpZCxub2RlKTsKKworICAgIGttcF9kZXBub2RlX2xpc3RfdCAqbmV4dDsKKyAgICBmb3IgKCBrbXBfZGVwbm9kZV9saXN0X3QgKnAgPSBub2RlLT5kbi5zdWNjZXNzb3JzOyBwOyBwID0gbmV4dCApIHsKKyAgICAgICAga21wX2RlcG5vZGVfdCAqc3VjY2Vzc29yID0gcC0+bm9kZTsKKyAgICAgICAga21wX2ludDMyIG5wcmVkZWNlc3NvcnMgPSBLTVBfVEVTVF9USEVOX0RFQzMyKCZzdWNjZXNzb3ItPmRuLm5wcmVkZWNlc3NvcnMpIC0gMTsKKworICAgICAgICAvLyBzdWNjZXNzb3IgdGFzayBjYW4gYmUgTlVMTCBmb3Igd2FpdF9kZXBlbmRzIG9yIGJlY2F1c2UgZGVwcyBhcmUgc3RpbGwgYmVpbmcgcHJvY2Vzc2VkCisgICAgICAgIGlmICggbnByZWRlY2Vzc29ycyA9PSAwICkgeworICAgICAgICAgICAgS01QX01CKCk7CisgICAgICAgICAgICBpZiAoIHN1Y2Nlc3Nvci0+ZG4udGFzayApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9yZWxlYXNlX2RlcHM6IFQjJWQgc3VjY2Vzc29yICVwIG9mICVwIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uLlxuIiwgZ3RpZCwgc3VjY2Vzc29yLT5kbi50YXNrLCB0YXNrICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9vbXBfdGFzayhndGlkLHN1Y2Nlc3Nvci0+ZG4udGFzayxmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBuZXh0ID0gcC0+bmV4dDsKKyAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQscC0+bm9kZSk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQscCk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQscCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxub2RlKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3JlbGVhc2VfZGVwczogVCMlZCBhbGwgc3VjY2Vzc29ycyBvZiAlcCBub3RpZmllZCBvZiBjb21wbGV0aW9uXG4iLCBndGlkLCB0YXNrICkgKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorQHBhcmFtIG5ld190YXNrIHRhc2sgdGh1bmsgYWxsb2NhdGVkIGJ5IF9fa21wX29tcF90YXNrX2FsbG9jKCkgZm9yIHRoZSAnJ25ldyB0YXNrJycKK0BwYXJhbSBuZGVwcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBkZXBfbGlzdCBMaXN0IG9mIGRlcGVuZCBpdGVtcyB3aXRoIHBvc3NpYmxlIGFsaWFzaW5nCitAcGFyYW0gbmRlcHNfbm9hbGlhcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKK0BwYXJhbSBub2FsaWFzX2RlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKKworQHJldHVybiBSZXR1cm5zIGVpdGhlciBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCBpZiB0aGUgY3VycmVudCB0YXNrIHdhcyBub3Qgc3VzcGVuZGVuZCBhbmQgcXVldWVkLCBvciBUQVNLX0NVUlJFTlRfUVVFVUVEIGlmIGl0IHdhcyBzdXNwZW5kZWQgYW5kIHF1ZXVlZAorCitTY2hlZHVsZSBhIG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIHdpdGggZGVwZW5kZW5jZXMgZm9yIGV4ZWN1dGlvbgorKi8KK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKQoreworCisgICAga21wX3Rhc2tkYXRhX3QgKiBuZXdfdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayk7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyhlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBuZXdfdGFza2RhdGEgKSApOworCisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIC8qIE9NUFQgZ3JhYiBhbGwgZGVwZW5kZW5jZXMgaWYgcmVxdWVzdGVkIGJ5IHRoZSB0b29sICovCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBuZGVwcytuZGVwc19ub2FsaWFzID4gMCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlcykpCisJeworICAgICAgICBrbXBfaW50MzIgaTsKKworICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLm5kZXBzID0gbmRlcHMrbmRlcHNfbm9hbGlhczsKKyAgICAgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzID0gKG9tcHRfdGFza19kZXBlbmRlbmNlX3QgKikKKyAgICAgICAgICBLTVBfT01QVF9ERVBTX0FMTE9DKHRocmVhZCwKKyAgICAgICAgICAgICAobmRlcHMrbmRlcHNfbm9hbGlhcykqc2l6ZW9mKG9tcHRfdGFza19kZXBlbmRlbmNlX3QpKTsKKworICAgICAgICBLTVBfQVNTRVJUKG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZGVwcyAhPSBOVUxMKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmRlcHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzW2ldLnZhcmlhYmxlX2FkZHIgPQorICAgICAgICAgICAgICAodm9pZCopIGRlcF9saXN0W2ldLmJhc2VfYWRkcjsKKyAgICAgICAgICAgIGlmIChkZXBfbGlzdFtpXS5mbGFncy5pbiAmJiBkZXBfbGlzdFtpXS5mbGFncy5vdXQpCisgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzW2ldLmRlcGVuZGVuY2VfZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgb21wdF90YXNrX2RlcGVuZGVuY2VfdHlwZV9pbm91dDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGRlcF9saXN0W2ldLmZsYWdzLm91dCkKKyAgICAgICAgICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbaV0uZGVwZW5kZW5jZV9mbGFncyA9CisgICAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX291dDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGRlcF9saXN0W2ldLmZsYWdzLmluKQorICAgICAgICAgICAgICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZGVwc1tpXS5kZXBlbmRlbmNlX2ZsYWdzID0KKyAgICAgICAgICAgICAgICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfaW47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5kZXBzX25vYWxpYXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzW25kZXBzK2ldLnZhcmlhYmxlX2FkZHIgPQorICAgICAgICAgICAgICAodm9pZCopIG5vYWxpYXNfZGVwX2xpc3RbaV0uYmFzZV9hZGRyOworICAgICAgICAgICAgaWYgKG5vYWxpYXNfZGVwX2xpc3RbaV0uZmxhZ3MuaW4gJiYgbm9hbGlhc19kZXBfbGlzdFtpXS5mbGFncy5vdXQpCisgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzW25kZXBzK2ldLmRlcGVuZGVuY2VfZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgb21wdF90YXNrX2RlcGVuZGVuY2VfdHlwZV9pbm91dDsKKyAgICAgICAgICAgIGVsc2UgaWYgKG5vYWxpYXNfZGVwX2xpc3RbaV0uZmxhZ3Mub3V0KQorICAgICAgICAgICAgICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZGVwc1tuZGVwcytpXS5kZXBlbmRlbmNlX2ZsYWdzID0KKyAgICAgICAgICAgICAgICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfb3V0OworICAgICAgICAgICAgZWxzZSBpZiAobm9hbGlhc19kZXBfbGlzdFtpXS5mbGFncy5pbikKKyAgICAgICAgICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbbmRlcHMraV0uZGVwZW5kZW5jZV9mbGFncyA9CisgICAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2luOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFICovCisKKyAgICBib29sIHNlcmlhbCA9IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgY3VycmVudF90YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciB8fCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsOworI2lmIE9NUF80NV9FTkFCTEVECisgICAga21wX3Rhc2tfdGVhbV90ICogdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgICAgc2VyaWFsID0gc2VyaWFsICYmICEodGFza190ZWFtICYmIHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MpOworI2VuZGlmCisKKyAgICBpZiAoICFzZXJpYWwgJiYgKCBuZGVwcyA+IDAgfHwgbmRlcHNfbm9hbGlhcyA+IDAgKSkgeworICAgICAgICAvKiBpZiBubyBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHRyYWNrZWQgeWV0LCBjcmVhdGUgdGhlIGRlcGVuZGVuY2UgaGFzaCAqLworICAgICAgICBpZiAoIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9PSBOVUxMICkKKyAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9IF9fa21wX2RlcGhhc2hfY3JlYXRlKHRocmVhZCwgY3VycmVudF90YXNrKTsKKworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBrbXBfZGVwbm9kZV90ICpub2RlID0gKGttcF9kZXBub2RlX3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSh0aHJlYWQsc2l6ZW9mKGttcF9kZXBub2RlX3QpKTsKKyNlbHNlCisgICAgICAgIGttcF9kZXBub2RlX3QgKm5vZGUgPSAoa21wX2RlcG5vZGVfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKHRocmVhZCxzaXplb2Yoa21wX2RlcG5vZGVfdCkpOworI2VuZGlmCisKKyAgICAgICAgX19rbXBfaW5pdF9ub2RlKG5vZGUpOworICAgICAgICBuZXdfdGFza2RhdGEtPnRkX2RlcG5vZGUgPSBub2RlOworCisgICAgICAgIGlmICggX19rbXBfY2hlY2tfZGVwcyggZ3RpZCwgbm9kZSwgbmV3X3Rhc2ssIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCwgTk9fREVQX0JBUlJJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRlcHMsIGRlcF9saXN0LCBuZGVwc19ub2FsaWFzLG5vYWxpYXNfZGVwX2xpc3QgKSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza193aXRoX2RlcHMoZXhpdCk6IFQjJWQgdGFzayBoYWQgYmxvY2tpbmcgZGVwZW5kZW5jaWVzOiAiCisgICAgICAgICAgICAgICAgICAibG9jPSVwIHRhc2s9JXAsIHJldHVybjogVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIGxvY19yZWYsCisgICAgICAgICAgICAgICAgICBuZXdfdGFza2RhdGEgKSApOworICAgICAgICAgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyhleGl0KTogVCMlZCBpZ25vcmVkIGRlcGVuZGVuY2llcyBmb3IgdGFzayAoc2VyaWFsaXplZCkiCisgICAgICAgICAgICAgICAgICAgICAgImxvYz0lcCB0YXNrPSVwXG4iLCBndGlkLCBsb2NfcmVmLCBuZXdfdGFza2RhdGEgKSApOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza193aXRoX2RlcHMoZXhpdCk6IFQjJWQgdGFzayBoYWQgbm8gYmxvY2tpbmcgZGVwZW5kZW5jaWVzIDogIgorICAgICAgICAgICAgICAgICAgImxvYz0lcCB0YXNrPSVwLCB0cmFuc2ZlcnJpbmcgdG8gX19rbXBjX29tcF90YXNrXG4iLCBndGlkLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhICkgKTsKKworICAgIHJldHVybiBfX2ttcGNfb21wX3Rhc2sobG9jX3JlZixndGlkLG5ld190YXNrKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorQHBhcmFtIG5kZXBzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBwb3NzaWJsZSBhbGlhc2luZworQHBhcmFtIGRlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBuZGVwc19ub2FsaWFzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworQHBhcmFtIG5vYWxpYXNfZGVwX2xpc3QgTGlzdCBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworCitCbG9ja3MgdGhlIGN1cnJlbnQgdGFzayB1bnRpbCBhbGwgc3BlY2lmaWVzIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gZnVsZmlsbGVkLgorKi8KK3ZvaWQKK19fa21wY19vbXBfd2FpdF9kZXBzICggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKQoreworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfd2FpdF9kZXBzKGVudGVyKTogVCMlZCBsb2M9JXBcbiIsIGd0aWQsIGxvY19yZWYpICk7CisKKyAgICBpZiAoIG5kZXBzID09IDAgJiYgbmRlcHNfbm9hbGlhcyA9PSAwICkgeworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhleGl0KTogVCMlZCBoYXMgbm8gZGVwZW5kZW5jaWVzIHRvIHdhaXQgdXBvbiA6IGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworCisgICAgLy8gV2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSBhczoKKyAgICAvLyAgIC0gZGVwZW5kZW5jZXMgYXJlIG5vdCBjb21wdXRlZCBpbiBzZXJpYWwgdGVhbXMgKGV4Y2VwdCBpZiB3ZSBoYXZlIHByb3h5IHRhc2tzKQorICAgIC8vICAgLSBpZiB0aGUgZGVwaGFzaCBpcyBub3QgeWV0IGNyZWF0ZWQgaXQgbWVhbnMgd2UgaGF2ZSBub3RoaW5nIHRvIHdhaXQgZm9yCisgICAgYm9vbCBpZ25vcmUgPSBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MudGFza2luZ19zZXIgfHwgY3VycmVudF90YXNrLT50ZF9mbGFncy5maW5hbDsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIGlnbm9yZSA9IGlnbm9yZSAmJiB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSAhPSBOVUxMICYmIHRocmVhZC0+dGgudGhfdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyA9PSBGQUxTRTsKKyNlbmRpZgorICAgIGlnbm9yZSA9IGlnbm9yZSB8fCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2ggPT0gTlVMTDsKKworICAgIGlmICggaWdub3JlICkgeworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhleGl0KTogVCMlZCBoYXMgbm8gYmxvY2tpbmcgZGVwZW5kZW5jaWVzIDogbG9jPSVwXG4iLCBndGlkLCBsb2NfcmVmKSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga21wX2RlcG5vZGVfdCBub2RlOworICAgIF9fa21wX2luaXRfbm9kZSgmbm9kZSk7CisKKyAgICBpZiAoIV9fa21wX2NoZWNrX2RlcHMoIGd0aWQsICZub2RlLCBOVUxMLCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2gsIERFUF9CQVJSSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRlcHMsIGRlcF9saXN0LCBuZGVwc19ub2FsaWFzLCBub2FsaWFzX2RlcF9saXN0ICkpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgaGFzIG5vIGJsb2NraW5nIGRlcGVuZGVuY2llcyA6IGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKyAgICBrbXBfZmxhZ18zMiBmbGFnKCh2b2xhdGlsZSBrbXBfdWludDMyICopJihub2RlLmRuLm5wcmVkZWNlc3NvcnMpLCAwVSk7CisgICAgd2hpbGUgKCBub2RlLmRuLm5wcmVkZWNlc3NvcnMgPiAwICkgeworICAgICAgICBmbGFnLmV4ZWN1dGVfdGFza3ModGhyZWFkLCBndGlkLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhleGl0KTogVCMlZCBmaW5pc2hlZCB3YWl0aW5nIDogbG9jPSVwXG4iLCBndGlkLCBsb2NfcmVmKSApOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF90YXNraW5nLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza2luZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxOGIyZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza2luZy5jcHAKQEAgLTAsMCArMSwzMTYyIEBACisvKgorICoga21wX3Rhc2tpbmcuY3BwIC0tIE9wZW5NUCAzLjAgdGFza2luZyBzdXBwb3J0LgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3dhaXRfcmVsZWFzZS5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ0c2FuX2Fubm90YXRpb25zLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgX19rbXBfZW5hYmxlX3Rhc2tpbmcoIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLCBrbXBfaW5mb190ICp0aGlzX3RociApOworc3RhdGljIHZvaWQgX19rbXBfYWxsb2NfdGFza19kZXF1ZSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKTsKK3N0YXRpYyBpbnQgIF9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGEoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKTsKKworI2lmZGVmIE9NUF80NV9FTkFCTEVECitzdGF0aWMgdm9pZCBfX2ttcF9ib3R0b21faGFsZl9maW5pc2hfcHJveHkoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogcHRhc2sgKTsKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfdHJhY2VfdGFza19zdGFjazogcHJpbnQgdGhlIHRpZWQgdGFza3MgZnJvbSB0aGUgdGFzayBzdGFjayBpbiBvcmRlcgorLy8gICAgIGZyb20gdG9wIGRvIGJvdHRvbQorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgZm9yIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisvLyAgdGhyZWFkX2RhdGE6IHRocmVhZCBkYXRhIGZvciB0YXNrIHRlYW0gdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKy8vICB0aHJlc2hvbGQ6IHZhbHVlIGFib3ZlIHdoaWNoIHRoZSB0cmFjZSBzdGF0ZW1lbnQgdHJpZ2dlcnMKKy8vICBsb2NhdGlvbjogc3RyaW5nIGlkZW50aWZ5aW5nIGNhbGwgc2l0ZSBvZiB0aGlzIGZ1bmN0aW9uIChmb3IgdHJhY2UpCisKK3N0YXRpYyB2b2lkCitfX2ttcF90cmFjZV90YXNrX3N0YWNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhLCBpbnQgdGhyZXNob2xkLCBjaGFyICpsb2NhdGlvbiApCit7CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAgICBrbXBfdGFza2RhdGFfdCAqKnN0YWNrX3RvcCA9IHRhc2tfc3RhY2sgLT4gdHNfdG9wOworICAgIGttcF9pbnQzMiBlbnRyaWVzID0gdGFza19zdGFjayAtPiB0c19lbnRyaWVzOworICAgIGttcF90YXNrZGF0YV90ICp0aWVkX3Rhc2s7CisKKyAgICBLQV9UUkFDRSh0aHJlc2hvbGQsICgiX19rbXBfdHJhY2VfdGFza19zdGFjayhzdGFydCk6IGxvY2F0aW9uID0gJXMsIGd0aWQgPSAlZCwgZW50cmllcyA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0X2Jsb2NrID0gJXAsIHN0YWNrX3RvcCA9ICVwIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgZ3RpZCwgZW50cmllcywgdGFza19zdGFjay0+dHNfZmlyc3RfYmxvY2ssIHN0YWNrX3RvcCApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGFja190b3AgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGVudHJpZXMgPiAwICk7CisKKyAgICB3aGlsZSAoIGVudHJpZXMgIT0gMCApCisgICAgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGFja190b3AgIT0gJiB0YXNrX3N0YWNrLT50c19maXJzdF9ibG9jay5zYl9ibG9ja1swXSApOworICAgICAgICAvLyBmaXggdXAgdHNfdG9wIGlmIHdlIG5lZWQgdG8gcG9wIGZyb20gcHJldmlvdXMgYmxvY2sKKyAgICAgICAgaWYgKCBlbnRyaWVzICYgVEFTS19TVEFDS19JTkRFWF9NQVNLID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBrbXBfc3RhY2tfYmxvY2tfdCAqc3RhY2tfYmxvY2sgPSAoa21wX3N0YWNrX2Jsb2NrX3QgKikgKHN0YWNrX3RvcCkgOworCisgICAgICAgICAgICBzdGFja19ibG9jayA9IHN0YWNrX2Jsb2NrIC0+IHNiX3ByZXY7CisgICAgICAgICAgICBzdGFja190b3AgPSAmIHN0YWNrX2Jsb2NrIC0+IHNiX2Jsb2NrW1RBU0tfU1RBQ0tfQkxPQ0tfU0laRV07CisgICAgICAgIH0KKworICAgICAgICAvLyBmaW5pc2ggYm9va2tlZXBpbmcKKyAgICAgICAgc3RhY2tfdG9wLS07CisgICAgICAgIGVudHJpZXMtLTsKKworICAgICAgICB0aWVkX3Rhc2sgPSAqIHN0YWNrX3RvcDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgIT0gTlVMTCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19USUVEICk7CisKKyAgICAgICAgS0FfVFJBQ0UodGhyZXNob2xkLCAoIl9fa21wX3RyYWNlX3Rhc2tfc3RhY2soJXMpOiAgICAgICAgICAgICBndGlkPSVkLCBlbnRyeT0lZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhY2tfdG9wPSVwLCB0aWVkX3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBndGlkLCBlbnRyaWVzLCBzdGFja190b3AsIHRpZWRfdGFzayApICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0YWNrX3RvcCA9PSAmIHRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrLnNiX2Jsb2NrWzBdICk7CisKKyAgICBLQV9UUkFDRSh0aHJlc2hvbGQsICgiX19rbXBfdHJhY2VfdGFza19zdGFjayhleGl0KTogbG9jYXRpb24gPSAlcywgZ3RpZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBndGlkICkgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9pbml0X3Rhc2tfc3RhY2s6IGluaXRpYWxpemUgdGhlIHRhc2sgc3RhY2sgZm9yIHRoZSBmaXJzdCB0aW1lCisvLyAgICBhZnRlciBhIHRocmVhZF9kYXRhIHN0cnVjdHVyZSBpcyBjcmVhdGVkLgorLy8gICAgSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gZG8gdGhpcyBhZ2FpbiAoYXNzdW1pbmcgdGhlIHN0YWNrIHdvcmtzKS4KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIG9mIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkX2RhdGE6IHRocmVhZCBkYXRhIGZvciB0YXNrIHRlYW0gdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAgICBrbXBfc3RhY2tfYmxvY2tfdCAqZmlyc3RfYmxvY2s7CisKKyAgICAvLyBzZXQgdXAgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBzdGFjaworICAgIGZpcnN0X2Jsb2NrID0gJiB0YXNrX3N0YWNrIC0+IHRzX2ZpcnN0X2Jsb2NrOworICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wID0gKGttcF90YXNrZGF0YV90ICoqKSBmaXJzdF9ibG9jazsKKyAgICBtZW1zZXQoICh2b2lkICopIGZpcnN0X2Jsb2NrLCAnXDAnLCBUQVNLX1NUQUNLX0JMT0NLX1NJWkUgKiBzaXplb2Yoa21wX3Rhc2tkYXRhX3QgKikpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RhY2sgdG8gYmUgZW1wdHkKKyAgICB0YXNrX3N0YWNrICAtPiB0c19lbnRyaWVzID0gVEFTS19TVEFDS19FTVBUWTsKKyAgICBmaXJzdF9ibG9jayAtPiBzYl9uZXh0ID0gTlVMTDsKKyAgICBmaXJzdF9ibG9jayAtPiBzYl9wcmV2ID0gTlVMTDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX2ZyZWVfdGFza19zdGFjazogZnJlZSB0aGUgdGFzayBzdGFjayB3aGVuIHRocmVhZF9kYXRhIGlzIGRlc3Ryb3llZC4KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIGZvciBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgaW5mbyBmb3IgdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAgICBrbXBfc3RhY2tfYmxvY2tfdCAqc3RhY2tfYmxvY2sgPSAmIHRhc2tfc3RhY2sgLT4gdHNfZmlyc3RfYmxvY2s7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMgPT0gVEFTS19TVEFDS19FTVBUWSApOworICAgIC8vIGZyZWUgZnJvbSB0aGUgc2Vjb25kIGJsb2NrIG9mIHRoZSBzdGFjaworICAgIHdoaWxlICggc3RhY2tfYmxvY2sgIT0gTlVMTCApIHsKKyAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKm5leHRfYmxvY2sgPSAoc3RhY2tfYmxvY2spID8gc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCA6IE5VTEw7CisKKyAgICAgICAgc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCA9IE5VTEw7CisgICAgICAgIHN0YWNrX2Jsb2NrIC0+IHNiX3ByZXYgPSBOVUxMOworICAgICAgICBpZiAoc3RhY2tfYmxvY2sgIT0gJiB0YXNrX3N0YWNrIC0+IHRzX2ZpcnN0X2Jsb2NrKSB7CisgICAgICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSggdGhyZWFkLCBzdGFja19ibG9jayApOyAgLy8gZnJlZSB0aGUgYmxvY2ssIGlmIG5vdCB0aGUgZmlyc3QKKyAgICAgICAgfQorICAgICAgICBzdGFja19ibG9jayA9IG5leHRfYmxvY2s7CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgdGhlIHN0YWNrIHRvIGJlIGVtcHR5CisgICAgdGFza19zdGFjayAtPiB0c19lbnRyaWVzID0gMDsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCA9IE5VTEw7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9wdXNoX3Rhc2tfc3RhY2s6IFB1c2ggdGhlIHRpZWQgdGFzayBvbnRvIHRoZSB0YXNrIHN0YWNrLgorLy8gICAgIEdyb3cgdGhlIHN0YWNrIGlmIG5lY2Vzc2FyeSBieSBhbGxvY2F0aW5nIGFub3RoZXIgYmxvY2suCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgY2FsbGluZyB0aHJlYWQKKy8vICB0aHJlYWQ6IHRocmVhZCBpbmZvIGZvciB0aHJlYWQgY29udGFpbmluZyBzdGFjaworLy8gIHRpZWRfdGFzazogdGhlIHRhc2sgdG8gcHVzaCBvbiB0aGUgc3RhY2sKKworc3RhdGljIHZvaWQKK19fa21wX3B1c2hfdGFza19zdGFjaygga21wX2ludDMyIGd0aWQsIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tkYXRhX3QgKiB0aWVkX3Rhc2sgKQoreworICAgIC8vIEdFSCAtIG5lZWQgdG8gY29uc2lkZXIgd2hhdCB0byBkbyBpZiB0dF90aHJlYWRzX2RhdGEgbm90IGFsbG9jYXRlZCB5ZXQKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmIHRocmVhZCAtPiB0aC50aF90YXNrX3RlYW0gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dC50dF90aHJlYWRzX2RhdGFbIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSBdOworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3MgOworCisgICAgaWYgKCB0aWVkX3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRpZWRfdGFzay0+dGRfZmxhZ3MudGFza2luZ19zZXIgKSB7CisgICAgICAgIHJldHVybjsgIC8vIERvbid0IHB1c2ggYW55dGhpbmcgb24gc3RhY2sgaWYgdGVhbSBvciB0ZWFtIHRhc2tzIGFyZSBzZXJpYWxpemVkCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfVElFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfc3RhY2sgLT4gdHNfdG9wICE9IE5VTEwgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFza19zdGFjayhlbnRlcik6IEdUSUQ6ICVkOyBUSFJFQUQ6ICVwOyBUQVNLOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZCwgdGllZF90YXNrICkgKTsKKyAgICAvLyBTdG9yZSBlbnRyeQorICAgICogKHRhc2tfc3RhY2sgLT4gdHNfdG9wKSA9IHRpZWRfdGFzazsKKworICAgIC8vIERvIGJvb2trZWVwaW5nIGZvciBuZXh0IHB1c2gKKyAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCsrOworICAgIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcysrOworCisgICAgaWYgKCB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMgJiBUQVNLX1NUQUNLX0lOREVYX01BU0sgPT0gMCApCisgICAgeworICAgICAgICAvLyBGaW5kIGJlZ2lubmluZyBvZiB0aGlzIHRhc2sgYmxvY2sKKyAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0KKyAgICAgICAgICAgICAoa21wX3N0YWNrX2Jsb2NrX3QgKikgKHRhc2tfc3RhY2sgLT4gdHNfdG9wIC0gVEFTS19TVEFDS19CTE9DS19TSVpFKTsKKworICAgICAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBibG9jaworICAgICAgICBpZiAoIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgIT0gTlVMTCApCisgICAgICAgIHsgICAgLy8gcmVzZXQgdHNfdG9wIHRvIGJlZ2lubmluZyBvZiBuZXh0IGJsb2NrCisgICAgICAgICAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCA9ICYgc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCAtPiBzYl9ibG9ja1swXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAvLyBBbGxvYyBuZXcgYmxvY2sgYW5kIGxpbmsgaXQgdXAKKyAgICAgICAgICAgIGttcF9zdGFja19ibG9ja190ICpuZXdfYmxvY2sgPSAoa21wX3N0YWNrX2Jsb2NrX3QgKikKKyAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX2NhbGxvYyh0aHJlYWQsIHNpemVvZihrbXBfc3RhY2tfYmxvY2tfdCkpOworCisgICAgICAgICAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCAgPSAmIG5ld19ibG9jayAtPiBzYl9ibG9ja1swXTsKKyAgICAgICAgICAgIHN0YWNrX2Jsb2NrIC0+IHNiX25leHQgPSBuZXdfYmxvY2s7CisgICAgICAgICAgICBuZXdfYmxvY2sgIC0+IHNiX3ByZXYgPSBzdGFja19ibG9jazsKKyAgICAgICAgICAgIG5ld19ibG9jayAgLT4gc2JfbmV4dCA9IE5VTEw7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3B1c2hfdGFza19zdGFjaygpOiBHVElEOiAlZDsgVEFTSzogJXA7IEFsbG9jIG5ldyBibG9jazogJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRpZWRfdGFzaywgbmV3X2Jsb2NrICkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2tfc3RhY2soZXhpdCk6IEdUSUQ6ICVkOyBUQVNLOiAlcFxuIiwgZ3RpZCwgdGllZF90YXNrICkgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9wb3BfdGFza19zdGFjazogUG9wIHRoZSB0aWVkIHRhc2sgZnJvbSB0aGUgdGFzayBzdGFjay4gIERvbid0IHJldHVybgorLy8gICAgIHRoZSB0YXNrLCBqdXN0IGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBlbmRpbmcgdGFzayBwYXNzZWQgaW4uCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkOiB0aHJlYWQgaW5mbyBzdHJ1Y3R1cmUgY29udGFpbmluZyBzdGFjaworLy8gIHRpZWRfdGFzazogdGhlIHRhc2sgcG9wcGVkIG9mZiB0aGUgc3RhY2sKKy8vICBlbmRpbmdfdGFzazogdGhlIHRhc2sgdGhhdCBpcyBlbmRpbmcgKHNob3VsZCBtYXRjaCBwb3BwZWQgdGFzaykKKworc3RhdGljIHZvaWQKK19fa21wX3BvcF90YXNrX3N0YWNrKCBrbXBfaW50MzIgZ3RpZCwga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza2RhdGFfdCAqZW5kaW5nX3Rhc2sgKQoreworICAgIC8vIEdFSCAtIG5lZWQgdG8gY29uc2lkZXIgd2hhdCB0byBkbyBpZiB0dF90aHJlYWRzX2RhdGEgbm90IGFsbG9jYXRlZCB5ZXQKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmIHRocmVhZCAtPiB0aC50aF90YXNrX3RlYW0gLT4gdHRfdGhyZWFkc19kYXRhWyBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICkgXTsKKyAgICBrbXBfdGFza19zdGFja190ICp0YXNrX3N0YWNrID0gJiB0aHJlYWRfZGF0YS0+dGQudGRfc3VzcF90aWVkX3Rhc2tzIDsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGllZF90YXNrOworCisgICAgaWYgKCBlbmRpbmdfdGFzay0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgZW5kaW5nX3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgeworICAgICAgICByZXR1cm47ICAvLyBEb24ndCBwb3AgYW55dGhpbmcgZnJvbSBzdGFjayBpZiB0ZWFtIG9yIHRlYW0gdGFza3MgYXJlIHNlcmlhbGl6ZWQKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3N0YWNrIC0+IHRzX3RvcCAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza19zdGFjayAtPiB0c19lbnRyaWVzID4gMCApOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcG9wX3Rhc2tfc3RhY2soZW50ZXIpOiBHVElEOiAlZDsgVEhSRUFEOiAlcFxuIiwgZ3RpZCwgdGhyZWFkICkgKTsKKworICAgIC8vIGZpeCB1cCB0c190b3AgaWYgd2UgbmVlZCB0byBwb3AgZnJvbSBwcmV2aW91cyBibG9jaworICAgIGlmICggdGFza19zdGFjayAtPiB0c19lbnRyaWVzICYgVEFTS19TVEFDS19JTkRFWF9NQVNLID09IDAgKQorICAgIHsKKyAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0KKyAgICAgICAgICAgKGttcF9zdGFja19ibG9ja190ICopICh0YXNrX3N0YWNrIC0+IHRzX3RvcCkgOworCisgICAgICAgIHN0YWNrX2Jsb2NrID0gc3RhY2tfYmxvY2sgLT4gc2JfcHJldjsKKyAgICAgICAgdGFza19zdGFjayAtPiB0c190b3AgPSAmIHN0YWNrX2Jsb2NrIC0+IHNiX2Jsb2NrW1RBU0tfU1RBQ0tfQkxPQ0tfU0laRV07CisgICAgfQorCisgICAgLy8gZmluaXNoIGJvb2trZWVwaW5nCisgICAgdGFza19zdGFjayAtPiB0c190b3AtLTsKKyAgICB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMtLTsKKworICAgIHRpZWRfdGFzayA9ICogKHRhc2tfc3RhY2sgLT4gdHNfdG9wICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRpZWRfdGFzayAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX1RJRUQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgPT0gZW5kaW5nX3Rhc2sgKTsgIC8vIElmIHdlIGJ1aWx0IHRoZSBzdGFjayBjb3JyZWN0bHkKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3BvcF90YXNrX3N0YWNrKGV4aXQpOiBHVElEOiAlZDsgVEFTSzogJXBcbiIsIGd0aWQsIHRpZWRfdGFzayApICk7CisgICAgcmV0dXJuOworfQorI2VuZGlmIC8qIEJVSUxEX1RJRURfVEFTS19TVEFDSyAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX3B1c2hfdGFzazogQWRkIGEgdGFzayB0byB0aGUgdGhyZWFkJ3MgZGVxdWUKKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfcHVzaF90YXNrKGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApCit7CisgICAga21wX2luZm9fdCAqICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiAgICB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF90YXNrX3RlYW1fdCAqICAgdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgICAga21wX2ludDMyICAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX3RocmVhZF9kYXRhX3QgKiB0aHJlYWRfZGF0YTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFzazogVCMlZCB0cnlpbmcgdG8gcHVzaCB0YXNrICVwLlxuIiwgZ3RpZCwgdGFza2RhdGEgKSApOworCisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19VTlRJRUQgKSB7CisgICAgICAgIC8vIHVudGllZCB0YXNrIG5lZWRzIHRvIGluY3JlbWVudCBjb3VudGVyIHNvIHRoYXQgdGhlIHRhc2sgc3RydWN0dXJlIGlzIG5vdCBmcmVlZCBwcmVtYXR1cmVseQorICAgICAgICBrbXBfaW50MzIgY291bnRlciA9IDEgKyBLTVBfVEVTVF9USEVOX0lOQzMyKCZ0YXNrZGF0YS0+dGRfdW50aWVkX2NvdW50KTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3B1c2hfdGFzazogVCMlZCB1bnRpZWRfY291bnQgKCVkKSBpbmNyZW1lbnRlZCBmb3IgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgY291bnRlciwgdGFza2RhdGEgKSApOworICAgIH0KKworICAgIC8vIFRoZSBmaXJzdCBjaGVjayBhdm9pZHMgYnVpbGRpbmcgdGFza190ZWFtIHRocmVhZCBkYXRhIGlmIHNlcmlhbGl6ZWQKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCApIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3B1c2hfdGFzazogVCMlZCB0ZWFtIHNlcmlhbGl6ZWQ7IHJldHVybmluZyBUQVNLX05PVF9QVVNIRUQgZm9yIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhICkgKTsKKyAgICAgICAgcmV0dXJuIFRBU0tfTk9UX1BVU0hFRDsKKyAgICB9CisKKyAgICAvLyBOb3cgdGhhdCBzZXJpYWxpemVkIHRhc2tzIGhhdmUgcmV0dXJuZWQsIHdlIGNhbiBhc3N1bWUgdGhhdCB3ZSBhcmUgbm90IGluIGltbWVkaWF0ZSBleGVjIG1vZGUKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIGlmICggISBLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSkgKSB7CisgICAgICAgICBfX2ttcF9lbmFibGVfdGFza2luZyggdGFza190ZWFtLCB0aHJlYWQgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzKSA9PSBUUlVFICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSX1BUUih0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhKSAhPSBOVUxMICk7CisKKyAgICAvLyBGaW5kIHRhc2tpbmcgZGVxdWUgc3BlY2lmaWMgdG8gZW5jb3VudGVyaW5nIHRocmVhZAorICAgIHRocmVhZF9kYXRhID0gJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhWyB0aWQgXTsKKworICAgIC8vIE5vIGxvY2sgbmVlZGVkIHNpbmNlIG9ubHkgb3duZXIgY2FuIGFsbG9jYXRlCisgICAgaWYgKHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID09IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2FsbG9jX3Rhc2tfZGVxdWUoIHRocmVhZCwgdGhyZWFkX2RhdGEgKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBkZXF1ZSBpcyBmdWxsCisgICAgaWYgKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID49IFRBU0tfREVRVUVfU0laRSh0aHJlYWRfZGF0YS0+dGQpICkKKyAgICB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoICJfX2ttcF9wdXNoX3Rhc2s6IFQjJWQgZGVxdWUgaXMgZnVsbDsgcmV0dXJuaW5nIFRBU0tfTk9UX1BVU0hFRCBmb3IgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEgKSApOworICAgICAgICByZXR1cm4gVEFTS19OT1RfUFVTSEVEOworICAgIH0KKworICAgIC8vIExvY2sgdGhlIGRlcXVlIGZvciB0aGUgdGFzayBwdXNoIG9wZXJhdGlvbgorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAvLyBOZWVkIHRvIHJlY2hlY2sgYXMgd2UgY2FuIGdldCBhIHByb3h5IHRhc2sgZnJvbSBhIHRocmVhZCBvdXRzaWRlIG9mIE9wZW5NUAorICAgIGlmICggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA+PSBUQVNLX0RFUVVFX1NJWkUodGhyZWFkX2RhdGEtPnRkKSApCisgICAgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3B1c2hfdGFzazogVCMlZCBkZXF1ZSBpcyBmdWxsIG9uIDJuZCBjaGVjazsgcmV0dXJuaW5nIFRBU0tfTk9UX1BVU0hFRCBmb3IgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEgKSApOworICAgICAgICByZXR1cm4gVEFTS19OT1RfUFVTSEVEOworICAgIH0KKyNlbHNlCisgICAgLy8gTXVzdCBoYXZlIHJvb20gc2luY2Ugbm8gdGhyZWFkIGNhbiBhZGQgdGFza3MgYnV0IGNhbGxpbmcgdGhyZWFkCisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA8IFRBU0tfREVRVUVfU0laRSh0aHJlYWRfZGF0YS0+dGQpICk7CisjZW5kaWYKKworICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlWyB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsIF0gPSB0YXNrZGF0YTsgIC8vIFB1c2ggdGFza2RhdGEKKyAgICAvLyBXcmFwIGluZGV4LgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgPSAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgKyAxICkgJiBUQVNLX0RFUVVFX01BU0sodGhyZWFkX2RhdGEtPnRkKTsKKyAgICBUQ1dfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgKyAxKTsgICAgICAgICAgICAgLy8gQWRqdXN0IHRhc2sgY291bnQKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFzazogVCMlZCByZXR1cm5pbmcgVEFTS19TVUNDRVNTRlVMTFlfUFVTSEVEOiAiCisgICAgICAgICAgInRhc2s9JXAgbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICByZXR1cm4gVEFTS19TVUNDRVNTRlVMTFlfUFVTSEVEOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQ6IHNldCB1cCBjdXJyZW50IHRhc2sgZnJvbSBjYWxsZWQgdGhyZWFkIHdoZW4gdGVhbSBlbmRzCisvLyB0aGlzX3RocjogdGhyZWFkIHN0cnVjdHVyZSB0byBzZXQgY3VycmVudF90YXNrIGluLgorCit2b2lkCitfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoZW50ZXIpOiBUIyVkIHRoaXNfdGhyZWFkPSVwLCBjdXJ0YXNrPSVwLCAiCisgICAgICAgICAgICAgICAgICAgImN1cnRhc2tfcGFyZW50PSVwXG4iLAorICAgICAgICAgICAgICAgICAgIDAsIHRoaXNfdGhyLCB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX3BhcmVudCApICk7CisKKyAgICB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgPSB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfcGFyZW50OworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoZXhpdCk6IFQjJWQgdGhpc190aHJlYWQ9JXAsIGN1cnRhc2s9JXAsICIKKyAgICAgICAgICAgICAgICAgICAiY3VydGFza19wYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgMCwgdGhpc190aHIsIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfcGFyZW50ICkgKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkOiBzZXQgdXAgY3VycmVudCB0YXNrIGluIGNhbGxlZCB0aHJlYWQgZm9yIGEgbmV3IHRlYW0KKy8vIHRoaXNfdGhyOiB0aHJlYWQgc3RydWN0dXJlIHRvIHNldCB1cAorLy8gdGVhbTogdGVhbSBmb3IgaW1wbGljaXQgdGFzayBkYXRhCisvLyB0aWQ6IHRocmVhZCB3aXRoaW4gdGVhbSB0byBzZXQgdXAKKwordm9pZAorX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCApCit7CisgICAgLy8gY3VycmVudCB0YXNrIG9mIHRoZSB0aHJlYWQgaXMgYSBwYXJlbnQgb2YgdGhlIG5ldyBqdXN0IGNyZWF0ZWQgaW1wbGljaXQgdGFza3Mgb2YgbmV3IHRlYW0KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZChlbnRlcik6IFQjJWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcCAiCisgICAgICAgICAgICAgICAgICAgICJwYXJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAodGhpc190aHIgIT0gTlVMTCk7CisKKyAgICBpZiggdGlkID09IDAgKSB7CisgICAgICAgIGlmKCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICE9ICYgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdICkgeworICAgICAgICAgICAgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdLnRkX3BhcmVudCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrID0gJiB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyAwIF07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyB0aWQgXS50ZF9wYXJlbnQgPSB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyAwIF0udGRfcGFyZW50OworICAgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrID0gJiB0ZWFtIC0+IHQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyB0aWQgXTsKKyAgICB9CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZChleGl0KTogVCMlZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwICIKKyAgICAgICAgICAgICAgICAgICAgInBhcmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX3BhcmVudCApICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX3N0YXJ0OiBib29ra2VlcGluZyBmb3IgYSB0YXNrIHN0YXJ0aW5nIGV4ZWN1dGlvbgorLy8gR1RJRDogZ2xvYmFsIHRocmVhZCBpZCBvZiBjYWxsaW5nIHRocmVhZAorLy8gdGFzazogdGFzayBzdGFydGluZyBleGVjdXRpb24KKy8vIGN1cnJlbnRfdGFzazogdGFzayBzdXNwZW5kaW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrX3N0YXJ0KCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2ssIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgICAga21wX2luZm9fdCAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfc3RhcnQoZW50ZXIpOiBUIyVkIHN0YXJ0aW5nIHRhc2sgJXA6IGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisKKyAgICAvLyBtYXJrIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayBhcyBzdXNwZW5kZWQKKyAgICAvLyBUT0RPOiBHRUggLSBtYWtlIHN1cmUgcm9vdCB0ZWFtIGltcGxpY2l0IHRhc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCisgICAgLy8gS01QX0RFQlVHX0FTU0VSVCggY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKyAgICAvLyBBZGQgdGFzayB0byBzdGFjayBpZiB0aWVkCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgaWYgKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50aWVkbmVzcyA9PSBUQVNLX1RJRUQgKQorICAgIHsKKyAgICAgICAgX19rbXBfcHVzaF90YXNrX3N0YWNrKCBndGlkLCB0aHJlYWQsIHRhc2tkYXRhICk7CisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1RJRURfVEFTS19TVEFDSyAqLworCisgICAgLy8gbWFyayBzdGFydGluZyB0YXNrIGFzIGV4ZWN1dGluZyBhbmQgYXMgY3VycmVudCB0YXNrCisgICAgdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzayA9IHRhc2tkYXRhOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLnN0YXJ0ZWQgPT0gMCB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19VTlRJRUQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDAgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVU5USUVEICk7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3Muc3RhcnRlZCA9IDE7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuZnJlZWQgPT0gMCApOworCisgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBwYXNzIHNvbWUgc29ydCBvZiBsb2NhdGlvbiBpZGVudGlmaWVyIGhlcmU/CisgICAgLy8gQVBUOiB5ZXMsIHdlIHdpbGwgcGFzcyBsb2NhdGlvbiBoZXJlLgorICAgIC8vIG5lZWQgdG8gc3RvcmUgY3VycmVudCB0aHJlYWQgc3RhdGUgKGluIGEgdGhyZWFkIG9yIHRhc2tkYXRhIHN0cnVjdHVyZSkKKyAgICAvLyBiZWZvcmUgc2V0dGluZyB3b3JrX3N0YXRlLCBvdGhlcndpc2Ugd3Jvbmcgc3RhdGUgaXMgc2V0IGFmdGVyIGVuZCBvZiB0YXNrCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX3N0YXJ0KGV4aXQpOiBUIyVkIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSApICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2JlZ2luKSkgeworICAgICAgICBrbXBfdGFza2RhdGFfdCAqcGFyZW50ID0gdGFza2RhdGEtPnRkX3BhcmVudDsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfYmVnaW4pKAorICAgICAgICAgICAgcGFyZW50ID8gcGFyZW50LT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkIDogb21wdF90YXNrX2lkX25vbmUsCisgICAgICAgICAgICBwYXJlbnQgPyAmKHBhcmVudC0+b21wdF90YXNrX2luZm8uZnJhbWUpIDogTlVMTCwKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkLAorICAgICAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmZ1bmN0aW9uKTsKKyAgICB9CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIC8qIE9NUFQgZW1pdCBhbGwgZGVwZW5kZW5jZXMgaWYgcmVxdWVzdGVkIGJ5IHRoZSB0b29sICovCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8ubmRlcHMgPiAwICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VzKSkKKwl7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VzKSgKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkLAorICAgICAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHMsCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8ubmRlcHMKKyAgICAgICAgKTsKKwkJLyogV2UgY2FuIG5vdyBmcmVlIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUgZGVwZW5kZW5jaWVzICovCisJCUtNUF9PTVBUX0RFUFNfRlJFRSAodGhyZWFkLCB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZGVwcyk7CisgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzID0gTlVMTDsKKyAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLm5kZXBzID0gMDsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgJiYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UgKi8KKworICAgIHJldHVybjsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19iZWdpbl9pZjA6IHJlcG9ydCB0aGF0IGEgZ2l2ZW4gc2VyaWFsaXplZCB0YXNrIGhhcyBzdGFydGVkIGV4ZWN1dGlvbgorLy8gbG9jX3JlZjogc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uOyBwb2ludHMgdG8gYmVnaW5uaW5nIG9mIHRhc2sgYmxvY2suCisvLyBndGlkOiBnbG9iYWwgdGhyZWFkIG51bWJlci4KKy8vIHRhc2s6IHRhc2sgdGh1bmsgZm9yIHRoZSBzdGFydGVkIHRhc2suCisKK3ZvaWQKK19fa21wY19vbXBfdGFza19iZWdpbl9pZjAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19iZWdpbl9pZjAoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwIGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2sgKSApOworCisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19VTlRJRUQgKSB7CisgICAgICAgIC8vIHVudGllZCB0YXNrIG5lZWRzIHRvIGluY3JlbWVudCBjb3VudGVyIHNvIHRoYXQgdGhlIHRhc2sgc3RydWN0dXJlIGlzIG5vdCBmcmVlZCBwcmVtYXR1cmVseQorICAgICAgICBrbXBfaW50MzIgY291bnRlciA9IDEgKyBLTVBfVEVTVF9USEVOX0lOQzMyKCZ0YXNrZGF0YS0+dGRfdW50aWVkX2NvdW50KTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wY19vbXBfdGFza19iZWdpbl9pZjA6IFQjJWQgdW50aWVkX2NvdW50ICglZCkgaW5jcmVtZW50ZWQgZm9yIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGNvdW50ZXIsIHRhc2tkYXRhICkgKTsKKyAgICB9CisKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrX3NlcmlhbCA9IDE7ICAvLyBFeGVjdXRlIHRoaXMgdGFzayBpbW1lZGlhdGVseSwgbm90IGRlZmVycmVkLgorICAgIF9fa21wX3Rhc2tfc3RhcnQoIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMChleGl0KTogVCMlZCBsb2M9JXAgdGFzaz0lcCxcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCB0YXNrZGF0YSApICk7CisKKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBUQVNLX1VOVVNFRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfYmVnaW46IHJlcG9ydCB0aGF0IGEgZ2l2ZW4gdGFzayBoYXMgc3RhcnRlZCBleGVjdXRpb24KKy8vIE5FVkVSIEdFTkVSQVRFRCBCWSBDT01QSUxFUiwgREVQUkVDQVRFRCEhIQorCit2b2lkCitfX2ttcGNfb21wX3Rhc2tfYmVnaW4oIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfY3VycmVudF90YXNrOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2JlZ2luKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcCBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSwgY3VycmVudF90YXNrICkgKTsKKworICAgIF9fa21wX3Rhc2tfc3RhcnQoIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2JlZ2luKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwLFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBUQVNLX1VOVVNFRAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrOiBmcmVlIHRoZSBjdXJyZW50IHRhc2sgc3BhY2UgYW5kIHRoZSBzcGFjZSBmb3Igc2hhcmVkcworLy8gZ3RpZDogR2xvYmFsIHRocmVhZCBJRCBvZiBjYWxsaW5nIHRocmVhZAorLy8gdGFza2RhdGE6IHRhc2sgdG8gZnJlZQorLy8gdGhyZWFkOiB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgb2YgY2FsbGVyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhLCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9mcmVlX3Rhc2s6IFQjJWQgZnJlZWluZyBkYXRhIGZyb20gdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIGFsbCBmbGFncyBhbmQgY291bnRlcnMgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy5jb21wbGV0ZSA9PSAxICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0YXNrZGF0YS0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSA9PSAwICB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPT0gMSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpID09IDAgKTsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5mcmVlZCA9IDE7CisgICAgQU5OT1RBVEVfSEFQUEVOU19CRUZPUkUodGFza2RhdGEpOworICAgIC8vIGRlYWxsb2NhdGUgdGhlIHRhc2tkYXRhIGFuZCBzaGFyZWQgdmFyaWFibGUgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sKKyAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSggdGhyZWFkLCB0YXNrZGF0YSApOworICAgICNlbHNlIC8qICEgVVNFX0ZBU1RfTUVNT1JZICovCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKCB0aHJlYWQsIHRhc2tkYXRhICk7CisgICAgI2VuZGlmCisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mcmVlX3Rhc2s6IFQjJWQgZnJlZWQgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhKSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzOiBmcmVlIHRoZSBjdXJyZW50IHRhc2sgYW5kIGFuY2VzdG9ycyB3aXRob3V0IGNoaWxkcmVuCisvLworLy8gZ3RpZDogR2xvYmFsIHRocmVhZCBJRCBvZiBjYWxsaW5nIHRocmVhZAorLy8gdGFza2RhdGE6IHRhc2sgdG8gZnJlZQorLy8gdGhyZWFkOiB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgb2YgY2FsbGVyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycygga21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEsIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworI2lmIE9NUF80NV9FTkFCTEVECisgICAgLy8gUHJveHkgdGFza3MgbXVzdCBhbHdheXMgYmUgYWxsb3dlZCB0byBmcmVlIHRoZWlyIHBhcmVudHMKKyAgICAvLyBiZWNhdXNlIHRoZXkgY2FuIGJlIHJ1biBpbiBiYWNrZ3JvdW5kIGV2ZW4gaW4gc2VyaWFsIG1vZGUuCisgICAga21wX2ludDMyIHRlYW1fc2VyaWFsID0gKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwKKyAgICAgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgJiYgIXRhc2tkYXRhLT50ZF9mbGFncy5wcm94eTsKKyNlbHNlCisgICAga21wX2ludDMyIHRlYW1fc2VyaWFsID0gdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8CisgICAgICAgIHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlcjsKKyNlbmRpZgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKworICAgIGttcF9pbnQzMiBjaGlsZHJlbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YSAtPiB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpICkgLSAxOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNoaWxkcmVuID49IDAgKTsKKworICAgIC8vIE5vdywgZ28gdXAgdGhlIGFuY2VzdG9yIHRyZWUgdG8gc2VlIGlmIGFueSBhbmNlc3RvcnMgY2FuIG5vdyBiZSBmcmVlZC4KKyAgICB3aGlsZSAoIGNoaWxkcmVuID09IDAgKQorICAgIHsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBwYXJlbnRfdGFza2RhdGEgPSB0YXNrZGF0YSAtPiB0ZF9wYXJlbnQ7CisKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoZW50ZXIpOiBUIyVkIHRhc2sgJXAgY29tcGxldGUgIgorICAgICAgICAgICAgICAgICAgICAgICJhbmQgZnJlZWluZyBpdHNlbGZcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgICAgIC8vIC0tLSBEZWFsbG9jYXRlIG15IGFuY2VzdG9yIHRhc2sgLS0tCisgICAgICAgIF9fa21wX2ZyZWVfdGFzayggZ3RpZCwgdGFza2RhdGEsIHRocmVhZCApOworCisgICAgICAgIHRhc2tkYXRhID0gcGFyZW50X3Rhc2tkYXRhOworCisgICAgICAgIC8vIFN0b3AgY2hlY2tpbmcgYW5jZXN0b3JzIGF0IGltcGxpY2l0IHRhc2sKKyAgICAgICAgLy8gaW5zdGVhZCBvZiB3YWxraW5nIHVwIGFuY2VzdG9yIHRyZWUgdG8gYXZvaWQgcHJlbWF0dXJlIGRlYWxsb2NhdGlvbiBvZiBhbmNlc3RvcnMuCisgICAgICAgIGlmICggdGVhbV9zZXJpYWwgfHwgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19JTVBMSUNJVCApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gUHJlZGVjcmVtZW50IHNpbXVsYXRlZCBieSAiLSAxIiBjYWxjdWxhdGlvbgorICAgICAgICBjaGlsZHJlbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YSAtPiB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpICkgLSAxOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjaGlsZHJlbiA+PSAwICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoZXhpdCk6IFQjJWQgdGFzayAlcCBoYXMgJWQgY2hpbGRyZW47ICIKKyAgICAgICAgICAgICAgICAgICJub3QgZnJlZWluZyBpdCB5ZXRcbiIsIGd0aWQsIHRhc2tkYXRhLCBjaGlsZHJlbikgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfZmluaXNoOiBib29ra2VlcGluZyB0byBkbyB3aGVuIGEgdGFzayBmaW5pc2hlcyBleGVjdXRpb24KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgSUQgZm9yIGNhbGxpbmcgdGhyZWFkCisvLyB0YXNrOiB0YXNrIHRvIGJlIGZpbmlzaGVkCisvLyByZXN1bWVkX3Rhc2s6IHRhc2sgdG8gYmUgcmVzdW1lZC4gIChtYXkgYmUgTlVMTCBpZiB0YXNrIGlzIHNlcmlhbGl6ZWQpCisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrX2ZpbmlzaCgga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2ssIGttcF90YXNrZGF0YV90ICpyZXN1bWVkX3Rhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfaW5mb190ICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrX3RlYW1fdCAqIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOyAvLyBtaWdodCBiZSBOVUxMIGZvciBzZXJpYWwgdGVhbXMuLi4KKyAgICBrbXBfaW50MzIgY2hpbGRyZW4gPSAwOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19lbmQpKSB7CisgICAgICAgIGttcF90YXNrZGF0YV90ICpwYXJlbnQgPSB0YXNrZGF0YS0+dGRfcGFyZW50OworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19lbmQpKAorICAgICAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgIH0KKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19maW5pc2goZW50ZXIpOiBUIyVkIGZpbmlzaGluZyB0YXNrICVwIGFuZCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHJlc3VtZWRfdGFzaykgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKworICAgIC8vIFBvcCB0YXNrIGZyb20gc3RhY2sgaWYgdGllZAorI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIGlmICggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19USUVEICkKKyAgICB7CisgICAgICAgIF9fa21wX3BvcF90YXNrX3N0YWNrKCBndGlkLCB0aHJlYWQsIHRhc2tkYXRhICk7CisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1RJRURfVEFTS19TVEFDSyAqLworCisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19VTlRJRUQgKSB7CisgICAgICAgIC8vIHVudGllZCB0YXNrIG5lZWRzIHRvIGNoZWNrIHRoZSBjb3VudGVyIHNvIHRoYXQgdGhlIHRhc2sgc3RydWN0dXJlIGlzIG5vdCBmcmVlZCBwcmVtYXR1cmVseQorICAgICAgICBrbXBfaW50MzIgY291bnRlciA9IEtNUF9URVNUX1RIRU5fREVDMzIoJnRhc2tkYXRhLT50ZF91bnRpZWRfY291bnQpIC0gMTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3Rhc2tfZmluaXNoOiBUIyVkIHVudGllZF9jb3VudCAoJWQpIGRlY3JlbWVudGVkIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudGVyLCB0YXNrZGF0YSApICk7CisgICAgICAgIGlmICggY291bnRlciA+IDAgKSB7CisgICAgICAgICAgICAvLyB1bnRpZWQgdGFzayBpcyBub3QgZG9uZSwgdG8gYmUgY29udGludWVkIHBvc3NpYmx5IGJ5IG90aGVyIHRocmVhZCwgZG8gbm90IGZyZWUgaXQgbm93CisgICAgICAgICAgICBpZiAocmVzdW1lZF90YXNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgKTsKKyAgICAgICAgICAgICAgICByZXN1bWVkX3Rhc2sgPSB0YXNrZGF0YS0+dGRfcGFyZW50OyAgLy8gSW4gYSBzZXJpYWxpemVkIHRhc2ssIHRoZSByZXN1bWVkIHRhc2sgaXMgdGhlIHBhcmVudAorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2sgPSByZXN1bWVkX3Rhc2s7IC8vIHJlc3RvcmUgY3VycmVudF90YXNrCisgICAgICAgICAgICByZXN1bWVkX3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7ICAvLyByZXN1bWUgcHJldmlvdXMgdGFzaworICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19maW5pc2goZXhpdCk6IFQjJWQgcGFydGlhbGx5IGRvbmUgdGFzayAlcCwgcmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHJlc3VtZWRfdGFzaykgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID09IDAgKTsKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9IDE7ICAgLy8gbWFyayB0aGUgdGFzayBhcyBjb21wbGV0ZWQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5zdGFydGVkID09IDEgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5mcmVlZCA9PSAwICk7CisKKyAgICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBjb3VudCBpZiB0ZWFtIHBhcmFsbGVsIGFuZCB0YXNraW5nIG5vdCBzZXJpYWxpemVkCisgICAgaWYgKCAhKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNraW5nX3NlciApICkgeworICAgICAgICAvLyBQcmVkZWNyZW1lbnQgc2ltdWxhdGVkIGJ5ICItIDEiIGNhbGN1bGF0aW9uCisgICAgICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX3BhcmVudCAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSApIC0gMTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2hpbGRyZW4gPj0gMCApOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggdGFza2RhdGEtPnRkX3Rhc2tncm91cCApCisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEtPnRkX3Rhc2tncm91cC0+Y291bnQpICk7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICB9CisgICAgLy8gaWYgd2UgZm91bmQgcHJveHkgdGFza3MgdGhlcmUgY291bGQgZXhpc3QgYSBkZXBlbmRlbmN5IGNoYWluCisgICAgLy8gd2l0aCB0aGUgcHJveHkgdGFzayBhcyBvcmlnaW4KKyAgICBpZiAoICEoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgfHwgKHRhc2tfdGVhbSAmJiB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzKSApIHsKKyNlbmRpZgorICAgICAgICBfX2ttcF9yZWxlYXNlX2RlcHMoZ3RpZCx0YXNrZGF0YSk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyB0ZF9mbGFncy5leGVjdXRpbmcgIG11c3QgYmUgbWFya2VkIGFzIDAgYWZ0ZXIgX19rbXBfcmVsZWFzZV9kZXBzIGhhcyBiZWVuIGNhbGxlZAorICAgIC8vIE90aGVydHdpc2UsIGlmIGEgdGFzayBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSBmcm9tIHRoZSByZWxlYXNlX2RlcHMgY29kZQorICAgIC8vIHRoZSBmbGFnIHdpbGwgYmUgcmVzZXQgdG8gMSBhZ2FpbiBieSB0aGlzIHNhbWUgZnVuY3Rpb24KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPT0gMSApOworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7ICAvLyBzdXNwZW5kIHRoZSBmaW5pc2hpbmcgdGFzaworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza19maW5pc2g6IFQjJWQgZmluaXNoZWQgdGFzayAlcCwgJWQgaW5jb21wbGV0ZSBjaGlsZHJlblxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjaGlsZHJlbikgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLyogSWYgdGhlIHRhc2tzJyBkZXN0cnVjdG9yIHRodW5rIGZsYWcgaGFzIGJlZW4gc2V0LCB3ZSBuZWVkIHRvIGludm9rZSB0aGUKKyAgICAgICBkZXN0cnVjdG9yIHRodW5rIHRoYXQgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlci4KKyAgICAgICBUaGUgY29kZSBpcyBwbGFjZWQgaGVyZSwgc2luY2UgYXQgdGhpcyBwb2ludCBvdGhlciB0YXNrcyBtaWdodCBoYXZlIGJlZW4gcmVsZWFzZWQKKyAgICAgICBoZW5jZSBvdmVybGFwcGluZyB0aGUgZGVzdHJ1Y3RvciBpbnZva2F0aW9ucyB3aXRoIHNvbWUgb3RoZXIgd29yayBpbiB0aGUKKyAgICAgICByZWxlYXNlZCB0YXNrcy4gIFRoZSBPcGVuTVAgc3BlYyBpcyBub3Qgc3BlY2lmaWMgb24gd2hlbiB0aGUgZGVzdHJ1Y3RvcnMgYXJlCisgICAgICAgaW52b2tlZCwgc28gd2Ugc2hvdWxkIGJlIGZyZWUgdG8gY2hvb3NlLgorICAgICovCisgICAgaWYgKHRhc2tkYXRhLT50ZF9mbGFncy5kZXN0cnVjdG9yc190aHVuaykgeworICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IGRlc3RyX3RodW5rID0gdGFzay0+ZGF0YTEuZGVzdHJ1Y3RvcnM7CisgICAgICAgIEtNUF9BU1NFUlQoZGVzdHJfdGh1bmspOworICAgICAgICBkZXN0cl90aHVuayhndGlkLCB0YXNrKTsKKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIC8vIGJvb2trZWVwaW5nIGZvciByZXN1bWluZyB0YXNrOgorICAgIC8vIEdFSCAtIG5vdGUgdGFza2luZ19zZXIgPT4gdGFza19zZXJpYWwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAodGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsKTsKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCApCisgICAgeworICAgICAgICBpZiAocmVzdW1lZF90YXNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VtZWRfdGFzayA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7ICAvLyBJbiBhIHNlcmlhbGl6ZWQgdGFzaywgdGhlIHJlc3VtZWQgdGFzayBpcyB0aGUgcGFyZW50CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2lmIE9NUF80NV9FTkFCTEVECisgICAgICAgICAgICAgaWYgKCAhKHRhc2tfdGVhbSAmJiB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzKSApCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdmVyaWZ5IHJlc3VtZWQgdGFzayBwYXNzZWQgaW4gcG9pbnRzIHRvIHBhcmVudAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrID09IHRhc2tkYXRhLT50ZF9wYXJlbnQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrICE9IE5VTEwgKTsgICAgICAgIC8vIHZlcmlmeSB0aGF0IHJlc3VtZWQgdGFzayBpcyBwYXNzZWQgYXMgYXJndWVtbnQKKyAgICB9CisKKyAgICAvLyBGcmVlIHRoaXMgdGFzayBhbmQgdGhlbiBhbmNlc3RvciB0YXNrcyBpZiB0aGV5IGhhdmUgbm8gY2hpbGRyZW4uCisgICAgLy8gUmVzdG9yZSB0aF9jdXJyZW50X3Rhc2sgZmlyc3QgYXMgc3VnZ2VzdGVkIGJ5IEpvaG46CisgICAgLy8gam9obm1jOiBpZiBhbiBhc3luY2hyb25vdXMgaW5xdWlyeSBwZWVycyBpbnRvIHRoZSBydW50aW1lIHN5c3RlbQorICAgIC8vIGl0IGRvZXNuJ3Qgc2VlIHRoZSBmcmVlZCB0YXNrIGFzIHRoZSBjdXJyZW50IHRhc2suCisgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2sgPSByZXN1bWVkX3Rhc2s7CisgICAgX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoZ3RpZCwgdGFza2RhdGEsIHRocmVhZCk7CisKKyAgICAvLyBUT0RPOiBHRUggLSBtYWtlIHN1cmUgcm9vdCB0ZWFtIGltcGxpY2l0IHRhc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCisgICAgLy8gS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgIHJlc3VtZWRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsgIC8vIHJlc3VtZSBwcmV2aW91cyB0YXNrCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX2ZpbmlzaChleGl0KTogVCMlZCBmaW5pc2hlZCB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHJlc3VtZWRfdGFzaykgKTsKKworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjA6IHJlcG9ydCB0aGF0IGEgdGFzayBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbgorLy8gbG9jX3JlZjogc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uOyBwb2ludHMgdG8gZW5kIG9mIHRhc2sgYmxvY2suCisvLyBndGlkOiBnbG9iYWwgdGhyZWFkIG51bWJlci4KKy8vIHRhc2s6IHRhc2sgdGh1bmsgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKwordm9pZAorX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2sgKQoreworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworCisgICAgX19rbXBfdGFza19maW5pc2goIGd0aWQsIHRhc2ssIE5VTEwgKTsgIC8vIHRoaXMgcm91dGluZSB3aWxsIHByb3ZpZGUgdGFzayB0byByZXN1bWUKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSApICk7CisKKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBUQVNLX1VOVVNFRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19jb21wbGV0ZTogcmVwb3J0IHRoYXQgYSB0YXNrIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uCisvLyBORVZFUiBHRU5FUkFURUQgQlkgQ09NUElMRVIsIERFUFJFQ0FURUQhISEKKwordm9pZAorX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzayApCit7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKworICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBOVUxMICk7ICAvLyBOb3Qgc3VyZSBob3cgdG8gZmluZCB0YXNrIHRvIHJlc3VtZQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBUQVNLX1VOVVNFRAorCisKKyNpZiBPTVBUX1NVUFBPUlQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza19pbml0X29tcHQ6CisvLyAgIEluaXRpYWxpemUgT01QVCBmaWVsZHMgbWFpbnRhaW5lZCBieSBhIHRhc2suIFRoaXMgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlcgorLy8gICBvbXB0X3Rvb2wsIHNvIHdlIGFscmVhZHkga25vdyB3aGV0aGVyIG9tcHQgaXMgZW5hYmxlZCBvciBub3QuCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfdGFza19pbml0X29tcHQoIGttcF90YXNrZGF0YV90ICogdGFzaywgaW50IHRpZCwgdm9pZCAqIGZ1bmN0aW9uICkKK3sKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHRhc2stPm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcodGlkKTsKKyAgICAgICAgdGFzay0+b21wdF90YXNrX2luZm8uZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgICAgICAgdGFzay0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgdGFzay0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICB0YXNrLT5vbXB0X3Rhc2tfaW5mby5uZGVwcyA9IDA7CisgICAgICAgIHRhc2stPm9tcHRfdGFza19pbmZvLmRlcHMgPSBOVUxMOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgfQorfQorI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2s6IEluaXRpYWxpemUgdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBpbiB0aGUgaW1wbGljaXQgdGFzayBmb3IgYSBnaXZlbiB0aHJlYWQKKy8vCisvLyBsb2NfcmVmOiAgcmVmZXJlbmNlIHRvIHNvdXJjZSBsb2NhdGlvbiBvZiBwYXJhbGxlbCByZWdpb24KKy8vIHRoaXNfdGhyOiAgdGhyZWFkIGRhdGEgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gaW1wbGljaXQgdGFzaworLy8gdGVhbTogdGVhbSBmb3IgdGhpc190aHIKKy8vIHRpZDogdGhyZWFkIGlkIG9mIGdpdmVuIHRocmVhZCB3aXRoaW4gdGVhbQorLy8gc2V0X2N1cnJfdGFzazogVFJVRSBpZiBuZWVkIHRvIHB1c2ggY3VycmVudCB0YXNrIHRvIHRocmVhZAorLy8gTk9URTogUm91dGluZSBkb2VzIG5vdCBzZXQgdXAgdGhlIGltcGxpY2l0IHRhc2sgSUNWUy4gIFRoaXMgaXMgYXNzdW1lZCB0byBoYXZlIGFscmVhZHkgYmVlbiBkb25lIGVsc2V3aGVyZS4KKy8vIFRPRE86IEdldCBiZXR0ZXIgbG9jX3JlZi4gIFZhbHVlIHBhc3NlZCBpbiBtYXkgYmUgTlVMTAorCit2b2lkCitfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkLCBpbnQgc2V0X2N1cnJfdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrICAgPSAmIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWyB0aWQgXTsKKworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2luaXRfaW1wbGljaXRfdGFzayhlbnRlcik6IFQjOiVkIHRlYW09JXAgdGFzaz0lcCwgcmVpbml0PSVzXG4iLAorICAgICAgICAgICAgICAgICAgdGlkLCB0ZWFtLCB0YXNrLCBzZXRfY3Vycl90YXNrID8gIlRSVUUiIDogIkZBTFNFIiApICk7CisKKyAgICB0YXNrLT50ZF90YXNrX2lkICA9IEtNUF9HRU5fVEFTS19JRCgpOworICAgIHRhc2stPnRkX3RlYW0gICAgID0gdGVhbTsKKy8vICAgIHRhc2stPnRkX3BhcmVudCAgID0gTlVMTDsgIC8vIGZpeCBmb3IgQ1EyMzAxMDEgKGJyb2tlbiBwYXJlbnQgdGFzayBpbmZvIGluIGRlYnVnZ2VyKQorICAgIHRhc2stPnRkX2lkZW50ICAgID0gbG9jX3JlZjsKKyAgICB0YXNrLT50ZF90YXNrd2FpdF9pZGVudCAgID0gTlVMTDsKKyAgICB0YXNrLT50ZF90YXNrd2FpdF9jb3VudGVyID0gMDsKKyAgICB0YXNrLT50ZF90YXNrd2FpdF90aHJlYWQgID0gMDsKKworICAgIHRhc2stPnRkX2ZsYWdzLnRpZWRuZXNzICAgID0gVEFTS19USUVEOworICAgIHRhc2stPnRkX2ZsYWdzLnRhc2t0eXBlICAgID0gVEFTS19JTVBMSUNJVDsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIHRhc2stPnRkX2ZsYWdzLnByb3h5ICAgICAgID0gVEFTS19GVUxMOworI2VuZGlmCisKKyAgICAvLyBBbGwgaW1wbGljaXQgdGFza3MgYXJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LCBub3QgZGVmZXJyZWQKKyAgICB0YXNrLT50ZF9mbGFncy50YXNrX3NlcmlhbCA9IDE7CisgICAgdGFzay0+dGRfZmxhZ3MudGFza2luZ19zZXIgPSAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisgICAgdGFzay0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgPSAoIHRlYW0tPnQudF9zZXJpYWxpemVkICkgPyAxIDogMDsKKworICAgIHRhc2stPnRkX2ZsYWdzLnN0YXJ0ZWQgICAgID0gMTsKKyAgICB0YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgICA9IDE7CisgICAgdGFzay0+dGRfZmxhZ3MuY29tcGxldGUgICAgPSAwOworICAgIHRhc2stPnRkX2ZsYWdzLmZyZWVkICAgICAgID0gMDsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGFzay0+dGRfZGVwbm9kZSA9IE5VTEw7CisjZW5kaWYKKworICAgIGlmIChzZXRfY3Vycl90YXNrKSB7ICAvLyBvbmx5IGRvIHRoaXMgaW5pdGlhbGl6YXRpb24gdGhlIGZpcnN0IHRpbWUgYSB0aHJlYWQgaXMgY3JlYXRlZAorICAgICAgICB0YXNrLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzID0gMDsKKyAgICAgICAgdGFzay0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzICA9IDA7IC8vIE5vdCB1c2VkIGJlY2F1c2UgZG8gbm90IG5lZWQgdG8gZGVhbGxvY2F0ZSBpbXBsaWNpdCB0YXNrCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgdGFzay0+dGRfdGFza2dyb3VwID0gTlVMTDsgICAgICAgICAgIC8vIEFuIGltcGxpY2l0IHRhc2sgZG9lcyBub3QgaGF2ZSB0YXNrZ3JvdXAKKyAgICAgICAgdGFzay0+dGRfZGVwaGFzaCA9IE5VTEw7CisjZW5kaWYKKyAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0aGlzX3RociwgdGVhbSwgdGlkICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzID09IDApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRhc2stPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPT0gMCk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgX19rbXBfdGFza19pbml0X29tcHQodGFzaywgdGlkLCBOVUxMKTsKKyNlbmRpZgorCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKGV4aXQpOiBUIzolZCB0ZWFtPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICB0aWQsIHRlYW0sIHRhc2sgKSApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLy8gX19rbXBfZmluaXNoX2ltcGxpY2l0X3Rhc2s6IFJlbGVhc2UgcmVzb3VyY2VzIGFzc29jaWF0ZWQgdG8gaW1wbGljaXQgdGFza3MKKy8vLy8gYXQgdGhlIGVuZCBvZiBwYXJhbGxlbCByZWdpb25zLiBTb21lIHJlc291cmNlcyBhcmUga2VwdCBmb3IgcmV1c2UgaW4gdGhlCisvLy8vIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorLy8vLworLy8vLyB0aHJlYWQ6ICB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBpbXBsaWNpdCB0YXNrCisvLwordm9pZAorX19rbXBfZmluaXNoX2ltcGxpY2l0X3Rhc2soa21wX2luZm9fdCAqdGhyZWFkKQoreworICAgIGttcF90YXNrZGF0YV90ICp0YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgaWYgKHRhc2stPnRkX2RlcGhhc2gpCisgICAgICAgIF9fa21wX2RlcGhhc2hfZnJlZV9lbnRyaWVzKHRocmVhZCwgdGFzay0+dGRfZGVwaGFzaCk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vLyBfX2ttcF9mcmVlX2ltcGxpY2l0X3Rhc2s6IFJlbGVhc2UgcmVzb3VyY2VzIGFzc29jaWF0ZWQgdG8gaW1wbGljaXQgdGFza3MKKy8vLy8gd2hlbiB0aGVzZSBhcmUgZGVzdHJveWVkIHJlZ2lvbnMKKy8vLy8KKy8vLy8gdGhyZWFkOiAgdGhyZWFkIGRhdGEgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gaW1wbGljaXQgdGFzaworLy8KK3ZvaWQKK19fa21wX2ZyZWVfaW1wbGljaXRfdGFzayhrbXBfaW5mb190ICp0aHJlYWQpCit7CisgICAga21wX3Rhc2tkYXRhX3QgKnRhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICBpZiAodGFzay0+dGRfZGVwaGFzaCkKKyAgICAgICAgX19rbXBfZGVwaGFzaF9mcmVlKHRocmVhZCwgdGFzay0+dGRfZGVwaGFzaCk7CisgICAgdGFzay0+dGRfZGVwaGFzaCA9IE5VTEw7Cit9CisKKworLy8gUm91bmQgdXAgYSBzaXplIHRvIGEgcG93ZXIgb2YgdHdvIHNwZWNpZmllZCBieSB2YWwKKy8vIFVzZWQgdG8gaW5zZXJ0IHBhZGRpbmcgYmV0d2VlbiBzdHJ1Y3R1cmVzIGNvLWFsbG9jYXRlZCB1c2luZyBhIHNpbmdsZSBtYWxsb2MoKSBjYWxsCitzdGF0aWMgc2l6ZV90CitfX2ttcF9yb3VuZF91cF90b192YWwoIHNpemVfdCBzaXplLCBzaXplX3QgdmFsICkgeworICAgIGlmICggc2l6ZSAmICggdmFsIC0gMSApICkgeworICAgICAgICBzaXplICY9IH4gKCB2YWwgLSAxICk7CisgICAgICAgIGlmICggc2l6ZSA8PSBLTVBfU0laRV9UX01BWCAtIHZhbCApIHsKKyAgICAgICAgICAgIHNpemUgKz0gdmFsOyAgICAvLyBSb3VuZCB1cCBpZiB0aGVyZSBpcyBubyBvdmVyZmxvdy4KKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiBzaXplOworfSAvLyBfX2ttcF9yb3VuZF91cF90b192YQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX2FsbG9jOiBBbGxvY2F0ZSB0aGUgdGFza2RhdGEgYW5kIHRhc2sgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIHRhc2sKKy8vCisvLyBsb2NfcmVmOiBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorLy8gZmxhZ3M6IGluY2x1ZGUgdGllZG5lc3MgJiB0YXNrIHR5cGUgKGV4cGxpY2l0IHZzLiBpbXBsaWNpdCkgb2YgdGhlICcnbmV3JycgdGFzayBlbmNvdW50ZXJlZC4KKy8vICAgICAgICBDb252ZXJ0ZWQgZnJvbSBrbXBfaW50MzIgdG8ga21wX3Rhc2tpbmdfZmxhZ3NfdCBpbiByb3V0aW5lLgorLy8gc2l6ZW9mX2ttcF90YXNrX3Q6ICBTaXplIGluIGJ5dGVzIG9mIGttcF90YXNrX3QgZGF0YSBzdHJ1Y3R1cmUgaW5jbHVkaW5nIHByaXZhdGUgdmFycyBhY2Nlc3NlZCBpbiB0YXNrLgorLy8gc2l6ZW9mX3NoYXJlZHM6ICBTaXplIGluIGJ5dGVzIG9mIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzIGFjY2Vzc2VkIGluIHRhc2suCisvLyB0YXNrX2VudHJ5OiBQb2ludGVyIHRvIHRhc2sgY29kZSBlbnRyeSBwb2ludCBnZW5lcmF0ZWQgYnkgY29tcGlsZXIuCisvLyByZXR1cm5zOiBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBrbXBfdGFza190IHN0cnVjdHVyZSAodGFzaykuCisKK2ttcF90YXNrX3QgKgorX19rbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNraW5nX2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKQoreworICAgIGttcF90YXNrX3QgKnRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhOworICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyZWFkLT50aC50aF90ZWFtOworICAgIGttcF90YXNrZGF0YV90ICpwYXJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgIHNpemVfdCBzaGFyZWRzX29mZnNldDsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfYWxsb2MoZW50ZXIpOiBUIyVkIGxvYz0lcCwgZmxhZ3M9KDB4JXgpICIKKyAgICAgICAgICAgICAgICAgICJzaXplb2ZfdGFzaz0lbGQgc2l6ZW9mX3NoYXJlZD0lbGQgZW50cnk9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCAqKChrbXBfaW50MzIgKilmbGFncyksIHNpemVvZl9rbXBfdGFza190LAorICAgICAgICAgICAgICAgICAgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkpICk7CisKKyAgICBpZiAoIHBhcmVudF90YXNrLT50ZF9mbGFncy5maW5hbCApIHsKKyAgICAgICAgaWYgKGZsYWdzLT5tZXJnZWRfaWYwKSB7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MtPmZpbmFsID0gMTsKKyAgICB9CisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIGlmICggZmxhZ3MtPnByb3h5ID09IFRBU0tfUFJPWFkgKSB7CisgICAgICAgIGZsYWdzLT50aWVkbmVzcyA9IFRBU0tfVU5USUVEOworICAgICAgICBmbGFncy0+bWVyZ2VkX2lmMCA9IDE7CisKKyAgICAgICAgLyogYXJlIHdlIHJ1bm5pbmcgaW4gYSBzZXF1ZW50aWFsIHBhcmFsbGVsIG9yIHRza21faW1tZWRpYXRlX2V4ZWMuLi4gd2UgbmVlZCB0YXNraW5nIHN1cHBvcnQgZW5hYmxlZCAqLworICAgICAgICBpZiAoICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSB0ZWFtIGlzIHNlcmlhbGl6ZWQKKyAgICAgICAgICAgICAgICBzZXR1cCBhIHRhc2sgdGVhbSBhbmQgcHJvcGFnYXRlIGl0IHRvIHRoZSB0aHJlYWQKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9zZXJpYWxpemVkKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKDMwLCgiVCMlZCBjcmVhdGluZyB0YXNrIHRlYW0gaW4gX19rbXBfdGFza19hbGxvYyBmb3IgcHJveHkgdGFza1xuIiwgZ3RpZCkpOworICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3NldHVwKHRocmVhZCx0ZWFtLDEpOyAvLyAxIGluZGljYXRlcyBzZXR1cCB0aGUgY3VycmVudCB0ZWFtIHJlZ2FyZGxlc3Mgb2YgbnRocmVhZHMKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0aHJlYWQtPnRoLnRoX3Rhc2tfc3RhdGVdOworICAgICAgICB9CisgICAgICAgIGttcF90YXNrX3RlYW1fdCAqIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworCisgICAgICAgIC8qIHRhc2tpbmcgbXVzdCBiZSBlbmFibGVkIG5vdyBhcyB0aGUgdGFzayBtaWdodCBub3QgYmUgcHVzaGVkICovCisgICAgICAgIGlmICggIUtNUF9UQVNLSU5HX0VOQUJMRUQoIHRhc2tfdGVhbSApICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMzAsKCJUIyVkIGVuYWJsaW5nIHRhc2tpbmcgaW4gX19rbXBfdGFza19hbGxvYyBmb3IgcHJveHkgdGFza1xuIiwgZ3RpZCkpOworICAgICAgICAgICAgX19rbXBfZW5hYmxlX3Rhc2tpbmcoIHRhc2tfdGVhbSwgdGhyZWFkICk7CisgICAgICAgICAgICBrbXBfaW50MzIgdGlkID0gdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKyAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICogdGhyZWFkX2RhdGEgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbIHRpZCBdOworICAgICAgICAgICAgLy8gTm8gbG9jayBuZWVkZWQgc2luY2Ugb25seSBvd25lciBjYW4gYWxsb2NhdGUKKyAgICAgICAgICAgIGlmICh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jX3Rhc2tfZGVxdWUoIHRocmVhZCwgdGhyZWFkX2RhdGEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyA9PSBGQUxTRSApCisgICAgICAgICAgVENXXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzLCBUUlVFKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIENhbGN1bGF0ZSBzaGFyZWQgc3RydWN0dXJlIG9mZnNldCBpbmNsdWRpbmcgcGFkZGluZyBhZnRlciBrbXBfdGFza190IHN0cnVjdAorICAgIC8vIHRvIGFsaWduIHBvaW50ZXJzIGluIHNoYXJlZCBzdHJ1Y3QKKyAgICBzaGFyZWRzX29mZnNldCA9IHNpemVvZigga21wX3Rhc2tkYXRhX3QgKSArIHNpemVvZl9rbXBfdGFza190OworICAgIHNoYXJlZHNfb2Zmc2V0ID0gX19rbXBfcm91bmRfdXBfdG9fdmFsKCBzaGFyZWRzX29mZnNldCwgc2l6ZW9mKCB2b2lkICogKSk7CisKKyAgICAvLyBBbGxvY2F0ZSBhIGttcF90YXNrZGF0YV90IGJsb2NrIGFuZCBhIGttcF90YXNrX3QgYmxvY2suCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfdGFza19hbGxvYzogVCMlZCBGaXJzdCBtYWxsb2Mgc2l6ZTogJWxkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgc2hhcmVkc19vZmZzZXQpICk7CisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfdGFza19hbGxvYzogVCMlZCBTZWNvbmQgbWFsbG9jIHNpemU6ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHNpemVvZl9zaGFyZWRzKSApOworCisgICAgLy8gQXZvaWQgZG91YmxlIGFsbG9jYXRpb24gaGVyZSBieSBjb21iaW5pbmcgc2hhcmVkcyB3aXRoIHRhc2tkYXRhCisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIHRhc2tkYXRhID0gKGttcF90YXNrZGF0YV90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUoIHRocmVhZCwgc2hhcmVkc19vZmZzZXQgKyBzaXplb2Zfc2hhcmVkcyApOworICAgICNlbHNlIC8qICEgVVNFX0ZBU1RfTUVNT1JZICovCisgICAgdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QgKikgX19rbXBfdGhyZWFkX21hbGxvYyggdGhyZWFkLCBzaGFyZWRzX29mZnNldCArIHNpemVvZl9zaGFyZWRzICk7CisgICAgI2VuZGlmIC8qIFVTRV9GQVNUX01FTU9SWSAqLworICAgIEFOTk9UQVRFX0hBUFBFTlNfQUZURVIodGFza2RhdGEpOworCisgICAgdGFzayAgICAgICAgICAgICAgICAgICAgICA9IEtNUF9UQVNLREFUQV9UT19UQVNLKHRhc2tkYXRhKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0YXNrICYgdGFza2RhdGEgYXJlIGFsaWduZWQgYXBwcm9wcmlhdGVseQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9QUEM2NCB8fCAhS01QX0hBVkVfUVVBRAorICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2tkYXRhKSAmIChzaXplb2YoZG91YmxlKS0xKSApID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICgoa21wX3VpbnRwdHJfdCl0YXNrKSAmIChzaXplb2YoZG91YmxlKS0xKSApID09IDAgKTsKKyNlbHNlCisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFza2RhdGEpICYgKHNpemVvZihfUXVhZCktMSkgKSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFzaykgJiAoc2l6ZW9mKF9RdWFkKS0xKSApID09IDAgKTsKKyNlbmRpZgorICAgIGlmIChzaXplb2Zfc2hhcmVkcyA+IDApIHsKKyAgICAgICAgLy8gQXZvaWQgZG91YmxlIGFsbG9jYXRpb24gaGVyZSBieSBjb21iaW5pbmcgc2hhcmVkcyB3aXRoIHRhc2tkYXRhCisgICAgICAgIHRhc2stPnNoYXJlZHMgICAgICAgICA9ICYgKChjaGFyICopIHRhc2tkYXRhKVsgc2hhcmVkc19vZmZzZXQgXTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHNoYXJlZHMgc3RydWN0IGlzIGFsaWduZWQgdG8gcG9pbnRlciBzaXplCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2stPnNoYXJlZHMpICYgKHNpemVvZih2b2lkICopLTEpICkgPT0gMCApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRhc2stPnNoYXJlZHMgICAgICAgICA9IE5VTEw7CisgICAgfQorICAgIHRhc2stPnJvdXRpbmUgICAgICAgICAgICAgPSB0YXNrX2VudHJ5OworICAgIHRhc2stPnBhcnRfaWQgICAgICAgICAgICAgPSAwOyAgICAgIC8vIEFDOiBBbHdheXMgc3RhcnQgd2l0aCAwIHBhcnQgaWQKKworICAgIHRhc2tkYXRhLT50ZF90YXNrX2lkICAgICAgPSBLTVBfR0VOX1RBU0tfSUQoKTsKKyAgICB0YXNrZGF0YS0+dGRfdGVhbSAgICAgICAgID0gdGVhbTsKKyAgICB0YXNrZGF0YS0+dGRfYWxsb2NfdGhyZWFkID0gdGhyZWFkOworICAgIHRhc2tkYXRhLT50ZF9wYXJlbnQgICAgICAgPSBwYXJlbnRfdGFzazsKKyAgICB0YXNrZGF0YS0+dGRfbGV2ZWwgICAgICAgID0gcGFyZW50X3Rhc2stPnRkX2xldmVsICsgMTsgLy8gaW5jcmVtZW50IG5lc3RpbmcgbGV2ZWwKKyAgICB0YXNrZGF0YS0+dGRfdW50aWVkX2NvdW50ID0gMDsKKyAgICB0YXNrZGF0YS0+dGRfaWRlbnQgICAgICAgID0gbG9jX3JlZjsKKyAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfaWRlbnQgICA9IE5VTEw7CisgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgPSAwOworICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgID0gMDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfcGFyZW50ICE9IE5VTEwgKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIC8vIGF2b2lkIGNvcHlpbmcgaWN2cyBmb3IgcHJveHkgdGFza3MKKyAgICBpZiAoIGZsYWdzLT5wcm94eSA9PSBUQVNLX0ZVTEwgKQorI2VuZGlmCisgICAgICAgY29weV9pY3ZzKCAmdGFza2RhdGEtPnRkX2ljdnMsICZ0YXNrZGF0YS0+dGRfcGFyZW50LT50ZF9pY3ZzICk7CisKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgICAgPSBmbGFncy0+dGllZG5lc3M7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmZpbmFsICAgICAgID0gZmxhZ3MtPmZpbmFsOworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5tZXJnZWRfaWYwICA9IGZsYWdzLT5tZXJnZWRfaWYwOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmRlc3RydWN0b3JzX3RodW5rID0gZmxhZ3MtPmRlc3RydWN0b3JzX3RodW5rOworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgICAgICAgICAgID0gZmxhZ3MtPnByb3h5OworICAgIHRhc2tkYXRhLT50ZF90YXNrX3RlYW0gICAgICAgICA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworICAgIHRhc2tkYXRhLT50ZF9zaXplX2FsbG9jICAgICAgICA9IHNoYXJlZHNfb2Zmc2V0ICsgc2l6ZW9mX3NoYXJlZHM7CisjZW5kaWYKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza3R5cGUgICAgPSBUQVNLX0VYUExJQ0lUOworCisgICAgLy8gR0VIIC0gVE9ETzogZml4IHRoaXMgdG8gY29weSBwYXJlbnQgdGFzaydzIHZhbHVlIG9mIHRhc2tpbmdfc2VyIGZsYWcKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza2luZ19zZXIgPSAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICAvLyBHRUggLSBUT0RPOiBmaXggdGhpcyB0byBjb3B5IHBhcmVudCB0YXNrJ3MgdmFsdWUgb2YgdGVhbV9zZXJpYWwgZmxhZworICAgIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCA9ICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSA/IDEgOiAwOworCisgICAgLy8gR0VIIC0gTm90ZSB3ZSBzZXJpYWxpemUgdGhlIHRhc2sgaWYgdGhlIHRlYW0gaXMgc2VyaWFsaXplZCB0byBtYWtlIHN1cmUgaW1wbGljaXQgcGFyYWxsZWwgcmVnaW9uCisgICAgLy8gICAgICAgdGFza3MgYXJlIG5vdCBsZWZ0IHVudGlsIHByb2dyYW0gdGVybWluYXRpb24gdG8gZXhlY3V0ZS4gIEFsc28sIGl0IGhlbHBzIGxvY2FsaXR5IHRvIGV4ZWN1dGUKKyAgICAvLyAgICAgICBpbW1lZGlhdGVseS4KKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAoIHBhcmVudF90YXNrLT50ZF9mbGFncy5maW5hbAorICAgICAgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlciApOworCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnN0YXJ0ZWQgICAgID0gMDsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZXhlY3V0aW5nICAgPSAwOworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5jb21wbGV0ZSAgICA9IDA7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkICAgICAgID0gMDsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5uYXRpdmUgICAgICA9IGZsYWdzLT5uYXRpdmU7CisKKyAgICB0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9IDA7CisgICAgdGFza2RhdGEtPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPSAxOyAvLyBzdGFydCBhdCBvbmUgYmVjYXVzZSBjb3VudHMgY3VycmVudCB0YXNrIGFuZCBjaGlsZHJlbgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXA7IC8vIHRhc2sgaW5oZXJpdHMgdGhlIHRhc2tncm91cCBmcm9tIHRoZSBwYXJlbnQgdGFzaworICAgIHRhc2tkYXRhLT50ZF9kZXBoYXNoID0gTlVMTDsKKyAgICB0YXNrZGF0YS0+dGRfZGVwbm9kZSA9IE5VTEw7CisjZW5kaWYKKworICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGNoaWxkIHRhc2sgY291bnRzIGlmIHRlYW0gcGFyYWxsZWwgYW5kIHRhc2tpbmcgbm90IHNlcmlhbGl6ZWQgb3IgaWYgaXQgaXMgYSBwcm94eSB0YXNrCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBpZiAoIGZsYWdzLT5wcm94eSA9PSBUQVNLX1BST1hZIHx8ICEoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgKQorI2Vsc2UKKyAgICBpZiAoICEoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgKQorI2VuZGlmCisgICAgeworICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopKCYgcGFyZW50X3Rhc2stPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpICk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwICkKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiBwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwLT5jb3VudCkgKTsKKyNlbmRpZgorICAgICAgICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBhbGxvY2F0ZWQgY2hpbGQgdGFza3MgZm9yIGV4cGxpY2l0IHRhc2tzIHNpbmNlIGltcGxpY2l0IG5vdCBkZWFsbG9jYXRlZAorICAgICAgICBpZiAoIHRhc2tkYXRhLT50ZF9wYXJlbnQtPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKSB7CisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSApOworICAgICAgICB9CisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza19hbGxvYyhleGl0KTogVCMlZCBjcmVhdGVkIHRhc2sgJXAgcGFyZW50PSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHRhc2tkYXRhLT50ZF9wYXJlbnQpICk7CisgICAgQU5OT1RBVEVfSEFQUEVOU19CRUZPUkUodGFzayk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBfX2ttcF90YXNrX2luaXRfb21wdCh0YXNrZGF0YSwgZ3RpZCwgKHZvaWQqKSB0YXNrX2VudHJ5KTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHRhc2s7Cit9CisKKwora21wX3Rhc2tfdCAqCitfX2ttcGNfb21wX3Rhc2tfYWxsb2MoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKQoreworICAgIGttcF90YXNrX3QgKnJldHZhbDsKKyAgICBrbXBfdGFza2luZ19mbGFnc190ICppbnB1dF9mbGFncyA9IChrbXBfdGFza2luZ19mbGFnc190ICopICYgZmxhZ3M7CisKKyAgICBpbnB1dF9mbGFncy0+bmF0aXZlID0gRkFMU0U7CisgICAgLy8gX19rbXBfdGFza19hbGxvYygpIHNldHMgdXAgYWxsIG90aGVyIHJ1bnRpbWUgZmxhZ3MKKworI2lmIE9NUF80NV9FTkFCTEVECisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2FsbG9jKGVudGVyKTogVCMlZCBsb2M9JXAsIGZsYWdzPSglcyAlcykgIgorICAgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIGlucHV0X2ZsYWdzLT50aWVkbmVzcyA/ICJ0aWVkICAiIDogInVudGllZCIsCisgICAgICAgICAgICAgICAgICBpbnB1dF9mbGFncy0+cHJveHkgPyAicHJveHkiIDogIiIsCisgICAgICAgICAgICAgICAgICBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkpICk7CisjZWxzZQorICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19hbGxvYyhlbnRlcik6IFQjJWQgbG9jPSVwLCBmbGFncz0oJXMpICIKKyAgICAgICAgICAgICAgICAgICJzaXplb2ZfdGFzaz0lbGQgc2l6ZW9mX3NoYXJlZD0lbGQgZW50cnk9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBpbnB1dF9mbGFncy0+dGllZG5lc3MgPyAidGllZCAgIiA6ICJ1bnRpZWQiLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVvZl9zaGFyZWRzLCB0YXNrX2VudHJ5KSApOworI2VuZGlmCisKKyAgICByZXR2YWwgPSBfX2ttcF90YXNrX2FsbG9jKCBsb2NfcmVmLCBndGlkLCBpbnB1dF9mbGFncywgc2l6ZW9mX2ttcF90YXNrX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkgKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19vbXBfdGFza19hbGxvYyhleGl0KTogVCMlZCByZXR2YWwgJXBcbiIsIGd0aWQsIHJldHZhbCkgKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9pbnZva2VfdGFzazogaW52b2tlIHRoZSBzcGVjaWZpZWQgdGFzaworLy8KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgSUQgb2YgY2FsbGVyCisvLyB0YXNrOiB0aGUgdGFzayB0byBpbnZva2UKKy8vIGN1cnJlbnRfdGFzazogdGhlIHRhc2sgdG8gcmVzdW1lIGFmdGVyIHRhc2sgaW52b2thdGlvbgorCitzdGF0aWMgdm9pZAorX19rbXBfaW52b2tlX3Rhc2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrLCBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF91aW50NjQgY3VyX3RpbWU7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpbnQgZGlzY2FyZCA9IDAgLyogZmFsc2UgKi87CisjZW5kaWYKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbnZva2VfdGFzayhlbnRlcik6IFQjJWQgaW52b2tpbmcgdGFzayAlcCwgY3VycmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRhc2spOworI2lmIE9NUF80NV9FTkFCTEVECisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSAmJgorICAgICAgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlID09IDEpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcHJveHkgdGFzayB0aGF0IHdhcyBhbHJlYWR5IGNvbXBsZXRlZCBidXQgaXQgbmVlZHMgdG8gcnVuCisgICAgICAgICAgICAvLyBpdHMgYm90dG9tLWhhbGYgZmluaXNoCisgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbnZva2VfdGFzazogVCMlZCBydW5uaW5nIGJvdHRvbSBmaW5pc2ggZm9yIHByb3h5IHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSkgKTsKKworICAgICAgICAgICAgX19rbXBfYm90dG9tX2hhbGZfZmluaXNoX3Byb3h5KGd0aWQsdGFzayk7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ludm9rZV90YXNrKGV4aXQpOiBUIyVkIGNvbXBsZXRlZCBib3R0b20gZmluaXNoIGZvciBwcm94eSB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLCBndGlkLCB0YXNrZGF0YSwgY3VycmVudF90YXNrKSApOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB9CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZihfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzKSB7CisgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB0aW1lIHN0YW1wIHRvIG1lYXN1cmUgdGFzayBleGVjdXRpb24gdGltZSB0byBjb3JyZWN0IGJhcnJpZXIgaW1iYWxhbmNlIHRpbWUKKyAgICAgICAgY3VyX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIC8vIFByb3h5IHRhc2tzIGFyZSBub3QgaGFuZGxlZCBieSB0aGUgcnVudGltZQorICAgIGlmICggdGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ICE9IFRBU0tfUFJPWFkgKSB7CisjZW5kaWYKKyAgICAgIEFOTk9UQVRFX0hBUFBFTlNfQUZURVIodGFzayk7CisgICAgICBfX2ttcF90YXNrX3N0YXJ0KCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIH0KKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF90aHJlYWRfaW5mb190IG9sZEluZm87CisgICAga21wX2luZm9fdCAqIHRocmVhZDsKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8vIFN0b3JlIHRoZSB0aHJlYWRzIHN0YXRlcyBhbmQgcmVzdG9yZSB0aGVtIGFmdGVyIHRoZSB0YXNrCisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgb2xkSW5mbyA9IHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbzsKKyAgICAgICAgdGhyZWFkLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAwOworICAgICAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLy8gVE9ETzogY2FuY2VsIHRhc2tzIGlmIHRoZSBwYXJhbGxlbCByZWdpb24gaGFzIGFsc28gYmVlbiBjYW5jZWxsZWQKKyAgICAvLyBUT0RPOiBjaGVjayBpZiB0aGlzIHNlcXVlbmNlIGNhbiBiZSBob2lzdGVkIGFib3ZlIF9fa21wX3Rhc2tfc3RhcnQKKyAgICAvLyBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gZW5hYmxlZCBmb3IgdGhpcyBydW4gLi4uCisgICAgaWYgKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzIFsgZ3RpZCBdOworICAgICAgICBrbXBfdGVhbV90ICogdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgIGttcF90YXNrZ3JvdXBfdCAqIHRhc2tncm91cCA9IHRhc2tkYXRhLT50ZF90YXNrZ3JvdXA7CisgICAgICAgIGlmICgodGFza2dyb3VwICYmIHRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3QpIHx8ICh0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCA9PSBjYW5jZWxfcGFyYWxsZWwpKSB7CisgICAgICAgICAgICBLTVBfQ09VTlRfQkxPQ0soVEFTS19jYW5jZWxsZWQpOworICAgICAgICAgICAgLy8gdGhpcyB0YXNrIGJlbG9uZ3MgdG8gYSB0YXNrIGdyb3VwIGFuZCB3ZSBuZWVkIHRvIGNhbmNlbCBpdAorICAgICAgICAgICAgZGlzY2FyZCA9IDEgLyogdHJ1ZSAqLzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gSW52b2tlIHRoZSB0YXNrIHJvdXRpbmUgYW5kIHBhc3MgaW4gcmVsZXZhbnQgZGF0YS4KKyAgICAvLyBUaHVua3MgZ2VuZXJhdGVkIGJ5IGdjYyB0YWtlIGEgZGlmZmVyZW50IGFyZ3VtZW50IGxpc3QuCisgICAgLy8KKyAgICBpZiAoIWRpc2NhcmQpIHsKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgICAgICBLTVBfQ09VTlRfQkxPQ0soVEFTS19leGVjdXRlZCk7CisgICAgICAgIHN3aXRjaChLTVBfR0VUX1RIUkVBRF9TVEFURSgpKSB7CisgICAgICAgICBjYXNlIEZPUktfSk9JTl9CQVJSSUVSOiBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfdGFza19qb2luX2Jhcik7IGJyZWFrOworICAgICAgICAgY2FzZSBQTEFJTl9CQVJSSUVSOiBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfdGFza19wbGFpbl9iYXIpOyBicmVhazsKKyAgICAgICAgIGNhc2UgVEFTS1lJRUxEOiBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfdGFza190YXNreWllbGQpOyBicmVhazsKKyAgICAgICAgIGNhc2UgVEFTS1dBSVQ6IEtNUF9QVVNIX1BBUlRJVElPTkVEX1RJTUVSKE9NUF90YXNrX3Rhc2t3YWl0KTsgYnJlYWs7CisgICAgICAgICBjYXNlIFRBU0tHUk9VUDogS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX3Rhc2tfdGFza2dyb3VwKTsgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OiBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfdGFza19pbW1lZGlhdGUpOyBicmVhazsKKyAgICAgICAgfQorI2VuZGlmIC8vIEtNUF9TVEFUU19FTkFCTEVECisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIC8qIGxldCBPTVBUIGtub3cgdGhhdCB3ZSdyZSBhYm91dCB0byBydW4gdGhpcyB0YXNrICovCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19zd2l0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoKSgKKyAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+b21wdF90YXNrX2luZm8udGFza19pZCwKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKHRhc2tkYXRhLT50ZF9mbGFncy5uYXRpdmUpIHsKKyAgICAgICAgICAgICgodm9pZCAoKikodm9pZCAqKSkoKih0YXNrLT5yb3V0aW5lKSkpKHRhc2stPnNoYXJlZHMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKCoodGFzay0+cm91dGluZSkpKGd0aWQsIHRhc2spOworICAgICAgICB9CisgICAgICAgIEtNUF9QT1BfUEFSVElUSU9ORURfVElNRVIoKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIC8qIGxldCBPTVBUIGtub3cgdGhhdCB3ZSdyZSByZXR1cm5pbmcgdG8gdGhlIGNhbGxlZSB0YXNrICovCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19zd2l0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoKSgKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkLAorICAgICAgICAgICAgY3VycmVudF90YXNrLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbyA9IG9sZEluZm87CisgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAvLyBQcm94eSB0YXNrcyBhcmUgbm90IGhhbmRsZWQgYnkgdGhlIHJ1bnRpbWUKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy5wcm94eSAhPSBUQVNLX1BST1hZICkgeworI2VuZGlmCisgICAgICBBTk5PVEFURV9IQVBQRU5TX0JFRk9SRSh0YXNrZGF0YS0+dGRfcGFyZW50KTsKKyAgICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gY29ycmVjdCBhcnJpdmUgdGltZSBhZnRlciB0aGUgdGFzayBmaW5pc2hlZAorICAgIGlmKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMpIHsKKyAgICAgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzIFsgZ3RpZCBdOworICAgICAgICBpZih0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lKSB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lICs9IChfX2l0dF9nZXRfdGltZXN0YW1wKCkgLSBjdXJfdGltZSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbnZva2VfdGFzayhleGl0KTogVCMlZCBjb21wbGV0ZWQgdGFzayAlcCwgcmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spICk7CisgICAgcmV0dXJuOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfcGFydHM6IFNjaGVkdWxlIGEgdGhyZWFkLXN3aXRjaGFibGUgdGFzayBmb3IgZXhlY3V0aW9uCisvLworLy8gbG9jX3JlZjogbG9jYXRpb24gb2Ygb3JpZ2luYWwgdGFzayBwcmFnbWEgKGlnbm9yZWQpCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOiB0YXNrIHRodW5rIGFsbG9jYXRlZCBieSBfX2ttcF9vbXBfdGFza19hbGxvYygpIGZvciB0aGUgJyduZXcgdGFzaycnCisvLyBSZXR1cm5zOgorLy8gICAgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgKDApIGlmIGRpZCBub3Qgc3VzcGVuZCBhbmQgcXVldWUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisvLyAgICBUQVNLX0NVUlJFTlRfUVVFVUVEICgxKSBpZiBzdXNwZW5kZWQgYW5kIHF1ZXVlZCB0aGUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNrX3BhcnRzKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrKQoreworICAgIGttcF90YXNrZGF0YV90ICogbmV3X3Rhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEobmV3X3Rhc2spOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3BhcnRzKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICAvKiBTaG91bGQgd2UgZXhlY3V0ZSB0aGUgbmV3IHRhc2sgb3IgcXVldWUgaXQ/ICAgRm9yIG5vdywgbGV0J3MganVzdCBhbHdheXMgdHJ5IHRvCisgICAgICAgcXVldWUgaXQuICBJZiB0aGUgcXVldWUgZmlsbHMgdXAsIHRoZW4gd2UnbGwgZXhlY3V0ZSBpdC4gICovCisKKyAgICBpZiAoIF9fa21wX3B1c2hfdGFzayggZ3RpZCwgbmV3X3Rhc2sgKSA9PSBUQVNLX05PVF9QVVNIRUQgKSAvLyBpZiBjYW5ub3QgZGVmZXIKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoaXMgdGFzayBpbW1lZGlhdGVseQorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIG5ld190YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgbmV3X3Rhc2ssIGN1cnJlbnRfdGFzayApOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19wYXJ0cyhleGl0KTogVCMlZCByZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ6ICIKKyAgICAgICAgICAgICAgICAgICJsb2M9JXAgdGFzaz0lcCwgcmV0dXJuOiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRFxuIiwgZ3RpZCwgbG9jX3JlZiwKKyAgICAgICAgICAgICAgICAgIG5ld190YXNrZGF0YSApICk7CisKKyAgICBBTk5PVEFURV9IQVBQRU5TX0JFRk9SRShuZXdfdGFzayk7CisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfb21wX3Rhc2s6IFNjaGVkdWxlIGEgbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgZm9yIGV4ZWN1dGlvbgorLy8gZ3RpZDogR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCisvLyBuZXdfdGFzazogbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgdGh1bmsgYWxsb2NhdGVkIGJ5IF9fa21wX29tcF90YXNrX2FsbG9jKCkKKy8vIHNlcmlhbGl6ZV9pbW1lZGlhdGU6IGlmIFRSVUUgdGhlbiBpZiB0aGUgdGFzayBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSBpdHMgZXhlY3V0aW9uIHdpbGwgYmUgc2VyaWFsaXplZAorLy8gcmV0dXJuczoKKy8vCisvLyAgICBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAoMCkgaWYgZGlkIG5vdCBzdXNwZW5kIGFuZCBxdWV1ZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKy8vICAgIFRBU0tfQ1VSUkVOVF9RVUVVRUQgKDEpIGlmIHN1c3BlbmRlZCBhbmQgcXVldWVkIHRoZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KK2ttcF9pbnQzMgorX19rbXBfb21wX3Rhc2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2ssIGJvb2wgc2VyaWFsaXplX2ltbWVkaWF0ZSApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiBuZXdfdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0KKyAgICAgICAgICAgIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogU2hvdWxkIHdlIGV4ZWN1dGUgdGhlIG5ldyB0YXNrIG9yIHF1ZXVlIGl0PyAgIEZvciBub3csIGxldCdzIGp1c3QgYWx3YXlzIHRyeSB0bworICAgICAgIHF1ZXVlIGl0LiAgSWYgdGhlIHF1ZXVlIGZpbGxzIHVwLCB0aGVuIHdlJ2xsIGV4ZWN1dGUgaXQuICAqLworI2lmIE9NUF80NV9FTkFCTEVECisgICAgaWYgKCBuZXdfdGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ID09IFRBU0tfUFJPWFkgfHwgX19rbXBfcHVzaF90YXNrKCBndGlkLCBuZXdfdGFzayApID09IFRBU0tfTk9UX1BVU0hFRCApIC8vIGlmIGNhbm5vdCBkZWZlcgorI2Vsc2UKKyAgICBpZiAoIF9fa21wX3B1c2hfdGFzayggZ3RpZCwgbmV3X3Rhc2sgKSA9PSBUQVNLX05PVF9QVVNIRUQgKSAvLyBpZiBjYW5ub3QgZGVmZXIKKyNlbmRpZgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhpcyB0YXNrIGltbWVkaWF0ZWx5CisgICAgICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgaWYgKCBzZXJpYWxpemVfaW1tZWRpYXRlICkKKyAgICAgICAgICBuZXdfdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgICAgICBfX2ttcF9pbnZva2VfdGFzayggZ3RpZCwgbmV3X3Rhc2ssIGN1cnJlbnRfdGFzayApOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgQU5OT1RBVEVfSEFQUEVOU19CRUZPUkUobmV3X3Rhc2spOworICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFzazogV3JhcHBlciBhcm91bmQgX19rbXBfb21wX3Rhc2sgdG8gc2NoZWR1bGUgYSBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayBmcm9tCisvLyB0aGUgcGFyZW50IHRocmVhZCBvbmx5IQorLy8gbG9jX3JlZjogbG9jYXRpb24gb2Ygb3JpZ2luYWwgdGFzayBwcmFnbWEgKGlnbm9yZWQpCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOiBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKQorLy8gcmV0dXJuczoKKy8vCisvLyAgICBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAoMCkgaWYgZGlkIG5vdCBzdXNwZW5kIGFuZCBxdWV1ZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKy8vICAgIFRBU0tfQ1VSUkVOVF9RVUVVRUQgKDEpIGlmIHN1c3BlbmRlZCBhbmQgcXVldWVkIHRoZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2soIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2spCit7CisgICAga21wX2ludDMyIHJlczsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhFWFBMSUNJVF9UQVNLKTsKKworI2lmIEtNUF9ERUJVRworICAgIGttcF90YXNrZGF0YV90ICogbmV3X3Rhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEobmV3X3Rhc2spOworI2VuZGlmCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICByZXMgPSAgX19rbXBfb21wX3Rhc2soZ3RpZCxuZXdfdGFzayx0cnVlKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFzayhleGl0KTogVCMlZCByZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ6IGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhICkgKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza3dhaXQ6IFdhaXQgdW50aWwgYWxsIHRhc2tzIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCB0YXNrIGFyZSBjb21wbGV0ZQorCitrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3dhaXQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQ7CisgICAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKFRBU0tXQUlUKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3dhaXQoZW50ZXIpOiBUIyVkIGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgYmVnaW4gd2FpdD8KKworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBteV9wYXJhbGxlbF9pZDsKKworICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyZWFkLT50aC50aF90ZWFtOworICAgICAgICAgICAgbXlfdGFza19pZCA9IHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQgPSB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrd2FpdF9iZWdpbikoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLy8gRGVidWdnZXI6IFRoZSB0YXNrd2FpdCBpcyBhY3RpdmUuIFN0b3JlIGxvY2F0aW9uIGFuZCB0aHJlYWQgZW5jb3VudGVyZWQgdGhlIHRhc2t3YWl0LgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gTm90ZTogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IElUVCBldmVudHMgYXMgd2VsbC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICs9IDE7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudCAgICA9IGxvY19yZWY7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgICA9IGd0aWQgKyAxOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdCggZ3RpZCApOworICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIGJvb2wgbXVzdF93YWl0ID0gISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgJiYgISB0YXNrZGF0YS0+dGRfZmxhZ3MuZmluYWw7CisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgICBtdXN0X3dhaXQgPSBtdXN0X3dhaXQgfHwgKHRocmVhZC0+dGgudGhfdGFza190ZWFtICE9IE5VTEwgJiYgdGhyZWFkLT50aC50aF90YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzKTsKKyNlbmRpZgorICAgICAgICBpZiAobXVzdF93YWl0KQorICAgICAgICB7CisgICAgICAgICAgICBrbXBfZmxhZ18zMiBmbGFnKCYodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpLCAwVSk7CisgICAgICAgICAgICB3aGlsZSAoIFRDUl80KHRhc2tkYXRhIC0+IHRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgZmxhZy5leGVjdXRlX3Rhc2tzKHRocmVhZCwgZ3RpZCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBlbmQgb2Ygd2FpdD8KKyAgICAgICAgLy8gRGVidWdnZXI6ICBUaGUgdGFza3dhaXQgaXMgY29tcGxldGVkLiBMb2NhdGlvbiByZW1haW5zLCBidXQgdGhyZWFkIGlzIG5lZ2F0ZWQuCisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgPSAtIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQ7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZCkpIHsKKyAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza3dhaXRfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQsIG15X3Rhc2tfaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBBTk5PVEFURV9IQVBQRU5TX0FGVEVSKHRhc2tkYXRhKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t3YWl0KGV4aXQpOiBUIyVkIHRhc2sgJXAgZmluaXNoZWQgd2FpdGluZywgIgorICAgICAgICAgICAgICAgICAgInJldHVybmluZyBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRFxuIiwgZ3RpZCwgdGFza2RhdGEpICk7CisKKyAgICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2t5aWVsZDogc3dpdGNoIHRvIGEgZGlmZmVyZW50IHRhc2sKKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2t5aWVsZCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGludCBlbmRfcGFydCApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YTsKKyAgICBrbXBfaW5mb190ICogdGhyZWFkOworICAgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfVEFTS1lJRUxEKTsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhUQVNLWUlFTEQpOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNreWllbGQoZW50ZXIpOiBUIyVkIGxvYz0lcCBlbmRfcGFydCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgZW5kX3BhcnQpICk7CisKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICYmIF9fa21wX2luaXRfcGFyYWxsZWwgKSB7CisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgYmVnaW4gd2FpdD8KKworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgLy8gU2hvdWxkIHdlIG1vZGVsIHRoaXMgYXMgYSB0YXNrIHdhaXQgb3Igbm90PworICAgICAgICAvLyBEZWJ1Z2dlcjogVGhlIHRhc2t3YWl0IGlzIGFjdGl2ZS4gU3RvcmUgbG9jYXRpb24gYW5kIHRocmVhZCBlbmNvdW50ZXJlZCB0aGUgdGFza3dhaXQuCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBOb3RlOiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYnkgSVRUIGV2ZW50cyBhcyB3ZWxsLgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgKz0gMTsKKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50ICAgID0gbG9jX3JlZjsKKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCAgID0gZ3RpZCArIDE7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBndGlkICk7CisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIGlmICggISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgKSB7CisgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKiB0YXNrX3RlYW0gPSB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbTsKKyAgICAgICAgICAgIGlmICh0YXNrX3RlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrc18zMiggdGhyZWFkLCBndGlkLCBOVUxMLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICAgICAgLy8gR0VIIFRPRE86IHNob3VsZG4ndCB3ZSBoYXZlIHNvbWUgc29ydCBvZiBPTVBSQVAgQVBJIGNhbGxzIGhlcmUgdG8gbWFyayBlbmQgb2Ygd2FpdD8KKyAgICAgICAgLy8gRGVidWdnZXI6ICBUaGUgdGFza3dhaXQgaXMgY29tcGxldGVkLiBMb2NhdGlvbiByZW1haW5zLCBidXQgdGhyZWFkIGlzIG5lZ2F0ZWQuCisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgPSAtIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQ7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNreWllbGQoZXhpdCk6IFQjJWQgdGFzayAlcCByZXN1bWluZywgIgorICAgICAgICAgICAgICAgICAgInJldHVybmluZyBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRFxuIiwgZ3RpZCwgdGFza2RhdGEpICk7CisKKyAgICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7Cit9CisKKworI2lmIE9NUF80MF9FTkFCTEVECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY190YXNrZ3JvdXA6IFN0YXJ0IGEgbmV3IHRhc2tncm91cAorCit2b2lkCitfX2ttcGNfdGFza2dyb3VwKCBpZGVudF90KiBsb2MsIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICAgICAgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgICogdGFza2RhdGEgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICBrbXBfdGFza2dyb3VwX3QgKiB0Z19uZXcgPQorICAgICAgICAoa21wX3Rhc2tncm91cF90ICopX19rbXBfdGhyZWFkX21hbGxvYyggdGhyZWFkLCBzaXplb2YoIGttcF90YXNrZ3JvdXBfdCApICk7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX3Rhc2tncm91cDogVCMlZCBsb2M9JXAgZ3JvdXA9JXBcbiIsIGd0aWQsIGxvYywgdGdfbmV3KSApOworICAgIHRnX25ldy0+Y291bnQgPSAwOworICAgIHRnX25ldy0+Y2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgdGdfbmV3LT5wYXJlbnQgPSB0YXNrZGF0YS0+dGRfdGFza2dyb3VwOworICAgIHRhc2tkYXRhLT50ZF90YXNrZ3JvdXAgPSB0Z19uZXc7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfZW5kX3Rhc2tncm91cDogV2FpdCB1bnRpbCBhbGwgdGFza3MgZ2VuZXJhdGVkIGJ5IHRoZSBjdXJyZW50IHRhc2sKKy8vICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXRzIGRlc2NlbmRhbnRzIGFyZSBjb21wbGV0ZQorCit2b2lkCitfX2ttcGNfZW5kX3Rhc2tncm91cCggaWRlbnRfdCogbG9jLCBpbnQgZ3RpZCApCit7CisgICAga21wX2luZm9fdCAgICAgICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICAqIHRhc2tkYXRhID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAga21wX3Rhc2tncm91cF90ICogdGFza2dyb3VwID0gdGFza2RhdGEtPnRkX3Rhc2tncm91cDsKKyAgICBpbnQgdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfZW5kX3Rhc2tncm91cChlbnRlcik6IFQjJWQgbG9jPSVwXG4iLCBndGlkLCBsb2MpICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2dyb3VwICE9IE5VTEwgKTsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhUQVNLR1JPVVApOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIEZvciBJVFQgdGhlIHRhc2tncm91cCB3YWl0IGlzIHNpbWlsYXIgdG8gdGFza3dhaXQgdW50aWwgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVtCisgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KCBndGlkICk7CisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgICBpZiAoICEgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8ICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSAhPSBOVUxMICYmIHRocmVhZC0+dGgudGhfdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcykgKQorI2Vsc2UKKyAgICAgICAgaWYgKCAhIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCApCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAga21wX2ZsYWdfMzIgZmxhZygmKHRhc2tncm91cC0+Y291bnQpLCAwVSk7CisgICAgICAgICAgICB3aGlsZSAoIFRDUl80KHRhc2tncm91cC0+Y291bnQpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgZmxhZy5leGVjdXRlX3Rhc2tzKHRocmVhZCwgZ3RpZCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2dyb3VwLT5jb3VudCA9PSAwICk7CisKKyAgICAvLyBSZXN0b3JlIHBhcmVudCB0YXNrZ3JvdXAgZm9yIHRoZSBjdXJyZW50IHRhc2sKKyAgICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0gdGFza2dyb3VwLT5wYXJlbnQ7CisgICAgX19rbXBfdGhyZWFkX2ZyZWUoIHRocmVhZCwgdGFza2dyb3VwICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfZW5kX3Rhc2tncm91cChleGl0KTogVCMlZCB0YXNrICVwIGZpbmlzaGVkIHdhaXRpbmdcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworICAgIEFOTk9UQVRFX0hBUFBFTlNfQUZURVIodGFza2RhdGEpOworfQorI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3JlbW92ZV9teV90YXNrOiByZW1vdmUgYSB0YXNrIGZyb20gbXkgb3duIGRlcXVlCisKK3N0YXRpYyBrbXBfdGFza190ICoKK19fa21wX3JlbW92ZV9teV90YXNrKCBrbXBfaW5mb190ICogdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkICkKK3sKKyAgICBrbXBfdGFza190ICogdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhOworICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YTsKKyAgICBrbXBfdWludDMyIHRhaWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgIT0gTlVMTCApOyAvLyBDYWxsZXIgc2hvdWxkIGNoZWNrIHRoaXMgY29uZGl0aW9uCisKKyAgICAgICAgdGhyZWFkX2RhdGEgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSBdOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZW50ZXIpOiBUIyVkIG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworCisgICAgaWYgKFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgeworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhleGl0ICMxKTogVCMlZCBObyB0YXNrcyB0byByZW1vdmU6IG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgaWYgKFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMik6IFQjJWQgTm8gdGFza3MgdG8gcmVtb3ZlOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB0YWlsID0gKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsIC0gMSApICYgVEFTS19ERVFVRV9NQVNLKHRocmVhZF9kYXRhLT50ZCk7ICAvLyBXcmFwIGluZGV4LgorICAgIHRhc2tkYXRhID0gdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVbIHRhaWwgXTsKKworICAgIGlmIChpc19jb25zdHJhaW5lZCAmJiAodGFza2RhdGEtPnRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVElFRCkpIHsKKyAgICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgY2FuZGlkYXRlIG9iZXlzIHRhc2sgc2NoZWR1bGluZyBjb25zdHJhaW50OgorICAgICAgICAvLyBvbmx5IGNoaWxkIG9mIGN1cnJlbnQgdGFzayBjYW4gYmUgc2NoZWR1bGVkCisgICAgICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudCA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICBrbXBfaW50MzIgICAgICAgIGxldmVsID0gY3VycmVudC0+dGRfbGV2ZWw7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogcGFyZW50ID0gdGFza2RhdGEtPnRkX3BhcmVudDsKKyAgICAgICAgd2hpbGUgKCBwYXJlbnQgIT0gY3VycmVudCAmJiBwYXJlbnQtPnRkX2xldmVsID4gbGV2ZWwgKSB7CisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQtPnRkX3BhcmVudDsgIC8vIGNoZWNrIGdlbmVyYXRpb24gdXAgdG8gdGhlIGxldmVsIG9mIHRoZSBjdXJyZW50IHRhc2sKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocGFyZW50ICE9IE5VTEwpOworICAgICAgICB9CisgICAgICAgIGlmICggcGFyZW50ICE9IGN1cnJlbnQgKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgdGFpbCB0YXNrIGlzIG5vdCBhIGNoaWxkLCB0aGVuIG5vIG90aGVyIGNoaWxkIGNhbiBhcHBlYXIgaW4gdGhlIGRlcXVlLgorICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhleGl0ICMyKTogVCMlZCBObyB0YXNrcyB0byByZW1vdmU6IG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCA9IHRhaWw7CisgICAgVENXXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MgLSAxKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGV4aXQgIzIpOiBUIyVkIHRhc2sgJXAgcmVtb3ZlZDogbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworCisgICAgdGFzayA9IEtNUF9UQVNLREFUQV9UT19UQVNLKCB0YXNrZGF0YSApOworICAgIHJldHVybiB0YXNrOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3N0ZWFsX3Rhc2s6IHJlbW92ZSBhIHRhc2sgZnJvbSBhbm90aGVyIHRocmVhZCdzIGRlcXVlCisvLyBBc3N1bWUgdGhhdCBjYWxsaW5nIHRocmVhZCBoYXMgYWxyZWFkeSBjaGVja2VkIGV4aXN0ZW5jZSBvZgorLy8gdGFza190ZWFtIHRocmVhZF9kYXRhIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKworc3RhdGljIGttcF90YXNrX3QgKgorX19rbXBfc3RlYWxfdGFzaygga21wX2luZm9fdCAqdmljdGltLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBrbXBfdWludDMyICp1bmZpbmlzaGVkX3RocmVhZHMsIGludCAqdGhyZWFkX2ZpbmlzaGVkLAorICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkICkKK3sKKyAgICBrbXBfdGFza190ICogdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhOworICAgIGttcF90aHJlYWRfZGF0YV90ICp2aWN0aW1fdGQsICp0aHJlYWRzX2RhdGE7CisgICAga21wX2ludDMyIHZpY3RpbV90aWQ7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworCisgICAgdGhyZWFkc19kYXRhID0gdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRzX2RhdGEgIT0gTlVMTCApOyAgLy8gQ2FsbGVyIHNob3VsZCBjaGVjayB0aGlzIGNvbmRpdGlvbgorCisgICAgdmljdGltX3RpZCA9IHZpY3RpbS0+dGgudGhfaW5mby5kcy5kc190aWQ7CisgICAgdmljdGltX3RkID0gJiB0aHJlYWRzX2RhdGFbIHZpY3RpbV90aWQgXTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZW50ZXIpOiBUIyVkIHRyeSB0byBzdGVhbCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCBudGFza3M9JWQgIgorICAgICAgICAgICAgICAgICAgImhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHZpY3RpbSApLCB0YXNrX3RlYW0sIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9oZWFkLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisKKyAgICBpZiAoIChUQ1JfNCh2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA9PSAwKSB8fCAvLyBDYWxsZXIgc2hvdWxkIG5vdCBjaGVjayB0aGlzIGNvbmRpdGlvbgorICAgICAgICAgKFRDUl9QVFIodmljdGltLT50aC50aF90YXNrX3RlYW0pICE9IHRhc2tfdGVhbSkpIC8vIEdFSDogd2h5IHdvdWxkIHRoaXMgaGFwcGVuPworICAgIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfc3RlYWxfdGFzayhleGl0ICMxKTogVCMlZCBjb3VsZCBub3Qgc3RlYWwgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgIgorICAgICAgICAgICAgICAgICAgICAgICJudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHZpY3RpbSApLCB0YXNrX3RlYW0sIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICAvLyBDaGVjayBhZ2FpbiBhZnRlciB3ZSBhY3F1aXJlIHRoZSBsb2NrCisgICAgaWYgKCAoVENSXzQodmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgfHwKKyAgICAgICAgIChUQ1JfUFRSKHZpY3RpbS0+dGgudGhfdGFza190ZWFtKSAhPSB0YXNrX3RlYW0pKSAvLyBHRUg6IHdoeSB3b3VsZCB0aGlzIGhhcHBlbj8KKyAgICB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfc3RlYWxfdGFzayhleGl0ICMyKTogVCMlZCBjb3VsZCBub3Qgc3RlYWwgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgIgorICAgICAgICAgICAgICAgICAgICAgICJudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHZpY3RpbSApLCB0YXNrX3RlYW0sIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWUgIT0gTlVMTCApOworCisgICAgdGFza2RhdGEgPSB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlW3ZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZF07CisgICAgaWYgKCBpc19jb25zdHJhaW5lZCApIHsKKyAgICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgY2FuZGlkYXRlIG9iZXlzIHRhc2sgc2NoZWR1bGluZyBjb25zdHJhaW50OgorICAgICAgICAvLyBvbmx5IGRlc2NlbmRhbnQgb2YgY3VycmVudCB0YXNrIGNhbiBiZSBzY2hlZHVsZWQKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50ID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIGttcF9pbnQzMiAgICAgICAgbGV2ZWwgPSBjdXJyZW50LT50ZF9sZXZlbDsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBwYXJlbnQgPSB0YXNrZGF0YS0+dGRfcGFyZW50OworICAgICAgICB3aGlsZSAoIHBhcmVudCAhPSBjdXJyZW50ICYmIHBhcmVudC0+dGRfbGV2ZWwgPiBsZXZlbCApIHsKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC0+dGRfcGFyZW50OyAgLy8gY2hlY2sgZ2VuZXJhdGlvbiB1cCB0byB0aGUgbGV2ZWwgb2YgdGhlIGN1cnJlbnQgdGFzaworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChwYXJlbnQgIT0gTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBwYXJlbnQgIT0gY3VycmVudCApIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBoZWFkIHRhc2sgaXMgbm90IGEgZGVzY2VuZGFudCBvZiB0aGUgY3VycmVudCB0YXNrIHRoZW4gZG8gbm90CisgICAgICAgICAgICAvLyBzdGVhbCBpdC4gTm8gb3RoZXIgdGFzayBpbiB2aWN0aW0ncyBkZXF1ZSBjYW4gYmUgYSBkZXNjZW5kYW50IG9mIHRoZQorICAgICAgICAgICAgLy8gY3VycmVudCB0YXNrLgorICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfc3RlYWxfdGFzayhleGl0ICMyKTogVCMlZCBjb3VsZCBub3Qgc3RlYWwgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkc19kYXRhW3ZpY3RpbV90aWRdLnRkLnRkX3RociApLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3RlYW0sIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIC8vIEJ1bXAgaGVhZCBwb2ludGVyIGFuZCBXcmFwLgorICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCA9ICh2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQgKyAxKSAmIFRBU0tfREVRVUVfTUFTSyh2aWN0aW1fdGQtPnRkKTsKKyAgICBpZiAoKnRocmVhZF9maW5pc2hlZCkgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHVuLW1hcmsgdGhpcyB2aWN0aW0gYXMgYSBmaW5pc2hlZCB2aWN0aW0uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAgICAgICAgLy8gcmVsZWFzaW5nIHRoZSBsb2NrLCBvciBlbHNlIG90aGVyIHRocmVhZHMgKHN0YXJ0aW5nIHdpdGggdGhlIG1hc3RlciB2aWN0aW0pCisgICAgICAgIC8vIG1pZ2h0IGJlIHByZW1hdHVyZWx5IHJlbGVhc2VkIGZyb20gdGhlIGJhcnJpZXIhISEKKyAgICAgICAga21wX3VpbnQzMiBjb3VudDsKKworICAgICAgICBjb3VudCA9IEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKTsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9zdGVhbF90YXNrOiBUIyVkIGluYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQ6IHRhc2tfdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudCArIDEsIHRhc2tfdGVhbSkgKTsKKworICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisgICAgfQorICAgIFRDV180KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIFRDUl80KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpIC0gMSk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soVEFTS19zdG9sZW4pOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMyk6IFQjJWQgc3RvbGUgdGFzayAlcCBmcm9tIFQjJWQ6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIHRhc2sgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyggdGFza2RhdGEgKTsKKyAgICByZXR1cm4gdGFzazsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBDaG9vc2UgYW5kIGV4ZWN1dGUgdGFza3MgdW50aWwgZWl0aGVyIHRoZSBjb25kaXRpb24KKy8vIGlzIHN0YXRpc2ZpZWQgKHJldHVybiB0cnVlKSBvciB0aGVyZSBhcmUgbm9uZSBsZWZ0IChyZXR1cm4gZmFsc2UpLgorLy8gZmluYWxfc3BpbiBpcyBUUlVFIGlmIHRoaXMgaXMgdGhlIHNwaW4gYXQgdGhlIHJlbGVhc2UgYmFycmllci4KKy8vIHRocmVhZF9maW5pc2hlZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGhyZWFkIGlzIGZpbmlzaGVkIGV4ZWN1dGluZyBhbGwKKy8vIHRoZSB0YXNrcyBpdCBoYXMgb24gaXRzIGRlcXVlLCBhbmQgaXMgYXQgdGhlIHJlbGVhc2UgYmFycmllci4KKy8vIHNwaW5uZXIgaXMgdGhlIGxvY2F0aW9uIG9uIHdoaWNoIHRvIHNwaW4uCisvLyBzcGlubmVyID09IE5VTEwgbWVhbnMgb25seSBleGVjdXRlIGEgc2luZ2xlIHRhc2sgYW5kIHJldHVybi4KKy8vIGNoZWNrZXIgaXMgdGhlIHZhbHVlIHRvIGNoZWNrIHRvIHRlcm1pbmF0ZSB0aGUgc3Bpbi4KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSBpbnQgX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBDICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCkKK3sKKyAgICBrbXBfdGFza190ZWFtX3QgKiAgICAgdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgICAga21wX3RocmVhZF9kYXRhX3QgKiAgIHRocmVhZHNfZGF0YTsKKyAgICBrbXBfdGFza190ICogICAgICAgICAgdGFzazsKKyAgICBrbXBfaW5mb190ICogICAgICAgICAgb3RoZXJfdGhyZWFkOworICAgIGttcF90YXNrZGF0YV90ICogICAgICBjdXJyZW50X3Rhc2sgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworICAgIHZvbGF0aWxlIGttcF91aW50MzIgKiB1bmZpbmlzaGVkX3RocmVhZHM7CisgICAga21wX2ludDMyICAgICAgICAgICAgIG50aHJlYWRzLCB2aWN0aW09LTIsIHVzZV9vd25fdGFza3M9MSwgbmV3X3ZpY3RpbT0wLCB0aWQ9dGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkID09IF9fa21wX3RocmVhZHNbIGd0aWQgXSApOworCisgICAgaWYgKHRhc2tfdGVhbSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKGVudGVyKTogVCMlZCBmaW5hbF9zcGluPSVkICp0aHJlYWRfZmluaXNoZWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBmaW5hbF9zcGluLCAqdGhyZWFkX2ZpbmlzaGVkKSApOworCisgICAgdGhyZWFkc19kYXRhID0gKGttcF90aHJlYWRfZGF0YV90ICopVENSX1BUUih0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRzX2RhdGEgIT0gTlVMTCApOworCisgICAgbnRocmVhZHMgPSB0YXNrX3RlYW0gLT4gdHQudHRfbnByb2M7CisgICAgdW5maW5pc2hlZF90aHJlYWRzID0gJih0YXNrX3RlYW0gLT4gdHQudHRfdW5maW5pc2hlZF90aHJlYWRzKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQoIG50aHJlYWRzID4gMSB8fCB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzKTsKKyNlbHNlCisgICAgS01QX0RFQlVHX0FTU0VSVCggbnRocmVhZHMgPiAxICk7CisjZW5kaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoaW50KShUQ1JfNCgqdW5maW5pc2hlZF90aHJlYWRzKSkgPj0gMCApOworCisgICAgd2hpbGUgKDEpIHsgLy8gT3V0ZXIgbG9vcCBrZWVwcyB0cnlpbmcgdG8gZmluZCB0YXNrcyBpbiBjYXNlIG9mIHNpbmdsZSB0aHJlYWQgZ2V0dGluZyB0YXNrcyBmcm9tIHRhcmdldCBjb25zdHJ1Y3RzCisgICAgICAgIHdoaWxlICgxKSB7IC8vIElubmVyIGxvb3AgdG8gZmluZCBhIHRhc2sgYW5kIGV4ZWN1dGUgaXQKKyAgICAgICAgICAgIHRhc2sgPSBOVUxMOworICAgICAgICAgICAgaWYgKHVzZV9vd25fdGFza3MpIHsgLy8gY2hlY2sgb24gb3duIHF1ZXVlIGZpcnN0CisgICAgICAgICAgICAgICAgdGFzayA9IF9fa21wX3JlbW92ZV9teV90YXNrKCB0aHJlYWQsIGd0aWQsIHRhc2tfdGVhbSwgaXNfY29uc3RyYWluZWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgodGFzayA9PSBOVUxMKSAmJiAobnRocmVhZHMgPiAxKSkgeyAvLyBTdGVhbCBhIHRhc2sKKyAgICAgICAgICAgICAgICBpbnQgYXNsZWVwID0gMTsKKyAgICAgICAgICAgICAgICB1c2Vfb3duX3Rhc2tzID0gMDsKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gc3RlYWwgZnJvbSB0aGUgbGFzdCBwbGFjZSBJIHN0b2xlIGZyb20gc3VjY2Vzc2Z1bGx5LgorICAgICAgICAgICAgICAgIGlmICh2aWN0aW0gPT0gLTIpIHsgLy8gaGF2ZW4ndCBzdG9sZW4gYW55dGhpbmcgeWV0CisgICAgICAgICAgICAgICAgICAgIHZpY3RpbSA9IHRocmVhZHNfZGF0YVt0aWRdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuOworICAgICAgICAgICAgICAgICAgICBpZiAodmljdGltICE9IC0xKSAvLyBpZiB3ZSBoYXZlIGEgbGFzdCBzdG9sZW4gZnJvbSB2aWN0aW0sIGdldCB0aGUgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWQgPSB0aHJlYWRzX2RhdGFbdmljdGltXS50ZC50ZF90aHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2aWN0aW0gIT0gLTEpIHsgLy8gZm91bmQgbGFzdCB2aWN0aW0KKyAgICAgICAgICAgICAgICAgICAgYXNsZWVwID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIW5ld192aWN0aW0pIHsgLy8gbm8gcmVjZW50IHN0ZWFscyBhbmQgd2UgaGF2ZW4ndCBhbHJlYWR5IHVzZWQgYSBuZXcgdmljdGltOyBzZWxlY3QgYSByYW5kb20gdGhyZWFkCisgICAgICAgICAgICAgICAgICAgIGRvIHsgLy8gRmluZCBhIGRpZmZlcmVudCB0aHJlYWQgdG8gc3RlYWwgd29yayBmcm9tLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGljayBhIHJhbmRvbSB0aHJlYWQuIEluaXRpYWwgcGxhbiB3YXMgdG8gY3ljbGUgdGhyb3VnaCBhbGwgdGhlIHRocmVhZHMsIGFuZCBvbmx5IHJldHVybiBpZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgdHJpZWQgdG8gc3RlYWwgZnJvbSBldmVyeSB0aHJlYWQsIGFuZCBmYWlsZWQuICBBcmNoIHNheXMgdGhhdCdzIG5vdCBzdWNoIGEgZ3JlYXQgaWRlYS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbSA9IF9fa21wX2dldF9yYW5kb20odGhyZWFkKSAlIChudGhyZWFkcyAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpY3RpbSA+PSB0aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3ZpY3RpbTsgIC8vIEFkanVzdHMgcmFuZG9tIGRpc3RyaWJ1dGlvbiB0byBleGNsdWRlIHNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgcG90ZW50aWFsIHZpY3RpbQorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkID0gdGhyZWFkc19kYXRhW3ZpY3RpbV0udGQudGRfdGhyOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBzbGlnaHQgY2hhbmNlIHRoYXQgX19rbXBfZW5hYmxlX3Rhc2tpbmcoKSBkaWQgbm90IHdha2UgdXAgYWxsIHRocmVhZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRpbmcgYXQgdGhlIGJhcnJpZXIuICBJZiB2aWN0aW0gaXMgc2xlZXBpbmcsIHRoZW4gd2FrZSBpdCB1cC4gIFNpbmNlIHdlIHdlcmUgZ29pbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBheSB0aGUgY2FjaGUgbWlzcyBwZW5hbHR5IGZvciByZWZlcmVuY2luZyBhbm90aGVyIHRocmVhZCdzIGttcF9pbmZvX3Qgc3RydWN0IGFueXdheSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjaGVjayBzaG91bGRuJ3QgY29zdCB0b28gbXVjaCBwZXJmb3JtYW5jZSBhdCB0aGlzIHBvaW50LiBJbiBleHRyYSBiYXJyaWVyIG1vZGUsIHRhc2tzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3Qgc2xlZXAgYXQgdGhlIHNlcGFyYXRlIHRhc2tpbmcgYmFycmllciwgc28gdGhpcyBpc24ndCBhIHByb2JsZW0uCisgICAgICAgICAgICAgICAgICAgICAgICBhc2xlZXAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX3Rhc2tfdGVhbXMgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUQ1JfUFRSKG90aGVyX3RocmVhZC0+dGgudGhfc2xlZXBfbG9jKSAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbGVlcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKG90aGVyX3RocmVhZCksIG90aGVyX3RocmVhZC0+dGgudGhfc2xlZXBfbG9jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHNsZWVwaW5nIHRocmVhZCBzaG91bGQgbm90IGhhdmUgYW55IHRhc2tzIG9uIGl0J3MgcXVldWUuIFRoZXJlIGlzIGEgc2xpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2liaWxpdHkgdGhhdCBpdCByZXN1bWVzLCBzdGVhbHMgYSB0YXNrIGZyb20gYW5vdGhlciB0aHJlYWQsIHdoaWNoIHNwYXducyBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFza3MsIGFsbCBpbiB0aGUgdGltZSB0aGF0IGl0IHRha2VzIHRoaXMgdGhyZWFkIHRvIGNoZWNrID0+IGRvbid0IHdyaXRlIGFuIGFzc2VydGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHZpY3RpbSdzIHF1ZXVlIGlzIGVtcHR5LiAgVHJ5IHN0ZWFsaW5nIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkLgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChhc2xlZXApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYXNsZWVwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSB2aWN0aW0gdG8gdHJ5IHRvIHN0ZWFsIGZyb20KKyAgICAgICAgICAgICAgICAgICAgdGFzayA9IF9fa21wX3N0ZWFsX3Rhc2sob3RoZXJfdGhyZWFkLCBndGlkLCB0YXNrX3RlYW0sIHVuZmluaXNoZWRfdGhyZWFkcywgdGhyZWFkX2ZpbmlzaGVkLCBpc19jb25zdHJhaW5lZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0YXNrICE9IE5VTEwpIHsgLy8gc2V0IGxhc3Qgc3RvbGVuIHRvIHZpY3RpbQorICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkc19kYXRhW3RpZF0udGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gIT0gdmljdGltKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRzX2RhdGFbdGlkXS50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IHZpY3RpbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmUtcmVmYWN0b3JlZCBjb2RlIGRpZCBub3QgdHJ5IG1vcmUgdGhhbiAxIHN1Y2Nlc3NmdWwgbmV3IHZpY2l0bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyB0aGUgbGFzdCBvbmUgZ2VuZXJhdGVkIG1vcmUgbG9jYWwgdGFza3M7IG5ld192aWN0aW0ga2VlcHMgdHJhY2sgb2YgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3ZpY3RpbSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7IC8vIE5vIHRhc2tzIGZvdW5kOyB1bnNldCBsYXN0X3N0b2xlbgorICAgICAgICAgICAgICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRocmVhZHNfZGF0YVt0aWRdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuLCAtMSk7CisgICAgICAgICAgICAgICAgICAgIHZpY3RpbSA9IC0yOyAvLyBubyBzdWNjZXNzZnVsIHZpY3RpbSBmb3VuZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRhc2sgPT0gTlVMTCkgLy8gYnJlYWsgb3V0IG9mIHRhc2tpbmcgbG9vcAorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBGb3VuZCBhIHRhc2s7IGV4ZWN1dGUgaXQKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICBpZiAoIF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgeworICAgICAgICAgICAgICAgIGlmICggaXR0X3N5bmNfb2JqID09IE5VTEwgKSB7IC8vIHdlIGFyZSBhdCBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCggZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyggaXR0X3N5bmNfb2JqICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAgICAgX19rbXBfaW52b2tlX3Rhc2soIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKSBfX2ttcF9pdHRfdGFza19maW5pc2hlZCggaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgaXMgb25seSBwYXJ0d2F5IHRocm91Z2ggdGhlIGJhcnJpZXIgYW5kIHRoZSBjb25kaXRpb24gaXMgbWV0LCB0aGVuIHJldHVybiBub3csCisgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBiYXJyaWVyIGdhdGhlci9yZWxlYXNlIHBhdHRlcm4gY2FuIHByb2NlZWQuIElmIHRoaXMgdGhyZWFkIGlzIGluIHRoZSBsYXN0IHNwaW4gbG9vcAorICAgICAgICAgICAgLy8gaW4gdGhlIGJhcnJpZXIsIHdhaXRpbmcgdG8gYmUgcmVsZWFzZWQsIHdlIGtub3cgdGhhdCB0aGUgdGVybWluYXRpb24gY29uZGl0aW9uIHdpbGwgbm90IGJlCisgICAgICAgICAgICAvLyBzYXRpc2lmaWVkLCBzbyBkb24ndCB3YXN0ZSBhbnkgY3ljbGVzIGNoZWNraW5nIGl0LgorICAgICAgICAgICAgaWYgKGZsYWcgPT0gTlVMTCB8fCAoIWZpbmFsX3NwaW4gJiYgZmxhZy0+ZG9uZV9jaGVjaygpKSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGU6IFQjJWQgc3BpbiBjb25kaXRpb24gc2F0aXNmaWVkXG4iLCBndGlkKSApOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRocmVhZC0+dGgudGhfdGFza190ZWFtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ZSUVMRCggX19rbXBfbGlicmFyeSA9PSBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsgICAvLyBZaWVsZCBiZWZvcmUgZXhlY3V0aW5nIG5leHQgdGFzaworICAgICAgICAgICAgLy8gSWYgZXhlY3V0aW9uIG9mIGEgc3RvbGVuIHRhc2sgcmVzdWx0cyBpbiBtb3JlIHRhc2tzIGJlaW5nIHBsYWNlZCBvbiBvdXIgcnVuIHF1ZXVlLCByZXNldCB1c2Vfb3duX3Rhc2tzCisgICAgICAgICAgICBpZiAoIXVzZV9vd25fdGFza3MgJiYgVENSXzQodGhyZWFkc19kYXRhW3RpZF0udGQudGRfZGVxdWVfbnRhc2tzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogVCMlZCBzdG9sZW4gdGFzayBzcGF3bmVkIG90aGVyIHRhc2tzLCByZXN0YXJ0XG4iLCBndGlkKSk7CisgICAgICAgICAgICAgICAgdXNlX293bl90YXNrcyA9IDE7CisgICAgICAgICAgICAgICAgbmV3X3ZpY3RpbSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgdGFzayBzb3VyY2UgaGFzIGJlZW4gZXhoYXVzdGVkLiBJZiBpbiBmaW5hbCBzcGluIGxvb3Agb2YgYmFycmllciwgY2hlY2sgaWYgdGVybWluYXRpb24gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgICAvLyBUaGUgd29yayBxdWV1ZSBtYXkgYmUgZW1wdHkgYnV0IHRoZXJlIG1pZ2h0IGJlIHByb3h5IHRhc2tzIHN0aWxsIGV4ZWN1dGluZworICAgICAgICBpZiAoZmluYWxfc3BpbiAmJiBUQ1JfNChjdXJyZW50X3Rhc2stPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpID09IDApCisjZWxzZQorICAgICAgICBpZiAoZmluYWxfc3BpbikKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICAvLyBGaXJzdCwgZGVjcmVtZW50IHRoZSAjdW5maW5pc2hlZCB0aHJlYWRzLCBpZiB0aGF0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGRvbmUuICBUaGlzIGRlY3JlbWVudAorICAgICAgICAgICAgLy8gbWlnaHQgYmUgdG8gdGhlIHNwaW4gbG9jYXRpb24sIGFuZCByZXN1bHQgaW4gdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBiZWluZyBzYXRpc2ZpZWQuCisgICAgICAgICAgICBpZiAoISAqdGhyZWFkX2ZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBjb3VudDsKKworICAgICAgICAgICAgICAgIGNvdW50ID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKXVuZmluaXNoZWRfdGhyZWFkcyApIC0gMTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBUIyVkIGRlYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQgdGFza190ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgY291bnQsIHRhc2tfdGVhbSkgKTsKKyAgICAgICAgICAgICAgICAqdGhyZWFkX2ZpbmlzaGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSXQgaXMgbm93IHVuc2FmZSB0byByZWZlcmVuY2UgdGhyZWFkLT50aC50aF90ZWFtICEhIQorICAgICAgICAgICAgLy8gRGVjcmVtZW50aW5nIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzIGNhbiBhbGxvdyB0aGUgbWFzdGVyIHRocmVhZCB0byBwYXNzIHRocm91Z2gKKyAgICAgICAgICAgIC8vIHRoZSBiYXJyaWVyLCB3aGVyZSBpdCBtaWdodCByZXNldCBlYWNoIHRocmVhZCdzIHRoLnRoX3RlYW0gZmllbGQgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKyAgICAgICAgICAgIC8vIElmIHdlIGNhbiBzdGVhbCBtb3JlIHdvcmssIHdlIGtub3cgdGhhdCB0aGlzIGhhcyBub3QgaGFwcGVuZWQgeWV0LgorICAgICAgICAgICAgaWYgKGZsYWcgIT0gTlVMTCAmJiBmbGFnLT5kb25lX2NoZWNrKCkpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkJ3MgdGFzayB0ZWFtIGlzIE5VTEwsIG1hc3RlciBoYXMgcmVjb2duaXplZCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRhc2tzOyBiYWlsIG91dAorICAgICAgICBpZiAodGhyZWFkLT50aC50aF90YXNrX3RlYW0gPT0gTlVMTCkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogVCMlZCBubyBtb3JlIHRhc2tzXG4iLCBndGlkKSApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgICAvLyBXZSBjb3VsZCBiZSBnZXR0aW5nIHRhc2tzIGZyb20gdGFyZ2V0IGNvbnN0cnVjdHM7IGlmIHRoaXMgaXMgdGhlIG9ubHkgdGhyZWFkLCBrZWVwIHRyeWluZyB0byBleGVjdXRlCisgICAgICAgIC8vIHRhc2tzIGZyb20gb3duIHF1ZXVlCisgICAgICAgIGlmIChudGhyZWFkcyA9PSAxKQorICAgICAgICAgICAgdXNlX293bl90YXNrcyA9IDE7CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBUIyVkIGNhbid0IGZpbmQgd29ya1xuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IF9fa21wX2V4ZWN1dGVfdGFza3NfMzIoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcsIGludCBmaW5hbF9zcGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpCit7CisgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUodGhyZWFkLCBndGlkLCBmbGFnLCBmaW5hbF9zcGluLCB0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBpc19jb25zdHJhaW5lZCk7Cit9CisKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzXzY0KGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF9mbGFnXzY0ICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKQoreworICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKHRocmVhZCwgZ3RpZCwgZmxhZywgZmluYWxfc3BpbiwgdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworfQorCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc19vbmNvcmUoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpCit7CisgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUodGhyZWFkLCBndGlkLCBmbGFnLCBmaW5hbF9zcGluLCB0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBpc19jb25zdHJhaW5lZCk7Cit9CisKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9lbmFibGVfdGFza2luZzogQWxsb2NhdGUgdGFzayB0ZWFtIGFuZCByZXN1bWUgdGhyZWFkcyBzbGVlcGluZyBhdCB0aGUKKy8vIG5leHQgYmFycmllciBzbyB0aGV5IGNhbiBhc3Npc3QgaW4gZXhlY3V0aW5nIGVucXVldWVkIHRhc2tzLgorLy8gRmlyc3QgdGhyZWFkIGluIGFsbG9jYXRlcyB0aGUgdGFzayB0ZWFtIGF0b21pY2FsbHkuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9lbmFibGVfdGFza2luZygga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sIGttcF9pbmZvX3QgKnRoaXNfdGhyICkKK3sKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkc19kYXRhOworICAgIGludCBudGhyZWFkcywgaSwgaXNfaW5pdF90aHJlYWQ7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2VuYWJsZV90YXNraW5nKGVudGVyKTogVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRhc2tfdGVhbSAhPSBOVUxMKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtICE9IE5VTEwpOworCisgICAgbnRocmVhZHMgPSB0YXNrX3RlYW0tPnR0LnR0X25wcm9jOworICAgIEtNUF9ERUJVR19BU1NFUlQobnRocmVhZHMgPiAwKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG50aHJlYWRzID09IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbnByb2MpOworCisgICAgLy8gQWxsb2NhdGUgb3IgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhyZWFkc19kYXRhIGlmIG5lY2Vzc2FyeQorICAgIGlzX2luaXRfdGhyZWFkID0gX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YSggdGhpc190aHIsIHRhc2tfdGVhbSApOworCisgICAgaWYgKCFpc19pbml0X3RocmVhZCkgeworICAgICAgICAvLyBTb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IHNldCB1cCB0aGUgYXJyYXkuCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmcoZXhpdCk6IFQjJWQ6IHRocmVhZHMgYXJyYXkgYWxyZWFkeSBzZXQgdXAuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSApICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdGhyZWFkc19kYXRhID0gKGttcF90aHJlYWRfZGF0YV90ICopVENSX1BUUih0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRzX2RhdGEgIT0gTlVMTCApOworCisgICAgaWYgKCAoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX3Rhc2tfdGVhbXMgKSAmJgorICAgICAgICAgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSApICkKKyAgICB7CisgICAgICAgIC8vIFJlbGVhc2UgYW55IHRocmVhZHMgc2xlZXBpbmcgYXQgdGhlIGJhcnJpZXIsIHNvIHRoYXQgdGhleSBjYW4gc3RlYWwKKyAgICAgICAgLy8gdGFza3MgYW5kIGV4ZWN1dGUgdGhlbS4gIEluIGV4dHJhIGJhcnJpZXIgbW9kZSwgdGFza3MgZG8gbm90IHNsZWVwCisgICAgICAgIC8vIGF0IHRoZSBzZXBhcmF0ZSB0YXNraW5nIGJhcnJpZXIsIHNvIHRoaXMgaXNuJ3QgYSBwcm9ibGVtLgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgICAgICAgdm9sYXRpbGUgdm9pZCAqc2xlZXBfbG9jOworICAgICAgICAgICAga21wX2luZm9fdCAqdGhyZWFkID0gdGhyZWFkc19kYXRhW2ldLnRkLnRkX3RocjsKKworICAgICAgICAgICAgaWYgKGkgPT0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTaW5jZSB3ZSBoYXZlbid0IGxvY2tlZCB0aGUgdGhyZWFkJ3Mgc3VzcGVuZCBtdXRleCBsb2NrIGF0IHRoaXMKKyAgICAgICAgICAgIC8vIHBvaW50LCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyB3aGVyZSBhIHRocmVhZCBtaWdodCBiZSBwdXR0aW5nCisgICAgICAgICAgICAvLyBpdHNlbGYgdG8gc2xlZXAsIGJ1dCBoYXNuJ3Qgc2V0IHRoZSB0aF9zbGVlcF9sb2MgZmllbGQgeWV0LgorICAgICAgICAgICAgLy8gVG8gd29yayBhcm91bmQgdGhpcywgX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZSgpIHBlcmlvZGljYWxseSBjaGVja3MKKyAgICAgICAgICAgIC8vIHNlZSBpZiBvdGhlciB0aHJlYWRzIGFyZSBzbGVlcGluZyAodXNpbmcgdGhlIHNhbWUgcmFuZG9tCisgICAgICAgICAgICAvLyBtZWNoYW5pc20gdGhhdCBpcyB1c2VkIGZvciB0YXNrIHN0ZWFsaW5nKSBhbmQgYXdha2VucyB0aGVtIGlmCisgICAgICAgICAgICAvLyB0aGV5IGFyZS4KKyAgICAgICAgICAgIGlmICggKCBzbGVlcF9sb2MgPSBUQ1JfUFRSKCB0aHJlYWQgLT4gdGgudGhfc2xlZXBfbG9jKSApICE9IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtGX1RSQUNFKCA1MCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmc6IFQjJWQgd2FraW5nIHVwIHRocmVhZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApICkgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyKF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyZWFkKSwgc2xlZXBfbG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtGX1RSQUNFKCA1MCwgKCAiX19rbXBfZW5hYmxlX3Rhc2tpbmc6IFQjJWQgZG9uJ3Qgd2FrZSB1cCB0aHJlYWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2VuYWJsZV90YXNraW5nKGV4aXQpOiBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApICkgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC8vIFRPRE86IENoZWNrIHRoZSBjb21tZW50IGNvbnNpc3RlbmN5CisgKiBVdGlsaXR5IHJvdXRpbmVzIGZvciAidGFzayB0ZWFtcyIuICBBIHRhc2sgdGVhbSAoa21wX3Rhc2tfdCkgaXMga2luZCBvZgorICogbGlrZSBhIHNoYWRvdyBvZiB0aGUga21wX3RlYW1fdCBkYXRhIHN0cnVjdCwgd2l0aCBhIGRpZmZlcmVudCBsaWZldGltZS4KKyAqIEFmdGVyIGEgY2hpbGQgKiB0aHJlYWQgY2hlY2tzIGludG8gYSBiYXJyaWVyIGFuZCBjYWxscyBfX2ttcF9yZWxlYXNlKCkgZnJvbQorICogdGhlIHBhcnRpY3VsYXIgdmFyaWFudCBvZiBfX2ttcF88YmFycmllcl9raW5kPl9iYXJyaWVyX2dhdGhlcigpLCBpdCBjYW4gbm8KKyAqIGxvbmdlciBhc3N1bWUgdGhhdCB0aGUga21wX3RlYW1fdCBzdHJ1Y3R1cmUgaXMgaW50YWN0IChhdCBhbnkgbW9tZW50LCB0aGUKKyAqIG1hc3RlciB0aHJlYWQgbWF5IGV4aXQgdGhlIGJhcnJpZXIgY29kZSBhbmQgZnJlZSB0aGUgdGVhbSBkYXRhIHN0cnVjdHVyZSwKKyAqIGFuZCByZXR1cm4gdGhlIHRocmVhZHMgdG8gdGhlIHRocmVhZCBwb29sKS4KKyAqCisgKiBUaGlzIGRvZXMgbm90IHdvcmsgd2l0aCB0aGUgdGhlIHRhc2tpbmcgY29kZSwgYXMgdGhlIHRocmVhZCBpcyBzdGlsbAorICogZXhwZWN0ZWQgdG8gcGFydGljaXBhdGUgaW4gdGhlIGV4ZWN1dGlvbiBvZiBhbnkgdGFza3MgdGhhdCBtYXkgaGF2ZSBiZWVuCisgKiBzcGF3bmVkIG15IGEgbWVtYmVyIG9mIHRoZSB0ZWFtLCBhbmQgdGhlIHRocmVhZCBzdGlsbCBuZWVkcyBhY2Nlc3MgdG8gYWxsCisgKiB0byBlYWNoIHRocmVhZCBpbiB0aGUgdGVhbSwgc28gdGhhdCBpdCBjYW4gc3RlYWwgd29yayBmcm9tIGl0LgorICoKKyAqIEVudGVyIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGttcF90YXNrX3RlYW1fdCBzdHJ1Y3QuICBJdCBlbXBsb3lzIGEgcmVmZXJlbmNlCisgKiBjb3VudGluZyBtZWNoYW5pbXMsIGFuZCBpcyBhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYmVmb3JlIGNhbGxpbmcKKyAqIF9fa21wXzxiYXJyaWVyX2tpbmQ+X3JlbGVhc2UsIGFuZCB0aGVuIGlzIHJlbGVhc2UgYnkgdGhlIGxhc3QgdGhyZWFkIHRvCisgKiBleGl0IF9fa21wXzxiYXJyaWVyX2tpbmQ+X3JlbGVhc2UgYXQgdGhlIG5leHQgYmFycmllci4gIEkuZS4gdGhlIGxpZmV0aW1lcworICogb2YgdGhlIGttcF90YXNrX3RlYW1fdCBzdHJ1Y3RzIGZvciBjb25zZWN1dGl2ZSBiYXJyaWVycyBjYW4gb3ZlcmxhcAorICogKGFuZCB3aWxsLCB1bmxlc3MgdGhlIG1hc3RlciB0aHJlYWQgaXMgdGhlIGxhc3QgdGhyZWFkIHRvIGV4aXQgdGhlIGJhcnJpZXIKKyAqIHJlbGVhc2UgcGhhc2UsIHdoaWNoIGlzIG5vdCB0eXBpY2FsKS4KKyAqCisgKiBUaGUgZXhpc3RlbmNlIG9mIHN1Y2ggYSBzdHJ1Y3QgaXMgdXNlZnVsIG91dHNpZGUgdGhlIGNvbnRleHQgb2YgdGFza2luZywKKyAqIGJ1dCBmb3Igbm93LCBJJ20gdHJ5aW5nIHRvIGtlZXAgaXQgc3BlY2lmaWMgdG8gdGhlIE9NUF8zMF9FTkFCTEVEIG1hY3JvLAorICogc28gdGhhdCBhbnkgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZXMgc2hvdyB1cCB3aGVuIGNvbXBhcmluZyB0aGUgMi41IHZzLiAzLjAKKyAqIGxpYnJhcmllcy4KKyAqCisgKiBXZSBjdXJyZW50bHkgdXNlIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHRocmVhZHMgYXJyYXkgYXMgYW4gaW5kaWNhdG9yIHRoYXQKKyAqIHRhc2tzIHdlcmUgc3Bhd25lZCBzaW5jZSB0aGUgbGFzdCBiYXJyaWVyLiAgSWYgdGhlIHN0cnVjdHVyZSBpcyB0byBiZQorICogdXNlZnVsIG91dHNpZGUgdGhlIGNvbnRleHQgb2YgdGFza2luZywgdGhlbiB0aGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UsIGJ1dAorICogbm90IHNldHR0aW5nIHRoZSBmaWVsZCBtaW5pbWl6ZXMgdGhlIHBlcmZvcm1hbmNlIGltcGFjdCBvZiB0YXNraW5nIG9uCisgKiBiYXJyaWVycywgd2hlbiBubyBleHBsaWNpdCB0YXNrcyB3ZXJlIHNwYXduZWQgKHB1c2hlZCwgYWN0dWFsbHkpLgorICovCisKKworc3RhdGljIGttcF90YXNrX3RlYW1fdCAqX19rbXBfZnJlZV90YXNrX3RlYW1zID0gTlVMTDsgICAgICAgICAgIC8vIEZyZWUgbGlzdCBmb3IgdGFza190ZWFtIGRhdGEgc3RydWN0dXJlcworLy8gTG9jayBmb3IgdGFzayB0ZWFtIGRhdGEgc3RydWN0dXJlcworc3RhdGljIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3Rhc2tfdGVhbV9sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF90YXNrX3RlYW1fbG9jayApOworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9hbGxvY190YXNrX2RlcXVlOgorLy8gQWxsb2NhdGVzIGEgdGFzayBkZXF1ZSBmb3IgYSBwYXJ0aWN1bGFyIHRocmVhZCwgYW5kIGluaXRpYWxpemUgdGhlIG5lY2Vzc2FyeQorLy8gZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0aW5nIHRvIHRoZSBkZXF1ZS4gIFRoaXMgb25seSBoYXBwZW5zIG9uY2UgcGVyIHRocmVhZAorLy8gcGVyIHRhc2sgdGVhbSBzaW5jZSB0YXNrIHRlYW1zIGFyZSByZWN5Y2xlZC4KKy8vIE5vIGxvY2sgaXMgbmVlZGVkIGR1cmluZyBhbGxvY2F0aW9uIHNpbmNlIGVhY2ggdGhyZWFkIGFsbG9jYXRlcyBpdHMgb3duCisvLyBkZXF1ZS4KKworc3RhdGljIHZvaWQKK19fa21wX2FsbG9jX3Rhc2tfZGVxdWUoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhICkKK3sKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9PSBOVUxMICk7CisKKyAgICAvLyBJbml0aWFsaXplIGxhc3Qgc3RvbGVuIHRhc2sgZmllbGQgdG8gIm5vbmUiCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gPSAtMTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2hlYWQgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgPT0gMCApOworCisgICAgS0VfVFJBQ0UoIDEwLCAoICJfX2ttcF9hbGxvY190YXNrX2RlcXVlOiBUIyVkIGFsbG9jYXRpbmcgZGVxdWVbJWRdIGZvciB0aHJlYWRfZGF0YSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgSU5JVElBTF9UQVNLX0RFUVVFX1NJWkUsIHRocmVhZF9kYXRhICkgKTsKKyAgICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgdGFzayBkZXF1ZSwgYW5kIHplcm8gdGhlIGRlcXVlCisgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfY2FsbG9jKCkgYmVjYXVzZSB0aHJlYWRzIG5vdCBhcm91bmQgZm9yCisgICAgLy8ga21wX3JlYXBfdGFza190ZWFtKCApLgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID0gKGttcF90YXNrZGF0YV90ICoqKQorICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopKTsKKwl0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9zaXplID0gSU5JVElBTF9UQVNLX0RFUVVFX1NJWkU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9yZWFsbG9jX3Rhc2tfZGVxdWU6CisvLyBSZS1hbGxvY2F0ZXMgYSB0YXNrIGRlcXVlIGZvciBhIHBhcnRpY3VsYXIgdGhyZWFkLCBjb3BpZXMgdGhlIGNvbnRlbnQgZnJvbSB0aGUgb2xkIGRlcXVlCisvLyBhbmQgYWRqdXN0cyB0aGUgbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcyByZWxhdGluZyB0byB0aGUgZGVxdWUuCisvLyBUaGlzIG9wZXJhdGlvbiBtdXN0IGJlIGRvbmUgd2l0aCBhIHRoZSBkZXF1ZV9sb2NrIGJlaW5nIGhlbGQKKworc3RhdGljIHZvaWQgX19rbXBfcmVhbGxvY190YXNrX2RlcXVlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgKQoreworICAgIGttcF9pbnQzMiBzaXplID0gVEFTS19ERVFVRV9TSVpFKHRocmVhZF9kYXRhLT50ZCk7CisgICAga21wX2ludDMyIG5ld19zaXplID0gMiAqIHNpemU7CisKKyAgICBLRV9UUkFDRSggMTAsICggIl9fa21wX3JlYWxsb2NfdGFza19kZXF1ZTogVCMlZCByZWFsbG9jYXRpbmcgZGVxdWVbZnJvbSAlZCB0byAlZF0gZm9yIHRocmVhZF9kYXRhICVwXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHNpemUsIG5ld19zaXplLCB0aHJlYWRfZGF0YSApICk7CisKKyAgICBrbXBfdGFza2RhdGFfdCAqKiBuZXdfZGVxdWUgPSAoa21wX3Rhc2tkYXRhX3QgKiopIF9fa21wX2FsbG9jYXRlKCBuZXdfc2l6ZSAqIHNpemVvZihrbXBfdGFza2RhdGFfdCAqKSk7CisKKyAgICBpbnQgaSxqOworICAgIGZvciAoIGkgPSB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwgaiA9IDA7IGogPCBzaXplOyBpID0gKGkrMSkgJiBUQVNLX0RFUVVFX01BU0sodGhyZWFkX2RhdGEtPnRkKSwgaisrICkKKyAgICAgICBuZXdfZGVxdWVbal0gPSB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVbaV07CisKKyAgICBfX2ttcF9mcmVlKHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZSk7CisKKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9oZWFkID0gMDsKKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsID0gc2l6ZTsKKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9IG5ld19kZXF1ZTsKKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9zaXplID0gbmV3X3NpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2tfZGVxdWU6CisvLyBEZWFsbG9jYXRlcyBhIHRhc2sgZGVxdWUgZm9yIGEgcGFydGljdWxhciB0aHJlYWQuCisvLyBIYXBwZW5zIGF0IGxpYnJhcnkgZGVhbGxvY2F0aW9uIHNvIGRvbid0IG5lZWQgdG8gcmVzZXQgYWxsIHRocmVhZCBkYXRhIGZpZWxkcy4KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza19kZXF1ZSgga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIGlmICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgIT0gTlVMTCApIHsKKyAgICAgICAgVENXXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzLCAwKTsKKyAgICAgICAgIF9fa21wX2ZyZWUoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlICk7CisgICAgICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID0gTlVMTDsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAvLyBHRUg6IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyBoZXJlIGZvciB0ZF9zdXNwX3RpZWRfdGFza3MKKyAgICBpZiAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX3N1c3BfdGllZF90YXNrcy50c19lbnRyaWVzICE9IFRBU0tfU1RBQ0tfRU1QVFkgKSB7CisgICAgICAgIF9fa21wX2ZyZWVfdGFza19zdGFjayggX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApLCB0aHJlYWRfZGF0YSApOworICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YToKKy8vIEFsbG9jYXRlcyBhIHRocmVhZHNfZGF0YSBhcnJheSBmb3IgYSB0YXNrIHRlYW0sIGVpdGhlciBieSBhbGxvY2F0aW5nIGFuIGluaXRpYWwKKy8vIGFycmF5IG9yIGVubGFyZ2luZyBhbiBleGlzdGluZyBhcnJheS4gIE9ubHkgdGhlIGZpcnN0IHRocmVhZCB0byBnZXQgdGhlIGxvY2sKKy8vIGFsbG9jcyBvciBlbmxhcmdlcyB0aGUgYXJyYXkgYW5kIHJlLWluaXRpYWxpemVzIHRoZSBhcnJheSBlbGVlbW50cy4KKy8vIFRoYXQgdGhyZWFkIHJldHVybnMgIlRSVUUiLCB0aGUgcmVzdCByZXR1cm4gIkZBTFNFIi4KKy8vIEFzc3VtZXMgdGhhdCB0aGUgbmV3IGFycmF5IHNpemUgaXMgZ2l2ZW4gYnkgdGFza190ZWFtIC0+IHR0LnR0X25wcm9jLgorLy8gVGhlIGN1cnJlbnQgc2l6ZSBpcyBnaXZlbiBieSB0YXNrX3RlYW0gLT4gdHQudHRfbWF4X3RocmVhZHMuCisKK3N0YXRpYyBpbnQKK19fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGEoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKQoreworICAgIGttcF90aHJlYWRfZGF0YV90ICoqIHRocmVhZHNfZGF0YV9wOworICAgIGttcF9pbnQzMiAgICAgICAgICAgIG50aHJlYWRzLCBtYXh0aHJlYWRzOworICAgIGludCAgICAgICAgICAgICAgICAgIGlzX2luaXRfdGhyZWFkID0gRkFMU0U7CisKKyAgICBpZiAoIFRDUl80KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcykgKSB7CisgICAgICAgIC8vIEFscmVhZHkgcmVhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLgorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgdGhyZWFkc19kYXRhX3AgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGE7CisgICAgbnRocmVhZHMgICA9IHRhc2tfdGVhbSAtPiB0dC50dF9ucHJvYzsKKyAgICBtYXh0aHJlYWRzID0gdGFza190ZWFtIC0+IHR0LnR0X21heF90aHJlYWRzOworCisgICAgLy8gQWxsIHRocmVhZHMgbXVzdCBsb2NrIHdoZW4gdGhleSBlbmNvdW50ZXIgdGhlIGZpcnN0IHRhc2sgb2YgdGhlIGltcGxpY2l0IHRhc2sKKyAgICAvLyByZWdpb24gdG8gbWFrZSBzdXJlIHRocmVhZHNfZGF0YSBmaWVsZHMgYXJlIChyZSlpbml0aWFsaXplZCBiZWZvcmUgdXNlZC4KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKKworICAgIGlmICggISBUQ1JfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MpICkgeworICAgICAgICAvLyBmaXJzdCB0aHJlYWQgdG8gZW5hYmxlIHRhc2tpbmcKKyAgICAgICAga21wX3RlYW1fdCAqdGVhbSA9IHRocmVhZCAtPiB0aC50aF90ZWFtOworICAgICAgICBpbnQgaTsKKworICAgICAgICBpc19pbml0X3RocmVhZCA9IFRSVUU7CisgICAgICAgIGlmICggbWF4dGhyZWFkcyA8IG50aHJlYWRzICkgeworCisgICAgICAgICAgICBpZiAoICp0aHJlYWRzX2RhdGFfcCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICpvbGRfZGF0YSA9ICp0aHJlYWRzX2RhdGFfcDsKKyAgICAgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqbmV3X2RhdGEgPSBOVUxMOworCisgICAgICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhOiBUIyVkIHJlYWxsb2NhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZHMgZGF0YSBmb3IgdGFza190ZWFtICVwLCBuZXdfc2l6ZSA9ICVkLCBvbGRfc2l6ZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRocmVhZHMsIG1heHRocmVhZHMgKSApOworICAgICAgICAgICAgICAgIC8vIFJlYWxsb2NhdGUgdGhyZWFkc19kYXRhIHRvIGhhdmUgbW9yZSBlbGVtZW50cyB0aGFuIGN1cnJlbnQgYXJyYXkKKyAgICAgICAgICAgICAgICAvLyBDYW5ub3QgdXNlIF9fa21wX3RocmVhZF9yZWFsbG9jKCkgYmVjYXVzZSB0aHJlYWRzIG5vdCBhcm91bmQgZm9yCisgICAgICAgICAgICAgICAgLy8ga21wX3JlYXBfdGFza190ZWFtKCApLiAgTm90ZSBhbGwgbmV3IGFycmF5IGVudHJpZXMgYXJlIGluaXRpYWxpemVkCisgICAgICAgICAgICAgICAgLy8gdG8gemVybyBieSBfX2ttcF9hbGxvY2F0ZSgpLgorICAgICAgICAgICAgICAgIG5ld19kYXRhID0gKGttcF90aHJlYWRfZGF0YV90ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoIG50aHJlYWRzICogc2l6ZW9mKGttcF90aHJlYWRfZGF0YV90KSApOworICAgICAgICAgICAgICAgIC8vIGNvcHkgb2xkIGRhdGEgdG8gbmV3IGRhdGEKKyAgICAgICAgICAgICAgICBLTVBfTUVNQ1BZX1MoICh2b2lkICopIG5ld19kYXRhLCBudGhyZWFkcyAqIHNpemVvZihrbXBfdGhyZWFkX2RhdGFfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBvbGRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHRocmVhZHMgKiBzaXplb2Yoa21wX3Rhc2tkYXRhX3QgKikgKTsKKworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgICAgICAgICAgICAgIC8vIEdFSDogRmlndXJlIG91dCBpZiB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbworICAgICAgICAgICAgICAgIGZvciAoaSA9IG1heHRocmVhZHM7IGkgPCBudGhyZWFkczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICYgKCp0aHJlYWRzX2RhdGFfcClbaV07CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2luaXRfdGFza19zdGFjayggX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRocmVhZF9kYXRhICk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgICAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIG5ldyBkYXRhIGFuZCBmcmVlIHRoZSBvbGQgZGF0YQorICAgICAgICAgICAgICAgICgqdGhyZWFkc19kYXRhX3ApID0gbmV3X2RhdGE7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSggb2xkX2RhdGEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YTogVCMlZCBhbGxvY2F0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkcyBkYXRhIGZvciB0YXNrX3RlYW0gJXAsIHNpemUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGFza190ZWFtLCBudGhyZWFkcyApICk7CisgICAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgaW5pdGlhbCBhbGxvY2F0ZSBmb3IgdGhyZWFkc19kYXRhIGFycmF5LCBhbmQgemVybyBlbnRyaWVzCisgICAgICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfY2FsbG9jKCkgYmVjYXVzZSB0aHJlYWRzIG5vdCBhcm91bmQgZm9yCisgICAgICAgICAgICAgICAgLy8ga21wX3JlYXBfdGFza190ZWFtKCApLgorICAgICAgICAgICAgICAgIEFOTk9UQVRFX0lHTk9SRV9XUklURVNfQkVHSU4oKTsKKyAgICAgICAgICAgICAgICAqdGhyZWFkc19kYXRhX3AgPSAoa21wX3RocmVhZF9kYXRhX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggbnRocmVhZHMgKiBzaXplb2Yoa21wX3RocmVhZF9kYXRhX3QpICk7CisgICAgICAgICAgICAgICAgQU5OT1RBVEVfSUdOT1JFX1dSSVRFU19FTkQoKTsKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgICAgICAgICAvLyBHRUg6IEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmICgqdGhyZWFkc19kYXRhX3ApW2ldOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X3Rhc2tfc3RhY2soIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0aHJlYWRfZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhc2tfdGVhbSAtPiB0dC50dF9tYXhfdGhyZWFkcyA9IG50aHJlYWRzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gSWYgYXJyYXkgaGFzIChtb3JlIHRoYW4pIGVub3VnaCBlbGVtZW50cywgZ28gYWhlYWQgYW5kIHVzZSBpdAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKnRocmVhZHNfZGF0YV9wICE9IE5VTEwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXRpYWxpemUgdGhyZWFkc19kYXRhIHBvaW50ZXJzIGJhY2sgdG8gdGhyZWFkX2luZm8gc3RydWN0dXJlcworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiAoKnRocmVhZHNfZGF0YV9wKVtpXTsKKyAgICAgICAgICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX3RociA9IHRlYW0gLT4gdC50X3RocmVhZHNbaV07CisKKyAgICAgICAgICAgIGlmICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gPj0gbnRocmVhZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbGFzdCBzdG9sZW4gZmllbGQgc3Vydml2ZXMgYWNyb3NzIHRlYW1zIC8gYmFycmllciwgYW5kIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAvLyBvZiB0aHJlYWRzIG1heSBoYXZlIGNoYW5nZWQuICBJdCdzIHBvc3NpYmxlIChsaWtlbHk/KSB0aGF0IGEgbmV3CisgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWwgcmVnaW9uIHdpbGwgZXhoaWJpdCB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUgcHJldmlvdXMgcmVnaW9uLgorICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgVENXX1NZTkNfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MsIFRSVUUpOworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworICAgIHJldHVybiBpc19pbml0X3RocmVhZDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrX3RocmVhZHNfZGF0YToKKy8vIERlYWxsb2NhdGVzIGEgdGhyZWFkc19kYXRhIGFycmF5IGZvciBhIHRhc2sgdGVhbSwgaW5jbHVkaW5nIGFueSBhdHRhY2hlZAorLy8gdGFza2luZyBkZXF1ZXMuICBPbmx5IG9jY3VycyBhdCBsaWJyYXJ5IHNodXRkb3duLgorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrX3RocmVhZHNfZGF0YSgga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKQoreworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworICAgIGlmICggdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSAhPSBOVUxMICkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhc2tfdGVhbS0+dHQudHRfbWF4X3RocmVhZHM7IGkrKyApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza19kZXF1ZSggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhW2ldICk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfZnJlZSggdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSApOworICAgICAgICB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhID0gTlVMTDsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbToKKy8vIEFsbG9jYXRlcyBhIHRhc2sgdGVhbSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyB0ZWFtLCB0YWtpbmcgaXQgZnJvbQorLy8gdGhlIGdsb2JhbCB0YXNrIHRlYW0gZnJlZSBsaXN0IGlmIHBvc3NpYmxlLiAgQWxzbyBpbml0aWFsaXplcyBkYXRhIHN0cnVjdHVyZXMuCisKK3N0YXRpYyBrbXBfdGFza190ZWFtX3QgKgorX19rbXBfYWxsb2NhdGVfdGFza190ZWFtKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gTlVMTDsKKyAgICBpbnQgbnRocmVhZHM7CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbTogVCMlZCBlbnRlcmluZzsgdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAodGhyZWFkID8gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgOiAtMSksIHRlYW0gKSApOworCisgICAgaWYgKFRDUl9QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zKSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRha2UgYSB0YXNrIHRlYW0gZnJvbSB0aGUgdGFzayB0ZWFtIHBvb2wKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisgICAgICAgIGlmIChfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgIT0gTlVMTCkgeworICAgICAgICAgICAgdGFza190ZWFtID0gX19rbXBfZnJlZV90YXNrX3RlYW1zOworICAgICAgICAgICAgVENXX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMsIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0KTsKKyAgICAgICAgICAgIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKyAgICB9CisKKyAgICBpZiAodGFza190ZWFtID09IE5VTEwpIHsKKyAgICAgICAgS0VfVFJBQ0UoIDEwLCAoICJfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06IFQjJWQgYWxsb2NhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ0YXNrIHRlYW0gZm9yIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0ZWFtICkgKTsKKyAgICAgICAgLy8gQWxsb2NhdGUgYSBuZXcgdGFzayB0ZWFtIGlmIG9uZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAvLyBDYW5ub3QgdXNlIF9fa21wX3RocmVhZF9tYWxsb2MoKSBiZWNhdXNlIHRocmVhZHMgbm90IGFyb3VuZCBmb3IKKyAgICAgICAgLy8ga21wX3JlYXBfdGFza190ZWFtKCApLgorICAgICAgICB0YXNrX3RlYW0gPSAoa21wX3Rhc2tfdGVhbV90ICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Rhc2tfdGVhbV90KSApOworICAgICAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKKyAgICAgICAgLy90YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhID0gTlVMTDsgICAvLyBBQzogX19rbXBfYWxsb2NhdGUgemVyb2VzIHJldHVybmVkIG1lbW9yeQorICAgICAgICAvL3Rhc2tfdGVhbSAtPiB0dC50dF9tYXhfdGhyZWFkcyA9IDA7CisgICAgICAgIC8vdGFza190ZWFtIC0+IHR0LnR0X25leHQgPSBOVUxMOworICAgIH0KKworICAgIFRDV180KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF90YXNrcywgRkFMU0UpOworI2lmIE9NUF80NV9FTkFCTEVECisgICAgVENXXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzLCBGQUxTRSk7CisjZW5kaWYKKyAgICB0YXNrX3RlYW0gLT4gdHQudHRfbnByb2MgPSBudGhyZWFkcyA9IHRlYW0tPnQudF9ucHJvYzsKKworICAgIFRDV180KCB0YXNrX3RlYW0gLT4gdHQudHRfdW5maW5pc2hlZF90aHJlYWRzLCBudGhyZWFkcyApOworICAgIFRDV180KCB0YXNrX3RlYW0gLT4gdHQudHRfYWN0aXZlLCBUUlVFICk7CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbTogVCMlZCBleGl0aW5nOyB0YXNrX3RlYW0gPSAlcCB1bmZpbmlzaGVkX3RocmVhZHMgaW5pdCdkIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAodGhyZWFkID8gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgOiAtMSksIHRhc2tfdGVhbSwgdGFza190ZWFtIC0+IHR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcykgKTsKKyAgICByZXR1cm4gdGFza190ZWFtOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9mcmVlX3Rhc2tfdGVhbToKKy8vIEZyZWVzIHRoZSB0YXNrIHRlYW0gYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgdGhyZWFkLCBhbmQgYWRkcyBpdAorLy8gdG8gdGhlIGdsb2JhbCB0YXNrIHRlYW0gZnJlZSBsaXN0LgorCit2b2lkCitfX2ttcF9mcmVlX3Rhc2tfdGVhbSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9mcmVlX3Rhc2tfdGVhbTogVCMlZCB0YXNrX3RlYW0gPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkID8gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgOiAtMSwgdGFza190ZWFtICkgKTsKKworICAgIC8vIFB1dCB0YXNrIHRlYW0gYmFjayBvbiBmcmVlIGxpc3QKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9PSBOVUxMICk7CisgICAgdGFza190ZWFtIC0+IHR0LnR0X25leHQgPSBfX2ttcF9mcmVlX3Rhc2tfdGVhbXM7CisgICAgVENXX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMsIHRhc2tfdGVhbSk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3Rhc2tfdGVhbV9sb2NrICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3JlYXBfdGFza190ZWFtczoKKy8vIEZyZWUgYWxsIHRoZSB0YXNrIHRlYW1zIG9uIHRoZSB0YXNrIHRlYW0gZnJlZSBsaXN0LgorLy8gU2hvdWxkIG9ubHkgYmUgZG9uZSBkdXJpbmcgbGlicmFyeSBzaHV0ZG93bi4KKy8vIENhbm5vdCBkbyBhbnl0aGluZyB0aGF0IG5lZWRzIGEgdGhyZWFkIHN0cnVjdHVyZSBvciBndGlkIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgZ29uZS4KKwordm9pZAorX19rbXBfcmVhcF90YXNrX3RlYW1zKCB2b2lkICkKK3sKKyAgICBrbXBfdGFza190ZWFtX3QgICAqdGFza190ZWFtOworCisgICAgaWYgKCBUQ1JfUFRSKF9fa21wX2ZyZWVfdGFza190ZWFtcykgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gRnJlZSBhbGwgdGFza190ZWFtcyBvbiB0aGUgZnJlZSBsaXN0CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF90YXNrX3RlYW1fbG9jayApOworICAgICAgICB3aGlsZSAoICggdGFza190ZWFtID0gX19rbXBfZnJlZV90YXNrX3RlYW1zICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza190ZWFtcyA9IHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0OworICAgICAgICAgICAgdGFza190ZWFtIC0+IHR0LnR0X25leHQgPSBOVUxMOworCisgICAgICAgICAgICAvLyBGcmVlIHRocmVhZHNfZGF0YSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmICggdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza190aHJlYWRzX2RhdGEoIHRhc2tfdGVhbSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfZnJlZSggdGFza190ZWFtICk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zOgorLy8gU29tZSB0aHJlYWRzIGNvdWxkIHN0aWxsIGJlIGluIHRoZSBmb3JrIGJhcnJpZXIgcmVsZWFzZSBjb2RlLCBwb3NzaWJseQorLy8gdHJ5aW5nIHRvIHN0ZWFsIHRhc2tzLiAgV2FpdCBmb3IgZWFjaCB0aHJlYWQgdG8gdW5yZWZlcmVuY2UgaXRzIHRhc2sgdGVhbS4KKy8vCit2b2lkCitfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbXModm9pZCkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAga21wX3VpbnQzMiBzcGluczsKKyAgICBpbnQgZG9uZTsKKworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworCisgICAgZm9yICg7OykgeworICAgICAgICBkb25lID0gVFJVRTsKKworICAgICAgICAvLyBUT0RPOiBHRUggLSB0aGlzIG1heSBiZSBpcyB3cm9uZyBiZWNhdXNlIHNvbWUgc3luYyB3b3VsZCBiZSBuZWNlc3NhcnkKKyAgICAgICAgLy8gICAgICAgICAgICAgaW4gY2FzZSB0aHJlYWRzIGFyZSBhZGRlZCB0byB0aGUgcG9vbCBkdXJpbmcgdGhlIHRyYXZlcnNhbC4KKyAgICAgICAgLy8gICAgICAgICAgICAgTmVlZCB0byB2ZXJpZnkgdGhhdCBsb2NrIGZvciB0aHJlYWQgcG9vbCBpcyBoZWxkIHdoZW4gY2FsbGluZworICAgICAgICAvLyAgICAgICAgICAgICB0aGlzIHJvdXRpbmUuCisgICAgICAgIGZvciAodGhyZWFkID0gKGttcF9pbmZvX3QgKilfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgICAgICB0aHJlYWQgIT0gTlVMTDsKKyAgICAgICAgICAgICB0aHJlYWQgPSB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCkKKyAgICAgICAgeworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBEV09SRCBleGl0X3ZhbDsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKCBUQ1JfUFRSKHRocmVhZC0+dGgudGhfdGFza190ZWFtKSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbTogVCMlZCB0YXNrX3RlYW0gPT0gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIC8vIFRPRE86IEdFSCAtIGFkZCB0aGlzIGNoZWNrIGZvciBMaW51eCogT1MgLyBPUyBYKiBhcyB3ZWxsPworICAgICAgICAgICAgaWYgKCFfX2ttcF9pc190aHJlYWRfYWxpdmUodGhyZWFkLCAmZXhpdF92YWwpKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsgIC8vIEJlY2F1c2UgdGhfdGFza190ZWFtIHBvaW50ZXIgaXMgbm90IE5VTEwgZm9yIHRoaXMgdGhyZWFkCisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbTogV2FpdGluZyBmb3IgVCMlZCB0byB1bnJlZmVyZW5jZSB0YXNrX3RlYW1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSApICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgICAgICAgICAgdm9sYXRpbGUgdm9pZCAqc2xlZXBfbG9jOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgaXMgc2xlZXBpbmcsIGF3YWtlbiBpdC4KKyAgICAgICAgICAgICAgICBpZiAoICggc2xlZXBfbG9jID0gVENSX1BUUiggdGhyZWFkLT50aC50aF9zbGVlcF9sb2MpICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbTogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyKF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyZWFkKSwgc2xlZXBfbG9jKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIG92ZXJzdWJzY3JpYmVkLAorICAgICAgICAvLyBvciBoYXZlIHdhaXRlZCBhIGJpdCAoYW5kIGxpYnJhcnkgbW9kZSBpcyB0aHJvdWdocHV0KSwgeWllbGQuCisgICAgICAgIC8vIFBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZS4KKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgIC8vIFlpZWxkcyBvbmx5IGlmIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQKKyAgICB9Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfdGVhbV9zZXR1cDogIENyZWF0ZSBhIHRhc2tfdGVhbSBmb3IgdGhlIGN1cnJlbnQgdGVhbSwgYnV0IHVzZQorLy8gYW4gYWxyZWFkeSBjcmVhdGVkLCB1bnVzZWQgb25lIGlmIGl0IGFscmVhZHkgZXhpc3RzLgordm9pZAorX19rbXBfdGFza190ZWFtX3NldHVwKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IGFsd2F5cyApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKworICAgIC8vIElmIHRoaXMgdGFza190ZWFtIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LCBhbGxvY2F0ZSBpdC4gSXQgd2lsbCBiZSB1c2VkIGluIHRoZSByZWdpb24gYWZ0ZXIgdGhlIG5leHQuCisgICAgLy8gSWYgaXQgZXhpc3RzLCBpdCBpcyB0aGUgY3VycmVudCB0YXNrIHRlYW0gYW5kIHNob3VsZG4ndCBiZSB0b3VjaGVkIHlldCBhcyBpdCBtYXkgc3RpbGwgYmUgaW4gdXNlLgorICAgIGlmICh0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSA9PSBOVUxMICYmIChhbHdheXMgfHwgdGVhbS0+dC50X25wcm9jID4gMSkgKSB7CisgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdID0gX19rbXBfYWxsb2NhdGVfdGFza190ZWFtKCB0aGlzX3RociwgdGVhbSApOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fc2V0dXA6IE1hc3RlciBUIyVkIGNyZWF0ZWQgbmV3IHRhc2tfdGVhbSAlcCBmb3IgdGVhbSAlZCBhdCBwYXJpdHk9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdLAorICAgICAgICAgICAgICAgICAgICAgICgodGVhbSAhPSBOVUxMKSA/IHRlYW0tPnQudF9pZCA6IC0xKSwgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGUpKTsKKyAgICB9CisKKyAgICAvLyBBZnRlciB0aHJlYWRzIGV4aXQgdGhlIHJlbGVhc2UsIHRoZXkgd2lsbCBjYWxsIHN5bmMsIGFuZCB0aGVuIHBvaW50IHRvIHRoaXMgb3RoZXIgdGFza190ZWFtOyBtYWtlIHN1cmUgaXQgaXMKKyAgICAvLyBhbGxvY2F0ZWQgYW5kIHByb3Blcmx5IGluaXRpYWxpemVkLiBBcyB0aHJlYWRzIHNwaW4gaW4gdGhlIGJhcnJpZXIgcmVsZWFzZSBwaGFzZSwgdGhleSB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUKKyAgICAvLyBwcmV2aW91cyB0YXNrX3RlYW0gc3RydWN0KGFib3ZlKSwgdW50aWwgdGhleSByZWNlaXZlIHRoZSBzaWduYWwgdG8gc3RvcCBjaGVja2luZyBmb3IgdGFza3MgKHRoZXkgY2FuJ3Qgc2FmZWx5CisgICAgLy8gcmVmZXJlbmNlIHRoZSBrbXBfdGVhbV90IHN0cnVjdCwgd2hpY2ggY291bGQgYmUgcmVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQpLiBObyB0YXNrIHRlYW1zIGFyZSBmb3JtZWQgZm9yCisgICAgLy8gc2VyaWFsaXplZCB0ZWFtcy4KKyAgICBpZiAodGVhbS0+dC50X25wcm9jID4gMSkgeworICAgICAgICBpbnQgb3RoZXJfdGVhbSA9IDEgLSB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgaWYgKHRlYW0tPnQudF90YXNrX3RlYW1bb3RoZXJfdGVhbV0gPT0gTlVMTCkgeyAvLyBzZXR1cCBvdGhlciB0ZWFtIGFzIHdlbGwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtW290aGVyX3RlYW1dID0gX19rbXBfYWxsb2NhdGVfdGFza190ZWFtKCB0aGlzX3RociwgdGVhbSApOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tfdGVhbV9zZXR1cDogTWFzdGVyIFQjJWQgY3JlYXRlZCBzZWNvbmQgbmV3IHRhc2tfdGVhbSAlcCBmb3IgdGVhbSAlZCBhdCBwYXJpdHk9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksIHRlYW0tPnQudF90YXNrX3RlYW1bb3RoZXJfdGVhbV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRlYW0gIT0gTlVMTCkgPyB0ZWFtLT50LnRfaWQgOiAtMSksIG90aGVyX3RlYW0gKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIExlYXZlIHRoZSBvbGQgdGFzayB0ZWFtIHN0cnVjdCBpbiBwbGFjZSBmb3IgdGhlIHVwY29taW5nIHJlZ2lvbjsgYWRqdXN0IGFzIG5lZWRlZAorICAgICAgICAgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtW290aGVyX3RlYW1dOworICAgICAgICAgICAgaWYgKCF0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSB8fCB0ZWFtLT50LnRfbnByb2MgIT0gdGFza190ZWFtLT50dC50dF9ucHJvYykgeworICAgICAgICAgICAgICAgIFRDV180KHRhc2tfdGVhbS0+dHQudHRfbnByb2MsIHRlYW0tPnQudF9ucHJvYyk7CisgICAgICAgICAgICAgICAgVENXXzQodGFza190ZWFtLT50dC50dF9mb3VuZF90YXNrcywgRkFMU0UpOworI2lmIE9NUF80NV9FTkFCTEVECisgICAgICAgICAgICAgICAgVENXXzQodGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcywgRkFMU0UpOworI2VuZGlmCisgICAgICAgICAgICAgICAgVENXXzQodGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMsIHRlYW0tPnQudF9ucHJvYyApOworICAgICAgICAgICAgICAgIFRDV180KHRhc2tfdGVhbS0+dHQudHRfYWN0aXZlLCBUUlVFICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiB0ZWFtIHNpemUgaGFzIGNoYW5nZWQsIHRoZSBmaXJzdCB0aHJlYWQgdG8gZW5hYmxlIHRhc2tpbmcgd2lsbCByZWFsbG9jIHRocmVhZHNfZGF0YSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tfdGVhbV9zZXR1cDogTWFzdGVyIFQjJWQgcmVzZXQgbmV4dCB0YXNrX3RlYW0gJXAgZm9yIHRlYW0gJWQgYXQgcGFyaXR5PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0ZWFtLT50LnRfdGFza190ZWFtW290aGVyX3RlYW1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRlYW0gIT0gTlVMTCkgPyB0ZWFtLT50LnRfaWQgOiAtMSksIG90aGVyX3RlYW0gKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfdGVhbV9zeW5jOiBQcm9wYWdhdGlvbiBvZiB0YXNrIHRlYW0gZGF0YSBmcm9tIHRlYW0gdG8gdGhyZWFkcworLy8gd2hpY2ggaGFwcGVucyBqdXN0IGFmdGVyIHRoZSByZWxlYXNlIHBoYXNlIG9mIGEgdGVhbSBiYXJyaWVyLiAgVGhpcyBtYXkgYmUKKy8vIGNhbGxlZCBieSBhbnkgdGhyZWFkLCBidXQgb25seSBmb3IgdGVhbXMgd2l0aCAjIHRocmVhZHMgPiAxLgorCit2b2lkCitfX2ttcF90YXNrX3RlYW1fc3luYygga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICAvLyBUb2dnbGUgdGhlIHRoX3Rhc2tfc3RhdGUgZmllbGQsIHRvIHN3aXRjaCB3aGljaCB0YXNrX3RlYW0gdGhpcyB0aHJlYWQgcmVmZXJzIHRvCisgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGUgPSAxIC0gdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGU7CisgICAgLy8gSXQgaXMgbm93IHNhZmUgdG8gcHJvcGFnYXRlIHRoZSB0YXNrIHRlYW0gcG9pbnRlciBmcm9tIHRoZSB0ZWFtIHN0cnVjdCB0byB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLCB0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSk7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza190ZWFtX3N5bmM6IFRocmVhZCBUIyVkIHRhc2sgdGVhbSBzd2l0Y2hlZCB0byB0YXNrX3RlYW0gJXAgZnJvbSBUZWFtICMlZCAocGFyaXR5PSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAoKHRlYW0gIT0gTlVMTCkgPyB0ZWFtLT50LnRfaWQgOiAtMSksIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlKSk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza190ZWFtX3dhaXQ6IE1hc3RlciB0aHJlYWQgd2FpdHMgZm9yIG91dHN0YW5kaW5nIHRhc2tzIGFmdGVyIHRoZSBiYXJyaWVyIGdhdGhlcgorLy8gcGhhc2UuICBPbmx5IGNhbGxlZCBieSBtYXN0ZXIgdGhyZWFkIGlmICN0aHJlYWRzIGluIHRlYW0gPiAxIG9yIGlmIHByb3h5IHRhc2tzIHdlcmUgY3JlYXRlZC4KKy8vIHdhaXQgaXMgYSBmbGFnIHRoYXQgZGVmYXVsdHMgdG8gMSAoc2VlIGttcC5oKSwgYnV0IHdhaXRpbmcgY2FuIGJlIHR1cm5lZCBvZmYgYnkgcGFzc2luZyBpbiAwCisvLyBvcHRpb25hbGx5IGFzIHRoZSBsYXN0IGFyZ3VtZW50LiBXaGVuIHdhaXQgaXMgemVybywgbWFzdGVyIHRocmVhZCBkb2VzIG5vdCB3YWl0IGZvcgorLy8gdW5maW5pc2hlZF90aHJlYWRzIHRvIHJlYWNoIDAuCit2b2lkCitfX2ttcF90YXNrX3RlYW1fd2FpdCgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0KKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKQorICAgICAgICAgICAgICAgICAgICAgICwgaW50IHdhaXQpCit7CisgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtID09IHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gKTsKKworICAgIGlmICggKCB0YXNrX3RlYW0gIT0gTlVMTCApICYmIEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtKSApIHsKKyAgICAgICAgaWYgKHdhaXQpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tfdGVhbV93YWl0OiBNYXN0ZXIgVCMlZCB3YWl0aW5nIGZvciBhbGwgdGFza3MgKGZvciB1bmZpbmlzaGVkX3RocmVhZHMgdG8gcmVhY2ggMCkgb24gdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCB0YXNrX3RlYW0pKTsKKyAgICAgICAgICAgIC8vIFdvcmtlciB0aHJlYWRzIG1heSBoYXZlIGRyb3BwZWQgdGhyb3VnaCB0byByZWxlYXNlIHBoYXNlLCBidXQgY291bGQgc3RpbGwgYmUgZXhlY3V0aW5nIHRhc2tzLiBXYWl0CisgICAgICAgICAgICAvLyBoZXJlIGZvciB0YXNrcyB0byBjb21wbGV0ZS4gVG8gYXZvaWQgbWVtb3J5IGNvbnRlbnRpb24sIG9ubHkgbWFzdGVyIHRocmVhZCBjaGVja3MgdGVybWluYXRpb24gY29uZGl0aW9uLgorICAgICAgICAgICAga21wX2ZsYWdfMzIgZmxhZygmdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMsIDBVKTsKKyAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgICB9CisgICAgICAgIC8vIERlYWN0aXZhdGUgdGhlIG9sZCB0YXNrIHRlYW0sIHNvIHRoYXQgdGhlIHdvcmtlciB0aHJlYWRzIHdpbGwgc3RvcCByZWZlcmVuY2luZyBpdCB3aGlsZSBzcGlubmluZy4KKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza190ZWFtX3dhaXQ6IE1hc3RlciBUIyVkIGRlYWN0aXZhdGluZyB0YXNrX3RlYW0gJXA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAic2V0dGluZyBhY3RpdmUgdG8gZmFsc2UsIHNldHRpbmcgbG9jYWwgYW5kIHRlYW0ncyBwb2ludGVyIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHRhc2tfdGVhbSkpOworI2lmIE9NUF80NV9FTkFCTEVECisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbS0+dHQudHRfbnByb2MgPiAxIHx8IHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgPT0gVFJVRSApOworICAgICAgICBUQ1dfU1lOQ180KCB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzLCBGQUxTRSApOworI2Vsc2UKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtLT50dC50dF9ucHJvYyA+IDEgKTsKKyNlbmRpZgorICAgICAgICBUQ1dfU1lOQ180KCB0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgRkFMU0UgKTsKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLCBOVUxMKTsKKyAgICB9Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tpbmdfYmFycmllcjoKKy8vIFRoaXMgcm91dGluZSBtYXkgb25seSBjYWxsZWQgd2hlbiBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9leHRyYV9iYXJyaWVyLgorLy8gSW50ZXJuYWwgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhbGwgdGFza3MgcHJpb3IgdG8gYSByZWd1bGFyIGJhcnJpZXIgb3IgYQorLy8gam9pbiBiYXJyaWVyLiAgSXQgaXMgYSBmdWxsIGJhcnJpZXIgaXRzZWxmLCB3aGljaCB1bmZvcnR1bmF0ZWx5IHR1cm5zCisvLyByZWd1bGFyIGJhcnJpZXJzIGludG8gZG91YmxlIGJhcnJpZXJzIGFuZCBqb2luIGJhcnJpZXJzIGludG8gMSAxLzIKKy8vIGJhcnJpZXJzLgordm9pZAorX19rbXBfdGFza2luZ19iYXJyaWVyKCBrbXBfdGVhbV90ICp0ZWFtLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCBndGlkICkKK3sKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICpzcGluID0gJnRlYW0tPnQudF90YXNrX3RlYW1bdGhyZWFkLT50aC50aF90YXNrX3N0YXRlXS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzOworICAgIGludCBmbGFnID0gRkFMU0U7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllciApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIEtNUF9GU1lOQ19TUElOX0lOSVQoIHNwaW4sIChrbXBfdWludDMyKikgTlVMTCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBrbXBfZmxhZ18zMiBzcGluX2ZsYWcoc3BpbiwgMFUpOworICAgIHdoaWxlICghIHNwaW5fZmxhZy5leGVjdXRlX3Rhc2tzKHRocmVhZCwgZ3RpZCwgVFJVRSwgJmZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSwgMCApICkgeworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gVE9ETzogV2hhdCBhYm91dCBpdHRfc3luY19vYmo/PworICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBzcGluICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKQorICAgICAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCggKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAvLyBHSDogV2UgYWx3YXlzIHlpZWxkIGhlcmUKKyAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCAodm9pZCopIHNwaW4gKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKKworI2lmIE9NUF80NV9FTkFCTEVECisKKy8qIF9fa21wX2dpdmVfdGFzayBwdXRzIGEgdGFzayBpbnRvIGEgZ2l2ZW4gdGhyZWFkIHF1ZXVlIGlmOgorICAgIC0gdGhlIHF1ZXVlIGZvciB0aGF0IHRocmVhZCB3YXMgY3JlYXRlZAorICAgIC0gdGhlcmUncyBzcGFjZSBpbiB0aGF0IHF1ZXVlCisKKyAgICBCZWNhdXNlIG9mIHRoaXMsIF9fa21wX3B1c2hfdGFzayBuZWVkcyB0byBjaGVjayBpZiB0aGVyZSdzIHNwYWNlIGFmdGVyIGdldHRpbmcgdGhlIGxvY2sKKyAqLworc3RhdGljIGJvb2wgX19rbXBfZ2l2ZV90YXNrICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgdGlkLCBrbXBfdGFza190ICogdGFzaywga21wX2ludDMyIHBhc3MgKQoreworICAgIGttcF90YXNrZGF0YV90ICogICAgdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfdGFza190ZWFtX3QgKgl0YXNrX3RlYW0gPSB0YXNrZGF0YS0+dGRfdGFza190ZWFtOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZ2l2ZV90YXNrOiB0cnlpbmcgdG8gZ2l2ZSB0YXNrICVwIHRvIHRocmVhZCAlZC5cbiIsIHRhc2tkYXRhLCB0aWQgKSApOworCisgICAgLy8gSWYgdGFza190ZWFtIGlzIE5VTEwgc29tZXRoaW5nIHdlbnQgcmVhbGx5IGJhZC4uLgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSAhPSBOVUxMICk7CisKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIGttcF90aHJlYWRfZGF0YV90ICogdGhyZWFkX2RhdGEgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbIHRpZCBdOworCisgICAgaWYgKHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID09IE5VTEwgKSB7CisgICAgICAgIC8vIFRoZXJlJ3Mgbm8gcXVldWUgaW4gdGhpcyB0aHJlYWQsIGdvIGZpbmQgYW5vdGhlciBvbmUKKyAgICAgICAgLy8gV2UncmUgZ3VhcmFudGVlZCB0aGF0IGF0IGxlYXN0IG9uZSB0aHJlYWQgaGFzIGEgcXVldWUKKyAgICAgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZ2l2ZV90YXNrOiB0aHJlYWQgJWQgaGFzIG5vIHF1ZXVlIHdoaWxlIGdpdmluZyB0YXNrICVwLlxuIiwgdGlkLCB0YXNrZGF0YSApICk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID49IFRBU0tfREVRVUVfU0laRSh0aHJlYWRfZGF0YS0+dGQpICkKKyAgICB7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2dpdmVfdGFzazogcXVldWUgaXMgZnVsbCB3aGlsZSBnaXZpbmcgdGFzayAlcCB0byB0aHJlYWQgJWQuXG4iLCB0YXNrZGF0YSwgdGlkICkgKTsKKworICAgICAgICAvLyBpZiB0aGlzIGRlcXVlIGlzIGJpZ2dlciB0aGFuIHRoZSBwYXNzIHJhdGlvIGdpdmUgYSBjaGFuY2UgdG8gYW5vdGhlciB0aHJlYWQKKyAgICAgICAgaWYgKCBUQVNLX0RFUVVFX1NJWkUodGhyZWFkX2RhdGEtPnRkKS9JTklUSUFMX1RBU0tfREVRVUVfU0laRSA+PSBwYXNzICkgcmV0dXJuIHJlc3VsdDsKKworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICBfX2ttcF9yZWFsbG9jX3Rhc2tfZGVxdWUodGhyZWFkLHRocmVhZF9kYXRhKTsKKworICAgIH0gZWxzZSB7CisKKyAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgICAgaWYgKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID49IFRBU0tfREVRVUVfU0laRSh0aHJlYWRfZGF0YS0+dGQpICkKKyAgICAgICB7CisgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2dpdmVfdGFzazogcXVldWUgaXMgZnVsbCB3aGlsZSBnaXZpbmcgdGFzayAlcCB0byB0aHJlYWQgJWQuXG4iLCB0YXNrZGF0YSwgdGlkICkgKTsKKworICAgICAgICAgICAvLyBpZiB0aGlzIGRlcXVlIGlzIGJpZ2dlciB0aGFuIHRoZSBwYXNzIHJhdGlvIGdpdmUgYSBjaGFuY2UgdG8gYW5vdGhlciB0aHJlYWQKKyAgICAgICAgICAgaWYgKCBUQVNLX0RFUVVFX1NJWkUodGhyZWFkX2RhdGEtPnRkKS9JTklUSUFMX1RBU0tfREVRVUVfU0laRSA+PSBwYXNzICkKKyAgICAgICAgICAgICAgZ290byByZWxlYXNlX2FuZF9leGl0OworCisgICAgICAgICAgIF9fa21wX3JlYWxsb2NfdGFza19kZXF1ZSh0aHJlYWQsdGhyZWFkX2RhdGEpOworICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBsb2NrIGlzIGhlbGQgaGVyZSwgYW5kIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBkZXF1ZQorCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVbIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgXSA9IHRhc2tkYXRhOworICAgIC8vIFdyYXAgaW5kZXguCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCA9ICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCArIDEgKSAmIFRBU0tfREVRVUVfTUFTSyh0aHJlYWRfZGF0YS0+dGQpOworICAgIFRDV180KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcywgVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSArIDEpOworCisgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9naXZlX3Rhc2s6IHN1Y2Nlc3NmdWxseSBnYXZlIHRhc2sgJXAgdG8gdGhyZWFkICVkLlxuIiwgdGFza2RhdGEsIHRpZCApICk7CisKK3JlbGVhc2VfYW5kX2V4aXQ6CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YS0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIFRoZSBmaW5pc2ggb2YgdGhlIGEgcHJveHkgdGFza3MgaXMgZGl2aWRlZCBpbiB0d28gcGllY2VzOgorICAgIC0gdGhlIHRvcCBoYWxmIGlzIHRoZSBvbmUgdGhhdCBjYW4gYmUgZG9uZSBmcm9tIGEgdGhyZWFkIG91dHNpZGUgdGhlIHRlYW0KKyAgICAtIHRoZSBib3R0b20gaGFsZiBtdXN0IGJlIHJ1biBmcm9tIGEgdGhlbSB3aXRoaW4gdGhlIHRlYW0KKworICAgIEluIG9yZGVyIHRvIHJ1biB0aGUgYm90dG9tIGhhbGYgdGhlIHRhc2sgZ2V0cyBxdWV1ZWQgYmFjayBpbnRvIG9uZSBvZiB0aGUgdGhyZWFkcyBvZiB0aGUgdGVhbS4KKyAgICBPbmNlIHRoZSB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2sgY291bnRlciBvZiB0aGUgcGFyZW50IGlzIGRlY3JlbWVudGVkIHRoZSB0aHJlYWRzIGNhbiBsZWF2ZSB0aGUgYmFycmllcnMuCisgICAgU28sIHRoZSBib3R0b20gaGFsZiBuZWVkcyB0byBiZSBxdWV1ZWQgYmVmb3JlIHRoZSBjb3VudGVyIGlzIGRlY3JlbWVudGVkLiBUaGUgdG9wIGhhbGYgaXMgdGhlcmVmb3JlIGRpdmlkZWQgaW4gdHdvIHBhcnRzOgorICAgIC0gdGhpbmdzIHRoYXQgY2FuIGJlIHJ1biBiZWZvcmUgcXVldWluZyB0aGUgYm90dG9tIGhhbGYKKyAgICAtIHRoaW5ncyB0aGF0IG11c3QgYmUgcnVuIGFmdGVyIHF1ZXVpbmcgdGhlIGJvdHRvbSBoYWxmCisKKyAgICBUaGlzIGNyZWF0ZXMgYSBzZWNvbmQgcmFjZSBhcyB0aGUgYm90dG9tIGhhbGYgY2FuIGZyZWUgdGhlIHRhc2sgYmVmb3JlIHRoZSBzZWNvbmQgdG9wIGhhbGYgaXMgZXhlY3V0ZWQuIFRvIGF2b2lkIHRoaXMKKyAgICB3ZSB1c2UgdGhlIHRkX2luY29tcGxldGVfY2hpbGRfdGFzayBvZiB0aGUgcHJveHkgdGFzayB0byBzeW5jaHJvbml6ZSB0aGUgdG9wIGFuZCBib3R0b20gaGFsZi4KKyovCisKK3N0YXRpYyB2b2lkIF9fa21wX2ZpcnN0X3RvcF9oYWxmX2ZpbmlzaF9wcm94eSgga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnByb3h5ID09IFRBU0tfUFJPWFkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuZnJlZWQgPT0gMCApOworCisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MuY29tcGxldGUgPSAxOyAgIC8vIG1hcmsgdGhlIHRhc2sgYXMgY29tcGxldGVkCisKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF90YXNrZ3JvdXAgKQorICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YS0+dGRfdGFza2dyb3VwLT5jb3VudCkgKTsKKworICAgIC8vIENyZWF0ZSBhbiBpbWFnaW5hcnkgY2hpbGRyZW4gZm9yIHRoaXMgdGFzayBzbyB0aGUgYm90dG9tIGhhbGYgY2Fubm90IHJlbGVhc2UgdGhlIHRhc2sgYmVmb3JlIHdlIGhhdmUgY29tcGxldGVkIHRoZSBzZWNvbmQgdG9wIGhhbGYKKyAgICBUQ0lfNCh0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3NlY29uZF90b3BfaGFsZl9maW5pc2hfcHJveHkoIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgKQoreworICAgIGttcF9pbnQzMiBjaGlsZHJlbiA9IDA7CisKKyAgICAvLyBQcmVkZWNyZW1lbnQgc2ltdWxhdGVkIGJ5ICItIDEiIGNhbGN1bGF0aW9uCisgICAgY2hpbGRyZW4gPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEgLT4gdGRfcGFyZW50IC0+IHRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpICkgLSAxOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNoaWxkcmVuID49IDAgKTsKKworICAgIC8vIFJlbW92ZSB0aGUgaW1hZ2luYXJ5IGNoaWxkcmVuCisgICAgVENEXzQodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9ib3R0b21faGFsZl9maW5pc2hfcHJveHkoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogcHRhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShwdGFzayk7CisgICAga21wX2luZm9fdCAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnByb3h5ID09IFRBU0tfUFJPWFkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9PSAxICk7IC8vIHRvcCBoYWxmIG11c3QgcnVuIGJlZm9yZSBib3R0b20gaGFsZgorCisgICAgLy8gV2UgbmVlZCB0byB3YWl0IHRvIG1ha2Ugc3VyZSB0aGUgdG9wIGhhbGYgaXMgZmluaXNoZWQKKyAgICAvLyBTcGlubmluZyBoZXJlIHNob3VsZCBiZSBvayBhcyB0aGlzIHNob3VsZCBoYXBwZW4gcXVpY2tseQorICAgIHdoaWxlICggVENSXzQodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpID4gMCApIDsKKworICAgIF9fa21wX3JlbGVhc2VfZGVwcyhndGlkLHRhc2tkYXRhKTsKKyAgICBfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhndGlkLCB0YXNrZGF0YSwgdGhyZWFkKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gZ3RpZCBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBwdGFzayBUYXNrIHdoaWNoIGV4ZWN1dGlvbiBpcyBjb21wbGV0ZWQKKworRXhlY3V0ZSB0aGUgY29tcGxldGF0aW9uIG9mIGEgcHJveHkgdGFzayBmcm9tIGEgdGhyZWFkIG9mIHRoYXQgaXMgcGFydCBvZiB0aGUgdGVhbS4gUnVuIGZpcnN0IGFuZCBib3R0b20gaGFsdmVzIGRpcmVjdGx5LgorKi8KK3ZvaWQgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqcHRhc2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIHB0YXNrICE9IE5VTEwgKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEocHRhc2spOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Byb3h5X3Rhc2tfY29tcGxldGVkKGVudGVyKTogVCMlZCBwcm94eSB0YXNrICVwIGNvbXBsZXRpbmdcbiIsIGd0aWQsIHRhc2tkYXRhICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZICk7CisKKyAgICBfX2ttcF9maXJzdF90b3BfaGFsZl9maW5pc2hfcHJveHkodGFza2RhdGEpOworICAgIF9fa21wX3NlY29uZF90b3BfaGFsZl9maW5pc2hfcHJveHkodGFza2RhdGEpOworICAgIF9fa21wX2JvdHRvbV9oYWxmX2ZpbmlzaF9wcm94eShndGlkLHB0YXNrKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Byb3h5X3Rhc2tfY29tcGxldGVkKGV4aXQpOiBUIyVkIHByb3h5IHRhc2sgJXAgY29tcGxldGluZ1xuIiwgZ3RpZCwgdGFza2RhdGEgKSApOworfQorCisvKiEKK0Bpbmdyb3VwIFRBU0tJTkcKK0BwYXJhbSBwdGFzayBUYXNrIHdoaWNoIGV4ZWN1dGlvbiBpcyBjb21wbGV0ZWQKKworRXhlY3V0ZSB0aGUgY29tcGxldGF0aW9uIG9mIGEgcHJveHkgdGFzayBmcm9tIGEgdGhyZWFkIHRoYXQgY291bGQgbm90IGJlbG9uZyB0byB0aGUgdGVhbS4KKyovCit2b2lkIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZF9vb28gKCBrbXBfdGFza190ICpwdGFzayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcHRhc2sgIT0gTlVMTCApOworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShwdGFzayk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9wcm94eV90YXNrX2NvbXBsZXRlZF9vb28oZW50ZXIpOiBwcm94eSB0YXNrIGNvbXBsZXRpbmcgb29vICVwXG4iLCB0YXNrZGF0YSApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSApOworCisgICAgX19rbXBfZmlyc3RfdG9wX2hhbGZfZmluaXNoX3Byb3h5KHRhc2tkYXRhKTsKKworICAgIC8vIEVucXVldWUgdGFzayB0byBjb21wbGV0ZSBib3R0b20gaGFsZiBjb21wbGV0aW9uIGZyb20gYSB0aHJlYWQgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIHRlYW0KKyAgICBrbXBfdGVhbV90ICogdGVhbSA9IHRhc2tkYXRhLT50ZF90ZWFtOworICAgIGttcF9pbnQzMiBudGhyZWFkcyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICAvL1RoaXMgc2hvdWxkIGJlIHNpbWlsYXIgdG8gc3RhcnRfayA9IF9fa21wX2dldF9yYW5kb20oIHRocmVhZCApICUgbnRocmVhZHMgYnV0IHdlIGNhbm5vdCB1c2UgX19rbXBfZ2V0X3JhbmRvbSBoZXJlCisgICAga21wX2ludDMyIHN0YXJ0X2sgPSAwOworICAgIGttcF9pbnQzMiBwYXNzID0gMTsKKyAgICBrbXBfaW50MzIgayA9IHN0YXJ0X2s7CisKKyAgICBkbyB7CisgICAgICAgIC8vRm9yIG5vdyB3ZSdyZSBqdXN0IGxpbmVhcmx5IHRyeWluZyB0byBmaW5kIGEgdGhyZWFkCisgICAgICAgIHRocmVhZCA9IHRlYW0tPnQudF90aHJlYWRzW2tdOworICAgICAgICBrID0gKGsrMSkgJSBudGhyZWFkczsKKworICAgICAgICAvLyB3ZSBkaWQgYSBmdWxsIHBhc3MgdGhyb3VnaCBhbGwgdGhlIHRocmVhZHMKKyAgICAgICAgaWYgKCBrID09IHN0YXJ0X2sgKSBwYXNzID0gcGFzcyA8PCAxOworCisgICAgfSB3aGlsZSAoICFfX2ttcF9naXZlX3Rhc2soIHRocmVhZCwgaywgIHB0YXNrLCBwYXNzICkgKTsKKworICAgIF9fa21wX3NlY29uZF90b3BfaGFsZl9maW5pc2hfcHJveHkodGFza2RhdGEpOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcHJveHlfdGFza19jb21wbGV0ZWRfb29vKGV4aXQpOiBwcm94eSB0YXNrIGNvbXBsZXRpbmcgb29vICVwXG4iLCB0YXNrZGF0YSApICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX2R1cF9hbGxvYzogQWxsb2NhdGUgdGhlIHRhc2tkYXRhIGFuZCBtYWtlIGEgY29weSBvZiBzb3VyY2UgdGFzayBmb3IgdGFza2xvb3AKKy8vCisvLyB0aHJlYWQ6ICAgYWxsb2NhdGluZyB0aHJlYWQKKy8vIHRhc2tfc3JjOiBwb2ludGVyIHRvIHNvdXJjZSB0YXNrIHRvIGJlIGR1cGxpY2F0ZWQKKy8vIHJldHVybnM6ICBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBrbXBfdGFza190IHN0cnVjdHVyZSAodGFzaykuCitrbXBfdGFza190ICoKK19fa21wX3Rhc2tfZHVwX2FsbG9jKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrX3QgKnRhc2tfc3JjICkKK3sKKyAgICBrbXBfdGFza190ICAgICAqdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGE7CisgICAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhX3NyYzsKKyAgICBrbXBfdGFza2RhdGFfdCAqcGFyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICBzaXplX3Qgc2hhcmVkc19vZmZzZXQ7CisgICAgc2l6ZV90IHRhc2tfc2l6ZTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfZHVwX2FsbG9jKGVudGVyKTogVGggJXAsIHNvdXJjZSB0YXNrICVwXG4iLCB0aHJlYWQsIHRhc2tfc3JjKSApOworICAgIHRhc2tkYXRhX3NyYyA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKCB0YXNrX3NyYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhX3NyYy0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19GVUxMICk7IC8vIGl0IHNob3VsZCBub3QgYmUgcHJveHkgdGFzaworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhX3NyYy0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworICAgIHRhc2tfc2l6ZSA9IHRhc2tkYXRhX3NyYy0+dGRfc2l6ZV9hbGxvYzsKKworICAgIC8vIEFsbG9jYXRlIGEga21wX3Rhc2tkYXRhX3QgYmxvY2sgYW5kIGEga21wX3Rhc2tfdCBibG9jay4KKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF90YXNrX2R1cF9hbGxvYzogVGggJXAsIG1hbGxvYyBzaXplICVsZFxuIiwgdGhyZWFkLCB0YXNrX3NpemUpICk7CisgICAgI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIHRhc2tkYXRhID0gKGttcF90YXNrZGF0YV90ICopX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhyZWFkLCB0YXNrX3NpemUgKTsKKyAgICAjZWxzZQorICAgIHRhc2tkYXRhID0gKGttcF90YXNrZGF0YV90ICopX19rbXBfdGhyZWFkX21hbGxvYyggdGhyZWFkLCB0YXNrX3NpemUgKTsKKyAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisgICAgS01QX01FTUNQWSh0YXNrZGF0YSwgdGFza2RhdGFfc3JjLCB0YXNrX3NpemUpOworCisgICAgdGFzayA9IEtNUF9UQVNLREFUQV9UT19UQVNLKHRhc2tkYXRhKTsKKworICAgIC8vIEluaXRpYWxpemUgbmV3IHRhc2sgKG9ubHkgc3BlY2lmaWMgZmllbGRzIG5vdCBhZmZlY3RlZCBieSBtZW1jcHkpCisgICAgdGFza2RhdGEtPnRkX3Rhc2tfaWQgPSBLTVBfR0VOX1RBU0tfSUQoKTsKKyAgICBpZiggdGFzay0+c2hhcmVkcyAhPSBOVUxMICkgeyAvLyBuZWVkIHNldHVwIHNoYXJlZHMgcG9pbnRlcgorICAgICAgICBzaGFyZWRzX29mZnNldCA9IChjaGFyKil0YXNrX3NyYy0+c2hhcmVkcyAtIChjaGFyKil0YXNrZGF0YV9zcmM7CisgICAgICAgIHRhc2stPnNoYXJlZHMgPSAmKChjaGFyKil0YXNrZGF0YSlbc2hhcmVkc19vZmZzZXRdOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoKChrbXBfdWludHB0cl90KXRhc2stPnNoYXJlZHMpICYgKHNpemVvZih2b2lkKiktMSkpID09IDAgKTsKKyAgICB9CisgICAgdGFza2RhdGEtPnRkX2FsbG9jX3RocmVhZCA9IHRocmVhZDsKKyAgICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0gcGFyZW50X3Rhc2stPnRkX3Rhc2tncm91cDsgLy8gdGFzayBpbmhlcml0cyB0aGUgdGFza2dyb3VwIGZyb20gdGhlIHBhcmVudCB0YXNrCisKKyAgICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBjaGlsZCB0YXNrIGNvdW50cyBpZiB0ZWFtIHBhcmFsbGVsIGFuZCB0YXNraW5nIG5vdCBzZXJpYWxpemVkCisgICAgaWYgKCAhKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyICkgKSB7CisgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiBwYXJlbnRfdGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgKTsKKyAgICAgICAgaWYgKCBwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwICkKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiBwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwLT5jb3VudCkgKTsKKyAgICAgICAgLy8gT25seSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgYWxsb2NhdGVkIGNoaWxkIHRhc2tzIGZvciBleHBsaWNpdCB0YXNrcyBzaW5jZSBpbXBsaWNpdCBub3QgZGVhbGxvY2F0ZWQKKyAgICAgICAgaWYgKCB0YXNrZGF0YS0+dGRfcGFyZW50LT50ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICkKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YS0+dGRfcGFyZW50LT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza19kdXBfYWxsb2MoZXhpdCk6IFRoICVwLCBjcmVhdGVkIHRhc2sgJXAsIHBhcmVudD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIHRocmVhZCwgdGFza2RhdGEsIHRhc2tkYXRhLT50ZF9wYXJlbnQpICk7CisjaWYgT01QVF9TVVBQT1JUCisgICAgX19rbXBfdGFza19pbml0X29tcHQodGFza2RhdGEsIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc19ndGlkLCAodm9pZCopdGFzay0+cm91dGluZSk7CisjZW5kaWYKKyAgICByZXR1cm4gdGFzazsKK30KKworLy8gUm91dGluZSBvcHRpb25hbGx5IGdlbmVyYXRlZCBieSB0aCBlY29tcGlsZXIgZm9yIHNldHRpbmcgdGhlIGxhc3Rwcml2YXRlIGZsYWcKKy8vIGFuZCBjYWxsaW5nIG5lZWRlZCBjb25zdHJ1Y3RvcnMgZm9yIHByaXZhdGUvZmlyc3Rwcml2YXRlIG9iamVjdHMKKy8vICh1c2VkIHRvIGZvcm0gdGFza2xvb3AgdGFza3MgZnJvbSBwYXR0ZXJuIHRhc2spCit0eXBlZGVmIHZvaWQoKnBfdGFza19kdXBfdCkoa21wX3Rhc2tfdCAqLCBrbXBfdGFza190ICosIGttcF9pbnQzMik7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrbG9vcF9saW5lYXI6IFN0YXJ0IHRhc2tzIG9mIHRoZSB0YXNrbG9vcCBsaW5lYXJseQorLy8KKy8vIGxvYyAgICAgICBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KKy8vIGd0aWQgICAgICBHbG9iYWwgdGhyZWFkIElECisvLyB0YXNrICAgICAgVGFzayB3aXRoIHdob2xlIGxvb3AgaXRlcmF0aW9uIHJhbmdlCisvLyBsYiAgICAgICAgUG9pbnRlciB0byBsb29wIGxvd2VyIGJvdW5kCisvLyB1YiAgICAgICAgUG9pbnRlciB0byBsb29wIHVwcGVyIGJvdW5kCisvLyBzdCAgICAgICAgTG9vcCBzdHJpZGUKKy8vIHNjaGVkICAgICBTY2hlZHVsZSBzcGVjaWZpZWQgMC8xLzIgZm9yIG5vbmUvZ3JhaW5zaXplL251bV90YXNrcworLy8gZ3JhaW5zaXplIFNjaGVkdWxlIHZhbHVlIGlmIHNwZWNpZmllZAorLy8gdGFza19kdXAgIFRhc2tzIGR1cGxpY2F0aW9uIHJvdXRpbmUKK3ZvaWQKK19fa21wX3Rhc2tsb29wX2xpbmVhcihpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfdGFza190ICp0YXNrLAorICAgICAgICAgICAgICAgIGttcF91aW50NjQgKmxiLCBrbXBfdWludDY0ICp1Yiwga21wX2ludDY0IHN0LAorICAgICAgICAgICAgICAgIGludCBzY2hlZCwga21wX3VpbnQ2NCBncmFpbnNpemUsIHZvaWQgKnRhc2tfZHVwICkKK3sKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX1RBU0tMT09QKTsKKyAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfdGFza2xvb3Bfc2NoZWR1bGluZyk7CisgICAgcF90YXNrX2R1cF90IHB0YXNrX2R1cCA9IChwX3Rhc2tfZHVwX3QpdGFza19kdXA7CisgICAga21wX3VpbnQ2NCB0YzsKKyAgICBrbXBfdWludDY0IGxvd2VyID0gKmxiOyAvLyBjb21waWxlciBwcm92aWRlcyBnbG9iYWwgYm91bmRzIGhlcmUKKyAgICBrbXBfdWludDY0IHVwcGVyID0gKnViOworICAgIGttcF91aW50NjQgaSwgbnVtX3Rhc2tzID0gMCwgZXh0cmFzID0gMDsKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIGttcF90YXNrZGF0YV90ICpjdXJyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICBrbXBfdGFza190ICpuZXh0X3Rhc2s7CisgICAga21wX2ludDMyIGxhc3Rwcml2ID0gMDsKKyAgICBzaXplX3QgbG93ZXJfb2Zmc2V0ID0gKGNoYXIqKWxiIC0gKGNoYXIqKXRhc2s7IC8vIHJlbWVtYmVyIG9mZnNldCBvZiBsYiBpbiB0aGUgdGFzayBzdHJ1Y3R1cmUKKyAgICBzaXplX3QgdXBwZXJfb2Zmc2V0ID0gKGNoYXIqKXViIC0gKGNoYXIqKXRhc2s7IC8vIHJlbWVtYmVyIG9mZnNldCBvZiB1YiBpbiB0aGUgdGFzayBzdHJ1Y3R1cmUKKworICAgIC8vIGNvbXB1dGUgdHJpcCBjb3VudAorICAgIGlmICggc3QgPT0gMSApIHsgICAvLyBtb3N0IGNvbW1vbiBjYXNlCisgICAgICAgIHRjID0gdXBwZXIgLSBsb3dlciArIDE7CisgICAgfSBlbHNlIGlmICggc3QgPCAwICkgeworICAgICAgICB0YyA9IChsb3dlciAtIHVwcGVyKSAvICgtc3QpICsgMTsKKyAgICB9IGVsc2UgeyAgICAgICAvLyBzdCA+IDAKKyAgICAgICAgdGMgPSAodXBwZXIgLSBsb3dlcikgLyBzdCArIDE7CisgICAgfQorICAgIGlmKHRjID09IDApIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX3Rhc2tsb29wKGV4aXQpOiBUIyVkIHplcm8tdHJpcCBsb29wXG4iLCBndGlkKSk7CisgICAgICAgIC8vIGZyZWUgdGhlIHBhdHRlcm4gdGFzayBhbmQgZXhpdAorICAgICAgICBfX2ttcF90YXNrX3N0YXJ0KCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKyAgICAgICAgLy8gZG8gbm90IGV4ZWN1dGUgYW55dGhpbmcgZm9yIHplcm8tdHJpcCBsb29wCisgICAgICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNvbXB1dGUgbnVtX3Rhc2tzL2dyYWluc2l6ZSBiYXNlZCBvbiB0aGUgaW5wdXQgcHJvdmlkZWQKKyAgICBzd2l0Y2goIHNjaGVkICkgeworICAgIGNhc2UgMDogLy8gbm8gc2NoZWR1bGUgY2xhdXNlIHNwZWNpZmllZCwgd2UgY2FuIGNob29zZSB0aGUgZGVmYXVsdAorICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IHRvIHNjaGVkdWxlICh0ZWFtX3NpemUqMTApIHRhc2tzCisgICAgICAgIGdyYWluc2l6ZSA9IHRocmVhZC0+dGgudGhfdGVhbV9ucHJvYyAqIDEwOworICAgIGNhc2UgMjogLy8gbnVtX3Rhc2tzIHByb3ZpZGVkCisgICAgICAgIGlmKCBncmFpbnNpemUgPiB0YyApIHsKKyAgICAgICAgICAgIG51bV90YXNrcyA9IHRjOyAgIC8vIHRvbyBiaWcgbnVtX3Rhc2tzIHJlcXVlc3RlZCwgYWRqdXN0IHZhbHVlcworICAgICAgICAgICAgZ3JhaW5zaXplID0gMTsKKyAgICAgICAgICAgIGV4dHJhcyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1fdGFza3MgPSBncmFpbnNpemU7CisgICAgICAgICAgICBncmFpbnNpemUgPSB0YyAvIG51bV90YXNrczsKKyAgICAgICAgICAgIGV4dHJhcyA9IHRjICUgbnVtX3Rhc2tzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTogLy8gZ3JhaW5zaXplIHByb3ZpZGVkCisgICAgICAgIGlmKCBncmFpbnNpemUgPiB0YyApIHsKKyAgICAgICAgICAgIG51bV90YXNrcyA9IDE7ICAgIC8vIHRvbyBiaWcgZ3JhaW5zaXplIHJlcXVlc3RlZCwgYWRqdXN0IHZhbHVlcworICAgICAgICAgICAgZ3JhaW5zaXplID0gdGM7CisgICAgICAgICAgICBleHRyYXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtX3Rhc2tzID0gdGMgLyBncmFpbnNpemU7CisgICAgICAgICAgICBncmFpbnNpemUgPSB0YyAvIG51bV90YXNrczsgLy8gYWRqdXN0IGdyYWluc2l6ZSBmb3IgYmFsYW5jZWQgZGlzdHJpYnV0aW9uIG9mIGl0ZXJhdGlvbnMKKyAgICAgICAgICAgIGV4dHJhcyA9IHRjICUgbnVtX3Rhc2tzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJ1bmtub3duIHNjaGVkdWxpbmcgb2YgdGFza2xvb3AiKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCh0YyA9PSBudW1fdGFza3MgKiBncmFpbnNpemUgKyBleHRyYXMpOworICAgIEtNUF9ERUJVR19BU1NFUlQobnVtX3Rhc2tzID4gZXh0cmFzKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG51bV90YXNrcyA+IDApOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY190YXNrbG9vcDogVCMlZCB3aWxsIGxhdW5jaDogbnVtX3Rhc2tzICVsbGQsIGdyYWluc2l6ZSAlbGxkLCBleHRyYXMgJWxsZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIG51bV90YXNrcywgZ3JhaW5zaXplLCBleHRyYXMpKTsKKworICAgIC8vIE1haW4gbG9vcCwgbGF1bmNoIG51bV90YXNrcyB0YXNrcywgYXNzaWduIGdyYWluc2l6ZSBpdGVyYXRpb25zIGVhY2ggdGFzaworICAgIGZvciggaSA9IDA7IGkgPCBudW1fdGFza3M7ICsraSApIHsKKyAgICAgICAga21wX3VpbnQ2NCBjaHVua19taW51c18xOworICAgICAgICBpZiggZXh0cmFzID09IDAgKSB7CisgICAgICAgICAgICBjaHVua19taW51c18xID0gZ3JhaW5zaXplIC0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNodW5rX21pbnVzXzEgPSBncmFpbnNpemU7CisgICAgICAgICAgICAtLWV4dHJhczsgLy8gZmlyc3QgZXh0cmFzIGl0ZXJhdGlvbnMgZ2V0IGJpZ2dlciBjaHVuayAoZ3JhaW5zaXplKzEpCisgICAgICAgIH0KKyAgICAgICAgdXBwZXIgPSBsb3dlciArIHN0ICogY2h1bmtfbWludXNfMTsKKyAgICAgICAgaWYoIGkgPT0gbnVtX3Rhc2tzIC0gMSApIHsKKyAgICAgICAgICAgIC8vIHNjaGVkdWxlIHRoZSBsYXN0IHRhc2ssIHNldCBsYXN0cHJpdmF0ZSBmbGFnCisgICAgICAgICAgICBsYXN0cHJpdiA9IDE7CisjaWYgS01QX0RFQlVHCisgICAgICAgICAgICBpZiggc3QgPT0gMSApCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh1cHBlciA9PSAqdWIpOworICAgICAgICAgICAgZWxzZSBpZiggc3QgPiAwICkKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHVwcGVyK3N0ID4gKnViKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHVwcGVyK3N0IDwgKnViKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIG5leHRfdGFzayA9IF9fa21wX3Rhc2tfZHVwX2FsbG9jKHRocmVhZCwgdGFzayk7IC8vIGFsbG9jYXRlIG5ldyB0YXNrCisgICAgICAgICooa21wX3VpbnQ2NCopKChjaGFyKiluZXh0X3Rhc2sgKyBsb3dlcl9vZmZzZXQpID0gbG93ZXI7IC8vIGFkanVzdCB0YXNrLXNwZWNpZmljIGJvdW5kcworICAgICAgICAqKGttcF91aW50NjQqKSgoY2hhciopbmV4dF90YXNrICsgdXBwZXJfb2Zmc2V0KSA9IHVwcGVyOworICAgICAgICBpZiggcHRhc2tfZHVwICE9IE5VTEwgKQorICAgICAgICAgICAgcHRhc2tfZHVwKG5leHRfdGFzaywgdGFzaywgbGFzdHByaXYpOyAvLyBzZXQgbGFzdHByaXZhdGUgZmxhZywgY29uc3RydWN0IGZpc3Rwcml2YXRlcywgZXRjLgorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfdGFza2xvb3A6IFQjJWQgc2NoZWR1bGUgdGFzayAlcDogbG93ZXIgJWxsZCwgdXBwZXIgJWxsZCAob2Zmc2V0cyAlcCAlcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbmV4dF90YXNrLCBsb3dlciwgdXBwZXIsIGxvd2VyX29mZnNldCwgdXBwZXJfb2Zmc2V0KSk7CisgICAgICAgIF9fa21wX29tcF90YXNrKGd0aWQsIG5leHRfdGFzaywgdHJ1ZSk7IC8vIHNjaGVkdWxlIG5ldyB0YXNrCisgICAgICAgIGxvd2VyID0gdXBwZXIgKyBzdDsgLy8gYWRqdXN0IGxvd2VyIGJvdW5kIGZvciB0aGUgbmV4dCBpdGVyYXRpb24KKyAgICB9CisgICAgLy8gZnJlZSB0aGUgcGF0dGVybiB0YXNrIGFuZCBleGl0CisgICAgX19rbXBfdGFza19zdGFydCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisgICAgLy8gZG8gbm90IGV4ZWN1dGUgdGhlIHBhdHRlcm4gdGFzaywganVzdCBkbyBib29ra2VlcGluZworICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gbG9jICAgICAgIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGd0aWQgICAgICBHbG9iYWwgdGhyZWFkIElECitAcGFyYW0gdGFzayAgICAgIFRhc2sgc3RydWN0dXJlCitAcGFyYW0gaWZfdmFsICAgIFZhbHVlIG9mIHRoZSBpZiBjbGF1c2UKK0BwYXJhbSBsYiAgICAgICAgUG9pbnRlciB0byBsb29wIGxvd2VyIGJvdW5kCitAcGFyYW0gdWIgICAgICAgIFBvaW50ZXIgdG8gbG9vcCB1cHBlciBib3VuZAorQHBhcmFtIHN0ICAgICAgICBMb29wIHN0cmlkZQorQHBhcmFtIG5vZ3JvdXAgICBGbGFnLCAxIGlmIG5vZ3JvdXAgY2xhdXNlIHNwZWNpZmllZCwgMCBvdGhlcndpc2UKK0BwYXJhbSBzY2hlZCAgICAgU2NoZWR1bGUgc3BlY2lmaWVkIDAvMS8yIGZvciBub25lL2dyYWluc2l6ZS9udW1fdGFza3MKK0BwYXJhbSBncmFpbnNpemUgU2NoZWR1bGUgdmFsdWUgaWYgc3BlY2lmaWVkCitAcGFyYW0gdGFza19kdXAgIFRhc2tzIGR1cGxpY2F0aW9uIHJvdXRpbmUKKworRXhlY3V0ZSB0aGUgdGFza2xvb3AgY29uc3RydWN0LgorKi8KK3ZvaWQKK19fa21wY190YXNrbG9vcChpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfdGFza190ICp0YXNrLCBpbnQgaWZfdmFsLAorICAgICAgICAgICAgICAgIGttcF91aW50NjQgKmxiLCBrbXBfdWludDY0ICp1Yiwga21wX2ludDY0IHN0LAorICAgICAgICAgICAgICAgIGludCBub2dyb3VwLCBpbnQgc2NoZWQsIGttcF91aW50NjQgZ3JhaW5zaXplLCB2b2lkICp0YXNrX2R1cCApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2sgIT0gTlVMTCApOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX3Rhc2tsb29wKGVudGVyKTogVCMlZCwgcGF0dGVybiB0YXNrICVwLCBsYiAlbGxkIHViICVsbGQgc3QgJWxsZCwgZ3JhaW4gJWxsdSglZClcbiIsCisgICAgICAgIGd0aWQsIHRhc2tkYXRhLCAqbGIsICp1Yiwgc3QsIGdyYWluc2l6ZSwgc2NoZWQpKTsKKworICAgIC8vIGNoZWNrIGlmIGNsYXVzZSB2YWx1ZSBmaXJzdAorICAgIGlmKCBpZl92YWwgPT0gMCApIHsgLy8gaWYoMCkgc3BlY2lmaWVkLCBtYXJrIHRhc2sgYXMgc2VyaWFsCisgICAgICAgIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCA9IDE7CisgICAgICAgIHRhc2tkYXRhLT50ZF9mbGFncy50aWVkbmVzcyA9IFRBU0tfVElFRDsgLy8gQUM6IHNlcmlhbCB0YXNrIGNhbm5vdCBiZSB1bnRpZWQKKyAgICB9CisgICAgaWYoIG5vZ3JvdXAgPT0gMCApIHsKKyAgICAgICAgX19rbXBjX3Rhc2tncm91cCggbG9jLCBndGlkICk7CisgICAgfQorCisgICAgaWYoIDEgLyogQUM6IHVzZSBzb21lIGhldXJpc3RpYyBoZXJlIHRvIGNob29zZSB0YXNrIHNjaGVkdWxpbmcgbWV0aG9kICovICkgeworICAgICAgICBfX2ttcF90YXNrbG9vcF9saW5lYXIoIGxvYywgZ3RpZCwgdGFzaywgbGIsIHViLCBzdCwgc2NoZWQsIGdyYWluc2l6ZSwgdGFza19kdXAgKTsKKyAgICB9CisKKyAgICBpZiggbm9ncm91cCA9PSAwICkgeworICAgICAgICBfX2ttcGNfZW5kX3Rhc2tncm91cCggbG9jLCBndGlkICk7CisgICAgfQorICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY190YXNrbG9vcChleGl0KTogVCMlZFxuIiwgZ3RpZCkpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza3EuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF90YXNrcS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3YmRhOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza3EuY3BwCkBAIC0wLDAgKzEsMjAzMiBAQAorLyoKKyAqIGttcF90YXNrcS5jcHAgLS0gVEFTS1Egc3VwcG9ydCBmb3IgT3Blbk1QLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKworI2RlZmluZSBNQVhfTUVTU0FHRSA1MTIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRhc2txIHJvdXRpbmVzIGFuZCBnbG9iYWwgdmFyaWFibGVzCisgKi8KKworI2RlZmluZSBLTVBfREVCVUdfUkVGX0NUUyh4KSAgICBLRl9UUkFDRSgxLCB4KTsKKworI2RlZmluZSBUSFJFQURfQUxMT0NfRk9SX1RBU0tRCisKK3N0YXRpYyBpbnQKK2luX3BhcmFsbGVsX2NvbnRleHQoIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIHJldHVybiAhIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrcV9lbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgZ3RpZCA9ICpndGlkX3JlZjsKKyAgICBpbnQgICAgICAgICAgICAgICAgdGlkICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdWludDMyICAgICAgICAgbXlfdG9rZW47CisgICAga21wY190YXNrX3F1ZXVlX3QgKnRhc2txOworICAgIGttcF90YXNrcV90ICAgICAgICp0cSAgID0gJiBfX2ttcF90aHJlYWRzW2d0aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl90YXNrcSwgbG9jX3JlZiwgTlVMTCwgMCApOworI2Vsc2UKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3Rhc2txLCBsb2NfcmVmLCBOVUxMICk7CisjZW5kaWYKKworICAgIGlmICggISBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiBHRUggLSBuZWVkIGNoZWNrIGhlcmUgdW5kZXIgc3RhdHMgdG8gbWFrZSBzdXJlICAgKi8KKyAgICAgICAgLyogICAgICAgaW5zaWRlIHRhc2sgKGN1cnJfdGh1bmtbKnRpZF9yZWZdICE9IE5VTEwpICovCisKKyAgICAgICAgbXlfdG9rZW4gPXRxLT50cV9jdXJyX3RodW5rWyB0aWQgXS0+IHRoX3Rhc2tudW07CisKKyAgICAgICAgdGFza3EgPSB0cS0+dHFfY3Vycl90aHVua1sgdGlkIF0tPiB0aC50aF9zaGFyZWRzIC0+IHN2X3F1ZXVlOworCisgICAgICAgIEtNUF9XQUlUX1lJRUxEKCZ0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nLCBteV90b2tlbiwgS01QX0VRLCBOVUxMKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfdGFza3FfeG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgaW50ICAgICAgICAgICBndGlkID0gKmd0aWRfcmVmOworICAgIGludCAgICAgICAgICAgdGlkICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdWludDMyICAgIG15X3Rva2VuOworICAgIGttcF90YXNrcV90ICAqdHEgICA9ICYgX19rbXBfdGhyZWFkc1tndGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fdGFza3EsIGxvY19yZWYgKTsKKworICAgIGlmICggISBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAvKiBHRUggLSBuZWVkIGNoZWNrIGhlcmUgdW5kZXIgc3RhdHMgdG8gbWFrZSBzdXJlICovCisgICAgICAgIC8qICAgICAgIGluc2lkZSB0YXNrIChjdXJyX3RodW5rW3RpZF0gIT0gTlVMTCkgICAgKi8KKworICAgICAgICBteV90b2tlbiA9IHRxLT50cV9jdXJyX3RodW5rWyB0aWQgXS0+dGhfdGFza251bTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICB0cS0+dHFfY3Vycl90aHVua1sgdGlkIF0tPiB0aC50aF9zaGFyZWRzIC0+IHN2X3F1ZXVlIC0+IHRxX3Rhc2tudW1fc2VydmluZyA9IG15X3Rva2VuICsgMTsKKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrcV9jaGVja19vcmRlcmVkKCBrbXBfaW50MzIgZ3RpZCwga21wY190aHVua190ICp0aHVuayApCit7CisgICAga21wX3VpbnQzMiBteV90b2tlbjsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqdGFza3E7CisKKyAgICAvKiBhc3N1bWUgd2UgYXJlIGFsd2F5cyBjYWxsZWQgZnJvbSBhbiBhY3RpdmUgcGFyYWxsZWwgY29udGV4dCAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBteV90b2tlbiA9ICB0aHVuayAtPiB0aF90YXNrbnVtOworCisgICAgdGFza3EgPSAgdGh1bmsgLT4gdGgudGhfc2hhcmVkcyAtPiBzdl9xdWV1ZTsKKworICAgIGlmKHRhc2txLT50cV90YXNrbnVtX3NlcnZpbmcgPD0gbXlfdG9rZW4pIHsKKyAgICAgICAgS01QX1dBSVRfWUlFTEQoJnRhc2txLT50cV90YXNrbnVtX3NlcnZpbmcsIG15X3Rva2VuLCBLTVBfR0UsIE5VTEwpOworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgdGFza3EtPnRxX3Rhc2tudW1fc2VydmluZyA9IG15X3Rva2VuICsxOworICAgICAgICBLTVBfTUIoKTsKKyAgICB9Cit9CisKKyNpZmRlZiBLTVBfREVCVUcKKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfVFFGKGttcF9pbnQzMiBmbGFncykKK3sKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJPUkRFUkVEICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JU19MQVNUUFJJVkFURSkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJMQVNUX1BSSVYgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lTX05PV0FJVCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJOT1dBSVQgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0hFVVJJU1RJQ1MpCisgICAgICAgIF9fa21wX3ByaW50ZigiSEVVUklTVCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMSkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRVNFUlYxICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQyKQorICAgICAgICBfX2ttcF9wcmludGYoIlJFU0VSVjIgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDMpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVTRVJWMyAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVENCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRVNFUlY0ICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JU19MQVNUX1RBU0spCisgICAgICAgIF9fa21wX3ByaW50ZigiTEFTVF9UQVNLICIpOworICAgIGlmIChmbGFncyAmIFRRRl9UQVNLUV9UQVNLKQorICAgICAgICBfX2ttcF9wcmludGYoIlRBU0tRX1RBU0sgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX1JFTEVBU0VfV09SS0VSUykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRUxFQVNFICIpOworICAgIGlmIChmbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKQorICAgICAgICBfX2ttcF9wcmludGYoIkFMTF9RVUVVRUQgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpCisgICAgICAgIF9fa21wX3ByaW50ZigiUEFSQUxMRUwgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKQorICAgICAgICBfX2ttcF9wcmludGYoIkRFQUxMT0MgIik7CisgICAgaWYgKCEoZmxhZ3MgJiAoVFFGX0lOVEVSTkFMX0ZMQUdTfFRRRl9JTlRFUkZBQ0VfRkxBR1MpKSkKKyAgICAgICAgX19rbXBfcHJpbnRmKCIoTk9ORSkiKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfdGh1bmsoIGttcF90YXNrcV90ICp0cSwga21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGludCBpOworICAgIGludCBucHJvYyA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisKKyAgICBfX2ttcF9wcmludGYoIlx0VGh1bmsgYXQgJXAgb24gKCVkKTogICIsIHRodW5rLCBnbG9iYWxfdGlkKTsKKworICAgIGlmICh0aHVuayAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgaSsrKSB7CisgICAgICAgICAgICBpZiggdHEtPnRxX2N1cnJfdGh1bmtbaV0gPT0gdGh1bmsgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCJbJWldICIsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfc2hhcmVkcz0lcCwgIiwgdGh1bmstPnRoLnRoX3NoYXJlZHMpOworICAgICAgICBfX2ttcF9wcmludGYoInRoX3Rhc2s9JXAsICIsIHRodW5rLT50aF90YXNrKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF9lbmNsX3RodW5rPSVwLCAiLCB0aHVuay0+dGhfZW5jbF90aHVuayk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfc3RhdHVzPSVkLCAiLCB0aHVuay0+dGhfc3RhdHVzKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF90YXNrbnVtPSV1LCAiLCB0aHVuay0+dGhfdGFza251bSk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfZmxhZ3M9Iik7IF9fa21wX2R1bXBfVFFGKHRodW5rLT50aF9mbGFncyk7CisgICAgfQorCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90aHVua19zdGFjayhrbXBjX3RodW5rX3QgKnRodW5rLCBrbXBfaW50MzIgdGhyZWFkX251bSkKK3sKKyAgICBrbXBjX3RodW5rX3QgKnRoOworCisgICAgX19rbXBfcHJpbnRmKCIgICAgVGh1bmsgc3RhY2sgZm9yIFQjJWQ6ICAiLCB0aHJlYWRfbnVtKTsKKworICAgIGZvciAodGggPSB0aHVuazsgdGggIT0gTlVMTDsgdGggPSB0aC0+dGhfZW5jbF90aHVuayApCisgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgdGgpOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90YXNrX3F1ZXVlKCBrbXBfdGFza3FfdCAqdHEsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGludCAgICAgICAgICAgICAgICAgIHFzLCBjb3VudCwgaTsKKyAgICBrbXBjX3RodW5rX3QgICAgICAgICp0aHVuazsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICp0YXNrcTsKKworICAgIF9fa21wX3ByaW50ZigiVGFzayBRdWV1ZSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpOworCisgICAgaWYgKHF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGluX3BhcmFsbGVsID0gcXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQ7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbG9jICAgICAgICAgICAgIDogIik7CisgICAgfQorICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKworICAgICAgICAgICAgLy9pZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSAwKQorICAgICAgICAgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9wYXJlbnQgICAgICAgICAgOiAlcFxuIiwgcXVldWUtPnRxLnRxX3BhcmVudCk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9maXJzdF9jaGlsZCAgICAgOiAlcFxuIiwgcXVldWUtPnRxX2ZpcnN0X2NoaWxkKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX25leHRfY2hpbGQgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfbmV4dF9jaGlsZCk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9wcmV2X2NoaWxkICAgICAgOiAlcFxuIiwgcXVldWUtPnRxX3ByZXZfY2hpbGQpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfcmVmX2NvdW50ICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9yZWZfY291bnQpOworCisgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIC8vaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gMCkKKyAgICAgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfc2hhcmVkcyAgICAgICAgIDogIik7CisgICAgICAgIGZvciAoaT0wOyBpPCgocXVldWUgPT0gdHEtPnRxX3Jvb3QpID8gcXVldWUtPnRxX25wcm9jIDogMSk7IGkrKykKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgcXVldWUtPnRxX3NoYXJlZHNbaV0uYWlfZGF0YSk7CisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3Rhc2tudW1fcXVldWluZyA6ICV1XG4iLCBxdWV1ZS0+dHFfdGFza251bV9xdWV1aW5nKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3Rhc2tudW1fc2VydmluZyA6ICV1XG4iLCBxdWV1ZS0+dHFfdGFza251bV9zZXJ2aW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3F1ZXVlICAgICAgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfcXVldWUpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90aHVua19zcGFjZSAgICAgOiAlcFxuIiwgcXVldWUtPnRxX3RodW5rX3NwYWNlKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGFza3Ffc2xvdCAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV90YXNrcV9zbG90KTsKKworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9mcmVlX3RodW5rcyAgICAgOiAiKTsKKyAgICAgICAgZm9yICh0aHVuayA9IHF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgdGh1bmsgPSB0aHVuay0+dGgudGhfbmV4dF9mcmVlICkKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgdGh1bmspOworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbnNsb3RzICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9uc2xvdHMpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9oZWFkICAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX2hlYWQpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YWlsICAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX3RhaWwpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9uZnVsbCAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX25mdWxsKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfaGl3YXQgICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9oaXdhdCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2ZsYWdzICAgICAgICAgICA6ICIpOyBfX2ttcF9kdW1wX1RRRihxdWV1ZS0+dHFfZmxhZ3MpOworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90aF90aHVua3MgICAgICAgOiAiKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBxdWV1ZS0+dHFfbnByb2M7IGkrKykgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZigiJWQgIiwgcXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgUXVldWUgc2xvdHM6XG4iKTsKKworCisgICAgICAgIHFzID0gcXVldWUtPnRxX3RhaWw7CisgICAgICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBxdWV1ZS0+dHFfbmZ1bGw7ICsrY291bnQgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiglZCkiLCBxcyk7CisgICAgICAgICAgICBfX2ttcF9kdW1wX3RodW5rKCB0cSwgcXVldWUtPnRxX3F1ZXVlW3FzXS5xc190aHVuaywgZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgcXMgPSAocXMrMSkgJSBxdWV1ZS0+dHFfbnNsb3RzOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cV90YXNrcV9zbG90ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICBUYXNrUSBzbG90OlxuIik7CisgICAgICAgICAgICAgICAgX19rbXBfZHVtcF90aHVuayggdHEsIChrbXBjX3RodW5rX3QgKikgcXVldWUtPnRxX3Rhc2txX3Nsb3QsIGdsb2JhbF90aWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fa21wX3ByaW50ZigiICAgIFRhc2txIGZyZWVsaXN0OiAiKTsKKworICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgIGZvciggdGFza3EgPSB0cS0+dHFfZnJlZWxpc3Q7IHRhc2txICE9IE5VTEw7IHRhc2txID0gdGFza3EtPnRxLnRxX25leHRfZnJlZSApCisgICAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgdGFza3EpOworCisgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworCisgICAgX19rbXBfcHJpbnRmKCJcblxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdXhfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUsIGttcF9pbnQzMiBsZXZlbCwga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIGludCBpLCBjb3VudCwgcXM7CisgICAgaW50IG5wcm9jID0gX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgPSBjdXJyX3F1ZXVlOworCisgICAgaWYgKGN1cnJfcXVldWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgX19rbXBfcHJpbnRmKCIgICAgIik7CisKKyAgICBmb3IgKGk9MDsgaTxsZXZlbDsgaSsrKQorICAgICAgICBfX2ttcF9wcmludGYoIiAgIik7CisKKyAgICBfX2ttcF9wcmludGYoIiVwIiwgY3Vycl9xdWV1ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgICBpZiggdHEtPnRxX2N1cnJfdGh1bmtbaV0gJiYgdHEtPnRxX2N1cnJfdGh1bmtbaV0tPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlID09IGN1cnJfcXVldWUgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiBbJWldIiwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2ttcF9wcmludGYoIjoiKTsKKworICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgIHFzID0gY3Vycl9xdWV1ZS0+dHFfdGFpbDsKKworICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBjdXJyX3F1ZXVlLT50cV9uZnVsbDsgKytjb3VudCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCBjdXJyX3F1ZXVlLT50cV9xdWV1ZVtxc10ucXNfdGh1bmspOworICAgICAgICAgcXMgPSAocXMrMSkgJSBjdXJyX3F1ZXVlLT50cV9uc2xvdHM7CisgICAgfQorCisgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkKSB7CisgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkKSB7CisgICAgICAgICAgICBmb3IocXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKiljdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZDsKKyAgICAgICAgICAgICAgICBxdWV1ZSAhPSBOVUxMOworICAgICAgICAgICAgICAgIHF1ZXVlID0gcXVldWUtPnRxX25leHRfY2hpbGQpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9hdXhfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCBxdWV1ZSwgbGV2ZWwrMSwgZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKnRxcm9vdCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgX19rbXBfcHJpbnRmKCJUYXNrUSBUcmVlIGF0IHJvb3QgJXAgb24gKCVkKTpcbiIsIHRxcm9vdCwgZ2xvYmFsX3RpZCk7CisKKyAgICBfX2ttcF9hdXhfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCB0cXJvb3QsIDAsIGdsb2JhbF90aWQgKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAgICBOZXcgdGFza3Egc3RvcmFnZSByb3V0aW5lcyB0aGF0IHRyeSB0byBtaW5pbWl6ZSBvdmVyaGVhZCBvZiBtYWxsb2NzIGJ1dAorICAgIHN0aWxsIHByb3ZpZGUgY2FjaGUgbGluZSBhbGlnbm1lbnQuCisqLworCisKK3N0YXRpYyB2b2lkICoKK19fa21wX3Rhc2txX2FsbG9jYXRlKHNpemVfdCBzaXplLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICB2b2lkICphZGRyLCAqb3JpZ19hZGRyOworICAgIHNpemVfdCBieXRlczsKKworICAgIEtCX1RSQUNFKCA1LCAoIl9fa21wX3Rhc2txX2FsbG9jYXRlOiBjYWxsZWQgc2l6ZT0lZCwgZ3RpZD0lZFxuIiwgKGludCkgc2l6ZSwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBieXRlcyA9IHNpemVvZih2b2lkICopICsgQ0FDSEVfTElORSArIHNpemU7CisKKyNpZmRlZiBUSFJFQURfQUxMT0NfRk9SX1RBU0tRCisgICAgb3JpZ19hZGRyID0gKHZvaWQgKikgX19rbXBfdGhyZWFkX21hbGxvYyggX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKSwgYnl0ZXMgKTsKKyNlbHNlCisgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBNQUxMT0MoICVkIClcbiIsIGJ5dGVzICkgKTsKKyAgICBvcmlnX2FkZHIgPSAodm9pZCAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBieXRlcyApOworI2VuZGlmIC8qIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EgKi8KKworICAgIGlmIChvcmlnX2FkZHIgPT0gMCkKKyAgICAgICAgS01QX0ZBVEFMKCBPdXRPZkhlYXBNZW1vcnkgKTsKKworICAgIGFkZHIgPSBvcmlnX2FkZHI7CisKKyAgICBpZiAoKChrbXBfdWludHB0cl90KSBhZGRyICYgKCBDQUNIRV9MSU5FIC0gMSApKSAhPSAwKSB7CisgICAgICAgIEtCX1RSQUNFKCA1MCwgKCJfX2ttcF90YXNrcV9hbGxvY2F0ZTogIGFkanVzdCBmb3IgY2FjaGUgYWxpZ25tZW50XG4iICkgKTsKKyAgICAgICAgYWRkciA9ICh2b2lkICopICgoKGttcF91aW50cHRyX3QpIGFkZHIgKyBDQUNIRV9MSU5FKSAmIH4oIENBQ0hFX0xJTkUgLSAxICkpOworICAgIH0KKworICAgICgqICh2b2lkICoqKSBhZGRyKSA9IG9yaWdfYWRkcjsKKworICAgIEtCX1RSQUNFKCAxMCwgKCJfX2ttcF90YXNrcV9hbGxvY2F0ZTogIGFsbG9jYXRlOiAlcCwgdXNlOiAlcCAtICVwLCBzaXplOiAlZCwgZ3RpZDogJWRcbiIsCisgICAgICAgICAgICAgb3JpZ19hZGRyLCAoKHZvaWQgKiopIGFkZHIpICsgMSwgKChjaGFyICopKCgodm9pZCAqKikgYWRkcikgKyAxKSkgKyBzaXplLTEsCisgICAgICAgICAgICAgKGludCkgc2l6ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgIHJldHVybiAoICgodm9pZCAqKikgYWRkcikgKyAxICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcGNfdGFza3FfZnJlZSh2b2lkICpwLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBLQl9UUkFDRSggNSwgKCJfX2ttcGNfdGFza3FfZnJlZTogY2FsbGVkIGFkZHI9JXAsIGd0aWQ9JWRcbiIsIHAsIGdsb2JhbF90aWQgKSApOworCisgICAgS0JfVFJBQ0UoMTAsICgiX19rbXBjX3Rhc2txX2ZyZWU6ICBmcmVlaW5nOiAlcCwgZ3RpZDogJWRcbiIsICgqKCAoKHZvaWQgKiopIHApLTEpKSwgZ2xvYmFsX3RpZCApKTsKKworI2lmZGVmIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EKKyAgICBfX2ttcF90aHJlYWRfZnJlZSggX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKSwgKiggKCh2b2lkICoqKSBwKS0xKSApOworI2Vsc2UKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKiggKCh2b2lkICoqKSBwKS0xKSApOworI2VuZGlmIC8qIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiAgICAgIEtlZXAgZnJlZWQga21wY190YXNrX3F1ZXVlX3Qgb24gYW4gaW50ZXJuYWwgZnJlZWxpc3QgYW5kIHJlY3ljbGUgc2luY2UKKyAqICAgICAgdGhleSdyZSBvZiBjb25zdGFudCBzaXplLgorICovCisKK3N0YXRpYyBrbXBjX3Rhc2tfcXVldWVfdCAqCitfX2ttcF9hbGxvY190YXNrcSAoIGttcF90YXNrcV90ICp0cSwgaW50IGluX3BhcmFsbGVsLCBrbXBfaW50MzIgbnNsb3RzLCBrbXBfaW50MzIgbnRodW5rcywKKyAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5zaGFyZWRzLCBrbXBfaW50MzIgbnByb2MsIHNpemVfdCBzaXplb2ZfdGh1bmssCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfc2hhcmVkcywga21wY190aHVua190ICoqbmV3X3Rhc2txX3RodW5rLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgaTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBieXRlczsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICAgICAgICAqbmV3X3F1ZXVlOworICAgIGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190ICpzaGFyZWRfdmFyX2FycmF5OworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICpzaGFyZWRfdmFyX3N0b3JhZ2U7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKnB0OyAvKiBmb3IgZG9pbmcgYnl0ZS1hZGp1c3RlZCBhZGRyZXNzIGNvbXB1dGF0aW9ucyAqLworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgIGlmKCB0cS0+dHFfZnJlZWxpc3QgKSB7CisgICAgICAgIG5ld19xdWV1ZSA9ICB0cSAtPiB0cV9mcmVlbGlzdDsKKyAgICAgICAgdHEgLT4gdHFfZnJlZWxpc3QgPSAgdHEgLT4gdHFfZnJlZWxpc3QgLT4gdHEudHFfbmV4dF9mcmVlOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobmV3X3F1ZXVlLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCk7CisKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9mbGFncyA9IDA7CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7CisKKyAgICAgICAgbmV3X3F1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlIChzaXplb2YgKGttcGNfdGFza19xdWV1ZV90KSwgZ2xvYmFsX3RpZCk7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfZmxhZ3MgPSAwOworICAgIH0KKworICAgIC8qICBzcGFjZSBpbiB0aGUgdGFzayBxdWV1ZSBmb3IgcXVldWUgc2xvdHMgKGFsbG9jYXRlIGFzIG9uZSBiaWcgY2h1bmsgKi8KKyAgICAvKiBvZiBzdG9yYWdlIGluY2x1ZGluZyBuZXdfdGFza3FfdGFzayBzcGFjZSkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBzaXplb2ZfdGh1bmsgKz0gKENBQ0hFX0xJTkUgLSAoc2l6ZW9mX3RodW5rICUgQ0FDSEVfTElORSkpOyAgICAgICAgIC8qIHBhZCB0byBjYWNoZSBsaW5lIHNpemUgKi8KKyAgICBwdCA9IChjaGFyICopIF9fa21wX3Rhc2txX2FsbG9jYXRlIChudGh1bmtzICogc2l6ZW9mX3RodW5rLCBnbG9iYWxfdGlkKTsKKyAgICBuZXdfcXVldWUtPnRxX3RodW5rX3NwYWNlID0gKGttcGNfdGh1bmtfdCAqKXB0OworICAgICpuZXdfdGFza3FfdGh1bmsgPSAoa21wY190aHVua190ICopKHB0ICsgKG50aHVua3MgLSAxKSAqIHNpemVvZl90aHVuayk7CisKKyAgICAvKiAgY2hhaW4gdGhlIGFsbG9jYXRlZCB0aHVua3MgaW50byBhIGZyZWVsaXN0IGZvciB0aGlzIHF1ZXVlICAqLworCisgICAgbmV3X3F1ZXVlLT50cV9mcmVlX3RodW5rcyA9IChrbXBjX3RodW5rX3QgKilwdDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAobnRodW5rcyAtIDIpOyBpKyspIHsKKyAgICAgICAgKChrbXBjX3RodW5rX3QgKikocHQraSpzaXplb2ZfdGh1bmspKS0+dGgudGhfbmV4dF9mcmVlID0gKGttcGNfdGh1bmtfdCAqKShwdCArIChpKzEpKnNpemVvZl90aHVuayk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICgoa21wY190aHVua190ICopKHB0K2kqc2l6ZW9mX3RodW5rKSktPnRoX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisgICAgfQorCisgICAgKChrbXBjX3RodW5rX3QgKikocHQrKG50aHVua3MtMikqc2l6ZW9mX3RodW5rKSktPnRoLnRoX25leHRfZnJlZSA9IE5VTEw7CisjaWZkZWYgS01QX0RFQlVHCisgICAgKChrbXBjX3RodW5rX3QgKikocHQrKG50aHVua3MtMikqc2l6ZW9mX3RodW5rKSktPnRoX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBsb2NrcyAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIF9fa21wX2luaXRfbG9jayggJiBuZXdfcXVldWUtPnRxX2xpbmtfbGNrICk7CisgICAgICAgIF9fa21wX2luaXRfbG9jayggJiBuZXdfcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjayApOworICAgICAgICBfX2ttcF9pbml0X2xvY2soICYgbmV3X3F1ZXVlLT50cV9xdWV1ZV9sY2sgKTsKKyAgICB9CisKKyAgICAvKiBub3cgYWxsb2NhdGUgdGhlIHNsb3RzICovCisKKyAgICBieXRlcyA9IG5zbG90cyAqIHNpemVvZiAoa21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdCk7CisgICAgbmV3X3F1ZXVlLT50cV9xdWV1ZSA9IChrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlKCBieXRlcywgZ2xvYmFsX3RpZCApOworCisgICAgLyogIHNwYWNlIGZvciBhcnJheSBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGUgc3RydWN0dXJlcyAqLworICAgIHNpemVvZl9zaGFyZWRzICs9IHNpemVvZihrbXBjX3Rhc2tfcXVldWVfdCAqKTsKKyAgICBzaXplb2Zfc2hhcmVkcyArPSAoQ0FDSEVfTElORSAtIChzaXplb2Zfc2hhcmVkcyAlIENBQ0hFX0xJTkUpKTsgICAgIC8qIHBhZCB0byBjYWNoZSBsaW5lIHNpemUgKi8KKworICAgIGJ5dGVzID0gbnNoYXJlZHMgKiBzaXplb2YgKGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190KTsKKyAgICBzaGFyZWRfdmFyX2FycmF5ID0gKGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlICggYnl0ZXMsIGdsb2JhbF90aWQpOworCisgICAgYnl0ZXMgPSBuc2hhcmVkcyAqIHNpemVvZl9zaGFyZWRzOworICAgIHNoYXJlZF92YXJfc3RvcmFnZSA9IChjaGFyICopIF9fa21wX3Rhc2txX2FsbG9jYXRlICggYnl0ZXMsIGdsb2JhbF90aWQpOworCisgICAgZm9yIChpPTA7IGk8bnNoYXJlZHM7IGkrKykgeworICAgICAgICBzaGFyZWRfdmFyX2FycmF5W2ldLmFpX2RhdGEgPSAoa21wY19zaGFyZWRfdmFyc190ICopIChzaGFyZWRfdmFyX3N0b3JhZ2UgKyBpKnNpemVvZl9zaGFyZWRzKTsKKyAgICAgICAgc2hhcmVkX3Zhcl9hcnJheVtpXS5haV9kYXRhLT5zdl9xdWV1ZSA9IG5ld19xdWV1ZTsKKyAgICB9CisgICAgbmV3X3F1ZXVlLT50cV9zaGFyZWRzID0gc2hhcmVkX3Zhcl9hcnJheTsKKworCisgICAgLyogYXJyYXkgZm9yIG51bWJlciBvZiBvdXRzdGFuZGluZyB0aHVua3MgcGVyIHRocmVhZCAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIGJ5dGVzID0gbnByb2MgKiBzaXplb2Yoa21wY19hbGlnbmVkX2ludDMyX3QpOworICAgICAgICBuZXdfcXVldWUtPnRxX3RoX3RodW5rcyA9IChrbXBjX2FsaWduZWRfaW50MzJfdCAqKSBfX2ttcF90YXNrcV9hbGxvY2F0ZSAoIGJ5dGVzLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9ucHJvYyAgICAgPSBucHJvYzsKKworICAgICAgICBmb3IgKGk9MDsgaTxucHJvYzsgaSsrKQorICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIG5ld19xdWV1ZTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza3EgKGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKnAsIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgX19rbXBjX3Rhc2txX2ZyZWUocC0+dHFfdGh1bmtfc3BhY2UsIGdsb2JhbF90aWQpOworICAgIF9fa21wY190YXNrcV9mcmVlKHAtPnRxX3F1ZXVlLCBnbG9iYWxfdGlkKTsKKworICAgIC8qIGZyZWUgc2hhcmVkIHZhciBzdHJ1Y3R1cmUgc3RvcmFnZSAqLworICAgIF9fa21wY190YXNrcV9mcmVlKCh2b2lkICopIHAtPnRxX3NoYXJlZHNbMF0uYWlfZGF0YSwgZ2xvYmFsX3RpZCk7CisKKyAgICAvKiBmcmVlIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzIHN0b3JhZ2UgKi8KKyAgICBfX2ttcGNfdGFza3FfZnJlZShwLT50cV9zaGFyZWRzLCBnbG9iYWxfdGlkKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICBwLT50cV9uZXh0X2NoaWxkID0gTlVMTDsKKyAgICBwLT50cV9wcmV2X2NoaWxkID0gTlVMTDsKKyAgICBwLT50cV9yZWZfY291bnQgPSAtMTA7CisgICAgcC0+dHFfc2hhcmVkcyA9IE5VTEw7CisgICAgcC0+dHFfdGFza251bV9xdWV1aW5nID0gMDsKKyAgICBwLT50cV90YXNrbnVtX3NlcnZpbmcgPSAwOworICAgIHAtPnRxX3F1ZXVlID0gTlVMTDsKKyAgICBwLT50cV90aHVua19zcGFjZSA9IE5VTEw7CisgICAgcC0+dHFfdGFza3Ffc2xvdCA9IE5VTEw7CisgICAgcC0+dHFfZnJlZV90aHVua3MgPSBOVUxMOworICAgIHAtPnRxX25zbG90cyA9IDA7CisgICAgcC0+dHFfaGVhZCA9IDA7CisgICAgcC0+dHFfdGFpbCA9IDA7CisgICAgcC0+dHFfbmZ1bGwgPSAwOworICAgIHAtPnRxX2hpd2F0ID0gMDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGk9MDsgaTxwLT50cV9ucHJvYzsgaSsrKQorICAgICAgICAgICAgcC0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPSAwOworICAgIH0KKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIHAtPnRxX2xvYyA9IE5VTEw7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcC0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQgKTsKKyAgICBwLT50cV9mbGFncyA9IFRRRl9ERUFMTE9DQVRFRDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIGlmIChpbl9wYXJhbGxlbCkgIHsKKyAgICAgICAgX19rbXBjX3Rhc2txX2ZyZWUocC0+dHFfdGhfdGh1bmtzLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgX19rbXBfZGVzdHJveV9sb2NrKCYgcC0+dHFfbGlua19sY2spOworICAgICAgICBfX2ttcF9kZXN0cm95X2xvY2soJiBwLT50cV9xdWV1ZV9sY2spOworICAgICAgICBfX2ttcF9kZXN0cm95X2xvY2soJiBwLT50cV9mcmVlX3RodW5rc19sY2spOworICAgIH0KKyNpZmRlZiBLTVBfREVCVUcKKyAgICBwLT50cV90aF90aHVua3MgPSBOVUxMOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKyAgICBwLT50cS50cV9uZXh0X2ZyZWUgPSB0cS0+dHFfZnJlZWxpc3Q7CisKKyAgICB0cS0+dHFfZnJlZWxpc3QgPSBwOworICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7Cit9CisKKy8qCisgKiAgICBPbmNlIGEgZ3JvdXAgb2YgdGh1bmtzIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdXNlIGluIGEgcGFydGljdWxhciBxdWV1ZSwKKyAqICAgIHRoZXNlIGFyZSBtYW5hZ2VkIHZpYSBhIHBlci1xdWV1ZSBmcmVlbGlzdC4KKyAqICAgIFdlIGZvcmNlIGEgY2hlY2sgdGhhdCB0aGVyZSdzIGFsd2F5cyBhIHRodW5rIGZyZWUgaWYgd2UgbmVlZCBvbmUuCisgKi8KKworc3RhdGljIGttcGNfdGh1bmtfdCAqCitfX2ttcF9hbGxvY190aHVuayAoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBpbnQgaW5fcGFyYWxsZWwsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcGNfdGh1bmtfdCAqZmw7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICB9CisKKyAgICBmbCA9IHF1ZXVlLT50cV9mcmVlX3RodW5rczsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKGZsICE9IE5VTEwpOworCisgICAgcXVldWUtPnRxX2ZyZWVfdGh1bmtzID0gZmwtPnRoLnRoX25leHRfZnJlZTsKKyAgICBmbC0+dGhfZmxhZ3MgPSAwOworCisgICAgaWYgKGluX3BhcmFsbGVsKQorICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgIHJldHVybiBmbDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGh1bmsgKGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwga21wY190aHVua190ICpwLCBpbnQgaW5fcGFyYWxsZWwsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRoX3Rhc2sgPSAwOworICAgIHAtPnRoX2VuY2xfdGh1bmsgPSAwOworICAgIHAtPnRoX3N0YXR1cyA9IDA7CisgICAgcC0+dGhfdGFza251bSA9IDA7CisgICAgLyogQWxzbyBjb3VsZCB6ZXJvIHBvaW50ZXJzIHRvIHByaXZhdGUgdmFycyAqLworI2VuZGlmCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKyAgICB9CisKKyAgICBwLT50aC50aF9uZXh0X2ZyZWUgPSBxdWV1ZS0+dHFfZnJlZV90aHVua3M7CisgICAgcXVldWUtPnRxX2ZyZWVfdGh1bmtzID0gcDsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRoX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIHJldHVybnMgbm9uemVybyBpZiB0aGUgcXVldWUganVzdCBiZWNhbWUgZnVsbCBhZnRlciB0aGUgZW5xdWV1ZSAgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZW5xdWV1ZV90YXNrICgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBrbXBjX3RodW5rX3QgKnRodW5rLCBpbnQgaW5fcGFyYWxsZWwgKQoreworICAgIGttcF9pbnQzMiAgICByZXQ7CisKKyAgICAvKiAgZGtwOiBjYW4gd2UgZ2V0IGFyb3VuZCB0aGUgbG9jayBpbiB0aGUgVFFGX1JFTEVBU0VfV09SS0VSUyBjYXNlIChvbmx5IHRoZSBtYXN0ZXIgaXMgZXhlY3V0aW5nIHRoZW4pICAqLworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9uZnVsbCA8IHF1ZXVlLT50cV9uc2xvdHMpOyAgLyogIGNoZWNrIHF1ZXVlIG5vdCBmdWxsICAqLworCisgICAgcXVldWUtPnRxX3F1ZXVlWyhxdWV1ZS0+dHFfaGVhZCkrK10ucXNfdGh1bmsgPSB0aHVuazsKKworICAgIGlmIChxdWV1ZS0+dHFfaGVhZCA+PSBxdWV1ZS0+dHFfbnNsb3RzKQorICAgICAgICBxdWV1ZS0+dHFfaGVhZCA9IDA7CisKKyAgICAocXVldWUtPnRxX25mdWxsKSsrOworCisgICAgS01QX01CKCk7ICAgLyogdG8gYXNzdXJlIHRoYXQgbmZ1bGwgaXMgc2VlbiB0byBpbmNyZWFzZSBiZWZvcmUgVFFGX0FMTF9UQVNLU19RVUVVRUQgaXMgc2V0ICovCisKKyAgICByZXQgPSAoaW5fcGFyYWxsZWwpID8gKHF1ZXVlLT50cV9uZnVsbCA9PSBxdWV1ZS0+dHFfbnNsb3RzKSA6IEZBTFNFOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIC8qIGRvbid0IG5lZWQgdG8gd2FpdCB1bnRpbCB3b3JrZXJzIGFyZSByZWxlYXNlZCBiZWZvcmUgdW5sb2NraW5nICovCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIGlmKCB0cS0+dHFfZ2xvYmFsX2ZsYWdzICYgVFFGX1JFTEVBU0VfV09SS0VSUyApIHsKKyAgICAgICAgICAgIC8qIElmIGp1c3QgY3JlYXRpbmcgdGhlIHJvb3QgcXVldWUsIHRoZSB3b3JrZXIgdGhyZWFkcyBhcmUgd2FpdGluZyBhdCAqLworICAgICAgICAgICAgLyogYSBqb2luIGJhcnJpZXIgdW50aWwgbm93LCB3aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBxdWV1ZSBmb3IgICovCisgICAgICAgICAgICAvKiB0aGVtIHRvIGRvOyByZWxlYXNlIHRoZW0gbm93IHRvIGRvIHdvcmsuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuIHRoaXMgaXMgdGhlIGZpcnN0IHRhc2sgZW5xdWV1ZWQsICAgICAqLworICAgICAgICAgICAgLyogc28gcmVzZXQgdGhlIGZsYWcgaGVyZSBhbHNvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHRxLT50cV9nbG9iYWxfZmxhZ3MgJj0gflRRRl9SRUxFQVNFX1dPUktFUlM7ICAvKiBubyBsb2NrIG5lZWRlZCwgd29ya2VycyBhcmUgc3RpbGwgaW4gc3BpbiBtb2RlICovCisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgIC8qIGF2b2lkIHJlbGVhc2luZyBiYXJyaWVyIHR3aWNlIGlmIHRhc2txX3Rhc2sgc3dpdGNoZXMgdGhyZWFkcyAqLworCisgICAgICAgICAgICBfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyKCBOVUxMLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZGVxdWV1ZV90YXNrIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBpbnQgaW5fcGFyYWxsZWwpCit7CisgICAga21wY190aHVua190ICpwdDsKKyAgICBpbnQgICAgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9uZnVsbCA+IDApOyAgLyogIGNoZWNrIHF1ZXVlIG5vdCBlbXB0eSAgKi8KKworICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgaW50IGN0OworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgaW5jICVkXG4iLAorICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICB9CisKKyAgICBwdCA9IHF1ZXVlLT50cV9xdWV1ZVsocXVldWUtPnRxX3RhaWwpKytdLnFzX3RodW5rOworCisgICAgaWYgKHF1ZXVlLT50cV90YWlsID49IHF1ZXVlLT50cV9uc2xvdHMpCisgICAgICAgIHF1ZXVlLT50cV90YWlsID0gMDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSsrOworCisgICAgICAgIEtNUF9NQigpOyAvKiBuZWNlc3Nhcnkgc28gYWlfZGF0YSBpbmNyZW1lbnQgaXMgcHJvcGFnYXRlZCB0byBvdGhlciB0aHJlYWRzIGltbWVkaWF0ZWx5IChkaWdpdGFsKSAqLworCisgICAgICAgIEtGX1RSQUNFKDIwMCwgKCJfX2ttcF9kZXF1ZXVlX3Rhc2s6IFQjJWQoOiVkKSBub3cgaGFzICVkIG91dHN0YW5kaW5nIHRodW5rcyBmcm9tIHF1ZXVlICVwXG4iLAorICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGlkLCBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSwgcXVldWUpKTsKKyAgICB9CisKKyAgICAocXVldWUtPnRxX25mdWxsKS0tOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgS01QX01CKCk7CisKKyAgICAvKiBuZWNlc3Nhcnkgc28gKHF1ZXVlLT50cV9uZnVsbCA+IDApIGFib3ZlIHN1Y2NlZWRzIGFmdGVyIHRxX25mdWxsIGlzIGRlY3JlbWVudGVkICovCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA+PSAwKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhIDw9IF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHB0OworfQorCisvKgorICogRmluZCB0aGUgbmV4dCAobm9uLW51bGwpIHRhc2sgdG8gZGVxdWV1ZSBhbmQgcmV0dXJuIGl0LgorICogVGhpcyBpcyBuZXZlciBjYWxsZWQgdW5sZXNzIGluX3BhcmFsbGVsPVRSVUUKKyAqCisgKiBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIHF1ZXVlIHRvIHRha2UgdGhlIHRhc2sgZnJvbToKKyAqIDEuICBXYWxrIHVwIHRoZSB0YXNrIHF1ZXVlIHRyZWUgZnJvbSB0aGUgY3VycmVudCBxdWV1ZSdzIHBhcmVudCBhbmQgbG9vaworICogICAgICBvbiB0aGUgd2F5IHVwIChmb3IgbG9vcCwgYmVsb3cpLgorICogMi4gIERvIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIGJhY2sgZG93biB0aGUgdHJlZSBmcm9tIHRoZSByb290IGFuZAorICogICAgICBsb29rIChmaW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZSgpKS4KKyAqCisgKiBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIHRhc2sgdG8gdGFrZSBmcm9tIGEgcXVldWUKKyAqIChfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKCkpOgorICogMS4gIE5ldmVyIHRha2UgdGhlIGxhc3QgdGFzayBmcm9tIGEgcXVldWUgaWYgVFFGX0lTX0xBU1RQUklWQVRFOyB0aGlzIHRhc2sKKyAqICAgICBtdXN0IGJlIHN0YWdlZCB0byBtYWtlIHN1cmUgd2UgZXhlY3V0ZSB0aGUgbGFzdCBvbmUgd2l0aAorICogICAgIFRRRl9JU19MQVNUX1RBU0sgYXQgdGhlIGVuZCBvZiB0YXNrIHF1ZXVlIGV4ZWN1dGlvbi4KKyAqIDIuICBJZiB0aGUgcXVldWUgbGVuZ3RoIGlzIGJlbG93IHNvbWUgaGlnaCB3YXRlciBtYXJrIGFuZCB0aGUgdGFza3EgdGFzaworICogICAgIGlzIGVucXVldWVkLCBwcmVmZXIgcnVubmluZyB0aGUgdGFza3EgdGFzay4KKyAqIDMuICBPdGhlcndpc2UsIHRha2UgYSAobm9ybWFsKSB0YXNrIGZyb20gdGhlIHF1ZXVlLgorICoKKyAqIElmIHdlIGRvIGFsbCB0aGlzIGFuZCByZXR1cm4gcHQgPT0gTlVMTCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgcm91dGluZSwKKyAqIHRoaXMgbWVhbnMgdGhlcmUgYXJlIG5vIG1vcmUgdGFza3MgdG8gZXhlY3V0ZSAoZXhjZXB0IHBvc3NpYmx5IGZvcgorICogVFFGX0lTX0xBU1RQUklWQVRFKS4KKyAqLworCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2ZpbmRfdGFza19pbl9xdWV1ZSAoa21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSkKK3sKKyAgICBrbXBjX3RodW5rX3QgKnB0ICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICAvKiBUbyBwcmV2ZW50IGRlYWRsb2NrIGZyb20gdHFfcXVldWVfbGNrIGlmIHF1ZXVlIGFscmVhZHkgZGVhbGxvY2F0ZWQgKi8KKyAgICBpZiAoICEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSApIHsKKworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAvKiBDaGVjayBhZ2FpbiB0byBhdm9pZCByYWNlIGluIF9fa21wY19lbmRfdGFza3EoKSAqLworICAgICAgICBpZiAoICEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSApIHsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIGlmICgocXVldWUtPnRxX3Rhc2txX3Nsb3QgIT0gTlVMTCkgJiYgKHF1ZXVlLT50cV9uZnVsbCA8PSBxdWV1ZS0+dHFfaGl3YXQpKSB7CisgICAgICAgICAgICAgICAgLyogaWYgdGhlcmUncyBlbm91Z2ggcm9vbSBpbiB0aGUgcXVldWUgYW5kIHRoZSBkaXNwYXRjaGVyICovCisgICAgICAgICAgICAgICAgLyogKHRhc2txIHRhc2spIGlzIGF2YWlsYWJsZSwgc2NoZWR1bGUgbW9yZSB0YXNrcyAgICAgICAgICovCisgICAgICAgICAgICAgICAgcHQgPSAoa21wY190aHVua190ICopIHF1ZXVlLT50cV90YXNrcV9zbG90OworICAgICAgICAgICAgICAgIHF1ZXVlLT50cV90YXNrcV9zbG90ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1ZXVlLT50cV9uZnVsbCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSA+PSBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIKSB7CisgICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyBpZiBubyB0aHVua3MgYXZhaWxhYmxlIG9yIHRoaXMgdGhyZWFkIGNhbid0ICovCisgICAgICAgICAgICAgICAgLyogcnVuIGFueSBiZWNhdXNlIGl0IGFscmVhZHkgaXMgZXhlY3V0aW5nIHRvbyBtYW55ICAgICAgICovCisKKyAgICAgICAgICAgICAgICBwdCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChxdWV1ZS0+dHFfbmZ1bGwgPiAxKSB7CisgICAgICAgICAgICAgICAgLyogIGFsd2F5cyBzYWZlIHRvIHNjaGVkdWxlIGEgdGFzayBldmVuIGlmIFRRRl9JU19MQVNUUFJJVkFURSAgKi8KKworICAgICAgICAgICAgICAgIHB0ID0gX19rbXBfZGVxdWV1ZV90YXNrIChnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19MQVNUUFJJVkFURSkpIHsKKyAgICAgICAgICAgICAgICAvKiAgb25lIHRoaW5nIGluIHF1ZXVlLCBhbHdheXMgc2FmZSB0byBzY2hlZHVsZSBpZiAhVFFGX0lTX0xBU1RQUklWQVRFICAqLworCisgICAgICAgICAgICAgICAgcHQgPSBfX2ttcF9kZXF1ZXVlX3Rhc2sgKGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19MQVNUX1RBU0spIHsKKyAgICAgICAgICAgICAgICAvKiBUUUZfSVNfTEFTVFBSSVZBVEUsIG9uZSB0aGluZyBpbiBxdWV1ZSwga21wY19lbmRfdGFza3FfdGFzaygpICAgKi8KKyAgICAgICAgICAgICAgICAvKiBoYXMgYmVlbiBydW4gc28gdGhpcyBpcyBsYXN0IHRhc2ssIHJ1biB3aXRoIFRRRl9JU19MQVNUX1RBU0sgc28gKi8KKyAgICAgICAgICAgICAgICAvKiBpbnN0cnVtZW50YXRpb24gZG9lcyBjb3B5LW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHB0ID0gX19rbXBfZGVxdWV1ZV90YXNrIChnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgcHQtPnRoX2ZsYWdzIHw9IFRRRl9JU19MQVNUX1RBU0s7ICAvKiBkb24ndCBuZWVkIHRlc3RfdGhlbl9vciBzaW5jZSBhbHJlYWR5IGxvY2tlZCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogR0VIIC0gV2hhdCBoYXBwZW5zIGhlcmUgaWYgaXMgbGFzdHByaXZhdGUsIGJ1dCBub3QgbGFzdCB0YXNrPyAqLworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcHQ7Cit9CisKKy8qCisgKiBXYWxrIGEgdHJlZSBvZiBxdWV1ZXMgc3RhcnRpbmcgYXQgcXVldWUncyBmaXJzdCBjaGlsZAorICogYW5kIHJldHVybiBhIG5vbi1OVUxMIHRodW5rIGlmIG9uZSBjYW4gYmUgc2NoZWR1bGVkLgorICogTXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuIGluX3BhcmFsbGVsPVRSVUUKKyAqLworCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUpCit7CisgICAga21wY190aHVua190ICpwdCA9IE5VTEw7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gY3Vycl9xdWV1ZTsKKworICAgIGlmIChjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgIHF1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworICAgICAgICBpZiAocXVldWUgPT0gTlVMTCkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocXVldWUgIT0gTlVMTCkgIHsKKyAgICAgICAgICAgIGludCBjdDsKKyAgICAgICAgICAgIGttcGNfdGFza19xdWV1ZV90ICpuZXh0OworCisgICAgICAgICAgICBjdD0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBpbmMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKworICAgICAgICAgICAgcHQgPSBfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKGdsb2JhbF90aWQsIHF1ZXVlKTsKKworICAgICAgICAgICAgaWYgKHB0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3Q7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBxdWV1ZS0+dHFfcmVmX2NvdW50ID49IDAgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBwdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYWx0aG91Z2ggcmVmZXJlbmNlIGNvdW50IHN0YXlzIGFjdGl2ZSBkdXJpbmcgZGVzY2VuZGFudCB3YWxrLCBzaG91bGRuJ3QgbWF0dGVyICAqLworICAgICAgICAgICAgLyogc2luY2UgaWYgY2hpbGRyZW4gc3RpbGwgZXhpc3QsIHJlZmVyZW5jZSBjb3VudHMgYXJlbid0IGJlaW5nIG1vbml0b3JlZCBhbnl3YXkgICAqLworCisgICAgICAgICAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlIChnbG9iYWxfdGlkLCBxdWV1ZSk7CisKKyAgICAgICAgICAgIGlmIChwdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGN0OworCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBuZXh0ID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisKKyAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKworICAgICAgICAgICAgcXVldWUgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworICAgIHJldHVybiBwdDsKK30KKworLyoKKyAqIFdhbGsgdXAgdGhlIHRhc2txIHRyZWUgbG9va2luZyBmb3IgYSB0YXNrIHRvIGV4ZWN1dGUuCisgKiBJZiB3ZSBnZXQgdG8gdGhlIHJvb3QsIHNlYXJjaCB0aGUgdHJlZSBmb3IgYSBkZXNjZW5kZW50IHF1ZXVlIHRhc2suCisgKiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5fcGFyYWxsZWw9VFJVRQorICovCisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZmluZF90YXNrX2luX2FuY2VzdG9yX3F1ZXVlIChrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqY3Vycl9xdWV1ZSkKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAga21wY190aHVua190ICAgICAgKnB0OworCisgICAgcHQgPSBOVUxMOworCisgICAgaWYgKGN1cnJfcXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgIHF1ZXVlID0gY3Vycl9xdWV1ZS0+dHEudHFfcGFyZW50OworCisgICAgICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHQgPSBfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKGdsb2JhbF90aWQsIHF1ZXVlKTsKKyAgICAgICAgICAgIGlmIChwdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKworICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXVlID0gcXVldWUtPnRxLnRxX3BhcmVudDsKKworICAgICAgICAgICAgaWYgKHF1ZXVlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHQgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZSggZ2xvYmFsX3RpZCwgdHEtPnRxX3Jvb3QgKTsKKworICAgIHJldHVybiBwdDsKK30KKworc3RhdGljIGludAorX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQgKGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEtNUF9NQigpOyAqLy8qIGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKworICAgIGZvciAoaT0wOyBpPHF1ZXVlLT50cV9ucHJvYzsgaSsrKSB7CisgICAgICAgIGlmIChxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbiAoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIHJldHVybiAocXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBpbnQgaW5fcGFyYWxsZWwgKQoreworI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9pbnQzMiAgICAgaTsKKyAgICBrbXBjX3RodW5rX3QgKnRodW5rOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSg1MCwgKCJCZWZvcmUgRGVsZXRpb24gb2YgVGFza1EgYXQgJXAgb24gKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICAvKiAgc3ViLXF1ZXVlIGluIGEgcmVjdXJzaW9uLCBub3QgdGhlIHJvb3QgdGFzayBxdWV1ZSAgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9maXJzdF9jaGlsZCA9PSBOVUxMKTsKKworICAgIC8qICB1bmxpbmsgcXVldWUgZnJvbSBpdHMgc2libGluZ3MgaWYgYW55IGF0IHRoaXMgbGV2ZWwgICovCisgICAgaWYgKHF1ZXVlLT50cV9wcmV2X2NoaWxkICE9IE5VTEwpCisgICAgICAgIHF1ZXVlLT50cV9wcmV2X2NoaWxkLT50cV9uZXh0X2NoaWxkID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisgICAgaWYgKHF1ZXVlLT50cV9uZXh0X2NoaWxkICE9IE5VTEwpCisgICAgICAgIHF1ZXVlLT50cV9uZXh0X2NoaWxkLT50cV9wcmV2X2NoaWxkID0gcXVldWUtPnRxX3ByZXZfY2hpbGQ7CisgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2ZpcnN0X2NoaWxkID09IHF1ZXVlKQorICAgICAgICBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9maXJzdF9jaGlsZCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworCisgICAgcXVldWUtPnRxX3ByZXZfY2hpbGQgPSBOVUxMOworICAgIHF1ZXVlLT50cV9uZXh0X2NoaWxkID0gTlVMTDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCB3YWl0aW5nIGZvciByZWZfY291bnQgb2YgJWQgdG8gcmVhY2ggMVxuIiwKKyAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIHF1ZXVlLT50cV9yZWZfY291bnQpKTsKKworICAgICAgICAvKiB3YWl0IHVudGlsIGFsbCBvdGhlciB0aHJlYWRzIGhhdmUgc3RvcHBlZCBhY2Nlc3NpbmcgdGhpcyBxdWV1ZSAqLworICAgICAgICB3aGlsZSAocXVldWUtPnRxX3JlZl9jb3VudCA+IDEpIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX1dBSVRfWUlFTEQoKHZvbGF0aWxlIGttcF91aW50MzIqKSZxdWV1ZS0+dHFfcmVmX2NvdW50LCAxLCBLTVBfTEUsIE5VTEwpOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGZyZWVpbmcgcXVldWVcbiIsCisgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUpKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpOworICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX25mdWxsID09IDApOworCisgICAgZm9yIChpPTA7IGk8cXVldWUtPnRxX25wcm9jOyBpKyspIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPT0gMCk7CisgICAgfQorCisgICAgaSA9IDA7CisgICAgZm9yICh0aHVuaz1xdWV1ZS0+dHFfZnJlZV90aHVua3M7IHRodW5rICE9IE5VTEw7IHRodW5rPXRodW5rLT50aC50aF9uZXh0X2ZyZWUpCisgICAgICAgICsraTsKKworICAgIEtNUF9BU1NFUlQgKGkgPT0gcXVldWUtPnRxX25zbG90cyArIChxdWV1ZS0+dHFfbnByb2MgKiBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIKSk7CisjZW5kaWYKKworICAgIC8qICByZWxlYXNlIHN0b3JhZ2UgZm9yIHF1ZXVlIGVudHJ5ICAqLworICAgIF9fa21wX2ZyZWVfdGFza3EgKCB0cSwgcXVldWUsIFRSVUUsIGdsb2JhbF90aWQgKTsKKworICAgIEtGX1RSQUNFKDUwLCAoIkFmdGVyIERlbGV0aW9uIG9mIFRhc2tRIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoNTAsIF9fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHEtPnRxX3Jvb3QsIGdsb2JhbF90aWQgKSk7Cit9CisKKy8qCisgKiBTdGFydGluZyBmcm9tIGluZGljYXRlZCBxdWV1ZSwgcHJvY2VlZCBkb3dud2FyZCB0aHJvdWdoIHRyZWUgYW5kCisgKiByZW1vdmUgYWxsIHRhc2txcyB3aGljaCBhcmUgZmluaXNoZWQsIGJ1dCBvbmx5IGdvIGRvd24gdG8gdGFza3FzCisgKiB3aGljaCBoYXZlIHRoZSAibm93YWl0IiBjbGF1c2UgcHJlc2VudC4gIEFzc3VtZSB0aGlzIGlzIG9ubHkgY2FsbGVkCisgKiB3aGVuIGluX3BhcmFsbGVsPVRSVUUuCisgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSgga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUgKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IGN1cnJfcXVldWU7CisKKyAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICBxdWV1ZSA9IChrbXBjX3Rhc2tfcXVldWVfdCAqKSBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZDsKKyAgICAgICAgaWYgKHF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSAgeworICAgICAgICAgICAga21wY190YXNrX3F1ZXVlX3QgKm5leHQ7CisgICAgICAgICAgICBpbnQgY3QgPSArKyhxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworCisKKyAgICAgICAgICAgIC8qIGFsdGhvdWdoIHJlZmVyZW5jZSBjb3VudCBzdGF5cyBhY3RpdmUgZHVyaW5nIGRlc2NlbmRhbnQgd2FsaywgKi8KKyAgICAgICAgICAgIC8qIHNob3VsZG4ndCBtYXR0ZXIgc2luY2UgaWYgY2hpbGRyZW4gc3RpbGwgZXhpc3QsIHJlZmVyZW5jZSAgICAgKi8KKyAgICAgICAgICAgIC8qIGNvdW50cyBhcmVuJ3QgYmVpbmcgbW9uaXRvcmVkIGFueXdheSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19OT1dBSVQpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9maW5kX2FuZF9yZW1vdmVfZmluaXNoZWRfY2hpbGRfdGFza3EgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKworICAgICAgICAgICAgICAgIGlmICgocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpICYmIChxdWV1ZS0+dHFfbmZ1bGwgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQocXVldWUpICYmICEgX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbihxdWV1ZSkpIHsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgT25seSByZW1vdmUgdGhpcyBpZiB3ZSBoYXZlIG5vdCBhbHJlYWR5IG1hcmtlZCBpdCBmb3IgZGVhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgVGhpcyBzaG91bGQgcHJldmVudCBtdWx0aXBsZSB0aHJlYWRzIGZyb20gdHJ5aW5nIHRvIGZyZWUgdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF90ZXN0X2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZW1vdmVfcXVldWVfZnJvbV90cmVlKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGRvIGFueSBtb3JlIGhlcmUgc2luY2UgY2FuJ3QgYmUgc3VyZSB3aGVyZSBzaWJsaW5nIHF1ZXVlIGlzIHNvIGp1c3QgZXhpdCB0aGlzIGxldmVsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBqdXN0IGZhbGwgdGhyb3VnaCBhbmQgZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgbmV4dCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworCisgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjdCA+PSAwICk7CisKKyAgICAgICAgICAgIHF1ZXVlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9Cit9CisKKy8qCisgKiBTdGFydGluZyBmcm9tIGluZGljYXRlZCBxdWV1ZSwgcHJvY2VlZCBkb3dud2FyZCB0aHJvdWdoIHRyZWUgYW5kCisgKiByZW1vdmUgYWxsIHRhc2txJ3MgYXNzdW1pbmcgYWxsIGFyZSBmaW5pc2hlZCBhbmQKKyAqIGFzc3VtaW5nIE5PIG90aGVyIHRocmVhZHMgYXJlIGV4ZWN1dGluZyBhdCB0aGlzIHBvaW50LgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZW1vdmVfYWxsX2NoaWxkX3Rhc2txKCBrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpuZXh0X2NoaWxkOworCisgICAgcXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKikgcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworCisgICAgd2hpbGUgKHF1ZXVlICE9IE5VTEwpICB7CisgICAgICAgIF9fa21wX3JlbW92ZV9hbGxfY2hpbGRfdGFza3EgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKworICAgICAgICBuZXh0X2NoaWxkID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgIF9fa21wX3JlbW92ZV9xdWV1ZV9mcm9tX3RyZWUgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIEZBTFNFICk7CisgICAgICAgIHF1ZXVlID0gbmV4dF9jaGlsZDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSgga21wX3Rhc2txX3QgKnRxLCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rLCBpbnQgaW5fcGFyYWxsZWwgKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBrbXBfaW50MzIgICAgICAgICAgdGlkICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBLRl9UUkFDRSgxMDAsICgiQWZ0ZXIgZGVxdWV1ZWluZyB0aGlzIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90aHVuayggdHEsIHRodW5rLCBnbG9iYWxfdGlkICkpOworICAgIEtGX1RSQUNFKDEwMCwgKCJUYXNrIFF1ZXVlOiAlcCBsb29rcyBsaWtlIHRoaXMgKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgLyoKKyAgICAgKiBGb3IgdGhlIHRhc2txIHRhc2ssIHRoZSBjdXJyX3RodW5rIHB1c2hlcyBhbmQgcG9wIHBhaXJzIGFyZSBzZXQgdXAgYXMgZm9sbG93czoKKyAgICAgKgorICAgICAqIGhhcHBlbnMgZXhhY3RseSBvbmNlOgorICAgICAqIDEpIF9fa21wY190YXNrcSAgICAgICAgICAgICA6IHB1c2ggKGlmIHJldHVybmluZyB0aHVuayBvbmx5KQorICAgICAqIDQpIF9fa21wY19lbmRfdGFza3FfdGFzayAgICA6IHBvcAorICAgICAqCisgICAgICogb3B0aW9uYWxseSBoYXBwZW5zICplYWNoKiB0aW1lIHRhc2txIHRhc2sgaXMgZGVxdWV1ZWQvZW5xdWV1ZWQ6CisgICAgICogMikgX19rbXBjX3Rhc2txX3Rhc2sgICAgICAgIDogcG9wCisgICAgICogMykgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUgIDogcHVzaAorICAgICAqCisgICAgICogZXhlY3V0aW9uIG9yZGVyaW5nOiAgMSwoMiwzKSosNAorICAgICAqLworCisgICAgaWYgKCEodGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKSB7CisgICAgICAgIGttcF9pbnQzMiBpbmRleCA9IChxdWV1ZSA9PSB0cS0+dHFfcm9vdCkgPyB0aWQgOiAwOworICAgICAgICB0aHVuay0+dGgudGhfc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgcXVldWUtPnRxX3NoYXJlZHNbaW5kZXhdLmFpX2RhdGE7CisKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSA/IGN0X3Rhc2tfb3JkZXJlZCA6IGN0X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9sb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3Rhc2txLCBxdWV1ZS0+dHFfbG9jICk7CisgICAgfQorCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIHRodW5rLT50aF9lbmNsX3RodW5rID0gdHEtPnRxX2N1cnJfdGh1bmtbdGlkXTsKKyAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rOworCisgICAgICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKyAgICB9CisKKyAgICBLRl9UUkFDRSggNTAsICgiQmVnaW4gRXhlY3V0aW5nIFRodW5rICVwIGZyb20gcXVldWUgJXAgb24gKCVkKVxuIiwgdGh1bmssIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgdGh1bmstPnRoX3Rhc2sgKGdsb2JhbF90aWQsIHRodW5rKTsKKyAgICBLRl9UUkFDRSggNTAsICgiRW5kIEV4ZWN1dGluZyBUaHVuayAlcCBmcm9tIHF1ZXVlICVwIG9uICglZClcbiIsIHRodW5rLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgaWYgKCEodGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKSB7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgPyBjdF90YXNrX29yZGVyZWQgOiBjdF90YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUtPnRxX2xvYyApOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rLT50aF9lbmNsX3RodW5rOworICAgICAgICAgICAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSBOVUxMOworICAgICAgICAgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIF9fa21wX3Rhc2txX2NoZWNrX29yZGVyZWQoZ2xvYmFsX3RpZCwgdGh1bmspOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfZnJlZV90aHVuayAocXVldWUsIHRodW5rLCBpbl9wYXJhbGxlbCwgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS0ZfVFJBQ0UoMTAwLCAoIlQjJWQgQWZ0ZXIgZnJlZWluZyB0aHVuazogJXAsIFRhc2tRIGxvb2tzIGxpa2UgdGhpczpcbiIsIGdsb2JhbF90aWQsIHRodW5rKSk7CisgICAgICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIEtNUF9NQigpOyAgIC8qIG5lZWRlZCBzbyB0aHVuayBwdXQgb24gZnJlZSBsaXN0IGJlZm9yZSBvdXRzdGFuZGluZyB0aHVuayBjb3VudCBpcyBkZWNyZW1lbnRlZCAqLworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhID49IDEpOworCisgICAgICAgICAgICBLRl9UUkFDRSggMjAwLCAoIl9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlOiBUIyVkIGhhcyAlZCB0aHVua3MgaW4gcXVldWUgJXBcbiIsCisgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEtMSwgcXVldWUpKTsKKworICAgICAgICAgICAgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEtLTsKKworICAgICAgICAgICAgLyogS01QX01CKCk7ICovICAgICAvKiBpcyBNQiByZWFsbHkgbmVjZXNzYXJ5ID8gKi8KKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIGludCBjdDsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHN0YXJ0cyBhIHRhc2txOyBjcmVhdGVzIGFuZCByZXR1cm5zIGEgdGh1bmsgZm9yIHRoZSB0YXNrcV90YXNrICAgICAgICAqLworLyogYWxzbywgcmV0dXJucyBwb2ludGVyIHRvIHNoYXJlZCB2YXJzIGZvciB0aGlzIHRocmVhZCBpbiAic2hhcmVkcyIgYXJnICovCisKK2ttcGNfdGh1bmtfdCAqCitfX2ttcGNfdGFza3EoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza190IHRhc2txX3Rhc2ssCisgICAgICAgICAgICAgIHNpemVfdCBzaXplb2ZfdGh1bmssIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAga21wX2ludDMyIGZsYWdzLCBrbXBjX3NoYXJlZF92YXJzX3QgKipzaGFyZWRzICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICBpbl9wYXJhbGxlbDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICBuc2xvdHMsIG50aHVua3MsIG5zaGFyZWRzLCBucHJvYzsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgICpuZXdfcXVldWUsICpjdXJyX3F1ZXVlOworICAgIGttcGNfdGh1bmtfdCAgICAgICAgKm5ld190YXNrcV90aHVuazsKKyAgICBrbXBfaW5mb190ICAgICAgICAgICp0aDsKKyAgICBrbXBfdGVhbV90ICAgICAgICAgICp0ZWFtOworICAgIGttcF90YXNrcV90ICAgICAgICAgKnRxOworICAgIGttcF9pbnQzMiAgICAgICAgICAgIHRpZDsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3EgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgIHRlYW0gPSB0aCAtPiB0aC50aF90ZWFtOworICAgIHRxID0gJiB0ZWFtIC0+IHQudF90YXNrcTsKKyAgICBucHJvYyA9IHRlYW0gLT4gdC50X25wcm9jOworICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIC8qIGZpbmQgb3V0IHdoZXRoZXIgdGhpcyBpcyBhIHBhcmFsbGVsIHRhc2txIG9yIHNlcmlhbGl6ZWQgb25lLiAqLworICAgIGluX3BhcmFsbGVsID0gaW5fcGFyYWxsZWxfY29udGV4dCggdGVhbSApOworCisgICAgaWYoICEgdHEtPnRxX3Jvb3QgKSB7CisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgLyogVmVjdG9yIE9SREVSRUQgU0VDVElPTiB0byB0YXNrcSB2ZXJzaW9uICovCisgICAgICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSBfX2ttcF90YXNrcV9lbzsKKworICAgICAgICAgICAgLyogVmVjdG9yIE9SREVSRUQgU0VDVElPTiB0byB0YXNrcSB2ZXJzaW9uICovCisgICAgICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gPSBfX2ttcF90YXNrcV94bzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgLyogVGhpcyBzaG91bGRuJ3QgYmUgYSBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyeSwgaXQgd2lsbCBjb25mdXNlIHRoZSB1c2VyLiAqLworICAgICAgICAgICAgLyogTmVlZCB0aGUgYm91bmRhcnkgdG8gYmUgYXQgdGhlIGVuZCB0YXNrcSBpbnN0ZWFkLiAqLworICAgICAgICAgICAgaWYgKCBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBUUlVFLCAwLCBOVUxMLCBOVUxMICkpIHsKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGluZyB0aGUgYWN0aXZlIHJvb3QgcXVldWUsIGFuZCB3ZSBhcmUgbm90IHRoZSBtYXN0ZXIgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgIC8qIFRoZSBtYXN0ZXIgdGhyZWFkIGJlbG93IGNyZWF0ZWQgdGhlIHF1ZXVlIGFuZCB0YXNrcyBoYXZlIGJlZW4gICAgICovCisgICAgICAgICAgICAgICAgLyogZW5xdWV1ZWQsIGFuZCB0aGUgbWFzdGVyIHRocmVhZCByZWxlYXNlZCB0aGlzIGJhcnJpZXIuICBUaGlzICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiB3b3JrZXIgdGhyZWFkIGNhbiBub3cgcHJvY2VlZCBhbmQgZXhlY3V0ZSB0YXNrcy4gIFNlZSBhbHNvIHRoZSAgICAqLworICAgICAgICAgICAgICAgIC8qIFRRRl9SRUxFQVNFX1dPUktFUlMgd2hpY2ggaXMgdXNlZCB0byBoYW5kbGUgdGhpcyBjYXNlLiAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAqc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgdHEtPnRxX3Jvb3QtPnRxX3NoYXJlZHNbdGlkXS5haV9kYXRhOworCisgICAgICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrcSByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBtYXN0ZXIgdGhyZWFkIG9ubHkgZXhlY3V0ZXMgdGhpcyBjb2RlICovCisKKyAgICAgICAgaWYoIHRxLT50cV9jdXJyX3RodW5rX2NhcGFjaXR5IDwgbnByb2MgKSB7CisgICAgICAgICAgICBpZih0cS0+dHFfY3Vycl90aHVuaykKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHRxLT50cV9jdXJyX3RodW5rKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UgYXQgb3V0ZXIgbGV2ZWwsIGkuZS4gd2hlbiB0cV9jdXJyX3RodW5rIGlzIHN0aWxsIE5VTEwgKi8KKyAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjayApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cS0+dHFfY3Vycl90aHVuayA9IChrbXBjX3RodW5rX3QgKiopIF9fa21wX2FsbG9jYXRlKCBucHJvYyAqIHNpemVvZihrbXBjX3RodW5rX3QgKikgKTsKKyAgICAgICAgICAgIHRxIC0+IHRxX2N1cnJfdGh1bmtfY2FwYWNpdHkgPSBucHJvYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkKKyAgICAgICAgICAgIHRxLT50cV9nbG9iYWxfZmxhZ3MgPSBUUUZfUkVMRUFTRV9XT1JLRVJTOworICAgIH0KKworICAgIC8qIGRrcDogaW4gZnV0dXJlLCBpZiBmbGFncyAmIFRRRl9IRVVSSVNUSUNTLCB3aWxsIGNob29zZSBuc2xvdHMgYmFzZWQgKi8KKyAgICAvKiAgICAgIG9uIHNvbWUgaGV1cmlzdGljcyAoZS5nLiwgZGVwdGggb2YgcXVldWUgbmVzdGluZz8pLiAgICAgICAgICAgICovCisKKyAgICBuc2xvdHMgPSAoaW5fcGFyYWxsZWwpID8gKDIgKiBucHJvYykgOiAxOworCisgICAgLyogVGhlcmUgbXVzdCBiZSBucHJvYyAqIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEggZXh0cmEgc2xvdHMgZm9yIHBlbmRpbmcgKi8KKyAgICAvKiBqb2JzIGJlaW5nIGV4ZWN1dGVkIGJ5IG90aGVyIHRocmVhZHMsIGFuZCBvbmUgZXh0cmEgZm9yIHRhc2txIHNsb3QgICAgICAgICAgKi8KKworICAgIG50aHVua3MgPSAoaW5fcGFyYWxsZWwpID8gKG5zbG90cyArIChucHJvYyAqIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpICsgMSkgOiBuc2xvdHMgKyAyOworCisgICAgLyogT25seSB0aGUgcm9vdCB0YXNrcSBnZXRzIGEgcGVyLXRocmVhZCBhcnJheSBvZiBzaGFyZWRzLiAgICAgICAqLworICAgIC8qIFRoZSByZXN0IG9mIHRoZSB0YXNrcSdzIG9ubHkgZ2V0IG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgdmFycy4gKi8KKworICAgIG5zaGFyZWRzID0gKCAhdHEtPnRxX3Jvb3QgJiYgaW5fcGFyYWxsZWwpID8gbnByb2MgOiAxOworCisgICAgLyogIGNyZWF0ZSBvdmVyYWxsIHF1ZXVlIGRhdGEgc3RydWN0dXJlIGFuZCBpdHMgY29tcG9uZW50cyB0aGF0IHJlcXVpcmUgYWxsb2NhdGlvbiAqLworCisgICAgbmV3X3F1ZXVlID0gX19rbXBfYWxsb2NfdGFza3EgKCB0cSwgaW5fcGFyYWxsZWwsIG5zbG90cywgbnRodW5rcywgbnNoYXJlZHMsIG5wcm9jLAorICAgICAgICBzaXplb2ZfdGh1bmssIHNpemVvZl9zaGFyZWRzLCAmbmV3X3Rhc2txX3RodW5rLCBnbG9iYWxfdGlkICk7CisKKyAgICAvKiAgcmVzdCBvZiBuZXdfcXVldWUgaW5pdGlhbGl6YXRpb25zICAqLworCisgICAgbmV3X3F1ZXVlLT50cV9mbGFncyAgICAgICAgICAgPSBmbGFncyAmIFRRRl9JTlRFUkZBQ0VfRkxBR1M7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV90YXNrbnVtX3F1ZXVpbmcgID0gMDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV90YXNrbnVtX3NlcnZpbmcgID0gMDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9mbGFncyAgICAgICAgICAgfD0gVFFGX1BBUkFMTEVMX0NPTlRFWFQ7CisgICAgfQorCisgICAgbmV3X3F1ZXVlLT50cV90YXNrcV9zbG90ICAgPSBOVUxMOworICAgIG5ld19xdWV1ZS0+dHFfbnNsb3RzICAgICAgID0gbnNsb3RzOworICAgIG5ld19xdWV1ZS0+dHFfaGl3YXQgICAgICAgID0gSElHSF9XQVRFUl9NQVJLIChuc2xvdHMpOworICAgIG5ld19xdWV1ZS0+dHFfbmZ1bGwgICAgICAgID0gMDsKKyAgICBuZXdfcXVldWUtPnRxX2hlYWQgICAgICAgICA9IDA7CisgICAgbmV3X3F1ZXVlLT50cV90YWlsICAgICAgICAgPSAwOworICAgIG5ld19xdWV1ZS0+dHFfbG9jICAgICAgICAgID0gbG9jOworCisgICAgaWYgKChuZXdfcXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpICYmIGluX3BhcmFsbGVsKSB7CisgICAgICAgIC8qIHByZXBhcmUgdG8gc2VydmUgdGhlIGZpcnN0LXF1ZXVlZCB0YXNrJ3MgT1JERVJFRCBkaXJlY3RpdmUgKi8KKyAgICAgICAgbmV3X3F1ZXVlLT50cV90YXNrbnVtX3NlcnZpbmcgPSAxOworCisgICAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSBfX2ttcF90YXNrcV9lbzsKKworICAgICAgICAvKiBWZWN0b3IgT1JERVJFRCBTRUNUSU9OIHRvIHRhc2txIHZlcnNpb24gKi8KKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuID0gX19rbXBfdGFza3FfeG87CisgICAgfQorCisgICAgLyogIGNyZWF0ZSBhIG5ldyB0aHVuayBmb3IgdGhlIHRhc2txX3Rhc2sgaW4gdGhlIG5ld19xdWV1ZSAgKi8KKyAgICAqc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgbmV3X3F1ZXVlLT50cV9zaGFyZWRzWzBdLmFpX2RhdGE7CisKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoLnRoX3NoYXJlZHMgPSAqc2hhcmVkczsKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoX3Rhc2sgICAgICAgPSB0YXNrcV90YXNrOworICAgIG5ld190YXNrcV90aHVuay0+dGhfZmxhZ3MgICAgICA9IG5ld19xdWV1ZS0+dHFfZmxhZ3MgfCBUUUZfVEFTS1FfVEFTSzsKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoX3N0YXR1cyAgICAgPSAwOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAobmV3X3Rhc2txX3RodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKTsKKworICAgIC8qIEtNUF9NQigpOyAqLyAvKiBtYWtlIHN1cmUgdGhlc2UgaW5pdHMgY29tcGxldGUgYmVmb3JlIHRocmVhZHMgc3RhcnQgdXNpbmcgdGhpcyBxdWV1ZSAobmVjZXNzYXJ5PykgKi8KKworICAgIC8qIGluc2VydCB0aGUgbmV3IHRhc2sgcXVldWUgaW50byB0aGUgdHJlZSwgYnV0IG9ubHkgYWZ0ZXIgYWxsIGZpZWxkcyBpbml0aWFsaXplZCAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIGlmKCAhIHRxLT50cV9yb290ICkgeworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cS50cV9wYXJlbnQgICA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfbmV4dF9jaGlsZCAgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9wcmV2X2NoaWxkICA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX3JlZl9jb3VudCAgID0gMTsKKyAgICAgICAgICAgIHRxLT50cV9yb290ID0gbmV3X3F1ZXVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY3Vycl9xdWV1ZSA9IHRxLT50cV9jdXJyX3RodW5rW3RpZF0tPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cS50cV9wYXJlbnQgICA9IGN1cnJfcXVldWU7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfcHJldl9jaGlsZCAgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9yZWZfY291bnQgICA9IDE7ICAgICAgLyogZm9yIHRoaXMgdGhlIHRocmVhZCB0aGF0IGJ1aWx0IHRoZSBxdWV1ZSAqLworCisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBhbGxvYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIG5ld19xdWV1ZSwgbmV3X3F1ZXVlLT50cV9yZWZfY291bnQpKTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9uZXh0X2NoaWxkID0gKHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqKSBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZDsKKworICAgICAgICAgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpCisgICAgICAgICAgICAgICAgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQtPnRxX3ByZXZfY2hpbGQgPSBuZXdfcXVldWU7CisKKyAgICAgICAgICAgIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gbmV3X3F1ZXVlOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgdXAgdGh1bmsgc3RhY2sgb25seSBhZnRlciBjb2RlIHRoYXQgZGV0ZXJtaW5lcyBjdXJyX3F1ZXVlIGFib3ZlICovCisgICAgICAgIG5ld190YXNrcV90aHVuay0+dGhfZW5jbF90aHVuayA9IHRxLT50cV9jdXJyX3RodW5rW3RpZF07CisgICAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSBuZXdfdGFza3FfdGh1bms7CisKKyAgICAgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbmV3X3Rhc2txX3RodW5rLT50aF9lbmNsX3RodW5rID0gMDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cS50cV9wYXJlbnQgICA9IE5VTEw7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPSBOVUxMOworICAgICAgICBuZXdfcXVldWUtPnRxX25leHRfY2hpbGQgID0gTlVMTDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9wcmV2X2NoaWxkICA9IE5VTEw7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfcmVmX2NvdW50ICAgPSAxOworICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgIEtGX1RSQUNFKDE1MCwgKCJDcmVhdGluZyBUYXNrUSBUYXNrIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxNTAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCBuZXdfdGFza3FfdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgS0ZfVFJBQ0UoMjUsICgiQWZ0ZXIgVGFza1EgYXQgJXAgQ3JlYXRpb24gb24gKCVkKTpcbiIsIG5ld19xdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEtGX1RSQUNFKDI1LCAoIkFmdGVyIFNlcmlhbCBUYXNrUSBhdCAlcCBDcmVhdGlvbiBvbiAoJWQpOlxuIiwgbmV3X3F1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgfQorCisgICAgS0ZfRFVNUCgyNSwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgbmV3X3F1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIEtGX0RVTVAoNTAsIF9fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHEtPnRxX3Jvb3QsIGdsb2JhbF90aWQgKSk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfdGFza3EsIG5ld19xdWV1ZS0+dHFfbG9jICk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICByZXR1cm4gbmV3X3Rhc2txX3RodW5rOworfQorCisKKy8qICBlbmRzIGEgdGFza3E7IGxhc3QgdGhyZWFkIG91dCBkZXN0cm95cyB0aGUgcXVldWUgICovCisKK3ZvaWQKK19fa21wY19lbmRfdGFza3EoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0YXNrcV90aHVuaykKK3sKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBrbXBfaW50MzIgICAgICAgICAgIGk7CisjZW5kaWYKKyAgICBrbXBfdGFza3FfdCAgICAgICAgKnRxOworICAgIGludCAgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisgICAga21wX2luZm9fdCAgICAgICAgICp0aDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgIGlzX291dGVybW9zdDsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAgKnF1ZXVlOworICAgIGttcGNfdGh1bmtfdCAgICAgICAqdGh1bms7CisgICAgaW50ICAgICAgICAgICAgICAgICBucHJvYzsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICB0cSA9ICYgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBucHJvYyA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisKKyAgICAvKiBGb3IgdGhlIG91dGVybW9zdCB0YXNrcSBvbmx5LCBhbGwgYnV0IG9uZSB0aHJlYWQgd2lsbCBoYXZlIHRhc2txX3RodW5rID09IE5VTEwgKi8KKyAgICBxdWV1ZSA9ICh0YXNrcV90aHVuayA9PSBOVUxMKSA/IHRxLT50cV9yb290IDogdGFza3FfdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworCisgICAgS0VfVFJBQ0UoIDUwLCAoIl9fa21wY19lbmRfdGFza3EgcXVldWU9JXAgKCVkKSBcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgaXNfb3V0ZXJtb3N0ID0gKHF1ZXVlID09IHRxLT50cV9yb290KTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAga21wX3VpbnQzMiBzcGluczsKKworICAgICAgICAvKiB0aGlzIGlzIGp1c3QgYSBzYWZlZ3VhcmQgdG8gcmVsZWFzZSB0aGUgd2FpdGluZyB0aHJlYWRzIGlmICovCisgICAgICAgIC8qIHRoZSBvdXRlcm1vc3QgdGFza3EgbmV2ZXIgcXVldWVzIGEgdGFzayAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICBpZiAoaXNfb3V0ZXJtb3N0ICYmIChLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSkpIHsKKyAgICAgICAgICAgIGlmKCB0cS0+dHFfZ2xvYmFsX2ZsYWdzICYgVFFGX1JFTEVBU0VfV09SS0VSUyApIHsKKyAgICAgICAgICAgICAgICAvKiBubyBsb2NrIG5lZWRlZCwgd29ya2VycyBhcmUgc3RpbGwgaW4gc3BpbiBtb2RlICovCisgICAgICAgICAgICAgICAgdHEtPnRxX2dsb2JhbF9mbGFncyAmPSB+VFFGX1JFTEVBU0VfV09SS0VSUzsKKworICAgICAgICAgICAgICAgIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBrZWVwIGRlcXVldWVpbmcgd29yayB1bnRpbCBhbGwgdGFza3MgYXJlIHF1ZXVlZCBhbmQgZGVxdWV1ZWQgKi8KKworICAgICAgICBkbyB7CisgICAgICAgICAgICAvKiB3YWl0IHVudGlsIHNvbWV0aGluZyBpcyBhdmFpbGFibGUgdG8gZGVxdWV1ZSAqLworICAgICAgICAgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworCisgICAgICAgICAgICB3aGlsZSAoIChxdWV1ZS0+dHFfbmZ1bGwgPT0gMCkKKyAgICAgICAgICAgICAgICAgJiYgKHF1ZXVlLT50cV90YXNrcV9zbG90ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICYmICghIF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpICkKKyAgICAgICAgICAgICAgICAgJiYgKCEgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKSApCisgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBLTVBfWUlFTERfV0hFTiggVFJVRSwgc3BpbnMgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBleGVjdXRlIHRhc2tzIGluIHRoZSBxdWV1ZSAqLworICAgICAgICAgICAgd2hpbGUgKCAoIChxdWV1ZS0+dHFfbmZ1bGwgIT0gMCkgfHwgKHF1ZXVlLT50cV90YXNrcV9zbG90ICE9IE5VTEwpICkKKyAgICAgICAgICAgICAgICAgJiYgKHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKSkgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiRm91bmQgdGh1bms6ICVwIGluIHByaW1hcnkgcXVldWUgJXAgKCVkKVxuIiwgdGh1bmssIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzZWUgaWYgd29yayBmb3VuZCBjYW4gYmUgZm91bmQgaW4gYSBkZXNjZW5kYW50IHF1ZXVlICovCisgICAgICAgICAgICBpZiAoIChfX2ttcF90YXNrcV9oYXNfYW55X2NoaWxkcmVuKHF1ZXVlKSkKKyAgICAgICAgICAgICAgJiYgKHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUoZ2xvYmFsX3RpZCwgcXVldWUpKSAhPSBOVUxMCisgICAgICAgICAgICAgICApIHsKKworICAgICAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIlN0b2xlIHRodW5rOiAlcCBpbiBkZXNjZW5kYW50IHF1ZXVlOiAlcCB3aGlsZSB3YWl0aW5nIGluIHF1ZXVlOiAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICB0aHVuaywgdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IHdoaWxlICggKCEgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKSkKKyAgICAgICAgICAgICAgIHx8IChxdWV1ZS0+dHFfbmZ1bGwgIT0gMCkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIkFsbCB0YXNrcyBxdWV1ZWQgYW5kIGRlcXVldWVkIGluIHF1ZXVlOiAlcCAoJWQpXG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgIC8qIHdhaXQgd2hpbGUgYWxsIHRhc2tzIGFyZSBub3QgZmluaXNoZWQgYW5kIG1vcmUgd29yayBmb3VuZAorICAgICAgICAgICBpbiBkZXNjZW5kYW50IHF1ZXVlcyAqLworCisgICAgICAgIHdoaWxlICggKCFfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZChxdWV1ZSkpCisgICAgICAgICAgICAgJiYgKHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUoZ2xvYmFsX3RpZCwgcXVldWUpKSAhPSBOVUxMCisgICAgICAgICAgICAgICkgeworCisgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJTdG9sZSB0aHVuazogJXAgaW4gZGVzY2VuZGFudCBxdWV1ZTogJXAgd2hpbGUgd2FpdGluZyBpbiBxdWV1ZTogJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICB0aHVuaywgdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgIH0KKworICAgICAgICBLRl9UUkFDRSg1MCwgKCJObyB3b3JrIGZvdW5kIGluIGRlc2NlbmRlbnQgcXVldWVzIG9yIGFsbCB3b3JrIGZpbmlzaGVkIGluIHF1ZXVlOiAlcCAoJWQpXG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgIGlmICghaXNfb3V0ZXJtb3N0KSB7CisgICAgICAgICAgICAvKiBuZWVkIHRvIHJldHVybiBpZiBOT1dBSVQgcHJlc2VudCBhbmQgbm90IG91dGVybW9zdCB0YXNrcSAqLworCisgICAgICAgICAgICBpZiAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX05PV0FJVCkgeworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfcmVmX2NvdW50LS07CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcXVldWUtPnRxX3JlZl9jb3VudCA+PSAwICk7CisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3EgcmV0dXJuIGZvciBub3dhaXQgY2FzZSAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgICAgIC8qIFdBSVQgdW50aWwgYWxsIHRhc2tzIGFyZSBmaW5pc2hlZCBhbmQgbm8gY2hpbGQgcXVldWVzIGV4aXN0IGJlZm9yZSBwcm9jZWVkaW5nICovCisgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisKKyAgICAgICAgICAgIHdoaWxlICghX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQocXVldWUpIHx8IF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpKSB7CisgICAgICAgICAgICAgICAgdGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fYW5jZXN0b3JfcXVldWUoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgICAgICAgICAgaWYgKHRodW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU3RvbGUgdGh1bms6ICVwIGluIGFuY2VzdG9yIHF1ZXVlOiAlcCB3aGlsZSB3YWl0aW5nIGluIHF1ZXVlOiAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBLTVBfWUlFTERfV0hFTiggdGh1bmsgPT0gTlVMTCwgc3BpbnMgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgaWYgKCAhKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCkgKSB7CisgICAgICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAvKiBvbmx5IHRoZSBhbGxvY2F0aW5nIHRocmVhZCBjYW4gZGVhbGxvY2F0ZSB0aGUgcXVldWUgKi8KKyAgICAgICAgICAgIGlmICh0YXNrcV90aHVuayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIHJldHVybiBmb3Igbm9uX291dGVybW9zdCBxdWV1ZSwgd2FpdCBjYXNlICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogT3V0ZXJtb3N0IFF1ZXVlOiBzdGVhbCB3b3JrIGZyb20gZGVzY2VuZGFudHMgdW50aWwgYWxsIHRhc2tzIGFyZSBmaW5pc2hlZCAqLworCisgICAgICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKworICAgICAgICB3aGlsZSAoIV9fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkKHF1ZXVlKSkgeworICAgICAgICAgICAgdGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZShnbG9iYWxfdGlkLCBxdWV1ZSk7CisKKyAgICAgICAgICAgIGlmICh0aHVuayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU3RvbGUgdGh1bms6ICVwIGluIGRlc2NlbmRhbnQgcXVldWU6ICVwIHdoaWxlIHdhaXRpbmcgaW4gcXVldWU6ICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtNUF9ZSUVMRF9XSEVOKCB0aHVuayA9PSBOVUxMLCBzcGlucyApOworICAgICAgICB9CisKKyAgICAgICAgLyogTmVlZCB0aGlzIGJhcnJpZXIgdG8gcHJldmVudCBkZXN0cnVjdGlvbiBvZiBxdWV1ZSBiZWZvcmUgdGhyZWFkcyBoYXZlIGFsbCBleGVjdXRlZCBhYm92ZSBjb2RlICovCisgICAgICAgIC8qIFRoaXMgbWF5IG5lZWQgdG8gYmUgZG9uZSBlYXJsaWVyIHdoZW4gTk9XQUlUIGlzIGltcGxlbWVudGVkIGZvciB0aGUgb3V0ZXJtb3N0IGxldmVsICovCisKKyAgICAgICAgaWYgKCAhX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgVFJVRSwgMCwgTlVMTCwgTlVMTCApKSB7CisgICAgICAgICAgICAvKiB0aGUgcXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX05PV0FJVCBjYXNlIGlzIG5vdCB5ZXQgaGFuZGxlZCBoZXJlOyAgICovCisgICAgICAgICAgICAvKiBmb3IgcmlnaHQgbm93LCBldmVyeWJvZHkgd2FpdHMsIGFuZCB0aGUgbWFzdGVyIHRocmVhZCBkZXN0cm95cyB0aGUgICovCisgICAgICAgICAgICAvKiByZW1haW5pbmcgcXVldWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIF9fa21wX3JlbW92ZV9hbGxfY2hpbGRfdGFza3EoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgICAgICAvKiBOb3cgZGVzdHJveSB0aGUgcm9vdCBxdWV1ZSAqLworICAgICAgICAgICAgS0ZfVFJBQ0UoMTAwLCAoIlQjJWQgQmVmb3JlIERlbGV0aW9uIG9mIHRvcC1sZXZlbCBUYXNrUSBhdCAlcDpcbiIsIGdsb2JhbF90aWQsIHF1ZXVlICkpOworICAgICAgICAgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAvKiAgdGhlIHJvb3QgcXVldWUgZW50cnkgICovCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUICgocXVldWUtPnRxLnRxX3BhcmVudCA9PSBOVUxMKSAmJiAocXVldWUtPnRxX25leHRfY2hpbGQgPT0gTlVMTCkpOworCisgICAgICAgICAgICAvKiAgY2hpbGRyZW4gbXVzdCBhbGwgYmUgZ29uZSBieSBub3cgYmVjYXVzZSBvZiBiYXJyaWVyIGFib3ZlICovCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPT0gTlVMTCk7CisKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPG5wcm9jOyBpKyspIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9PSAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpPTAsIHRodW5rPXF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgaSsrLCB0aHVuaz10aHVuay0+dGgudGhfbmV4dF9mcmVlKTsKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCAoaSA9PSBxdWV1ZS0+dHFfbnNsb3RzICsgKG5wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCkpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICEgdHEtPnRxX2N1cnJfdGh1bmtbaV0gKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLyogIHVubGluayB0aGUgcm9vdCBxdWV1ZSBlbnRyeSAgKi8KKyAgICAgICAgICAgIHRxIC0+IHRxX3Jvb3QgPSAgTlVMTDsKKworICAgICAgICAgICAgLyogIHJlbGVhc2Ugc3RvcmFnZSBmb3Igcm9vdCBxdWV1ZSBlbnRyeSAgKi8KKyAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIkFmdGVyIERlbGV0aW9uIG9mIHRvcC1sZXZlbCBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza3EgKCB0cSwgcXVldWUsIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkICk7CisKKyAgICAgICAgICAgIEtGX0RVTVAoNTAsIF9fa21wX2R1bXBfdGFza19xdWV1ZV90cmVlKCB0cSwgdHEtPnRxX3Jvb3QsIGdsb2JhbF90aWQgKSk7CisKKyAgICAgICAgICAgIC8qIHJlbGVhc2UgdGhlIHdvcmtlcnMgbm93IHRoYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgdXAgdG8gZGF0ZSAqLworICAgICAgICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworCisgICAgICAgIC8qIFJlc2V0IE9SREVSRUQgU0VDVElPTiB0byBwYXJhbGxlbCB2ZXJzaW9uICovCisgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGVvX2ZjbiA9IDA7CisKKyAgICAgICAgLyogUmVzZXQgT1JERVJFRCBTRUNUSU9OIHRvIHBhcmFsbGVsIHZlcnNpb24gKi8KKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGluIHNlcmlhbCBleGVjdXRpb24gY29udGV4dCwgZGVxdWV1ZSB0aGUgbGFzdCB0YXNrICAqLworICAgICAgICAvKiBhbmQgZXhlY3V0ZSBpdCwgaWYgdGhlcmUgd2VyZSBhbnkgdGFza3MgZW5jb3VudGVyZWQgKi8KKworICAgICAgICBpZiAocXVldWUtPnRxX25mdWxsID4gMCkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPT0gMSk7CisKKyAgICAgICAgICAgIHRodW5rID0gX19rbXBfZGVxdWV1ZV90YXNrKGdsb2JhbF90aWQsIHF1ZXVlLCBpbl9wYXJhbGxlbCk7CisKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLKSB7CisgICAgICAgICAgICAgICAgLyogVFFGX0lTX0xBU1RQUklWQVRFLCBvbmUgdGhpbmcgaW4gcXVldWUsIF9fa21wY19lbmRfdGFza3FfdGFzaygpICovCisgICAgICAgICAgICAgICAgLyogaGFzIGJlZW4gcnVuIHNvIHRoaXMgaXMgbGFzdCB0YXNrLCBydW4gd2l0aCBUUUZfSVNfTEFTVF9UQVNLIHNvICovCisgICAgICAgICAgICAgICAgLyogaW5zdHJ1bWVudGF0aW9uIGRvZXMgY29weS1vdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBubyBuZWVkIGZvciB0ZXN0X3RoZW5fb3IgY2FsbCBzaW5jZSBhbHJlYWR5IGxvY2tlZCAqLworICAgICAgICAgICAgICAgIHRodW5rLT50aF9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJUIyVkIGZvdW5kIHRodW5rOiAlcCBpbiBzZXJpYWwgcXVldWU6ICVwXG4iLCBnbG9iYWxfdGlkLCB0aHVuaywgcXVldWUpKTsKKworICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICB9CisKKyAgICAgICAgLyogZGVzdHJveSB0aGUgdW5hdHRhY2hlZCBzZXJpYWwgcXVldWUgbm93IHRoYXQgdGhlcmUgaXMgbm8gbW9yZSB3b3JrIHRvIGRvICovCisgICAgICAgIEtGX1RSQUNFKDEwMCwgKCJCZWZvcmUgRGVsZXRpb24gb2YgU2VyaWFsaXplZCBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICAgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGkgPSAwOworICAgICAgICBmb3IgKHRodW5rPXF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgdGh1bms9dGh1bmstPnRoLnRoX25leHRfZnJlZSkKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCAoaSA9PSBxdWV1ZS0+dHFfbnNsb3RzICsgMSk7CisjZW5kaWYKKyAgICAgICAgLyogIHJlbGVhc2Ugc3RvcmFnZSBmb3IgdW5hdHRhY2hlZCBzZXJpYWwgcXVldWUgICovCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIlNlcmlhbGl6ZWQgVGFza1EgYXQgJXAgZGVsZXRlZCBvbiAoJWQpLlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICBfX2ttcF9mcmVlX3Rhc2txICggdHEsIHF1ZXVlLCBpbl9wYXJhbGxlbCwgZ2xvYmFsX3RpZCApOworICAgIH0KKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qICBFbnF1ZXVlcyBhIHRhc2sgZm9yIHRodW5rIHByZXZpb3VzbHkgY3JlYXRlZCBieSBfX2ttcGNfdGFza19idWZmZXIuICovCisvKiAgUmV0dXJucyBub256ZXJvIGlmIGp1c3QgZmlsbGVkIHVwIHF1ZXVlICAqLworCitrbXBfaW50MzIKK19fa21wY190YXNrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmspCit7CisgICAga21wX2ludDMyICAgICAgICAgIHJldDsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAgaW50ICAgICAgICAgICAgICAgIGluX3BhcmFsbGVsOworICAgIGttcF90YXNrcV90ICAgICAgICp0cTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFzayBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAoISh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykpOyAgLyogIHRodW5rLT50aF90YXNrIGlzIGEgcmVndWxhciB0YXNrICAqLworCisgICAgdHEgICAgICAgICAgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBxdWV1ZSAgICAgICA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwgJiYgKHRodW5rLT50aF9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSkKKyAgICAgICAgdGh1bmstPnRoX3Rhc2tudW0gPSArK3F1ZXVlLT50cV90YXNrbnVtX3F1ZXVpbmc7CisKKyAgICAvKiBGb3Igc2VyaWFsIGV4ZWN1dGlvbiBkZXF1ZXVlIHRoZSBwcmVjZWRpbmcgdGFzayBhbmQgZXhlY3V0ZSBpdCwgaWYgb25lIGV4aXN0cyAqLworICAgIC8qIFRoaXMgY2Fubm90IGJlIHRoZSBsYXN0IHRhc2suICBUaGF0IG9uZSBpcyBoYW5kbGVkIGluIF9fa21wY19lbmRfdGFza3EgKi8KKworICAgIGlmICghaW5fcGFyYWxsZWwgJiYgcXVldWUtPnRxX25mdWxsID4gMCkgeworICAgICAgICBrbXBjX3RodW5rX3QgKnByZXZfdGh1bms7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPT0gMSk7CisKKyAgICAgICAgcHJldl90aHVuayA9IF9fa21wX2RlcXVldWVfdGFzayhnbG9iYWxfdGlkLCBxdWV1ZSwgaW5fcGFyYWxsZWwpOworCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIlQjJWQgZm91bmQgdGh1bms6ICVwIGluIHNlcmlhbCBxdWV1ZTogJXBcbiIsIGdsb2JhbF90aWQsIHByZXZfdGh1bmssIHF1ZXVlKSk7CisKKyAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHByZXZfdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgfQorCisgICAgLyogVGhlIGluc3RydW1lbnRhdGlvbiBzZXF1ZW5jZSBpczogIF9fa21wY190YXNrX2J1ZmZlcigpLCBpbml0aWFsaXplIHByaXZhdGUgICAgKi8KKyAgICAvKiB2YXJpYWJsZXMsIF9fa21wY190YXNrKCkuICBUaGUgX19rbXBjX3Rhc2tfYnVmZmVyIHJvdXRpbmUgY2hlY2tzIHRoYXQgdGhlICAgICAqLworICAgIC8qIHRhc2sgcXVldWUgaXMgbm90IGZ1bGwgYW5kIGFsbG9jYXRlcyBhIHRodW5rICh3aGljaCBpcyB0aGVuIHBhc3NlZCB0byAgICAgICAgICovCisgICAgLyogX19rbXBjX3Rhc2soKSkuICBTbywgdGhlIGVucXVldWUgYmVsb3cgc2hvdWxkIG5ldmVyIGZhaWwgZHVlIHRvIGEgZnVsbCBxdWV1ZS4gKi8KKworICAgIEtGX1RSQUNFKDEwMCwgKCJBZnRlciBlbnF1ZXVlaW5nIHRoaXMgVGFzayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICByZXQgPSBfX2ttcF9lbnF1ZXVlX3Rhc2sgKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIHRodW5rLCBpbl9wYXJhbGxlbCApOworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIlRhc2sgUXVldWUgbG9va3MgbGlrZSB0aGlzIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiAgZW5xdWV1ZXMgYSB0YXNrcV90YXNrIGZvciB0aHVuayBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgX19rbXBjX3Rhc2txICAqLworLyogIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB1bmxlc3MgaW4gYSBwYXJhbGxlbCBjb250ZXh0ICAgICAgICAgICAgKi8KKwordm9pZAorX19rbXBjX3Rhc2txX3Rhc2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaywga21wX2ludDMyIHN0YXR1cykKK3sKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxICA9ICZfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworICAgIGludCAgICAgICAgICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txX3Rhc2sgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9UUkFDRSgxMDAsICgiVGFza1EgVGFzayBhcmd1bWVudCB0aHVuayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICBxdWV1ZSA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfdGFza3EsIGxvYyApOworCisgICAgLyogIHRodW5rLT50aF90YXNrIGlzIHRoZSB0YXNrcV90YXNrICAqLworICAgIEtNUF9ERUJVR19BU1NFUlQgKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKTsKKworICAgIC8qICBub3Qgc3VwcG9zZWQgdG8gY2FsbCBfX2ttcGNfdGFza3FfdGFzayBpZiBpdCdzIGFscmVhZHkgZW5xdWV1ZWQgICovCisgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxX3Rhc2txX3Nsb3QgPT0gTlVMTCk7CisKKyAgICAvKiBkZXF1ZXVlIHRhc2txIHRodW5rIGZyb20gY3Vycl90aHVuayBzdGFjayAqLworICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuay0+dGhfZW5jbF90aHVuazsKKyAgICB0aHVuay0+dGhfZW5jbF90aHVuayA9IE5VTEw7CisKKyAgICBLRl9EVU1QKCAyMDAsIF9fa21wX2R1bXBfdGh1bmtfc3RhY2soIHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQgKSk7CisKKyAgICB0aHVuay0+dGhfc3RhdHVzID0gc3RhdHVzOworCisgICAgS01QX01CKCk7ICAvKiAgZmx1c2ggdGh1bmstPnRoX3N0YXR1cyBiZWZvcmUgdGFza3FfdGFzayBlbnF1ZXVlZCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiAgKi8KKworICAgIC8qICBlbnF1ZXVlIHRhc2txX3Rhc2sgaW4gdGh1bmsgaW50byBzcGVjaWFsIHNsb3QgaW4gcXVldWUgICAgICovCisgICAgLyogR0VIIC0gcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBsb2NrIHRhc2txIHNsb3Qgc2luY2Ugb25seSBvbmUgKi8KKyAgICAvKiAgICAgICB0aHJlYWQgZW5xdWV1ZXMgJiBhbHJlYWR5IGEgbG9jayBzZXQgYXQgZGVxdWV1ZSBwb2ludCAqLworCisgICAgcXVldWUtPnRxX3Rhc2txX3Nsb3QgPSB0aHVuazsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3FfdGFzayByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworfQorCisvKiAgZW5kcyBhIHRhc2txX3Rhc2s7IGRvbmUgZ2VuZXJhdGluZyB0YXNrcyAgKi8KKwordm9pZAorX19rbXBjX2VuZF90YXNrcV90YXNrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmspCit7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxOworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisgICAgaW50ICAgICAgICAgICAgICAgIHRpZDsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHRxICAgICAgICAgID0gJl9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisgICAgcXVldWUgICAgICAgPSB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgICAgaW5fcGFyYWxsZWwgPSAocXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpOworICAgIHRpZCAgICAgICAgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF90YXNrcSwgbG9jICk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyNpZiBLTVBfQVJDSF9YODYgfHwgXAorICAgIEtNUF9BUkNIX1g4Nl82NAorCisgICAgICAgIEtNUF9URVNUX1RIRU5fT1IzMiggJnF1ZXVlLT50cV9mbGFncywgKGttcF9pbnQzMikgVFFGX0FMTF9UQVNLU19RVUVVRUQgKTsKKyNlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9BTExfVEFTS1NfUVVFVUVEOworCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgaWYgKHRodW5rLT50aF9mbGFncyAmIFRRRl9JU19MQVNUUFJJVkFURSkgeworICAgICAgICAvKiBOb3JtYWxseSwgX19rbXBfZmluZF90YXNrX2luX3F1ZXVlKCkgcmVmdXNlcyB0byBzY2hlZHVsZSB0aGUgbGFzdCB0YXNrIGluIHRoZSAqLworICAgICAgICAvKiBxdWV1ZSBpZiBUUUZfSVNfTEFTVFBSSVZBVEUgc28gd2UgY2FuIHBvc2l0aXZlbHkgaWRlbnRpZnkgdGhhdCBsYXN0IHRhc2sgICAgICAqLworICAgICAgICAvKiBhbmQgcnVuIGl0IHdpdGggaXRzIFRRRl9JU19MQVNUX1RBU0sgYml0IHR1cm5lZCBvbiBpbiB0aF9mbGFncy4gIFdoZW4gICAgICAgICAqLworICAgICAgICAvKiBfX2ttcGNfZW5kX3Rhc2txX3Rhc2soKSBpcyBjYWxsZWQgd2UgYXJlIGRvbmUgZ2VuZXJhdGluZyBhbGwgdGhlIHRhc2tzLCBzbyAgICAqLworICAgICAgICAvKiB3ZSBrbm93IHRoZSBsYXN0IG9uZSBpbiB0aGUgcXVldWUgaXMgdGhlIGxhc3Rwcml2YXRlIHRhc2suICBNYXJrIHRoZSBxdWV1ZSAgICAqLworICAgICAgICAvKiBhcyBoYXZpbmcgZ290dGVuIHRvIHRoaXMgc3RhdGUgdmlhIHRxX2ZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSzsgd2hlbiB0aGF0ICAgICAqLworICAgICAgICAvKiB0YXNrIGFjdHVhbGx5IGV4ZWN1dGVzIG1hcmsgaXQgdmlhIHRoX2ZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSyAodGhpcyB0aF9mbGFncyAqLworICAgICAgICAvKiBiaXQgc2lnbmFscyB0aGUgaW5zdHJ1bWVudGVkIGNvZGUgdG8gZG8gY29weS1vdXRzIGFmdGVyIGV4ZWN1dGlvbikuICAgICAgICAgICAqLworCisgICAgICAgIGlmICghIGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICAvKiBObyBzeW5jaHJvbml6YXRpb24gbmVlZGVkIGZvciBzZXJpYWwgY29udGV4dCAqLworICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9JU19MQVNUX1RBU0s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisjaWYgS01QX0FSQ0hfWDg2IHx8IFwKKyAgICBLTVBfQVJDSF9YODZfNjQKKworICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9PUjMyKCAmcXVldWUtPnRxX2ZsYWdzLCAoa21wX2ludDMyKSBUUUZfSVNfTEFTVF9UQVNLICk7CisjZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOworCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIC8qIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb24gd2hlcmUgbGFzdCB0YXNrIGlzIGRlcXVldWVkIGJ1dCAqLworICAgICAgICAgICAgLyogZmxhZyBpc24ndCB2aXNpYmxlIHlldCAobm90IHN1cmUgYWJvdXQgdGhpcykgICAgICAgICAgICAgICovCisgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGRlcXVldWUgdGFza3EgdGh1bmsgZnJvbSBjdXJyX3RodW5rIHN0YWNrICovCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuay0+dGhfZW5jbF90aHVuazsKKyAgICAgICAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSBOVUxMOworCisgICAgICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKyAgICB9CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2VuZF90YXNrcV90YXNrIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qIHJldHVybnMgdGh1bmsgZm9yIGEgcmVndWxhciB0YXNrIGJhc2VkIG9uIHRhc2txX3RodW5rICAgICAgICAgICAgICAqLworLyogKF9fa21wY190YXNrcV90YXNrIGRvZXMgdGhlIGFuYWxvZ291cyB0aGluZyBmb3IgYSBUUUZfVEFTS1FfVEFTSykgICovCisKK2ttcGNfdGh1bmtfdCAqCitfX2ttcGNfdGFza19idWZmZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0YXNrcV90aHVuaywga21wY190YXNrX3QgdGFzaykKK3sKKyAgICBrbXBfdGFza3FfdCAgICAgICAqdHE7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICAgIGttcGNfdGh1bmtfdCAgICAgICpuZXdfdGh1bms7CisgICAgaW50ICAgICAgICAgICAgICAgIGluX3BhcmFsbGVsOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrX2J1ZmZlciBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAodGFza3FfdGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spOyAgLyogIHRhc2txX3RodW5rLT50aF90YXNrIGlzIHRoZSB0YXNrcV90YXNrICAqLworCisgICAgdHEgICAgICAgICAgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBxdWV1ZSAgICAgICA9IHRhc2txX3RodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisKKyAgICAvKiBUaGUgaW5zdHJ1bWVudGF0aW9uIHNlcXVlbmNlIGlzOiAgX19rbXBjX3Rhc2tfYnVmZmVyKCksIGluaXRpYWxpemUgcHJpdmF0ZSAqLworICAgIC8qIHZhcmlhYmxlcywgX19rbXBjX3Rhc2soKS4gIFRoZSBfX2ttcGNfdGFza19idWZmZXIgcm91dGluZSBjaGVja3MgdGhhdCB0aGUgICovCisgICAgLyogdGFzayBxdWV1ZSBpcyBub3QgZnVsbCBhbmQgYWxsb2NhdGVzIGEgdGh1bmsgKHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvICAgICAgKi8KKyAgICAvKiBfX2ttcGNfdGFzaygpKS4gIFNvLCB3ZSBjYW4gcHJlLWFsbG9jYXRlIGEgdGh1bmsgaGVyZSBhc3N1bWluZyBpdCB3aWxsIGJlICAqLworICAgIC8qIHRoZSBuZXh0IHRvIGJlIGVucXVldWVkIGluIF9fa21wY190YXNrKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBuZXdfdGh1bmsgPSBfX2ttcF9hbGxvY190aHVuayAocXVldWUsIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkKTsKKyAgICBuZXdfdGh1bmstPnRoLnRoX3NoYXJlZHMgPSAoa21wY19zaGFyZWRfdmFyc190ICopIHF1ZXVlLT50cV9zaGFyZWRzWzBdLmFpX2RhdGE7CisgICAgbmV3X3RodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKyAgICBuZXdfdGh1bmstPnRoX3Rhc2sgICAgICAgPSB0YXNrOworCisgICAgLyogR0VIIC0gc2hvdWxkbid0IG5lZWQgdG8gbG9jayB0aGUgcmVhZCBvZiB0cV9mbGFncyBoZXJlICovCisgICAgbmV3X3RodW5rLT50aF9mbGFncyAgICAgID0gcXVldWUtPnRxX2ZsYWdzICYgVFFGX0lOVEVSRkFDRV9GTEFHUzsKKworICAgIG5ld190aHVuay0+dGhfc3RhdHVzICAgICA9IDA7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUICghKG5ld190aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykpOworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIkNyZWF0aW5nIFJlZ3VsYXIgVGFzayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgbmV3X3RodW5rLCBnbG9iYWxfdGlkICkpOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrX2J1ZmZlciByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgcmV0dXJuIG5ld190aHVuazsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3RocmVhZHByaXZhdGUuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF90aHJlYWRwcml2YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWQzZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF90aHJlYWRwcml2YXRlLmNwcApAQCAtMCwwICsxLDczMyBAQAorLyoKKyAqIGttcF90aHJlYWRwcml2YXRlLmNwcCAtLSBPcGVuTVAgdGhyZWFkcHJpdmF0ZSBzdXBwb3J0IGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFVTRV9DSEVDS1NfQ09NTU9OCisKKyNkZWZpbmUgS01QX0lOTElORV9TVUJSICAgICAgICAgMQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICk7CitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKgora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApOworCitzdHJ1Y3Qgc2hhcmVkX3RhYmxlICAgICBfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGU7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYworI2lmZGVmIEtNUF9JTkxJTkVfU1VCUgorX19mb3JjZWlubGluZQorI2VuZGlmCitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKgorX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKCBzdHJ1Y3QgY29tbW9uX3RhYmxlICp0YmwsIGludCBndGlkLCB2b2lkICpwY19hZGRyICkKKworeworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbjogdGhyZWFkIyVkLCBjYWxsZWQgd2l0aCBhZGRyZXNzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyAgICBkdW1wX2xpc3QoKTsKKyNlbmRpZgorCisgICAgZm9yICh0biA9IHRibC0+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+dmVjX2xlbiA9IChzaXplX3QpIHZlY3Rvcl9sZW5ndGg7CisvKgorICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gMDsKKyovCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKGRhdGEpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3V0aWxpdHkuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF91dGlsaXR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI0NGIwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF91dGlsaXR5LmNwcApAQCAtMCwwICsxLDQyOSBAQAorLyoKKyAqIGttcF91dGlsaXR5LmNwcCAtLSBVdGlsaXR5IHJvdXRpbmVzIGZvciB0aGUgT3Blbk1QIHN1cHBvcnQgbGlicmFyeS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgImttcF9pMThuLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyICp1bmtub3duID0gInVua25vd24iOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvKiBOT1RFOiBJZiBjYWxsZWQgYmVmb3JlIHNlcmlhbF9pbml0aWFsaXplIChpLmUuIGZyb20gcnVudGltZV9pbml0aWFsaXplKSwgdGhlbiAqLworLyogdGhlIGRlYnVnZ2luZyBwYWNrYWdlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQsIGFuZCBvbmx5ICIwIiB3aWxsIHByaW50ICAgKi8KKy8qIGRlYnVnZ2luZyBvdXRwdXQgc2luY2UgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBoYXZlIG5vdCBiZWVuIHJlYWQuICAgICAgICAgICovCisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYyBpbnQgdHJhY2VfbGV2ZWwgPSA1OworI2VuZGlmCisKKy8qCisgKiBMT0dfSURfQklUUyAgPSAoIDEgKyBmbG9vciggbG9nXzIoIG1heCggbG9nX3Blcl9waHkgLSAxLCAxICkpKSkKKyAqIEFQSUNfSUQgICAgICA9IChQSFlfSUQgPDwgTE9HX0lEX0JJVFMpIHwgTE9HX0lECisgKiBQSFlfSUQgICAgICAgPSBBUElDX0lEID4+IExPR19JRF9CSVRTCisgKi8KK2ludAorX19rbXBfZ2V0X3BoeXNpY2FsX2lkKCBpbnQgbG9nX3Blcl9waHksIGludCBhcGljX2lkICkKK3sKKyAgIGludCBpbmRleF9sc2IsIGluZGV4X21zYiwgdGVtcDsKKworICAgaWYgKGxvZ19wZXJfcGh5ID4gMSkgeworCWluZGV4X2xzYiA9IDA7CisJaW5kZXhfbXNiID0gMzE7CisKKwl0ZW1wID0gbG9nX3Blcl9waHk7CisgICAgICAgIHdoaWxlICggKHRlbXAgJiAxKSA9PSAwICkgeworCSAgICB0ZW1wICA+Pj0gMTsKKwkgICAgaW5kZXhfbHNiKys7CisJfQorCisJdGVtcCA9IGxvZ19wZXJfcGh5OworCXdoaWxlICggKHRlbXAgJiAweDgwMDAwMDAwKT09MCApIHsKKwkgICAgdGVtcCA8PD0gMTsKKwkgICAgaW5kZXhfbXNiLS07CisJfQorCisJLyogSWYgPjEgYml0cyB3ZXJlIHNldCBpbiBsb2dfcGVyX3BoeSwgY2hvb3NlIG5leHQgaGlnaGVyIHBvd2VyIG9mIDIgKi8KKwlpZiAoaW5kZXhfbHNiICE9IGluZGV4X21zYikgaW5kZXhfbXNiKys7CisKKwlyZXR1cm4gKCAoaW50KSAoYXBpY19pZCA+PiBpbmRleF9tc2IpICk7CisgICB9CisKKyAgIHJldHVybiBhcGljX2lkOworfQorCisKKy8qCisgKiBMT0dfSURfQklUUyAgPSAoIDEgKyBmbG9vciggbG9nXzIoIG1heCggbG9nX3Blcl9waHkgLSAxLCAxICkpKSkKKyAqIEFQSUNfSUQgICAgICA9IChQSFlfSUQgPDwgTE9HX0lEX0JJVFMpIHwgTE9HX0lECisgKiBMT0dfSUQgICAgICAgPSBBUElDX0lEICYgKCggMSA8PCBMT0dfSURfQklUUyApIC0gMSApCisgKi8KK2ludAorX19rbXBfZ2V0X2xvZ2ljYWxfaWQoIGludCBsb2dfcGVyX3BoeSwgaW50IGFwaWNfaWQgKQoreworICAgdW5zaWduZWQgY3VycmVudF9iaXQ7CisgICBpbnQgYml0c19zZWVuOworCisgICBpZiAobG9nX3Blcl9waHkgPD0gMSkgcmV0dXJuICggMCApOworCisgICBiaXRzX3NlZW4gPSAwOworCisgICBmb3IgKGN1cnJlbnRfYml0ID0gMTsgbG9nX3Blcl9waHkgIT0gMDsgY3VycmVudF9iaXQgPDw9IDEpIHsKKwlpZiAoIGxvZ19wZXJfcGh5ICYgY3VycmVudF9iaXQgKSB7CisJICAgIGxvZ19wZXJfcGh5ICY9IH5jdXJyZW50X2JpdDsKKwkgICAgYml0c19zZWVuKys7CisJfQorICAgfQorCisgICAvKiBJZiBleGFjdGx5IDEgYml0IHdhcyBzZXQgaW4gbG9nX3Blcl9waHksIGNob29zZSBuZXh0IGxvd2VyIHBvd2VyIG9mIDIgKi8KKyAgIGlmIChiaXRzX3NlZW4gPT0gMSkgeworCWN1cnJlbnRfYml0ID4+PSAxOworICAgfQorCisgICByZXR1cm4gKCAoaW50KSAoKGN1cnJlbnRfYml0IC0gMSkgJiBhcGljX2lkKSApOworfQorCisKK3N0YXRpYwora21wX3VpbnQ2NAorX19rbXBfcGFyc2VfZnJlcXVlbmN5KCAgICAgICAgLy8gUjogRnJlcXVlbmN5IGluIEh6LgorICAgIGNoYXIgY29uc3QgKiBmcmVxdWVuY3kgICAgLy8gSTogRmxvYXQgbnVtYmVyIGFuZCB1bml0OiBNSHosIEdIeiwgb3IgVEd6LgorKSB7CisKKyAgICBkb3VibGUgICAgICAgdmFsdWUgID0gMC4wOworICAgIGNoYXIgY29uc3QgKiB1bml0ICAgPSBOVUxMOworICAgIGttcF91aW50NjQgICByZXN1bHQgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogWmVybyBpcyBhIGJldHRlciB1bmtub3duIHZhbHVlIHRoYW4gYWxsIG9uZXMuICovCisKKyAgICBpZiAoIGZyZXF1ZW5jeSA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH07IC8vIGlmCisgICAgdmFsdWUgPSBzdHJ0b2QoIGZyZXF1ZW5jeSwgKGNoYXIgKiAqKSAmIHVuaXQgKTsgLy8gc3RydG9kKCkgZG9lcyBub3QgbGlrZSAiY2hhciBjb25zdCAqIi4KKyAgICBpZiAoIDAgPCB2YWx1ZSAmJiB2YWx1ZSA8PSBEQkxfTUFYICkgeyAgICAgICAgICAvLyBHb29kIHZhbHVlIChub3Qgb3ZlcmZsb3csIHVuZGVyZmxvdywgZXRjKS4KKyAgICAgICAgaWYgKCBzdHJjbXAoIHVuaXQsICJNSHoiICkgPT0gMCApIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxLjBFKzY7CisgICAgICAgIH0gZWxzZSBpZiAoIHN0cmNtcCggdW5pdCwgIkdIeiIgKSA9PSAwICkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEuMEUrOTsKKyAgICAgICAgfSBlbHNlIGlmICggc3RyY21wKCB1bml0LCAiVEh6IiApID09IDAgKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMS4wRSsxMjsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLy8gV3JvbmcgdW5pdC4KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHJlc3VsdDsKKworfTsgLy8gZnVuYyBfX2ttcF9wYXJzZV9jcHVfZnJlcXVlbmN5CisKK3ZvaWQKK19fa21wX3F1ZXJ5X2NwdWlkKCBrbXBfY3B1aW5mb190ICpwICkKK3sKKyAgICBzdHJ1Y3Qga21wX2NwdWlkIGJ1ZjsKKyAgICBpbnQgbWF4X2FyZzsKKyAgICBpbnQgbG9nX3Blcl9waHk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGNmbHVzaF9zaXplOworI2VuZGlmCisKKyAgICBwLT5pbml0aWFsaXplZCA9IDE7CisKKyAgICBwLT5zc2UyID0gMTsgLy8gQXNzdW1lIFNTRTIgYnkgZGVmYXVsdC4KKworICAgIF9fa21wX3g4Nl9jcHVpZCggMCwgMCwgJmJ1ZiApOworCisgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIklORk86IENQVUlEICVkOiBFQVg9MHglMDhYIEVCWD0weCUwOFggRUNYPTB4JTA4WCBFRFg9MHglMDhYXG4iLAorICAgICAgICAwLCBidWYuZWF4LCBidWYuZWJ4LCBidWYuZWN4LCBidWYuZWR4ICkgKTsKKworICAgIG1heF9hcmcgPSBidWYuZWF4OworCisgICAgcC0+YXBpY19pZCA9IC0xOworCisgICAgaWYgKG1heF9hcmcgPj0gMSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAga21wX3VpbnQzMiB0LCBkYXRhWyA0IF07CisKKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKCAxLCAwLCAmYnVmICk7CisgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCJJTkZPOiBDUFVJRCAlZDogRUFYPTB4JTA4WCBFQlg9MHglMDhYIEVDWD0weCUwOFggRURYPTB4JTA4WFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgYnVmLmVheCwgYnVmLmVieCwgYnVmLmVjeCwgYnVmLmVkeCApICk7CisKKyAgICAgICAgeworI2RlZmluZSBnZXRfdmFsdWUocmVnLGxvLG1hc2spICggKCAoIHJlZyApID4+ICggbG8gKSApICYgKCBtYXNrICApICkKKworICAgICAgICAgICAgcC0+c2lnbmF0dXJlID0gYnVmLmVheDsKKyAgICAgICAgICAgIHAtPmZhbWlseSAgICA9ICAgZ2V0X3ZhbHVlKCBidWYuZWF4LCAyMCwgMHhmZiApICAgICAgICArIGdldF92YWx1ZSggYnVmLmVheCwgOCwgMHgwZiApOworICAgICAgICAgICAgcC0+bW9kZWwgICAgID0gKCBnZXRfdmFsdWUoIGJ1Zi5lYXgsIDE2LCAweDBmICkgPDwgNCApICsgZ2V0X3ZhbHVlKCBidWYuZWF4LCA0LCAweDBmICk7CisgICAgICAgICAgICBwLT5zdGVwcGluZyAgPSAgIGdldF92YWx1ZSggYnVmLmVheCwgIDAsIDB4MGYgKTsKKworI3VuZGVmIGdldF92YWx1ZQorCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIGZhbWlseSA9ICVkLCBtb2RlbCA9ICVkLCBzdGVwcGluZyA9ICVkXG4iLCBwLT5mYW1pbHksIHAtPm1vZGVsLCBwLT5zdGVwcGluZyApICk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKCB0ID0gYnVmLmVieCwgaSA9IDA7IGkgPCA0OyB0ID4+PSA4LCArK2kgKSB7CisgICAgICAgICAgICBkYXRhWyBpIF0gPSAodCAmIDB4ZmYpOworICAgICAgICB9OyAvLyBmb3IKKworICAgICAgICBwLT5zc2UyID0gKCBidWYuZWR4ID4+IDI2ICkgJiAxOworCisjaWZkZWYgS01QX0RFQlVHCisKKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiA0KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBUU0MgLSBUaW1lc3RhbXAgQ291bnRlciBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgVFNDIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiA4KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBDWDggLSBDTVBYQ0hHOEIgSW5zdHJ1Y3Rpb24gQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIENYOCIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gOSkgJiAxICkgeworICAgICAgICAgICAgLyogQVBJQyAtIExvY2FsIEFQSUMgUHJlc2VudCAobXVsdGktcHJvY2Vzc29yIG9wZXJhdGlvbiBzdXBwb3J0ICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIEFQSUMiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDE1KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBDTU9WIC0gQ29uZGl0aW9uYWwgTU9WZSBJbnN0cnVjdGlvbiBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQ01PViIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMTgpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFBTTiAtIFByb2Nlc3NvciBTZXJpYWwgTnVtYmVyIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBQU04iICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDE5KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBDTEZVTFNIIC0gQ2FjaGUgRmx1c2ggSW5zdHJ1Y3Rpb24gQXZhaWxhYmxlICovCisgICAgICAgICAgICBjZmx1c2hfc2l6ZSA9IGRhdGFbIDEgXSAqIDg7ICAgIC8qIEJpdHMgMTUtMDg6IENMRkxVU0ggbGluZSBzaXplID0gOCAoNjQgYnl0ZXMpICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIENMRkxVU0goJWRiKSIsIGNmbHVzaF9zaXplICkgKTsKKworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjEpICYgMSApIHsKKyAgICAgICAgICAgIC8qIERURVMgLSBEZWJ1ZyBUcmFjZSAmIEVNT04gU3RvcmUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgRFRFUyIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjIpICYgMSApIHsKKyAgICAgICAgICAgIC8qIEFDUEkgLSBBQ1BJIFN1cHBvcnQgQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIEFDUEkiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDIzKSAmIDEgKSB7CisgICAgICAgICAgICAvKiBNTVggLSBNdWx0aW1lZGlhIEV4dGVuc2lvbnMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgTU1YIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyNSkgJiAxICkgeworICAgICAgICAgICAgLyogU1NFIC0gU1NFIEluc3RydWN0aW9ucyAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBTU0UiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI2KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBTU0UyIC0gU1NFMiBJbnN0cnVjdGlvbnMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgU1NFMiIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjcpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFNMRlNOUCAtIFNlbGYtU25vb3BpbmcgQ2FjaGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgU0xGU05QIiApICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI4KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBCaXRzIDIzLTE2OiBMb2dpY2FsIFByb2Nlc3NvcnMgcGVyIFBoeXNpY2FsIFByb2Nlc3NvciAoMSBmb3IgUDQpICovCisgICAgICAgICAgICBsb2dfcGVyX3BoeSA9IGRhdGFbIDIgXTsKKyAgICAgICAgICAgIHAtPmFwaWNfaWQgICAgID0gZGF0YVsgMyBdOyAvKiBCaXRzIDMxLTI0OiBQcm9jZXNzb3IgSW5pdGlhbCBBUElDIElEIChYKSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBIVCglZCBUUFVzKSIsIGxvZ19wZXJfcGh5ICkgKTsKKworICAgICAgICAgICAgaWYoIGxvZ19wZXJfcGh5ID4gMSApIHsKKyAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IHRvIDFrIEZPUiBKVC1lbmFibGVkIHByb2Nlc3NvcnMgKDRrIG9uIE9TIFgqKSAqLworI2lmIEtNUF9PU19EQVJXSU4KKyAgICAgICAgICAgICAgICBwLT5jcHVfc3RhY2tvZmZzZXQgPSA0ICogMTAyNDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcC0+Y3B1X3N0YWNrb2Zmc2V0ID0gMSAqIDEwMjQ7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcC0+cGh5c2ljYWxfaWQgPSBfX2ttcF9nZXRfcGh5c2ljYWxfaWQoIGxvZ19wZXJfcGh5LCBwLT5hcGljX2lkICk7CisgICAgICAgICAgICBwLT5sb2dpY2FsX2lkICA9IF9fa21wX2dldF9sb2dpY2FsX2lkKCBsb2dfcGVyX3BoeSwgcC0+YXBpY19pZCApOworICAgICAgICB9CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjkpICYgMSApIHsKKyAgICAgICAgICAgIC8qIEFUSFJPVEwgLSBBdXRvbWF0aWMgVGhyb3R0bGUgQ29udHJvbCAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBBVEhST1RMIiApICk7CisgICAgICAgIH0KKyAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBdXG4iICkgKTsKKworICAgICAgICBmb3IgKGkgPSAyOyBpIDw9IG1heF9hcmc7ICsraSkgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKCBpLCAwLCAmYnVmICk7CisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgKCAiSU5GTzogQ1BVSUQgJWQ6IEVBWD0weCUwOFggRUJYPTB4JTA4WCBFQ1g9MHglMDhYIEVEWD0weCUwOFhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCBidWYuZWF4LCBidWYuZWJ4LCBidWYuZWN4LCBidWYuZWR4ICkgKTsKKyAgICAgICAgfQorI2VuZGlmCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBwLT5ydG0gPSAwOworICAgICAgICBpZiAobWF4X2FyZyA+IDcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJUTSBiaXQgQ1BVSUQuMDc6RUJYLCBiaXQgMTEgKi8KKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCg3LCAwLCAmYnVmKTsKKyAgICAgICAgICAgIHAtPnJ0bSA9IChidWYuZWJ4ID4+IDExKSAmIDE7CisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFJUTSIgKSApOworICAgICAgICB9CisjZW5kaWYKKyAgICB9OyAvLyBpZgorCisgICAgeyAvLyBQYXJzZSBDUFUgYnJhbmQgc3RyaW5nIGZvciBmcmVxdWVuY3ksIHNhdmluZyB0aGUgc3RyaW5nIGZvciBsYXRlci4KKyAgICAgICAgaW50IGk7CisgICAgICAgIGttcF9jcHVpZF90ICogYmFzZSA9IChrbXBfY3B1aWRfdCAqKSZwLT5uYW1lWzBdOworCisgICAgICAgIC8vIEdldCBDUFUgYnJhbmQgc3RyaW5nLgorICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDM7ICsrIGkgKSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoIDB4ODAwMDAwMDIgKyBpLCAwLCBiYXNlK2kgKTsKKyAgICAgICAgfTsgLy8gZm9yCisgICAgICAgIHAtPm5hbWVbIHNpemVvZihwLT5uYW1lKSAtIDEgXSA9IDA7IC8vIEp1c3QgaW4gY2FzZS4gOy0pCisgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCAiY3B1IGJyYW5kIHN0cmluZzogXCIlc1wiXG4iLCAmcC0+bmFtZVswXSApICk7CisKKyAgICAgICAgLy8gUGFyc2UgZnJlcXVlbmN5LgorICAgICAgICBwLT5mcmVxdWVuY3kgPSBfX2ttcF9wYXJzZV9mcmVxdWVuY3koIHN0cnJjaHIoICZwLT5uYW1lWzBdLCAnICcgKSApOworICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICggImNwdSBmcmVxdWVuY3kgZnJvbSBicmFuZCBzdHJpbmc6ICUiIEtNUF9VSU5UNjRfU1BFQyAiXG4iLCBwLT5mcmVxdWVuY3kgKSApOworICAgIH0KK30KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfZXhwYW5kX2hvc3RfbmFtZSggY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChzaXplID49IHNpemVvZih1bmtub3duKSk7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICB7CisJRFdPUkQJcyA9IHNpemU7CisKKwlpZiAoISBHZXRDb21wdXRlck5hbWVBKCBidWZmZXIsICYgcyApKQorCSAgICBLTVBfU1RSQ1BZX1MoIGJ1ZmZlciwgc2l6ZSwgdW5rbm93biApOworICAgIH0KKyNlbHNlCisgICAgYnVmZmVyW3NpemUgLSAyXSA9IDA7CisgICAgaWYgKGdldGhvc3RuYW1lKCBidWZmZXIsIHNpemUgKSB8fCBidWZmZXJbc2l6ZSAtIDJdICE9IDApCisJS01QX1NUUkNQWV9TKCBidWZmZXIsIHNpemUsIHVua25vd24gKTsKKyNlbmRpZgorfQorCisvKiBFeHBhbmQgdGhlIG1ldGEgY2hhcmFjdGVycyBpbiB0aGUgZmlsZW5hbWU6CisgKgorICogQ3VycmVudGx5IGRlZmluZWQgY2hhcmFjdGVycyBhcmU6CisgKgorICogJUggdGhlIGhvc3RuYW1lCisgKiAlUCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdXNlZC4KKyAqICVJIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBydW4uCisgKi8KKwordm9pZAorX19rbXBfZXhwYW5kX2ZpbGVfbmFtZSggY2hhciAqcmVzdWx0LCBzaXplX3QgcmxlbiwgY2hhciAqcGF0dGVybiApCit7CisgICAgY2hhcgkqcG9zID0gcmVzdWx0LCAqZW5kID0gcmVzdWx0ICsgcmxlbiAtIDE7CisgICAgY2hhcgkgYnVmZmVyWzI1Nl07CisgICAgaW50CQkgZGVmYXVsdF9jcHVfd2lkdGggPSAxOworICAgIGludCAgICAgICAgICBzbnBfcmVzdWx0OworCisgICAgS01QX0RFQlVHX0FTU0VSVChybGVuID4gMCk7CisgICAgKmVuZCA9IDA7CisgICAgeworCWludCBpOworCWZvcihpID0gX19rbXBfeHByb2M7IGkgPj0gMTA7IGkgLz0gMTAsICsrZGVmYXVsdF9jcHVfd2lkdGgpOworICAgIH0KKworICAgIGlmIChwYXR0ZXJuICE9IE5VTEwpIHsKKwl3aGlsZSAoKnBhdHRlcm4gIT0gJ1wwJyAmJiBwb3MgPCBlbmQpIHsKKwkgICAgaWYgKCpwYXR0ZXJuICE9ICclJykgeworCQkqcG9zKysgPSAqcGF0dGVybisrOworCSAgICB9IGVsc2UgeworCQljaGFyICpvbGRfcGF0dGVybiA9IHBhdHRlcm47CisJCWludCB3aWR0aCA9IDE7CisJCWludCBjcHVfd2lkdGggPSBkZWZhdWx0X2NwdV93aWR0aDsKKworCQkrK3BhdHRlcm47CisKKwkJaWYgKCpwYXR0ZXJuID49ICcwJyAmJiAqcGF0dGVybiA8PSAnOScpIHsKKwkJICAgIHdpZHRoID0gMDsKKwkJICAgIGRvIHsKKwkJCXdpZHRoID0gKHdpZHRoICogMTApICsgKnBhdHRlcm4rKyAtICcwJzsKKwkJICAgIH0gd2hpbGUgKCpwYXR0ZXJuID49ICcwJyAmJiAqcGF0dGVybiA8PSAnOScpOworCQkgICAgaWYgKHdpZHRoIDwgMCB8fCB3aWR0aCA+IDEwMjQpCisJCQl3aWR0aCA9IDE7CisKKwkJICAgIGNwdV93aWR0aCA9IHdpZHRoOworCQl9CisKKwkJc3dpdGNoICgqcGF0dGVybikgeworCQljYXNlICdIJzoKKwkJY2FzZSAnaCc6CisJCSAgICB7CisJCQlfX2ttcF9leHBhbmRfaG9zdF9uYW1lKCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgKTsKKwkJCUtNUF9TVFJOQ1BZKCBwb3MsICBidWZmZXIsIGVuZCAtIHBvcyArIDEpOworCQkJaWYoKmVuZCA9PSAwKSB7CisJCQkgICAgd2hpbGUgKCAqcG9zICkKKwkJCQkrK3BvczsKKwkJCSAgICArK3BhdHRlcm47CisJCQl9IGVsc2UKKwkJCSAgICBwb3MgPSBlbmQ7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnUCc6CisJCWNhc2UgJ3AnOgorCQkgICAgeworCQkJc25wX3Jlc3VsdCA9IEtNUF9TTlBSSU5URiggcG9zLCBlbmQgLSBwb3MgKyAxLCAiJTAqZCIsIGNwdV93aWR0aCwgX19rbXBfZGZsdF90ZWFtX250aCApOworCQkJaWYoc25wX3Jlc3VsdCA+PSAwICYmIHNucF9yZXN1bHQgPD0gZW5kIC0gcG9zKSB7CisJCQkgICAgd2hpbGUgKCAqcG9zICkKKwkJCQkrK3BvczsKKwkJCSAgICArK3BhdHRlcm47CisJCQl9IGVsc2UKKwkJCSAgICBwb3MgPSBlbmQ7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJY2FzZSAnSSc6CisJCWNhc2UgJ2knOgorCQkgICAgeworCQkJcGlkX3QgaWQgPSBnZXRwaWQoKTsKKwkJCXNucF9yZXN1bHQgPSBLTVBfU05QUklOVEYoIHBvcywgZW5kIC0gcG9zICsgMSwgIiUwKmQiLCB3aWR0aCwgaWQgKTsKKwkJCWlmKHNucF9yZXN1bHQgPj0gMCAmJiBzbnBfcmVzdWx0IDw9IGVuZCAtIHBvcykgeworCQkJICAgIHdoaWxlICggKnBvcyApCisJCQkJKytwb3M7CisJCQkgICAgKytwYXR0ZXJuOworCQkJfSBlbHNlCisJCQkgICAgcG9zID0gZW5kOworCQkJYnJlYWs7CisJCSAgICB9CisJCWNhc2UgJyUnOgorCQkgICAgeworCQkJKnBvcysrID0gJyUnOworCQkJKytwYXR0ZXJuOworCQkJYnJlYWs7CisJCSAgICB9CisJCWRlZmF1bHQ6CisJCSAgICB7CisJCQkqcG9zKysgPSAnJSc7CisJCQlwYXR0ZXJuID0gb2xkX3BhdHRlcm4gKyAxOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwkvKiBUT0RPOiBIb3cgZG8gd2UgZ2V0IHJpZCBvZiB0aGlzPyAqLworCWlmKCpwYXR0ZXJuICE9ICdcMCcpCisJICAgIEtNUF9GQVRBTCggRmlsZU5hbWVUb29Mb25nICk7CisgICAgfQorCisgICAgKnBvcyA9ICdcMCc7Cit9CisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX3ZlcnNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzgyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3ZlcnNpb24uY3BwCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICoga21wX3ZlcnNpb24uY3BwCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorCisvLyBSZXBsYWNlIHdpdGggc25hcHNob3QgZGF0ZSBZWVlZTU1ERCBmb3IgcHJvbW90aW9uIGJ1aWxkLgorI2RlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICAyMDE0MDkyNgorCisvLyBIZWxwZXIgbWFjcm9zIHRvIGNvbnZlcnQgdmFsdWUgb2YgbWFjcm8gdG8gc3RyaW5nIGxpdGVyYWwuCisjZGVmaW5lIF9zdHJpbmdlciggeCApICN4CisjZGVmaW5lIHN0cmluZ2VyKCB4ICkgIF9zdHJpbmdlciggeCApCisKKy8vIERldGVjdCBjb21waWxlci4KKyNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgI2lmICAgX19JTlRFTF9DT01QSUxFUiA9PSAxMDEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTAuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDExMDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMS4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTExMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDExLjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMjAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTIuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEyMTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMi4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTMwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEzLjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMzEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTMuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDE0MDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxNC4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTQxMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE0LjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxNTAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTUuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDE2MDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxNi4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTcwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE3LjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSA5OTk4CisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgbWFpbmxpbmUiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSA5OTk5CisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgbWFpbmxpbmUiCisgICAgI2VuZGlmCisjZWxpZiBLTVBfQ09NUElMRVJfQ0xBTkcKKyAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiQ2xhbmcgIiBzdHJpbmdlciggX19jbGFuZ19tYWpvcl9fICkgIi4iIHN0cmluZ2VyKCBfX2NsYW5nX21pbm9yX18gKQorI2VsaWYgS01QX0NPTVBJTEVSX0dDQworICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJHQ0MgIiBzdHJpbmdlciggX19HTlVDX18gKSAiLiIgc3RyaW5nZXIoIF9fR05VQ19NSU5PUl9fICkKKyNlbGlmIEtNUF9DT01QSUxFUl9NU1ZDCisgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIk1TVkMgIiBzdHJpbmdlciggX01TQ19GVUxMX1ZFUiApCisjZW5kaWYKKyNpZm5kZWYgS01QX0NPTVBJTEVSCisgICAgI3dhcm5pbmcgIlVua25vd24gY29tcGlsZXIiCisgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgInVua25vd24gY29tcGlsZXIiCisjZW5kaWYKKworLy8gRGV0ZWN0IGxpYnJyYXkgdHlwZSAocGVyZiwgc3R1YikuCisjaWZkZWYgS01QX1NUVUIKKyAgICAjZGVmaW5lIEtNUF9MSUJfVFlQRSAic3R1YiIKKyNlbHNlCisgICAgI2RlZmluZSBLTVBfTElCX1RZUEUgInBlcmZvcm1hbmNlIgorI2VuZGlmIC8vIEtNUF9MSUJfVFlQRQorCisvLyBEZXRlY3QgbGluayB0eXBlIChzdGF0aWMsIGR5bmFtaWMpLgorI2lmZGVmIEtNUF9EWU5BTUlDX0xJQgorICAgICNkZWZpbmUgS01QX0xJTktfVFlQRSAiZHluYW1pYyIKKyNlbHNlCisgICAgI2RlZmluZSBLTVBfTElOS19UWVBFICJzdGF0aWMiCisjZW5kaWYgLy8gS01QX0xJTktfVFlQRQorCisvLyBGaW5hbGx5LCBkZWZpbmUgc3RyaW5ncy4KKyNkZWZpbmUgS01QX0xJQlJBUlkgICBLTVBfTElCX1RZUEUgIiBsaWJyYXJ5ICgiIEtNUF9MSU5LX1RZUEUgIikiCisjZGVmaW5lIEtNUF9DT1BZUklHSFQgIiIKKworaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fbWFqb3IgPSBLTVBfVkVSU0lPTl9NQUpPUjsKK2ludCBjb25zdCBfX2ttcF92ZXJzaW9uX21pbm9yID0gS01QX1ZFUlNJT05fTUlOT1I7CitpbnQgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZCA9IEtNUF9WRVJTSU9OX0JVSUxEOworaW50IGNvbnN0IF9fa21wX29wZW5tcF92ZXJzaW9uID0KKyAgICAjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAgICAgMjAxNTExOworICAgICNlbGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIDIwMTMwNzsKKyAgICAjZWxzZQorICAgICAgICAyMDExMDc7CisgICAgI2VuZGlmCisKKy8qIERvIE5PVCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGlzIHN0cmluZyEgIEludGVsKFIpIFRocmVhZCBQcm9maWxlciBjaGVja3MgZm9yIGEKKyAgIHNwZWNpZmljIGZvcm1hdCBzb21lIGNoYW5nZXMgaW4gdGhlIHJlY29nbml0aW9uIHJvdXRpbmUgdGhlcmUgbmVlZCB0bworICAgYmUgbWFkZSBiZWZvcmUgdGhpcyBpcyBjaGFuZ2VkLgorKi8KK2NoYXIgY29uc3QgX19rbXBfY29weXJpZ2h0W10gPQorICAgIEtNUF9WRVJTSU9OX1BSRUZJWCBLTVBfTElCUkFSWQorICAgICIgdmVyLiAiIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NQUpPUiApICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fTUlOT1IgKQorICAgICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fQlVJTEQgKSAiICIKKyAgICBLTVBfQ09QWVJJR0hUOworCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0W10gICAgICA9IEtNUF9WRVJTSU9OX1BSRUZJWCBLTVBfQ09QWVJJR0hUOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbXSAgICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggInZlcnNpb246ICIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX01BSk9SICkgIi4iIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NSU5PUiApICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fQlVJTEQgKTsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saWJfdHlwZVtdICAgICAgID0gS01QX1ZFUlNJT05fUFJFRklYICJsaWJyYXJ5IHR5cGU6ICIgS01QX0xJQl9UWVBFOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVtdICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggImxpbmsgdHlwZTogIiBLTVBfTElOS19UWVBFOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbXSAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggImJ1aWxkIHRpbWU6ICIgIm5vX3RpbWVzdGFtcCI7CisjaWYgS01QX01JQzIKKyAgICBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fdGFyZ2V0X2VudltdID0gS01QX1ZFUlNJT05fUFJFRklYICJ0YXJnZXQgZW52aXJvbm1lbnQ6IE1JQzIiOworI2VuZGlmCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGRfY29tcGlsZXJbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiYnVpbGQgY29tcGlsZXI6ICIgS01QX0NPTVBJTEVSOworCisvLworLy8gQ2FsbGVkIGF0IHNlcmlhbCBpbml0aWFsaXphdGlvbiB0aW1lLgorLy8KK3N0YXRpYyBpbnQgX19rbXBfdmVyc2lvbl8xX3ByaW50ZWQgPSBGQUxTRTsKKwordm9pZAorX19rbXBfcHJpbnRfdmVyc2lvbl8xKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX3ZlcnNpb25fMV9wcmludGVkICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF92ZXJzaW9uXzFfcHJpbnRlZCA9IFRSVUU7CisKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisgICAgICAgIC8vIFByaW50IHZlcnNpb24gc3RyaW5ncyBza2lwcGluZyBpbml0aWFsIG1hZ2ljLgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fbGliX3ZlclsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpYl90eXBlWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fbGlua190eXBlWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICNpZiBLTVBfTUlDCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl90YXJnZXRfZW52WyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgI2VuZGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9idWlsZF9jb21waWxlclsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgI2lmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2FsdF9jb21wWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICAjZW5kaWYgLyogZGVmaW5lZChLTVBfR09NUF9DT01QQVQpICovCisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9vbXBfYXBpWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzZHluYW1pYyBlcnJvciBjaGVja2luZzogJXNcbiIsIEtNUF9WRVJTSU9OX1BSRUZfU1RSLCAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayA/ICJ5ZXMiIDogIm5vIiApICApOworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IGJzX3BsYWluX2JhcnJpZXI7IGkgPCBic19sYXN0X2JhcnJpZXI7ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICAgICAgICAgJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICIlcyVzIGJhcnJpZXIgYnJhbmNoIGJpdHM6IGdhdGhlcj0ldSwgcmVsZWFzZT0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgS01QX1ZFUlNJT05fUFJFRl9TVFIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfdHlwZV9uYW1lWyBpIF0sCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzWyBpIF0sCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdCisgICAgICAgICAgICAgICAgKTsgLy8gX19rbXBfc3RyX2J1Zl9wcmludAorICAgICAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gYnNfcGxhaW5fYmFycmllcjsgaSA8IGJzX2xhc3RfYmFycmllcjsgKysgaSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KAorICAgICAgICAgICAgICAgICAgICAmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIiVzJXMgYmFycmllciBwYXR0ZXJuOiBnYXRoZXI9JXMsIHJlbGVhc2U9JXNcbiIsCisgICAgICAgICAgICAgICAgICAgIEtNUF9WRVJTSU9OX1BSRUZfU1RSLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZVsgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVyblsgaSBdIF0sCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lWyBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgaSBdIF0KKyAgICAgICAgICAgICAgICApOyAvLyBfX2ttcF9zdHJfYnVmX3ByaW50CisgICAgICAgICAgICB9OyAvLyBmb3IgaQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xvY2tbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KAorICAgICAgICAgICAgJiBidWZmZXIsCisgICAgICAgICAgICAiJXN0aHJlYWQgYWZmaW5pdHkgc3VwcG9ydDogJXNcbiIsCisgICAgICAgICAgICBLTVBfVkVSU0lPTl9QUkVGX1NUUiwKKyAgICAgICAgICAgICNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpCisgICAgICAgICAgICAgICAgICAgID8KKyAgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lCisgICAgICAgICAgICAgICAgICAgICAgICA/CisgICAgICAgICAgICAgICAgICAgICAgICAibm90IHVzZWQiCisgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgICAgICAieWVzIgorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgIm5vIgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgIm5vIgorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiS01QX1ZFUlNJT04gaXMgdHJ1ZVxuIiApICk7CisgICAgI2VuZGlmIC8vIEtNUF9TVFVCCit9IC8vIF9fa21wX3ByaW50X3ZlcnNpb25fMQorCisvLworLy8gQ2FsbGVkIGF0IHBhcmFsbGVsIGluaXRpYWxpemF0aW9uIHRpbWUuCisvLworc3RhdGljIGludCBfX2ttcF92ZXJzaW9uXzJfcHJpbnRlZCA9IEZBTFNFOworCit2b2lkCitfX2ttcF9wcmludF92ZXJzaW9uXzIoIHZvaWQgKSB7CisgICAgaWYgKCBfX2ttcF92ZXJzaW9uXzJfcHJpbnRlZCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgX19rbXBfdmVyc2lvbl8yX3ByaW50ZWQgPSBUUlVFOworfSAvLyBfX2ttcF9wcmludF92ZXJzaW9uXzIKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyODUzYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBrbXBfdmVyc2lvbi5oIC0tIHZlcnNpb24gbnVtYmVyIGZvciB0aGlzIHJlbGVhc2UKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfVkVSU0lPTl9ICisjZGVmaW5lIEtNUF9WRVJTSU9OX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2lmbmRlZiBLTVBfVkVSU0lPTl9NQUpPUgorICAgICNlcnJvciBLTVBfVkVSU0lPTl9NQUpPUiBtYWNybyBpcyBub3QgZGVmaW5lZC4KKyNlbmRpZgorI2RlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICAgICAwCisvKgorICAgIFVzaW5nICJtYWdpYyIgcHJlZml4IGluIGFsbCB0aGUgdmVyc2lvbiBzdHJpbmdzIGlzIHJhdGhlciBjb252ZW5pZW50IHRvIGdldCBzdGF0aWMgdmVyc2lvbiBpbmZvCisgICAgZnJvbSBiaW5hcmllcyBieSB1c2luZyBzdGFuZGFyZCB1dGlsaXRpZXMgInN0cmluZ3MiIGFuZCAiZ3JlcCIsIGUuIGcuOgorICAgICAgICAkIHN0cmluZ3MgbGlib21wLnNvIHwgZ3JlcCAiQCgjKSIKKyAgICBnaXZlcyBjbGVhbiBsaXN0IG9mIGFsbCB2ZXJzaW9uIHN0cmluZ3MgaW4gdGhlIGxpYnJhcnkuIExlYWRpbmcgemVybyBoZWxwcyB0byBrZWVwIHZlcnNpb24KKyAgICBzdHJpbmcgc2VwYXJhdGUgZnJvbSBwcmludGFibGUgY2hhcmFjdGVycyB3aGljaCBtYXkgb2NjdXJzIGp1c3QgYmVmb3JlIHZlcnNpb24gc3RyaW5nLgorKi8KKyNkZWZpbmUgS01QX1ZFUlNJT05fTUFHSUNfU1RSICAgIlx4MDBAKCMpICIKKyNkZWZpbmUgS01QX1ZFUlNJT05fTUFHSUNfTEVOICAgNiAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgS01QX1ZFUlNJT05fTUFHSUNfU1RSLgorI2RlZmluZSBLTVBfVkVSU0lPTl9QUkVGX1NUUiAgICAiSW50ZWwoUikgT01QICIKKyNkZWZpbmUgS01QX1ZFUlNJT05fUFJFRklYICAgICAgS01QX1ZFUlNJT05fTUFHSUNfU1RSIEtNUF9WRVJTSU9OX1BSRUZfU1RSCisKKy8qIGRlY2xhcmUgYWxsIHRoZSB2ZXJzaW9uIHN0cmluZyBjb25zdGFudHMgZm9yIEtNUF9WRVJTSU9OIGVudi4gdmFyaWFibGUgKi8KK2V4dGVybiBpbnQgIGNvbnN0IF9fa21wX3ZlcnNpb25fbWFqb3I7CitleHRlcm4gaW50ICBjb25zdCBfX2ttcF92ZXJzaW9uX21pbm9yOworZXh0ZXJuIGludCAgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZDsKK2V4dGVybiBpbnQgIGNvbnN0IF9fa21wX29wZW5tcF92ZXJzaW9uOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfY29weXJpZ2h0W107ICAgIC8vIE9sZCB2YXJpYWJsZSwga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIElUQyBhbmQgSVRQLgorZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9jb3B5cmlnaHRbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGliX3ZlcltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saWJfdHlwZVtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saW5rX3R5cGVbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZVtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl90YXJnZXRfZW52W107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX2NvbXBpbGVyW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2FsdF9jb21wW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX29tcF9hcGlbXTsKKy8vID8/PyBleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2RlYnVnW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xvY2tbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbmVzdGVkX3N0YXRzX3JlcG9ydGluZ1tdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5zdGRjYWxsW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmNkZWNsW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmV4dHJhW107CisKK3ZvaWQgX19rbXBfcHJpbnRfdmVyc2lvbl8xKCB2b2lkICk7Cit2b2lkIF9fa21wX3ByaW50X3ZlcnNpb25fMiggdm9pZCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLyogS01QX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjFlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5jcHAKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGttcF93YWl0X3JlbGVhc2UuY3BwIC0tIFdhaXQvUmVsZWFzZSBpbXBsZW1lbnRhdGlvbgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKwordm9pZCBfX2ttcF93YWl0XzY0KGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgX19rbXBfd2FpdF90ZW1wbGF0ZSh0aGlzX3RociwgZmxhZywgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworfQorCit2b2lkIF9fa21wX3JlbGVhc2VfNjQoa21wX2ZsYWdfNjQgKmZsYWcpIHsKKyAgICBfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKGZsYWcpOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJmZjhlOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmgKQEAgLTAsMCArMSw2MjggQEAKKy8qCisgKiBrbXBfd2FpdF9yZWxlYXNlLmggLS0gV2FpdC9SZWxlYXNlIGltcGxlbWVudGF0aW9uCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1dBSVRfUkVMRUFTRV9ICisjZGVmaW5lIEtNUF9XQUlUX1JFTEVBU0VfSAorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorCisvKiEKK0BkZWZncm91cCBXQUlUX1JFTEVBU0UgV2FpdC9SZWxlYXNlIG9wZXJhdGlvbnMKKworVGhlIGRlZmluaXRpb25zIGFuZCBmdW5jdGlvbnMgaGVyZSBpbXBsZW1lbnQgdGhlIGxvd2VzdCBsZXZlbCB0aHJlYWQKK3N5bmNocm9uaXphdGlvbnMgb2Ygc3VzcGVuZGluZyBhIHRocmVhZCBhbmQgYXdha2luZyBpdC4gVGhleSBhcmUgdXNlZAordG8gYnVpbGQgaGlnaGVyIGxldmVsIG9wZXJhdGlvbnMgc3VjaCBhcyBiYXJyaWVycyBhbmQgZm9yay9qb2luLgorKi8KKworLyohCitAaW5ncm91cCBXQUlUX1JFTEVBU0UKK0B7CisqLworCisvKiEKKyAqIFRoZSBmbGFnX3R5cGUgZGVzY3JpYmVzIHRoZSBzdG9yYWdlIHVzZWQgZm9yIHRoZSBmbGFnLgorICovCitlbnVtIGZsYWdfdHlwZSB7CisgICAgZmxhZzMyLCAgICAgICAgLyoqPCAzMiBiaXQgZmxhZ3MgKi8KKyAgICBmbGFnNjQsICAgICAgICAvKio8IDY0IGJpdCBmbGFncyAqLworICAgIGZsYWdfb25jb3JlICAgIC8qKjwgc3BlY2lhbCA2NC1iaXQgZmxhZyBmb3Igb24tY29yZSBiYXJyaWVyIChoaWVyYXJjaGljYWwpICovCit9OworCisvKiEKKyAqIEJhc2UgY2xhc3MgZm9yIHdhaXQvcmVsZWFzZSB2b2xhdGlsZSBmbGFnCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBQPgorY2xhc3Mga21wX2ZsYWcgeworICAgIHZvbGF0aWxlIFAgKiBsb2M7ICAvKio8IFBvaW50ZXIgdG8gdGhlIGZsYWcgc3RvcmFnZSB0aGF0IGlzIG1vZGlmaWVkIGJ5IGFub3RoZXIgdGhyZWFkICovCisgICAgZmxhZ190eXBlIHQ7ICAgICAgIC8qKjwgIlR5cGUiIG9mIHRoZSBmbGFnIGluIGxvYyAqLworIHB1YmxpYzoKKyAgICB0eXBlZGVmIFAgZmxhZ190OworICAgIGttcF9mbGFnKHZvbGF0aWxlIFAgKnAsIGZsYWdfdHlwZSBmdCkgOiBsb2MocCksIHQoZnQpIHt9CisgICAgLyohCisgICAgICogQHJlc3VsdCB0aGUgcG9pbnRlciB0byB0aGUgYWN0dWFsIGZsYWcKKyAgICAgKi8KKyAgICB2b2xhdGlsZSBQICogZ2V0KCkgeyByZXR1cm4gbG9jOyB9CisgICAgLyohCisgICAgICogQHBhcmFtIG5ld19sb2MgaW4gICBzZXQgbG9jIHRvIHBvaW50IGF0IG5ld19sb2MKKyAgICAgKi8KKyAgICB2b2lkIHNldCh2b2xhdGlsZSBQICpuZXdfbG9jKSB7IGxvYyA9IG5ld19sb2M7IH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IHRoZSBmbGFnX3R5cGUKKyAgICAgKi8KKyAgICBmbGFnX3R5cGUgZ2V0X3R5cGUoKSB7IHJldHVybiB0OyB9CisgICAgLy8gRGVyaXZlZCBjbGFzc2VzIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nOgorICAgIC8qCisgICAga21wX2luZm9fdCAqIGdldF93YWl0ZXIoa21wX3VpbnQzMiBpKTsKKyAgICBrbXBfdWludDMyIGdldF9udW1fd2FpdGVycygpOworICAgIGJvb2wgZG9uZV9jaGVjaygpOworICAgIGJvb2wgZG9uZV9jaGVja192YWwoUCBvbGRfbG9jKTsKKyAgICBib29sIG5vdGRvbmVfY2hlY2soKTsKKyAgICBQIGludGVybmFsX3JlbGVhc2UoKTsKKyAgICB2b2lkIHN1c3BlbmQoaW50IHRoX2d0aWQpOworICAgIHZvaWQgcmVzdW1lKGludCB0aF9ndGlkKTsKKyAgICBQIHNldF9zbGVlcGluZygpOworICAgIFAgdW5zZXRfc2xlZXBpbmcoKTsKKyAgICBib29sIGlzX3NsZWVwaW5nKCk7CisgICAgYm9vbCBpc19hbnlfc2xlZXBpbmcoKTsKKyAgICBib29sIGlzX3NsZWVwaW5nX3ZhbChQIG9sZF9sb2MpOworICAgIGludCBleGVjdXRlX3Rhc2tzKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwgaW50IGZpbmFsX3NwaW4sIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCk7CisgICAgKi8KK307CisKKyNpZiAhIEtNUF9VU0VfTU9OSVRPUgorIyBpZiBLTVBfT1NfVU5JWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKyAgIC8vIEhXIFRTQyBpcyB1c2VkIHRvIHJlZHVjZSBvdmVyaGVhZCAoY2xvY2sgdGljayBpbnN0ZWFkIG9mIG5hbm9zZWNvbmQpLgorICAgZXh0ZXJuIGRvdWJsZSBfX2ttcF90aWNrc19wZXJfbnNlYzsKKyMgIGRlZmluZSBLTVBfTk9XKCkgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKCkKKyMgIGRlZmluZSBLTVBfQkxPQ0tUSU1FX0lOVEVSVkFMKCkgKF9fa21wX2RmbHRfYmxvY2t0aW1lICogS01QX1VTRUNfUEVSX1NFQyAqIF9fa21wX3RpY2tzX3Blcl9uc2VjKQorIyAgZGVmaW5lIEtNUF9CTE9DS0lORyhnb2FsLCBjb3VudCkgKChnb2FsKSA+IEtNUF9OT1coKSkKKyMgZWxzZQorICAgLy8gU3lzdGVtIHRpbWUgaXMgcmV0cmlldmVkIHNwb3JhZGljYWxseSB3aGlsZSBibG9ja2luZy4KKyAgIGV4dGVybiBrbXBfdWludDY0IF9fa21wX25vd19uc2VjKCk7CisjICBkZWZpbmUgS01QX05PVygpIF9fa21wX25vd19uc2VjKCkKKyMgIGRlZmluZSBLTVBfQkxPQ0tUSU1FX0lOVEVSVkFMKCkgKF9fa21wX2RmbHRfYmxvY2t0aW1lICogS01QX1VTRUNfUEVSX1NFQykKKyMgIGRlZmluZSBLTVBfQkxPQ0tJTkcoZ29hbCwgY291bnQpICgoY291bnQpICUgMTAwMCAhPSAwIHx8IChnb2FsKSA+IEtNUF9OT1coKSkKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTcGluIHdhaXQgbG9vcCB0aGF0IGZpcnN0IGRvZXMgcGF1c2UsIHRoZW4geWllbGQsIHRoZW4gc2xlZXAuIEEgdGhyZWFkIHRoYXQgY2FsbHMgX19rbXBfd2FpdF8qCisgICBtdXN0IG1ha2UgY2VydGFpbiB0aGF0IGFub3RoZXIgdGhyZWFkIGNhbGxzIF9fa21wX3JlbGVhc2UgdG8gd2FrZSBpdCBiYWNrIHVwIHRvIHByZXZlbnQgZGVhZGxvY2tzISAgKi8KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF93YWl0X3RlbXBsYXRlKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBDICpmbGFnLCBpbnQgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgLy8gTk9URTogV2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQuCisgICAgdm9sYXRpbGUgdHlwZW5hbWUgQzo6ZmxhZ190ICpzcGluID0gZmxhZy0+Z2V0KCk7CisgICAga21wX3VpbnQzMiBzcGluczsKKyAgICBrbXBfdWludDMyIGhpYmVybmF0ZTsKKyAgICBpbnQgdGhfZ3RpZDsKKyAgICBpbnQgdGFza3NfY29tcGxldGVkID0gRkFMU0U7CisgICAgaW50IG92ZXJzdWJzY3JpYmVkOworI2lmICEgS01QX1VTRV9NT05JVE9SCisgICAga21wX3VpbnQ2NCBwb2xsX2NvdW50OworICAgIGttcF91aW50NjQgaGliZXJuYXRlX2dvYWw7CisjZW5kaWYKKworICAgIEtNUF9GU1lOQ19TUElOX0lOSVQoc3BpbiwgTlVMTCk7CisgICAgaWYgKGZsYWctPmRvbmVfY2hlY2soKSkgeworICAgICAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRChzcGluKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0aF9ndGlkID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF93YWl0X3NsZWVwOiBUIyVkIHdhaXRpbmcgZm9yIGZsYWcoJXApXG4iLCB0aF9ndGlkLCBmbGFnKSk7CisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgICBzdGF0c19zdGF0ZV9lIHRocmVhZF9zdGF0ZSA9IEtNUF9HRVRfVEhSRUFEX1NUQVRFKCk7CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgb21wdF9zdGF0ZV90IG9tcHRfc3RhdGUgPSB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZTsKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfc3RhdGUgIT0gb21wdF9zdGF0ZV91bmRlZmluZWQpIHsKKyAgICAgICAgaWYgKG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV9pZGxlKSB7CisgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2lkbGVfYmVnaW4pKSB7CisgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2lkbGVfYmVnaW4pKHRoX2d0aWQgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2JlZ2luKSkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfaW1wbGljaXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9leHBsaWNpdCk7CisKKyAgICAgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCogdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50Lm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm87CisgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcElkOworICAgICAgICAgICAgb21wdF90YXNrX2lkX3QgdElkOworICAgICAgICAgICAgaWYgKHRlYW0peworICAgICAgICAgICAgICAgIHBJZCA9IHRlYW0tPm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworICAgICAgICAgICAgICAgIHRJZCA9IHRlYW0tPm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBJZCA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworICAgICAgICAgICAgICAgIHRJZCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2JlZ2luKShwSWQsIHRJZCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8vIFNldHVwIGZvciB3YWl0aW5nCisgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworCisgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgICAgIC8vIFRoZSB3b3JrZXIgdGhyZWFkcyBjYW5ub3QgcmVseSBvbiB0aGUgdGVhbSBzdHJ1Y3QgZXhpc3RpbmcgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgLy8gVXNlIHRoZSBidCB2YWx1ZXMgY2FjaGVkIGluIHRoZSB0aHJlYWQgc3RydWN0IGluc3RlYWQuCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAgICAgaWYgKF9fa21wX3plcm9fYnQgJiYgIXRoaXNfdGhyLT50aC50aF90ZWFtX2J0X3NldCkKKyAgICAgICAgICAgIC8vIEZvcmNlIGltbWVkaWF0ZSBzdXNwZW5kIGlmIG5vdCBzZXQgYnkgdXNlciBhbmQgbW9yZSB0aHJlYWRzIHRoYW4gYXZhaWxhYmxlIHByb2NzCisgICAgICAgICAgICBoaWJlcm5hdGUgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoaWJlcm5hdGUgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHM7CisjZWxzZQorICAgICAgICBoaWJlcm5hdGUgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHM7CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgICAgICAvKiBJZiB0aGUgYmxvY2t0aW1lIGlzIG5vbnplcm8sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc3BpbiB3YWl0IGZvciB0aGUgZW50aXJldHkKKyAgICAgICAgICAgb2YgdGhlIHNwZWNpZmllZCAjaW50ZXJ2YWxzLCBwbHVzIHVwIHRvIG9uZSBpbnRlcnZhbCBtb3JlLiAgVGhpcyBpbmNyZW1lbnQgbWFrZQorICAgICAgICAgICBjZXJ0YWluIHRoYXQgdGhpcyB0aHJlYWQgZG9lc24ndCBnbyB0byBzbGVlcCB0b28gc29vbi4gICovCisgICAgICAgIGlmIChoaWJlcm5hdGUgIT0gMCkKKyAgICAgICAgICAgIGhpYmVybmF0ZSsrOworCisgICAgICAgIC8vIEFkZCBpbiB0aGUgY3VycmVudCB0aW1lIHZhbHVlLgorICAgICAgICBoaWJlcm5hdGUgKz0gVENSXzQoX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUpOworICAgICAgICBLRl9UUkFDRSgyMCwgKCJfX2ttcF93YWl0X3NsZWVwOiBUIyVkIG5vdz0lZCwgaGliZXJuYXRlPSVkLCBpbnRlcnZhbHM9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIGhpYmVybmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBoaWJlcm5hdGUgLSBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSkpOworI2Vsc2UKKyAgICAgICAgaGliZXJuYXRlX2dvYWwgPSBLTVBfTk9XKCkgKyBLTVBfQkxPQ0tUSU1FX0lOVEVSVkFMKCk7CisgICAgICAgIHBvbGxfY291bnQgPSAwOworI2VuZGlmIC8vIEtNUF9VU0VfTU9OSVRPUgorICAgIH0KKworICAgIG92ZXJzdWJzY3JpYmVkID0gKFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBLTVBfTUIoKTsKKworICAgIC8vIE1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSAoZmxhZy0+bm90ZG9uZV9jaGVjaygpKSB7CisgICAgICAgIGludCBpbl9wb29sOworICAgICAgICBrbXBfdGFza190ZWFtX3QgKiB0YXNrX3RlYW0gPSBOVUxMOworICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgIHRhc2tfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW07CisgICAgICAgICAgICAvKiBJZiB0aGUgdGhyZWFkJ3MgdGFzayB0ZWFtIHBvaW50ZXIgaXMgTlVMTCwgaXQgbWVhbnMgb25lIG9mIDMgdGhpbmdzOgorCSAgICAgICAxKSBBIG5ld2x5LWNyZWF0ZWQgdGhyZWFkIGlzIGZpcnN0IGJlaW5nIHJlbGVhc2VkIGJ5IF9fa21wX2ZvcmtfYmFycmllcigpLCBhbmQKKwkgICAgICAgICAgaXRzIHRhc2sgdGVhbSBoYXMgbm90IGJlZW4gc2V0IHVwIHlldC4KKwkgICAgICAgMikgQWxsIHRhc2tzIGhhdmUgYmVlbiBleGVjdXRlZCB0byBjb21wbGV0aW9uLgorCSAgICAgICAzKSBUYXNraW5nIGlzIG9mZiBmb3IgdGhpcyByZWdpb24uICBUaGlzIGNvdWxkIGJlIGJlY2F1c2Ugd2UgYXJlIGluIGEgc2VyaWFsaXplZCByZWdpb24KKwkgICAgICAgICAgKHBlcmhhcHMgdGhlIG91dGVyIG9uZSksIG9yIGVsc2UgdGFza2luZyB3YXMgbWFudWFsbHkgZGlzYWJsZWQgKEtNUF9UQVNLSU5HPTApLiAgKi8KKyAgICAgICAgICAgIGlmICh0YXNrX3RlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChUQ1JfU1lOQ180KHRhc2tfdGVhbS0+dHQudHRfYWN0aXZlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoS01QX1RBU0tJTkdfRU5BQkxFRCh0YXNrX3RlYW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy0+ZXhlY3V0ZV90YXNrcyh0aGlzX3RociwgdGhfZ3RpZCwgZmluYWxfc3BpbiwgJnRhc2tzX2NvbXBsZXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIUtNUF9NQVNURVJfVElEKHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCkpOworICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gaWYKKworICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKHNwaW4pOworICAgICAgICBpZiAoVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgICAgICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpCisgICAgICAgICAgICAgICAgX19rbXBfYWJvcnRfdGhyZWFkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwgb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10aHJvdWdocHV0KSwgdGhlbiB5aWVsZAorICAgICAgICBLTVBfWUlFTEQob3ZlcnN1YnNjcmliZWQpOworICAgICAgICAvLyBUT0RPOiBTaG91bGQgaXQgYmUgbnVtYmVyIG9mIGNvcmVzIGluc3RlYWQgb2YgdGhyZWFkIGNvbnRleHRzPyBMaWtlOgorICAgICAgICAvLyBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX25jb3Jlcyk7CisgICAgICAgIC8vIE5lZWQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZGF0YSB0byBtYWtlIHRoZSBjaGFuZ2UuLi4KKyAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgdGhyZWFkIHdhcyB0cmFuc2ZlcnJlZCBmcm9tIGEgdGVhbQorICAgICAgICAvLyB0byB0aGUgdGhyZWFkIHBvb2wgKG9yIHZpY2UtdmVyc2EpIHdoaWxlIHNwaW5uaW5nLgorICAgICAgICBpbl9wb29sID0gISFUQ1JfNCh0aGlzX3Roci0+dGgudGhfaW5fcG9vbCk7CisgICAgICAgIGlmIChpbl9wb29sICE9ICEhdGhpc190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sKSB7CisgICAgICAgICAgICBpZiAoaW5fcG9vbCkgeyAvLyBSZWNlbnRseSB0cmFuc2ZlcnJlZCBmcm9tIHRlYW0gdG8gcG9vbAorICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoKGttcF9pbnQzMiAqKSZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKTsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBUUlVFOworICAgICAgICAgICAgICAgIC8qIEhlcmUsIHdlIGNhbm5vdCBhc3NlcnQgdGhhdDoKKyAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpIDw9IF9fa21wX3RocmVhZF9wb29sX250aCk7CisgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoIGlzIGluYy9kZWMnZCBieSB0aGUgbWFzdGVyIHRocmVhZCB3aGlsZSB0aGUgZm9yay9qb2luCisgICAgICAgICAgICAgICAgICAgbG9jayBpcyBoZWxkLCB3aGVyZWFzIF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggaXMgaW5jL2RlYydkIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAgICAgICAgICAgYnkgdGhlIHdvcmtlcnMuICBUaGUgdHdvIGNhbiBnZXQgb3V0IG9mIHN5bmMgZm9yIGJyaWVmIHBlcmlvZHMgb2YgdGltZS4gICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgLy8gUmVjZW50bHkgdHJhbnNmZXJyZWQgZnJvbSBwb29sIHRvIHRlYW0KKyAgICAgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCk7CisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAgICAgIC8vIENoZWNrIGlmIHRocmVhZCBoYXMgYmVlbiBzaWduYWxsZWQgdG8gaWRsZSBzdGF0ZQorICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBsb2dpY2FsICJqb2luLWJhcnJpZXIiIGhhcyBmaW5pc2hlZAorICAgICAgICBpZiAodGhpc190aHItPnRoLnRoX3N0YXRzLT5pc0lkbGUoKSAmJiBLTVBfR0VUX1RIUkVBRF9TVEFURSgpID09IEZPUktfSk9JTl9CQVJSSUVSKSB7CisgICAgICAgICAgICBLTVBfU0VUX1RIUkVBRF9TVEFURShJRExFKTsKKyAgICAgICAgICAgIEtNUF9QVVNIX1BBUlRJVElPTkVEX1RJTUVSKE9NUF9pZGxlKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLy8gRG9uJ3Qgc3VzcGVuZCBpZiBLTVBfQkxPQ0tUSU1FIGlzIHNldCB0byAiaW5maW5pdGUiCisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIERvbid0IHN1c3BlbmQgaWYgdGhlcmUgaXMgYSBsaWtlbGlob29kIG9mIG5ldyB0YXNrcyBiZWluZyBzcGF3bmVkLgorICAgICAgICBpZiAoKHRhc2tfdGVhbSAhPSBOVUxMKSAmJiBUQ1JfNCh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Rhc2tzKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgICAgIC8vIElmIHdlIGhhdmUgd2FpdGVkIGEgYml0IG1vcmUsIGZhbGwgYXNsZWVwCisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSkgPCBoaWJlcm5hdGUpCisgICAgICAgICAgICBjb250aW51ZTsKKyNlbHNlCisgICAgICAgIGlmIChLTVBfQkxPQ0tJTkcoaGliZXJuYXRlX2dvYWwsIHBvbGxfY291bnQrKykpCisgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZgorCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIl9fa21wX3dhaXRfc2xlZXA6IFQjJWQgc3VzcGVuZCB0aW1lIHJlYWNoZWRcbiIsIHRoX2d0aWQpKTsKKworICAgICAgICBmbGFnLT5zdXNwZW5kKHRoX2d0aWQpOworCisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IElmIHRocmVhZCBpcyBkb25lIHdpdGggd29yayBhbmQgdGltZXMgb3V0LCBkaXNiYW5kL2ZyZWUKKyAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9zdGF0ZSAhPSBvbXB0X3N0YXRlX3VuZGVmaW5lZCkgeworICAgICAgICBpZiAob21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX2lkbGUpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaWRsZV9lbmQpKSB7CisgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2lkbGVfZW5kKSh0aF9ndGlkICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9lbmQpKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9pbXBsaWNpdCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2V4cGxpY2l0KTsKKworICAgICAgICAgICAgb21wdF9sd190YXNrdGVhbV90KiB0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbzsKKyAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwSWQ7CisgICAgICAgICAgICBvbXB0X3Rhc2tfaWRfdCB0SWQ7CisgICAgICAgICAgICBpZiAodGVhbSl7CisgICAgICAgICAgICAgICAgcElkID0gdGVhbS0+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+ICAgICAgICAvLyBMaW51eCogT1MgYW5kIE9TIFgqOiBhbGxvYygpIGRlY2xhcmVkIGluICJhbGxvY2EiLgorI2Vsc2UKKyAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyNlbmRpZgorCisvKgorICAgIEtNUF9TUkNfTE9DX0RFQ0wgLS0gRGVjbGFyaW5nIHNvdXJjZSBsb2NhdGlvbiBwYXJhbWVtdGVycywgdG8gYmUgdXNlZCBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgICBLTVBfU1JDX0xPQ19QQVJNIC0tIFNvdXJjZSBsb2NhdGlvbiBwYXJhbWVtdGVycywgdG8gYmUgdXNlZCB0byBwYXNzIHBhcmFtZXRlcnMgdG8gdW5kZXJseWluZworICAgICAgICBsZXZlbHMuCisgICAgS01QX1NSQ19MT0NfQ1VSUiAtLSBTb3VyY2UgbG9jYXRpb24gYXJndW1lbnRzIGRlc2NyaWJpbmcgY3VycmVudCBsb2NhdGlvbiwgdG8gYmUgdXNlZCBhdAorICAgICAgICB0b3AtbGV2ZWwuCisKKyAgICBUeXBpY2FsIHVzYWdlOgorCisgICAgICAgIHZvaWQgKiBfYWxpZ25lZF9tYWxsb2MoIGludCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKSB7CisgICAgICAgICAgICAvLyBOb3RlOiBDb21tYSBpcyBtaXNzZWQgYmVmb3JlIEtNUF9TUkNfTE9DX0RFQ0wuCisgICAgICAgICAgICBLRV9UUkFDRSggMjUsICggImNhbGxlZCBmcm9tICVzOiVkXG4iLCBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICAgICAgICAgIC4uLgorICAgICAgICB9CisgICAgICAgICNkZWZpbmUgYWxpZ25lZF9tYWxsb2MoIHNpemUgKSBfYWxpZ25lZF9tYWxsb2MoIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyAgICAgICAgICAgIC8vIFVzZSBtYWNybyBpbnN0ZWFkIG9mIGRpcmVjdCBjYWxsIHRvIGZ1bmN0aW9uIC0tIG1hY3JvIHBhc3NlcyBpbmZvIGFib3V0IGN1cnJlbnQKKyAgICAgICAgICAgIC8vIHNvdXJjZSBsb2NhdGlvbiB0byB0aGUgZnVuYy4KKyovCisjaWYgS01QX0RFQlVHCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19ERUNMICAgICwgY2hhciBjb25zdCAqIF9maWxlXywgaW50IF9saW5lXworICAgICNkZWZpbmUgS01QX1NSQ19MT0NfUEFSTSAgICAsIF9maWxlXywgX2xpbmVfCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19DVVJSICAgICwgX19GSUxFX18sIF9fTElORV9fCisjZWxzZQorICAgICNkZWZpbmUgS01QX1NSQ19MT0NfREVDTAorICAgICNkZWZpbmUgS01QX1NSQ19MT0NfUEFSTQorICAgICNkZWZpbmUgS01QX1NSQ19MT0NfQ1VSUgorI2VuZGlmIC8vIEtNUF9ERUJVRworCisvKgorICAgIG1hbGxvY19zcmNfbG9jKCkgYW5kIGZyZWVfc3JjX2xvYygpIGFyZSBwc2V1ZG8tZnVuY3Rpb25zIChyZWFsbHkgbWFjcm9zKSB3aXRoIGFjY2VwdHMgZXh0cmEKKyAgICBhcmd1bWVudHMgKHNvdXJjZSBsb2NhdGlvbiBpbmZvKSBpbiBkZWJ1ZyBtb2RlLiBUaGV5IHNob3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIG1hbGxvYygpIGFuZAorICAgIGZyZWUoKSwgdGhpcyBhbGxvd3MgZW5hYmxpbmcgbmF0aXZlIG1lbW9yeSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzIChpZiBhbnkpLgorCisgICAgVHlwaWNhbCB1c2FnZToKKworICAgICAgICBwdHIgPSBtYWxsb2Nfc3JjX2xvYyggc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgICAgICAgICAvLyBJbnNpZGUgbWVtb3J5IGFsbG9jYXRpb24gd3JhcHBlciwgb3IKKyAgICAgICAgcHRyID0gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfQ1VSUiApOworICAgICAgICAgICAgLy8gT3V0c2lkZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVyLgorCisKKyovCisjZGVmaW5lIG1hbGxvY19zcmNfbG9jKCBhcmdzICkgICAgX21hbGxvY19zcmNfbG9jKCBhcmdzICkKKyNkZWZpbmUgZnJlZV9zcmNfbG9jKCAgIGFyZ3MgKSAgICBfZnJlZV9zcmNfbG9jKCAgIGFyZ3MgKQorICAgIC8qCisgICAgICAgIERlcGVuZGluZyBvbiBidWlsZCBtb2RlIChkZWJ1ZyBvciByZWxlYXNlKSwgbWFsbG9jX3NyY19sb2MgaXMgZGVjbGFyZWQgd2l0aCAxIG9yIDMKKyAgICAgICAgcGFyYW1ldGVycywgYnV0IGNhbGxzIHRvIG1hbGxvY19zcmNfbG9jKCkgYXJlIGFsd2F5cyB0aGUgc2FtZToKKworICAgICAgICAgICAgLi4uIG1hbGxvY19zcmNfbG9jKCBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsgLy8gb3IgS01QX1NSQ19MT0NfQ1VSUgorCisgICAgICAgIENvbXBpbGVyIGlzc3VlcyB3YXJuaW5nL2Vycm9yICJ0b28gZmV3IGFyZ3VtZW50cyBpbiBtYWNybyBpbnZvY2F0aW9uIi4gRGVjbGFyaW5nIHR3bworICAgICAgICBtYWNyb3NlcywgbWFsbG9jX3NyY19sb2MoKSBhbmQgX21hbGxvY19zcmNfbG9jKCkgb3ZlcmNvbWVzIHRoZSBwcm9ibGVtLgorICAgICovCisKKyNpZiBLTVBfREVCVUcKKworICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBfREVCVUcKKyAgICAgICAgLy8gS01QX0RFQlVHICE9IF9ERUJVRy4gTVMgZGVidWcgUlRMIGlzIGF2YWlsYWJsZSBvbmx5IGlmIF9ERUJVRyBpcyBkZWZpbmVkLgorCisgICAgICAgIC8vIFdpbmRvd3MqIE9TIGhhcyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuIEVuYWJsZSB0aGVtLgorCisgICAgICAgICNpbmNsdWRlIDxjcnRkYmcuaD4KKworICAgICAgICAjZGVmaW5lIEtNUF9NRU1fQkxPQ0sgICAgICAgICAgIF9DTElFTlRfQkxPQ0sKKyAgICAgICAgI2RlZmluZSBtYWxsb2MoIHNpemUgKSAgICAgICAgICBfbWFsbG9jX2RiZyggKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18gKQorICAgICAgICAjZGVmaW5lIGNhbGxvYyggbnVtLCBzaXplICkgICAgIF9jYWxsb2NfZGJnKCAobnVtKSwgKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18gKQorICAgICAgICAjZGVmaW5lIHJlYWxsb2MoIHB0ciwgc2l6ZSApICAgIF9yZWFsbG9jX2RiZyggKHB0ciksIChzaXplKSwgS01QX01FTV9CTE9DSywgX19GSUxFX18sIF9fTElORV9fICkKKyAgICAgICAgI2RlZmluZSBmcmVlKCBwdHIgKSAgICAgICAgICAgICBfZnJlZV9kYmcoIChwdHIpLCBLTVBfTUVNX0JMT0NLICkKKworICAgICAgICAjZGVmaW5lIF9tYWxsb2Nfc3JjX2xvYyggc2l6ZSwgZmlsZSwgbGluZSApICBfbWFsbG9jX2RiZyggKHNpemUpLCBLTVBfTUVNX0JMT0NLLCAoZmlsZSksIChsaW5lKSApCisgICAgICAgICNkZWZpbmUgX2ZyZWVfc3JjX2xvYyggICAgcHRyLCBmaWxlLCBsaW5lICkgIF9mcmVlX2RiZyggICAocHRyKSwgIEtNUF9NRU1fQkxPQ0sgICAgICAgICAgICAgICAgICkKKworICAgICNlbHNlCisKKyAgICAgICAgLy8gTGludXgqIE9TLCBPUyBYKiwgb3Igbm9uLWRlYnVnIFdpbmRvd3MqIE9TLgorCisgICAgICAgICNkZWZpbmUgX21hbGxvY19zcmNfbG9jKCBzaXplLCBmaWxlLCBsaW5lICkgICAgbWFsbG9jKCAoc2l6ZSkgKQorICAgICAgICAjZGVmaW5lIF9mcmVlX3NyY19sb2MoIHB0ciwgZmlsZSwgbGluZSApICAgICAgIGZyZWUoIChwdHIpICkKKworICAgICNlbmRpZgorCisjZWxzZQorCisgICAgLy8gSW4gcmVsZWFzZSBidWlsZCBtYWxsb2Nfc3JjX2xvYygpIGFuZCBmcmVlX3NyY19sb2MoKSBkbyBub3QgaGF2ZSBleHRyYSBwYXJhbWV0ZXJzLgorICAgICNkZWZpbmUgX21hbGxvY19zcmNfbG9jKCBzaXplICkgICAgbWFsbG9jKCAoc2l6ZSkgKQorICAgICNkZWZpbmUgX2ZyZWVfc3JjX2xvYyggcHRyICkgICAgICAgZnJlZSggKHB0cikgKQorCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyNlbmRpZiAvLyBLTVBfV1JBUFBFUl9NQUxMT0NfSAorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2xpYm9tcC5yYy52YXIgYi9yYzMvcnVudGltZS9zcmMvbGlib21wLnJjLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjZhOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2xpYm9tcC5yYy52YXIKQEAgLTAsMCArMSw3MCBAQAorLy8gbGlib21wLnJjLnZhcgorCisvLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vLworLy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8vCisvLy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisjaW5jbHVkZSAid2lucmVzLmgiCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyAgICAvLyBFbmdsaXNoIChVLlMuKSByZXNvdXJjZXMKKyNwcmFnbWEgY29kZV9wYWdlKDEyNTIpCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworICAgIC8vIFBhcnRzIG9mIEZJTEVWRVJTSU9OIGFuZCBQUk9EVUNUVkVSU0lPTiBhcmUgMTYtYml0IGZpZWxkcywgZW50aXJlIGJ1aWxkIGRhdGUgeXl5eW1tZGQKKyAgICAvLyBkb2VzIG5vdCBmaXQgaW50byBvbmUgdmVyc2lvbiBwYXJ0LCBzbyB3ZSBuZWVkIHRvIHNwbGl0IGl0IGludG8geXl5eSBhbmQgbW1kZDoKKyAgICBGSUxFVkVSU0lPTiAgICBATElCT01QX1ZFUlNJT05fTUFKT1JALEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAsQExJQk9NUF9WRVJTSU9OX0JVSUxEX1lFQVJALEBMSUJPTVBfVkVSU0lPTl9CVUlMRF9NT05USF9EQVlACisgICAgUFJPRFVDVFZFUlNJT04gQExJQk9NUF9WRVJTSU9OX01BSk9SQCxATElCT01QX1ZFUlNJT05fTUlOT1JALEBMSUJPTVBfVkVSU0lPTl9CVUlMRF9ZRUFSQCxATElCT01QX1ZFUlNJT05fQlVJTERfTU9OVEhfREFZQAorICAgIEZJTEVGTEFHU01BU0sgIFZTX0ZGSV9GSUxFRkxBR1NNQVNLCisgICAgRklMRUZMQUdTICAgICAgMAorI2lmIEtNUF9ERUJVRworICAgICAgICB8IFZTX0ZGX0RFQlVHCisjZW5kaWYKKyNpZiBATElCT01QX1ZFUlNJT05fQlVJTERAID09IDAKKyAgICAgICAgfCBWU19GRl9QUklWQVRFQlVJTEQgfCBWU19GRl9QUkVSRUxFQVNFCisjZW5kaWYKKyAgICBGSUxFT1MgICAgICAgICAgVk9TX05UX1dJTkRPV1MzMiAgICAvLyBXaW5kb3dzKiBTZXJ2ZXIqIDIwMDMsIFhQKiwgMjAwMCwgb3IgTlQqCisgICAgRklMRVRZUEUgICAgICAgIFZGVF9ETEwKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBCTE9DSyAiMDQwOTA0YjAiICAgICAgICAgICAgLy8gVS5TLiBFbmdsaXNoLCBVbmljb2RlICgweDA0YjAgPT0gMTIwMCkKKyAgICAgICAgICAgIEJFR0lOCisKKyAgICAgICAgICAgICAgICAvLyBGaWxlRGVzY3JpcHRpb24gYW5kIExlZ2FsQ29weXJpZ2h0IHNob3VsZCBiZSBzaG9ydC4KKyAgICAgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgICJMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeVwwIgorICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyB2YWx1ZXMgbWF5IGJlIHJlbGF0aXZlbHkgbG9uZy4KKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAgICAgICJMTFZNXDAiCisgICAgICAgICAgICAgICAgLy8gVkFMVUUgIkxlZ2FsVHJhZGVtYXJrcyIsICAiXDAiICAvLyBOb3QgdXNlZCBmb3Igbm93LgorICAgICAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICAgICAgIkxMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5XDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgICAiQExJQk9NUF9WRVJTSU9OX01BSk9SQC5ATElCT01QX1ZFUlNJT05fTUlOT1JAXDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgICAgICAiQExJQk9NUF9WRVJTSU9OX0JVSUxEQFwwIgorICAgICAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAgICAgIkBMSUJPTVBfTElCX0ZJTEVAXDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiQExJQk9NUF9MSUJfRklMRUBcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAiTExWTSogT3Blbk1QKiBATElCT01QX0xFR0FMX1RZUEVAIExpYnJhcnkgIgorICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiBATElCT01QX1ZFUlNJT05fTUFKT1JALkBMSUJPTVBfVkVSU0lPTl9NSU5PUkAuQExJQk9NUF9WRVJTSU9OX0JVSUxEQCAiCisgICAgICAgICAgICAgICAgICAgICJmb3IgQExJQk9NUF9MRUdBTF9BUkNIQCBhcmNoaXRlY3R1cmUgYnVpbHQgb24gQExJQk9NUF9CVUlMRF9EQVRFQC5cMCIKKyNpZiBATElCT01QX1ZFUlNJT05fQlVJTERAID09IDAKKyAgICAgICAgICAgICAgICAgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhIGRldmVsb3BtZW50IGJ1aWxkLlwwIgorI2VuZGlmCisgICAgICAgICAgICAgICAgLy8gVkFMVUUgIlNwZWNpYWxCdWlsZCIsICAgICAiXDAiICAgIC8vIE5vdCB1c2VkIGZvciBub3cuCisKKyAgICAgICAgICAgIEVORAorICAgICAgICBFTkQKKyAgICAgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMTAzMywgMTIwMAorICAgICAgICAgICAgLy8gMTAzMyAtLSBVLlMuIEVuZ2xpc2gsIDEyMDAgLS0gVW5pY29kZQorICAgICAgICBFTkQKKyAgICBFTkQKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9vbXB0LWV2ZW50LXNwZWNpZmljLmggYi9yYzMvcnVudGltZS9zcmMvb21wdC1ldmVudC1zcGVjaWZpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjEyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvb21wdC1ldmVudC1zcGVjaWZpYy5oCkBAIC0wLDAgKzEsMTUyIEBACisjaWZuZGVmICBfX09NUFRfRVZFTlRfU1BFQ0lGSUNfSF9fCisjZGVmaW5lICBfX09NUFRfRVZFTlRfU1BFQ0lGSUNfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpbGU6IG9tcHQtZXZlbnQtc3BlY2lmaWMuaAorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqICAgc3BlY2lmeSB3aGljaCBvZiB0aGUgT01QVCBldmVudHMgYXJlIGltcGxlbWVudGVkIGJ5IHRoaXMgcnVudGltZSBzeXN0ZW0KKyAqICAgYW5kIHRoZSBsZXZlbCBvZiB0aGVpciBpbXBsZW1lbnRhdGlvbiBieSBhIHJ1bnRpbWUgc3lzdGVtLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9vbXB0X3Rva2VucGFzdGVfaGVscGVyKHgseSkgICAgICAgIHggIyMgeQorI2RlZmluZSBfb21wdF90b2tlbnBhc3RlKHgseSkgICAgICAgICAgICAgICBfb21wdF90b2tlbnBhc3RlX2hlbHBlcih4LHkpCisjZGVmaW5lIG9tcHRfZXZlbnRfaW1wbGVtZW50YXRpb25fc3RhdHVzKGUpIF9vbXB0X3Rva2VucGFzdGUoZSxfaW1wbGVtZW50ZWQpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBTcGVjaWZ5IHdoZXRoZXIgYW4gZXZlbnQgbWF5IG9jY3VyIG9yIG5vdCwgYW5kIHdoZXRoZXIgZXZlbnQgY2FsbGJhY2tzCisgfCBuZXZlciwgc29tZXRpbWVzLCBvciBhbHdheXMgb2NjdXIuCisgfAorIHwgVGhlIHZhbHVlcyBmb3IgdGhlc2UgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4xLjIgb2YKKyB8IHRoZSBPTVBUIFRSLiBUaGV5IGFyZSBleHBvc2VkIHRvIHRvb2xzIHRocm91Z2ggb21wdF9zZXRfY2FsbGJhY2suCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBvbXB0X2V2ZW50X05FVkVSICAgICAgICAgICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMKKyNkZWZpbmUgb21wdF9ldmVudF9VTklNUExFTUVOVEVEICAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX25vX2NhbGxiYWNrCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0NPTlZFTklFTlQgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19zb21lCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0FMV0FZUyAgICAgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMKKworI2lmIE9NUFRfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisjZWxzZQorI2RlZmluZSBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNlbmRpZgorCisjaWYgT01QVF9CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKyNlbHNlCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRSAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgTWFuZGF0b3J5IEV2ZW50cworICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisjZGVmaW5lIG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza19iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKworI2RlZmluZSBvbXB0X2V2ZW50X3RocmVhZF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKyNkZWZpbmUgb21wdF9ldmVudF90aHJlYWRfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKyNkZWZpbmUgb21wdF9ldmVudF9jb250cm9sX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKyNkZWZpbmUgb21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duX2ltcGxlbWVudGVkICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBPcHRpb25hbCBFdmVudHMgKGJsYW1lIHNoaWZ0aW5nKQorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgb21wdF9ldmVudF9pZGxlX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfaWRsZV9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2JlZ2luX2ltcGxlbWVudGVkICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9lbmRfaW1wbGVtZW50ZWQgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKworI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfYmVnaW5faW1wbGVtZW50ZWQgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2VuZF9pbXBsZW1lbnRlZCAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kX2ltcGxlbWVudGVkICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfcmVsZWFzZV9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX2xhc3RfaW1wbGVtZW50ZWQgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX2NyaXRpY2FsX2ltcGxlbWVudGVkICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWNfaW1wbGVtZW50ZWQgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZF9pbXBsZW1lbnRlZCAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzKQorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luX2ltcGxlbWVudGVkICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmRfaW1wbGVtZW50ZWQgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2JlZ2luX2ltcGxlbWVudGVkICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X2luaXRpYWxfdGFza19lbmRfaW1wbGVtZW50ZWQgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKworI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoX2ltcGxlbWVudGVkICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2xvb3BfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9sb29wX2VuZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9zZWN0aW9uc19iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfc2VjdGlvbnNfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luX2ltcGxlbWVudGVkICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19lbmRfaW1wbGVtZW50ZWQgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2JlZ2luX2ltcGxlbWVudGVkICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19lbmRfaW1wbGVtZW50ZWQgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfd29ya3NoYXJlX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3dvcmtzaGFyZV9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKworI2RlZmluZSBvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9tYXN0ZXJfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYmFycmllcl9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF90YXNrZ3JvdXBfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2X2ltcGxlbWVudGVkICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X2NyaXRpY2FsX2ltcGxlbWVudGVkICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9hdG9taWNfaW1wbGVtZW50ZWQgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2tfaW1wbGVtZW50ZWQgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfZmlyc3RfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHRfaW1wbGVtZW50ZWQgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX2NyaXRpY2FsX2ltcGxlbWVudGVkICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF9hY3F1aXJlZF9hdG9taWNfaW1wbGVtZW50ZWQgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYWNxdWlyZWRfb3JkZXJlZF9pbXBsZW1lbnRlZCAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfaW5pdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9ja19pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9ja19pbXBsZW1lbnRlZCAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9mbHVzaF9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNpZiBPTVBfNDBfRU5BQkxFRAorIyBkZWZpbmUgb21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VzX2ltcGxlbWVudGVkICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjIGRlZmluZSBvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZV9wYWlyX2ltcGxlbWVudGVkICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNlbHNlCisjIGRlZmluZSBvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZXNfaW1wbGVtZW50ZWQgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyMgZGVmaW5lIG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlX3BhaXJfaW1wbGVtZW50ZWQgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL29tcHQtZ2VuZXJhbC5jcHAgYi9yYzMvcnVudGltZS9zcmMvb21wdC1nZW5lcmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2MxYzIyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL29tcHQtZ2VuZXJhbC5jcHAKQEAgLTAsMCArMSw1MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3lzdGVtIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvbXB0IGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5jcHAiCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgb21wdF9nZXRfY2FsbGJhY2tfc3VjY2VzcyAxCisjZGVmaW5lIG9tcHRfZ2V0X2NhbGxiYWNrX2ZhaWx1cmUgMAorCisjZGVmaW5lIG5vX3Rvb2xfcHJlc2VudCAwCisKKyNkZWZpbmUgT01QVF9BUElfUk9VVElORSBzdGF0aWMKKworI2lmbmRlZiBPTVBUX1NUUl9NQVRDSAorI2RlZmluZSBPTVBUX1NUUl9NQVRDSChoYXlzdGFjaywgbmVlZGxlKSAoIXN0cmNhc2VjbXAoaGF5c3RhY2ssIG5lZWRsZSkpCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKnN0YXRlX25hbWU7CisgICAgb21wdF9zdGF0ZV90ICBzdGF0ZV9pZDsKK30gb21wdF9zdGF0ZV9pbmZvX3Q7CisKKworZW51bSB0b29sX3NldHRpbmdfZSB7CisgICAgb21wX3Rvb2xfZXJyb3IsCisgICAgb21wX3Rvb2xfdW5zZXQsCisgICAgb21wX3Rvb2xfZGlzYWJsZWQsCisgICAgb21wX3Rvb2xfZW5hYmxlZAorfTsKKworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2luaXRpYWxpemVfdCkgKAorICAgIG9tcHRfZnVuY3Rpb25fbG9va3VwX3Qgb21wdF9mbl9sb29rdXAsCisgICAgY29uc3QgY2hhciAqdmVyc2lvbiwKKyAgICB1bnNpZ25lZCBpbnQgb21wdF92ZXJzaW9uCispOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnbG9iYWwgdmFyaWFibGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG9tcHRfZW5hYmxlZCA9IDA7CisKK29tcHRfc3RhdGVfaW5mb190IG9tcHRfc3RhdGVfaW5mb1tdID0geworI2RlZmluZSBvbXB0X3N0YXRlX21hY3JvKHN0YXRlLCBjb2RlKSB7ICMgc3RhdGUsIHN0YXRlIH0sCisgICAgRk9SRUFDSF9PTVBUX1NUQVRFKG9tcHRfc3RhdGVfbWFjcm8pCisjdW5kZWYgb21wdF9zdGF0ZV9tYWNybworfTsKKworb21wdF9jYWxsYmFja3NfdCBvbXB0X2NhbGxiYWNrczsKKworc3RhdGljIG9tcHRfaW5pdGlhbGl6ZV90ICBvbXB0X2luaXRpYWxpemVfZm4gPSBOVUxMOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBvbXB0X2ludGVyZmFjZV9mbl90IG9tcHRfZm5fbG9va3VwKGNvbnN0IGNoYXIgKnMpOworCitPTVBUX0FQSV9ST1VUSU5FIG9tcHRfdGhyZWFkX2lkX3Qgb21wdF9nZXRfdGhyZWFkX2lkKHZvaWQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiAocHJpdmF0ZSBvcGVyYXRpb25zKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE9uIFVuaXgtbGlrZSBzeXN0ZW1zIHRoYXQgc3VwcG9ydCB3ZWFrIHN5bWJvbHMgdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbgorICogb2Ygb21wdF90b29sKCkgd2lsbCBiZSB1c2VkIGluIGNhc2Ugbm8gdG9vbC1zdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZgorICogdGhpcyBmdW5jdGlvbiBpcyBwcmVzZW50IGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIGEgcHJvY2Vzcy4KKyAqCisgKiBPbiBXaW5kb3dzLCB0aGUgb21wdF90b29sX3dpbmRvd3MgZnVuY3Rpb24gaXMgdXNlZCB0byBmaW5kIHRoZQorICogb21wdF90b29sIHN5bWJvbCBhY3Jvc3MgYWxsIG1vZHVsZXMgbG9hZGVkIGJ5IGEgcHJvY2Vzcy4gSWYgb21wdF90b29sIGlzCisgKiBmb3VuZCwgb21wdF90b29sJ3MgcmV0dXJuIHZhbHVlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdG9vbC4gT3RoZXJ3aXNlLAorICogTlVMTCBpcyByZXR1cm5lZCBhbmQgT01QVCB3b24ndCBiZSBlbmFibGVkICovCisjaWYgT01QVF9IQVZFX1dFQUtfQVRUUklCVVRFCitfT01QX0VYVEVSTgorX19hdHRyaWJ1dGVfXyAoKCB3ZWFrICkpCitvbXB0X2luaXRpYWxpemVfdCBvbXB0X3Rvb2woKQoreworI2lmIE9NUFRfREVCVUcKKyAgICBwcmludGYoIm9tcHRfdG9vbCgpIGlzIGNhbGxlZCBmcm9tIHRoZSBSVExcbiIpOworI2VuZGlmCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNlbGlmIE9NUFRfSEFWRV9QU0FQSQorCisjaW5jbHVkZSA8cHNhcGkuaD4KKyNwcmFnbWEgY29tbWVudChsaWIsICJwc2FwaS5saWIiKQorI2RlZmluZSBvbXB0X3Rvb2wgb21wdF90b29sX3dpbmRvd3MKKworLy8gVGhlIG51bWJlciBvZiBsb2FkZWQgbW9kdWxlcyB0byBzdGFydCBlbnVtZXJhdGlvbiB3aXRoIEVudW1Qcm9jZXNzTW9kdWxlcygpCisjZGVmaW5lIE5VTV9NT0RVTEVTIDEyOAorCitzdGF0aWMKK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbF93aW5kb3dzKCkKK3sKKyAgICBpbnQgaTsKKyAgICBEV09SRCBuZWVkZWQsIG5ld19zaXplOworICAgIEhNT0RVTEUgKm1vZHVsZXM7CisgICAgSEFORExFICBwcm9jZXNzID0gR2V0Q3VycmVudFByb2Nlc3MoKTsKKyAgICBtb2R1bGVzID0gKEhNT0RVTEUqKW1hbGxvYyggTlVNX01PRFVMRVMgKiBzaXplb2YoSE1PRFVMRSkgKTsKKyAgICBvbXB0X2luaXRpYWxpemVfdCAoKm9tcHRfdG9vbF9wKSgpID0gTlVMTDsKKworI2lmIE9NUFRfREVCVUcKKyAgICBwcmludGYoIm9tcHRfdG9vbF93aW5kb3dzKCk6IGxvb2tpbmcgZm9yIG9tcHRfdG9vbFxuIik7CisjZW5kaWYKKyAgICBpZiAoIUVudW1Qcm9jZXNzTW9kdWxlcyggcHJvY2VzcywgbW9kdWxlcywgTlVNX01PRFVMRVMgKiBzaXplb2YoSE1PRFVMRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmVlZGVkKSkgeworICAgICAgICAvLyBSZWdhcmRsZXNzIG9mIHRoZSBlcnJvciByZWFzb24gdXNlIHRoZSBzdHViIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgICAgICAgIGZyZWUobW9kdWxlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvLyBDaGVjayBpZiBOVU1fTU9EVUxFUyBpcyBlbm91Z2ggdG8gbGlzdCBhbGwgbW9kdWxlcworICAgIG5ld19zaXplID0gbmVlZGVkIC8gc2l6ZW9mKEhNT0RVTEUpOworICAgIGlmIChuZXdfc2l6ZSA+IE5VTV9NT0RVTEVTKSB7CisjaWYgT01QVF9ERUJVRworICAgIHByaW50Zigib21wdF90b29sX3dpbmRvd3MoKTogcmVzaXplIGJ1ZmZlciB0byAlZCBieXRlc1xuIiwgbmVlZGVkKTsKKyNlbmRpZgorICAgICAgICBtb2R1bGVzID0gKEhNT0RVTEUqKXJlYWxsb2MoIG1vZHVsZXMsIG5lZWRlZCApOworICAgICAgICAvLyBJZiByZXNpemluZyBmYWlsZWQgdXNlIHRoZSBzdHViIGZ1bmN0aW9uLgorICAgICAgICBpZiAoIUVudW1Qcm9jZXNzTW9kdWxlcyhwcm9jZXNzLCBtb2R1bGVzLCBuZWVkZWQsICZuZWVkZWQpKSB7CisgICAgICAgICAgICBmcmVlKG1vZHVsZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG5ld19zaXplOyArK2kpIHsKKyAgICAgICAgKEZBUlBST0MgJilvbXB0X3Rvb2xfcCA9IEdldFByb2NBZGRyZXNzKG1vZHVsZXNbaV0sICJvbXB0X3Rvb2wiKTsKKyAgICAgICAgaWYgKG9tcHRfdG9vbF9wKSB7CisjaWYgT01QVF9ERUJVRworICAgICAgICAgICAgVENIQVIgbW9kTmFtZVtNQVhfUEFUSF07CisgICAgICAgICAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUobW9kdWxlc1tpXSwgbW9kTmFtZSwgTUFYX1BBVEgpKQorICAgICAgICAgICAgICAgIHByaW50Zigib21wdF90b29sX3dpbmRvd3MoKTogb21wdF90b29sIGZvdW5kIGluIG1vZHVsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbW9kTmFtZSk7CisjZW5kaWYKKyAgICAgICAgICAgIGZyZWUobW9kdWxlcyk7CisgICAgICAgICAgICByZXR1cm4gb21wdF90b29sX3AoKTsKKyAgICAgICAgfQorI2lmIE9NUFRfREVCVUcKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBUQ0hBUiBtb2ROYW1lW01BWF9QQVRIXTsKKyAgICAgICAgICAgIGlmIChHZXRNb2R1bGVGaWxlTmFtZShtb2R1bGVzW2ldLCBtb2ROYW1lLCBNQVhfUEFUSCkpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJvbXB0X3Rvb2xfd2luZG93cygpOiBvbXB0X3Rvb2wgbm90IGZvdW5kIGluIG1vZHVsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbW9kTmFtZSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBmcmVlKG1vZHVsZXMpOworICAgIHJldHVybiBOVUxMOworfQorI2Vsc2UKKyMgZXJyb3IgRWl0aGVyIF9fYXR0cmlidXRlX18oKHdlYWspKSBvciBwc2FwaS5kbGwgYXJlIHJlcXVpcmVkIGZvciBPTVBUIHN1cHBvcnQKKyNlbmRpZiAvLyBPTVBUX0hBVkVfV0VBS19BVFRSSUJVVEUKKwordm9pZCBvbXB0X3ByZV9pbml0KCkKK3sKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRXhlY3V0ZSB0aGUgcHJlLWluaXRpYWxpemF0aW9uIGxvZ2ljIG9ubHkgb25jZS4KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc3RhdGljIGludCBvbXB0X3ByZV9pbml0aWFsaXplZCA9IDA7CisKKyAgICBpZiAob21wdF9wcmVfaW5pdGlhbGl6ZWQpIHJldHVybjsKKworICAgIG9tcHRfcHJlX2luaXRpYWxpemVkID0gMTsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBVc2UgYSB0b29sIGlmZiBhIHRvb2wgaXMgZW5hYmxlZCBhbmQgYXZhaWxhYmxlLgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBjb25zdCBjaGFyICpvbXB0X2Vudl92YXIgPSBnZXRlbnYoIk9NUF9UT09MIik7CisgICAgdG9vbF9zZXR0aW5nX2UgdG9vbF9zZXR0aW5nID0gb21wX3Rvb2xfZXJyb3I7CisKKyAgICBpZiAoIW9tcHRfZW52X3ZhciAgfHwgIXN0cmNtcChvbXB0X2Vudl92YXIsICIiKSkKKyAgICAgICAgdG9vbF9zZXR0aW5nID0gb21wX3Rvb2xfdW5zZXQ7CisgICAgZWxzZSBpZiAoT01QVF9TVFJfTUFUQ0gob21wdF9lbnZfdmFyLCAiZGlzYWJsZWQiKSkKKyAgICAgICAgdG9vbF9zZXR0aW5nID0gb21wX3Rvb2xfZGlzYWJsZWQ7CisgICAgZWxzZSBpZiAoT01QVF9TVFJfTUFUQ0gob21wdF9lbnZfdmFyLCAiZW5hYmxlZCIpKQorICAgICAgICB0b29sX3NldHRpbmcgPSBvbXBfdG9vbF9lbmFibGVkOworCisjaWYgT01QVF9ERUJVRworICAgIHByaW50Zigib21wdF9wcmVfaW5pdCgpOiB0b29sX3NldHRpbmcgPSAlZFxuIiwgdG9vbF9zZXR0aW5nKTsKKyNlbmRpZgorICAgIHN3aXRjaCh0b29sX3NldHRpbmcpIHsKKyAgICBjYXNlIG9tcF90b29sX2Rpc2FibGVkOgorICAgICAgICBicmVhazsKKworICAgIGNhc2Ugb21wX3Rvb2xfdW5zZXQ6CisgICAgY2FzZSBvbXBfdG9vbF9lbmFibGVkOgorICAgICAgICBvbXB0X2luaXRpYWxpemVfZm4gPSBvbXB0X3Rvb2woKTsKKyAgICAgICAgaWYgKG9tcHRfaW5pdGlhbGl6ZV9mbikgeworICAgICAgICAgICAgb21wdF9lbmFibGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2Ugb21wX3Rvb2xfZXJyb3I6CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIldhcm5pbmc6IE9NUF9UT09MIGhhcyBpbnZhbGlkIHZhbHVlIFwiJXNcIi5cbiIKKyAgICAgICAgICAgICIgIGxlZ2FsIHZhbHVlcyBhcmUgKE5VTEwsXCJcIixcImRpc2FibGVkXCIsIgorICAgICAgICAgICAgIlwiZW5hYmxlZFwiKS5cbiIsIG9tcHRfZW52X3Zhcik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNpZiBPTVBUX0RFQlVHCisgICAgcHJpbnRmKCJvbXB0X3ByZV9pbml0KCk6IG9tcHRfZW5hYmxlZCA9ICVkXG4iLCBvbXB0X2VuYWJsZWQpOworI2VuZGlmCit9CisKKwordm9pZCBvbXB0X3Bvc3RfaW5pdCgpCit7CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEV4ZWN1dGUgdGhlIHBvc3QtaW5pdGlhbGl6YXRpb24gbG9naWMgb25seSBvbmNlLgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBzdGF0aWMgaW50IG9tcHRfcG9zdF9pbml0aWFsaXplZCA9IDA7CisKKyAgICBpZiAob21wdF9wb3N0X2luaXRpYWxpemVkKSByZXR1cm47CisKKyAgICBvbXB0X3Bvc3RfaW5pdGlhbGl6ZWQgPSAxOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEluaXRpYWxpemUgdGhlIHRvb2wgaWYgc28gaW5kaWNhdGVkLgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIG9tcHRfaW5pdGlhbGl6ZV9mbihvbXB0X2ZuX2xvb2t1cCwgb21wdF9nZXRfcnVudGltZV92ZXJzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBUX1ZFUlNJT04pOworCisgICAgICAgIG9tcHRfdGhyZWFkX3QgKnJvb3RfdGhyZWFkID0gb21wdF9nZXRfdGhyZWFkKCk7CisKKyAgICAgICAgb21wdF9zZXRfdGhyZWFkX3N0YXRlKHJvb3RfdGhyZWFkLCBvbXB0X3N0YXRlX292ZXJoZWFkKTsKKworICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfYmVnaW4pCisgICAgICAgICAgICAgICAgKG9tcHRfdGhyZWFkX2luaXRpYWwsIG9tcHRfZ2V0X3RocmVhZF9pZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG9tcHRfc2V0X3RocmVhZF9zdGF0ZShyb290X3RocmVhZCwgb21wdF9zdGF0ZV93b3JrX3NlcmlhbCk7CisgICAgfQorfQorCisKK3ZvaWQgb21wdF9maW5pKCkKK3sKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcnVudGltZV9zaHV0ZG93bikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duKSgpOworICAgICAgICB9CisgICAgfQorCisgICAgb21wdF9lbmFibGVkID0gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGludGVyZmFjZSBvcGVyYXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzdGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX1JPVVRJTkUgaW50IG9tcHRfZW51bWVyYXRlX3N0YXRlKGludCBjdXJyZW50X3N0YXRlLCBpbnQgKm5leHRfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dF9zdGF0ZV9uYW1lKQoreworICAgIGNvbnN0IHN0YXRpYyBpbnQgbGVuID0gc2l6ZW9mKG9tcHRfc3RhdGVfaW5mbykgLyBzaXplb2Yob21wdF9zdGF0ZV9pbmZvX3QpOworICAgIGludCBpID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspIHsKKyAgICAgICAgaWYgKG9tcHRfc3RhdGVfaW5mb1tpXS5zdGF0ZV9pZCA9PSBjdXJyZW50X3N0YXRlKSB7CisgICAgICAgICAgICAqbmV4dF9zdGF0ZSA9IG9tcHRfc3RhdGVfaW5mb1tpKzFdLnN0YXRlX2lkOworICAgICAgICAgICAgKm5leHRfc3RhdGVfbmFtZSA9IG9tcHRfc3RhdGVfaW5mb1tpKzFdLnN0YXRlX25hbWU7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYWxsYmFja3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X3NldF9jYWxsYmFjayhvbXB0X2V2ZW50X3QgZXZpZCwgb21wdF9jYWxsYmFja190IGNiKQoreworICAgIHN3aXRjaCAoZXZpZCkgeworCisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnRfbmFtZSwgY2FsbGJhY2tfdHlwZSwgZXZlbnRfaWQpICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgZXZlbnRfbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9tcHRfZXZlbnRfaW1wbGVtZW50YXRpb25fc3RhdHVzKGV2ZW50X25hbWUpKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKGV2ZW50X25hbWUpID0gKGNhbGxiYWNrX3R5cGUpIGNiOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIG9tcHRfZXZlbnRfaW1wbGVtZW50YXRpb25fc3RhdHVzKGV2ZW50X25hbWUpOworCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCisKKyAgICBkZWZhdWx0OiByZXR1cm4gb21wdF9zZXRfcmVzdWx0X3JlZ2lzdHJhdGlvbl9lcnJvcjsKKyAgICB9Cit9CisKKworT01QVF9BUElfUk9VVElORSBpbnQgb21wdF9nZXRfY2FsbGJhY2sob21wdF9ldmVudF90IGV2aWQsIG9tcHRfY2FsbGJhY2tfdCAqY2IpCit7CisgICAgc3dpdGNoIChldmlkKSB7CisKKyNkZWZpbmUgb21wdF9ldmVudF9tYWNybyhldmVudF9uYW1lLCBjYWxsYmFja190eXBlLCBldmVudF9pZCkgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBldmVudF9uYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob21wdF9ldmVudF9pbXBsZW1lbnRhdGlvbl9zdGF0dXMoZXZlbnRfbmFtZSkpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCBteWNiID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKG9tcHRfY2FsbGJhY2tfdCkgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhldmVudF9uYW1lKTsgICAgXAorICAgICAgICAgICAgaWYgKG15Y2IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqY2IgPSBteWNiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIG9tcHRfZ2V0X2NhbGxiYWNrX3N1Y2Nlc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbXB0X2dldF9jYWxsYmFja19mYWlsdXJlOworCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCisKKyAgICBkZWZhdWx0OiByZXR1cm4gb21wdF9nZXRfY2FsbGJhY2tfZmFpbHVyZTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYXJhbGxlbCByZWdpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfUk9VVElORSBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9nZXRfcGFyYWxsZWxfaWQoaW50IGFuY2VzdG9yX2xldmVsKQoreworICAgIHJldHVybiBfX29tcHRfZ2V0X3BhcmFsbGVsX2lkX2ludGVybmFsKGFuY2VzdG9yX2xldmVsKTsKK30KKworCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUoaW50IGFuY2VzdG9yX2xldmVsKQoreworICAgIHJldHVybiBfX29tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZV9pbnRlcm5hbChhbmNlc3Rvcl9sZXZlbCk7Cit9CisKKworT01QVF9BUElfUk9VVElORSB2b2lkICpvbXB0X2dldF9wYXJhbGxlbF9mdW5jdGlvbihpbnQgYW5jZXN0b3JfbGV2ZWwpCit7CisgICAgcmV0dXJuIF9fb21wdF9nZXRfcGFyYWxsZWxfZnVuY3Rpb25faW50ZXJuYWwoYW5jZXN0b3JfbGV2ZWwpOworfQorCisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF9zdGF0ZV90IG9tcHRfZ2V0X3N0YXRlKG9tcHRfd2FpdF9pZF90ICpvbXB0X3dhaXRfaWQpCit7CisgICAgb21wdF9zdGF0ZV90IHRocmVhZF9zdGF0ZSA9IF9fb21wdF9nZXRfc3RhdGVfaW50ZXJuYWwob21wdF93YWl0X2lkKTsKKworICAgIGlmICh0aHJlYWRfc3RhdGUgPT0gb21wdF9zdGF0ZV91bmRlZmluZWQpIHsKKyAgICAgICAgdGhyZWFkX3N0YXRlID0gb21wdF9zdGF0ZV93b3JrX3NlcmlhbDsKKyAgICB9CisKKyAgICByZXR1cm4gdGhyZWFkX3N0YXRlOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0aHJlYWRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitPTVBUX0FQSV9ST1VUSU5FIHZvaWQgKm9tcHRfZ2V0X2lkbGVfZnJhbWUoKQoreworICAgIHJldHVybiBfX29tcHRfZ2V0X2lkbGVfZnJhbWVfaW50ZXJuYWwoKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdGFza3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF90aHJlYWRfaWRfdCBvbXB0X2dldF90aHJlYWRfaWQodm9pZCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF90aHJlYWRfaWRfaW50ZXJuYWwoKTsKK30KKworT01QVF9BUElfUk9VVElORSBvbXB0X3Rhc2tfaWRfdCBvbXB0X2dldF90YXNrX2lkKGludCBkZXB0aCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF90YXNrX2lkX2ludGVybmFsKGRlcHRoKTsKK30KKworCitPTVBUX0FQSV9ST1VUSU5FIG9tcHRfZnJhbWVfdCAqb21wdF9nZXRfdGFza19mcmFtZShpbnQgZGVwdGgpCit7CisgICAgcmV0dXJuIF9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbChkZXB0aCk7Cit9CisKKworT01QVF9BUElfUk9VVElORSB2b2lkICpvbXB0X2dldF90YXNrX2Z1bmN0aW9uKGludCBkZXB0aCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF90YXNrX2Z1bmN0aW9uX2ludGVybmFsKGRlcHRoKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBsYWNlaG9sZGVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIERvbid0IGRlZmluZSB0aGlzIGFzIHN0YXRpYy4gVGhlIGxvYWRlciBtYXkgY2hvb3NlIHRvIGVsaW1pbmF0ZSB0aGUgc3ltYm9sCisvLyBldmVuIHRob3VnaCBpdCBpcyBuZWVkZWQgYnkgdG9vbHMuCisjZGVmaW5lIE9NUFRfQVBJX1BMQUNFSE9MREVSCisKKy8vIEVuc3VyZSB0aGF0IHBsYWNlaG9sZGVycyBkb24ndCBoYXZlIG1hbmdsZWQgbmFtZXMgaW4gdGhlIHN5bWJvbCB0YWJsZS4KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitPTVBUX0FQSV9QTEFDRUhPTERFUiB2b2lkIG9tcHRfaWRsZSh2b2lkKQoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwbGFjZWhvbGRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY2FsbGluZyBjb250ZXh0IG9mCisgICAgLy8gaWRsZSBPcGVuTVAgd29ya2VyIHRocmVhZHMuIEl0IGlzIG5vdCBtZWFudCB0byBiZSBpbnZva2VkLgorICAgIGFzc2VydCgwKTsKK30KKworCitPTVBUX0FQSV9QTEFDRUhPTERFUiB2b2lkIG9tcHRfb3ZlcmhlYWQodm9pZCkKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgcGxhY2Vob2xkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIE9wZW5NUCBjb250ZXh0IG9mCisgICAgLy8gdGhyZWFkcyB3b3JraW5nIGluIHRoZSBPcGVuTVAgcnVudGltZS4gIEl0IGlzIG5vdCBtZWFudCB0byBiZSBpbnZva2VkLgorICAgIGFzc2VydCgwKTsKK30KKworCitPTVBUX0FQSV9QTEFDRUhPTERFUiB2b2lkIG9tcHRfYmFycmllcl93YWl0KHZvaWQpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHBsYWNlaG9sZGVyIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBPcGVuTVAgY29udGV4dCBvZgorICAgIC8vIHRocmVhZHMgd2FpdGluZyBmb3IgYSBiYXJyaWVyIGluIHRoZSBPcGVuTVAgcnVudGltZS4gSXQgaXMgbm90IG1lYW50CisgICAgLy8gdG8gYmUgaW52b2tlZC4KKyAgICBhc3NlcnQoMCk7Cit9CisKKworT01QVF9BUElfUExBQ0VIT0xERVIgdm9pZCBvbXB0X3Rhc2tfd2FpdCh2b2lkKQoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwbGFjZWhvbGRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgT3Blbk1QIGNvbnRleHQgb2YKKyAgICAvLyB0aHJlYWRzIHdhaXRpbmcgZm9yIGEgdGFzayBpbiB0aGUgT3Blbk1QIHJ1bnRpbWUuIEl0IGlzIG5vdCBtZWFudAorICAgIC8vIHRvIGJlIGludm9rZWQuCisgICAgYXNzZXJ0KDApOworfQorCisKK09NUFRfQVBJX1BMQUNFSE9MREVSIHZvaWQgb21wdF9tdXRleF93YWl0KHZvaWQpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHBsYWNlaG9sZGVyIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBPcGVuTVAgY29udGV4dCBvZgorICAgIC8vIHRocmVhZHMgd2FpdGluZyBmb3IgYSBtdXRleCBpbiB0aGUgT3Blbk1QIHJ1bnRpbWUuIEl0IGlzIG5vdCBtZWFudAorICAgIC8vIHRvIGJlIGludm9rZWQuCisgICAgYXNzZXJ0KDApOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNvbXBhdGFiaWxpdHkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X2dldF9vbXB0X3ZlcnNpb24oKQoreworICAgIHJldHVybiBPTVBUX1ZFUlNJT047Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGFwcGxpY2F0aW9uLWZhY2luZyBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgY29udHJvbAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19PTVBfRVhURVJOIHZvaWQgb21wdF9jb250cm9sKHVpbnQ2NF90IGNvbW1hbmQsIHVpbnQ2NF90IG1vZGlmaWVyKQoreworICAgIGlmIChvbXB0X2VuYWJsZWQgJiYgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2NvbnRyb2wpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9jb250cm9sKShjb21tYW5kLCBtb2RpZmllcik7CisgICAgfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBUEkgaW5xdWlyeSBmb3IgdG9vbAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBvbXB0X2ludGVyZmFjZV9mbl90IG9tcHRfZm5fbG9va3VwKGNvbnN0IGNoYXIgKnMpCit7CisKKyNkZWZpbmUgb21wdF9pbnRlcmZhY2VfZm4oZm4pIFwKKyAgICBpZiAoc3RyY21wKHMsICNmbikgPT0gMCkgcmV0dXJuIChvbXB0X2ludGVyZmFjZV9mbl90KSBmbjsKKworICAgIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG9tcHRfaW50ZXJmYWNlX2ZuKQorCisgICAgRk9SRUFDSF9PTVBUX1BMQUNFSE9MREVSX0ZOKG9tcHRfaW50ZXJmYWNlX2ZuKQorCisgICAgcmV0dXJuIChvbXB0X2ludGVyZmFjZV9mbl90KSAwOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL29tcHQtaW50ZXJuYWwuaCBiL3JjMy9ydW50aW1lL3NyYy9vbXB0LWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkYTlkOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9vbXB0LWludGVybmFsLmgKQEAgLTAsMCArMSw5MyBAQAorI2lmbmRlZiBfX09NUFRfSU5URVJOQUxfSF9fCisjZGVmaW5lIF9fT01QVF9JTlRFUk5BTF9IX18KKworI2luY2x1ZGUgIm9tcHQuaCIKKyNpbmNsdWRlICJvbXB0LWV2ZW50LXNwZWNpZmljLmgiCisKKyNkZWZpbmUgT01QVF9WRVJTSU9OIDEKKworI2RlZmluZSBfT01QX0VYVEVSTiBleHRlcm4gIkMiCisKKyNkZWZpbmUgT01QVF9JTlZPS0VSKHgpIFwKKyAgKCh4ID09IGZvcmtfY29udGV4dF9nbnUpID8gb21wdF9pbnZva2VyX3Byb2dyYW0gOiBvbXB0X2ludm9rZXJfcnVudGltZSkKKworCisjZGVmaW5lIG9tcHRfY2FsbGJhY2soZSkgZSAjIyBfY2FsbGJhY2sKKworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2NhbGxiYWNrc19zIHsKKyNkZWZpbmUgb21wdF9ldmVudF9tYWNybyhldmVudCwgY2FsbGJhY2ssIGV2ZW50aWQpIGNhbGxiYWNrIG9tcHRfY2FsbGJhY2soZXZlbnQpOworCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCit9IG9tcHRfY2FsbGJhY2tzX3Q7CisKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgb21wdF9mcmFtZV90ICAgICAgICAgICAgZnJhbWU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgZnVuY3Rpb247CisgICAgb21wdF90YXNrX2lkX3QgICAgICAgICAgdGFza19pZDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGludCAgICAgICAgICAgICAgICAgICAgIG5kZXBzOworICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3QgICpkZXBzOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCit9IG9tcHRfdGFza19pbmZvX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCAgcGFyYWxsZWxfaWQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqbWljcm90YXNrOworfSBvbXB0X3RlYW1faW5mb190OworCisKK3R5cGVkZWYgc3RydWN0IG9tcHRfbHdfdGFza3RlYW1fcyB7CisgICAgb21wdF90ZWFtX2luZm9fdCAgICBvbXB0X3RlYW1faW5mbzsKKyAgICBvbXB0X3Rhc2tfaW5mb190ICAgIG9tcHRfdGFza19pbmZvOworICAgIHN0cnVjdCBvbXB0X2x3X3Rhc2t0ZWFtX3MgKnBhcmVudDsKK30gb21wdF9sd190YXNrdGVhbV90OworCisKK3R5cGVkZWYgc3RydWN0IG9tcHRfcGFyYWxsZWxfaW5mb19zIHsKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZDsgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZDsgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZTsgIC8qIGZyYW1lIGRhdGEgb2YgcGFyZW50IHRhc2sgICAgKi8KKyAgICB2b2lkICpwYXJhbGxlbF9mdW5jdGlvbjsgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworfSBvbXB0X3BhcmFsbGVsX2luZm9fdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgb21wdF9zdGF0ZV90ICAgICAgICBzdGF0ZTsKKyAgICBvbXB0X3dhaXRfaWRfdCAgICAgIHdhaXRfaWQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqaWRsZV9mcmFtZTsKK30gb21wdF90aHJlYWRfaW5mb190OworCisKK2V4dGVybiBvbXB0X2NhbGxiYWNrc190IG9tcHRfY2FsbGJhY2tzOworCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyMgIGRlZmluZSBLTVBfT01QVF9ERVBTX0FMTE9DIF9fa21wX2Zhc3RfYWxsb2NhdGUKKyMgIGRlZmluZSBLTVBfT01QVF9ERVBTX0ZSRUUgX19rbXBfZmFzdF9mcmVlCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfT01QVF9ERVBTX0FMTE9DIF9fa21wX3RocmVhZF9tYWxsb2MKKyMgIGRlZmluZSBLTVBfT01QVF9ERVBTX0ZSRUUgX19rbXBfdGhyZWFkX2ZyZWUKKyMgZW5kaWYKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAmJiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3ZvaWQgb21wdF9wcmVfaW5pdCh2b2lkKTsKK3ZvaWQgb21wdF9wb3N0X2luaXQodm9pZCk7Cit2b2lkIG9tcHRfZmluaSh2b2lkKTsKKworZXh0ZXJuIGludCBvbXB0X2VuYWJsZWQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9vbXB0LXNwZWNpZmljLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9vbXB0LXNwZWNpZmljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTk2MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL29tcHQtc3BlY2lmaWMuY3BwCkBAIC0wLDAgKzEsMzM3IEBACisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gaW5jbHVkZSBmaWxlcworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgIm9tcHQtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBtYWNyb3MKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyNkZWZpbmUgR1RJRF9UT19PTVBUX1RIUkVBRF9JRChpZCkgKChvbXB0X3RocmVhZF9pZF90KSAoaWQgPj0wKSA/IGlkICsgMTogMCkKKworI2RlZmluZSBMV1RfRlJPTV9URUFNKHRlYW0pICh0ZWFtKS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworCisjZGVmaW5lIE9NUFRfVEhSRUFEX0lEX0JJVFMgMTYKKworLy8gMjAxMyAwOCAyNCAtIEpvaG4gTWVsbG9yLUNydW1tZXkKKy8vICAgaWRlYWxseSwgYSB0aHJlYWQgc2hvdWxkIGFzc2lnbiBpdHMgb3duIGlkcyBiYXNlZCBvbiB0aHJlYWQgcHJpdmF0ZSBkYXRhLgorLy8gICBob3dldmVyLCB0aGUgd2F5IHRoZSBpbnRlbCBydW50aW1lIHJlaW5pdGlhbGl6ZXMgdGhyZWFkIGRhdGEgc3RydWN0dXJlcworLy8gICB3aGVuIGl0IGNyZWF0ZXMgdGVhbXMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIG1haW50YWluIHBlcnNpc3RlbnQgdGhyZWFkCisvLyAgIGRhdGEuIHVzaW5nIGEgc2hhcmVkIHZhcmlhYmxlIGluc3RlYWQgaXMgc2ltcGxlLiBJIGxlYXZlIGl0IHRvIGludGVsIHRvCisvLyAgIHNvcnQgb3V0IGhvdyB0byBpbXBsZW1lbnQgYSBoaWdoZXIgcGVyZm9ybWFuY2UgdmVyc2lvbiBpbiB0aGVpciBydW50aW1lLgorCisvLyB3aGVuIHVzaW5nIGZldGNoX2FuZF9hZGQgdG8gZ2VuZXJhdGUgdGhlIElEcywgdGhlcmUgaXNuJ3QgYW55IHJlYXNvbiB0byB3YXN0ZQorLy8gYml0cyBmb3IgdGhyZWFkIGlkLgorI2lmIDAKKyNkZWZpbmUgTkVYVF9JRChpZF9wdHIsdGlkKSBcCisgICgoS01QX1RFU1RfVEhFTl9JTkM2NChpZF9wdHIpIDw8IE9NUFRfVEhSRUFEX0lEX0JJVFMpIHwgKHRpZCkpCisjZWxzZQorI2RlZmluZSBORVhUX0lEKGlkX3B0cix0aWQpIChLTVBfVEVTVF9USEVOX0lOQzY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKilpZF9wdHIpKQorI2VuZGlmCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBwcml2YXRlIG9wZXJhdGlvbnMKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHJhdmVyc2UgdGhlIHRlYW0gYW5kIHRhc2sgaGllcmFyY2h5CisvLyBub3RlOiBfX29tcHRfZ2V0X3RlYW1pbmZvIGFuZCBfX29tcHRfZ2V0X3Rhc2tpbmZvCisvLyAgICAgICB0cmF2ZXJzZSB0aGUgaGllcmFyY2h5IHNpbWlsYXJseSBhbmQgbmVlZCB0byBiZQorLy8gICAgICAga2VwdCBjb25zaXN0ZW50CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworb21wdF90ZWFtX2luZm9fdCAqCitfX29tcHRfZ2V0X3RlYW1pbmZvKGludCBkZXB0aCwgaW50ICpzaXplKQoreworICAgIGttcF9pbmZvX3QgKnRociA9IG9tcHRfZ2V0X3RocmVhZCgpOworCisgICAgaWYgKHRocikgeworICAgICAgICBrbXBfdGVhbSAqdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKyAgICAgICAgaWYgKHRlYW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgb21wdF9sd190YXNrdGVhbV90ICpsd3QgPSBMV1RfRlJPTV9URUFNKHRlYW0pOworCisgICAgICAgIHdoaWxlKGRlcHRoID4gMCkgeworICAgICAgICAgICAgLy8gbmV4dCBsaWdodHdlaWdodCB0ZWFtIChpZiBhbnkpCisgICAgICAgICAgICBpZiAobHd0KSBsd3QgPSBsd3QtPnBhcmVudDsKKworICAgICAgICAgICAgLy8gbmV4dCBoZWF2eXdlaWdodCB0ZWFtIChpZiBhbnkpIGFmdGVyCisgICAgICAgICAgICAvLyBsaWdodHdlaWdodCB0ZWFtcyBhcmUgZXhoYXVzdGVkCisgICAgICAgICAgICBpZiAoIWx3dCAmJiB0ZWFtKSB7CisgICAgICAgICAgICAgICAgdGVhbT10ZWFtLT50LnRfcGFyZW50OworICAgICAgICAgICAgICAgIGlmICh0ZWFtKSB7CisgICAgICAgICAgICAgICAgICAgIGx3dCA9IExXVF9GUk9NX1RFQU0odGVhbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXB0aC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGx3dCkgeworICAgICAgICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgaGF2ZSBvbmUgdGFzaworICAgICAgICAgICAgaWYgKHNpemUpICpzaXplID0gMTsKKworICAgICAgICAgICAgLy8gcmV0dXJuIHRlYW0gaW5mbyBmb3IgbGlnaHR3ZWlnaHQgdGVhbQorICAgICAgICAgICAgcmV0dXJuICZsd3QtPm9tcHRfdGVhbV9pbmZvOworICAgICAgICB9IGVsc2UgaWYgKHRlYW0pIHsKKyAgICAgICAgICAgIC8vIGV4dHJhY3Qgc2l6ZSBmcm9tIGhlYXZ5d2VpZ2h0IHRlYW0KKyAgICAgICAgICAgIGlmIChzaXplKSAqc2l6ZSA9IHRlYW0tPnQudF9ucHJvYzsKKworICAgICAgICAgICAgLy8gcmV0dXJuIHRlYW0gaW5mbyBmb3IgaGVhdnl3ZWlnaHQgdGVhbQorICAgICAgICAgICAgcmV0dXJuICZ0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworb21wdF90YXNrX2luZm9fdCAqCitfX29tcHRfZ2V0X3Rhc2tpbmZvKGludCBkZXB0aCkKK3sKKyAgICBvbXB0X3Rhc2tfaW5mb190ICppbmZvID0gTlVMTDsKKyAgICBrbXBfaW5mb190ICp0aHIgPSBvbXB0X2dldF90aHJlYWQoKTsKKworICAgIGlmICh0aHIpIHsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgICp0YXNrZGF0YSA9IHRoci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IExXVF9GUk9NX1RFQU0odGFza2RhdGEtPnRkX3RlYW0pOworCisgICAgICAgIHdoaWxlIChkZXB0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIG5leHQgbGlnaHR3ZWlnaHQgdGVhbSAoaWYgYW55KQorICAgICAgICAgICAgaWYgKGx3dCkgbHd0ID0gbHd0LT5wYXJlbnQ7CisKKyAgICAgICAgICAgIC8vIG5leHQgaGVhdnl3ZWlnaHQgdGVhbSAoaWYgYW55KSBhZnRlcgorICAgICAgICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgYXJlIGV4aGF1c3RlZAorICAgICAgICAgICAgaWYgKCFsd3QgJiYgdGFza2RhdGEpIHsKKyAgICAgICAgICAgICAgICB0YXNrZGF0YSA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHRhc2tkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGx3dCA9IExXVF9GUk9NX1RFQU0odGFza2RhdGEtPnRkX3RlYW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcHRoLS07CisgICAgICAgIH0KKworICAgICAgICBpZiAobHd0KSB7CisgICAgICAgICAgICBpbmZvID0gJmx3dC0+b21wdF90YXNrX2luZm87CisgICAgICAgIH0gZWxzZSBpZiAodGFza2RhdGEpIHsKKyAgICAgICAgICAgIGluZm8gPSAmdGFza2RhdGEtPm9tcHRfdGFza19pbmZvOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGluZm87Cit9CisKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gaW50ZXJmYWNlIG9wZXJhdGlvbnMKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGhyZWFkIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvbXB0X3BhcmFsbGVsX2lkX3QKK19fb21wdF90aHJlYWRfaWRfbmV3KCkKK3sKKyAgICBzdGF0aWMgdWludDY0X3Qgb21wdF90aHJlYWRfaWQgPSAxOworICAgIHJldHVybiBORVhUX0lEKCZvbXB0X3RocmVhZF9pZCwgMCk7Cit9CisKK3ZvaWQKK19fb21wdF90aHJlYWRfYmVnaW4ob21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCBpbnQgZ3RpZCkKK3sKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luKSgKKyAgICAgICAgdGhyZWFkX3R5cGUsIEdUSURfVE9fT01QVF9USFJFQURfSUQoZ3RpZCkpOworfQorCisKK3ZvaWQKK19fb21wdF90aHJlYWRfZW5kKG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgaW50IGd0aWQpCit7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9lbmQpKAorICAgICAgICB0aHJlYWRfdHlwZSwgR1RJRF9UT19PTVBUX1RIUkVBRF9JRChndGlkKSk7Cit9CisKKworb21wdF90aHJlYWRfaWRfdAorX19vbXB0X2dldF90aHJlYWRfaWRfaW50ZXJuYWwoKQoreworICAgIC8vIEZJWE1FCisgICAgLy8gdW50aWwgd2UgaGF2ZSBhIGJldHRlciB3YXkgb2YgYXNzaWduaW5nIGlkcywgdXNlIF9fa21wX2dldF9ndGlkCisgICAgLy8gc2luY2UgdGhlIHJldHVybiB2YWx1ZSBtaWdodCBiZSBuZWdhdGl2ZSwgd2UgbmVlZCB0byB0ZXN0IHRoYXQgYmVmb3JlCisgICAgLy8gYXNzaWduaW5nIGl0IHRvIGFuIG9tcHRfdGhyZWFkX2lkX3QsIHdoaWNoIGlzIHVuc2lnbmVkLgorICAgIGludCBpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgYXNzZXJ0KGlkID49IDApOworCisgICAgcmV0dXJuIEdUSURfVE9fT01QVF9USFJFQURfSUQoaWQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0YXRlIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX29tcHRfdGhyZWFkX2Fzc2lnbl93YWl0X2lkKHZvaWQgKnZhcmlhYmxlKQoreworICAgIGludCBndGlkID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICBrbXBfaW5mb190ICp0aSA9IG9tcHRfZ2V0X3RocmVhZF9ndGlkKGd0aWQpOworCisgICAgdGktPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IChvbXB0X3dhaXRfaWRfdCkgdmFyaWFibGU7Cit9CisKK29tcHRfc3RhdGVfdAorX19vbXB0X2dldF9zdGF0ZV9pbnRlcm5hbChvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkKQoreworICAgIGttcF9pbmZvX3QgKnRpID0gb21wdF9nZXRfdGhyZWFkKCk7CisKKyAgICBpZiAodGkpIHsKKyAgICAgICAgaWYgKG9tcHRfd2FpdF9pZCkKKyAgICAgICAgICAgICpvbXB0X3dhaXRfaWQgPSB0aS0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkOworICAgICAgICByZXR1cm4gdGktPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgfQorICAgIHJldHVybiBvbXB0X3N0YXRlX3VuZGVmaW5lZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpZGxlIGZyYW1lIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkICoKK19fb21wdF9nZXRfaWRsZV9mcmFtZV9pbnRlcm5hbCh2b2lkKQoreworICAgIGttcF9pbmZvX3QgKnRpID0gb21wdF9nZXRfdGhyZWFkKCk7CisgICAgcmV0dXJuIHRpID8gdGktPnRoLm9tcHRfdGhyZWFkX2luZm8uaWRsZV9mcmFtZSA6IE5VTEw7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwYXJhbGxlbCByZWdpb24gc3VwcG9ydAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29tcHRfcGFyYWxsZWxfaWRfdAorX19vbXB0X3BhcmFsbGVsX2lkX25ldyhpbnQgZ3RpZCkKK3sKKyAgICBzdGF0aWMgdWludDY0X3Qgb21wdF9wYXJhbGxlbF9pZCA9IDE7CisgICAgcmV0dXJuIGd0aWQgPj0gMCA/IE5FWFRfSUQoJm9tcHRfcGFyYWxsZWxfaWQsIGd0aWQpIDogMDsKK30KKworCit2b2lkICoKK19fb21wdF9nZXRfcGFyYWxsZWxfZnVuY3Rpb25faW50ZXJuYWwoaW50IGRlcHRoKQoreworICAgIG9tcHRfdGVhbV9pbmZvX3QgKmluZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKGRlcHRoLCBOVUxMKTsKKyAgICB2b2lkICpmdW5jdGlvbiA9IGluZm8gPyBpbmZvLT5taWNyb3Rhc2sgOiBOVUxMOworICAgIHJldHVybiBmdW5jdGlvbjsKK30KKworCitvbXB0X3BhcmFsbGVsX2lkX3QKK19fb21wdF9nZXRfcGFyYWxsZWxfaWRfaW50ZXJuYWwoaW50IGRlcHRoKQoreworICAgIG9tcHRfdGVhbV9pbmZvX3QgKmluZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKGRlcHRoLCBOVUxMKTsKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgaWQgPSBpbmZvID8gaW5mby0+cGFyYWxsZWxfaWQgOiAwOworICAgIHJldHVybiBpZDsKK30KKworCitpbnQKK19fb21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplX2ludGVybmFsKGludCBkZXB0aCkKK3sKKyAgICAvLyBpbml0aWFsaXplIHRoZSByZXR1cm4gdmFsdWUgd2l0aCB0aGUgZXJyb3IgdmFsdWUuCisgICAgLy8gaWYgdGhlcmUgaXMgYSB0ZWFtIGF0IHRoZSBzcGVjaWZpZWQgZGVwdGgsIHRoZSBkZWZhdWx0CisgICAgLy8gdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbiB0aGUgc2l6ZSBvZiB0aGF0IHRlYW0uCisgICAgaW50IHNpemUgPSAtMTsKKyAgICAodm9pZCkgX19vbXB0X2dldF90ZWFtaW5mbyhkZXB0aCwgJnNpemUpOworICAgIHJldHVybiBzaXplOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbGlnaHR3ZWlnaHQgdGFzayB0ZWFtIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX29tcHRfbHdfdGFza3RlYW1faW5pdChvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCwga21wX2luZm9fdCAqdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIHZvaWQgKm1pY3JvdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BpZCkKK3sKKyAgICBsd3QtPm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkID0gb21wdF9waWQ7CisgICAgbHd0LT5vbXB0X3RlYW1faW5mby5taWNyb3Rhc2sgPSBtaWNyb3Rhc2s7CisgICAgbHd0LT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gMDsKKyAgICBsd3QtPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgbHd0LT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIGx3dC0+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+CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiBlbnVtIF9faXR0X2Vycm9yX2NvZGUKK3sKKyAgICBfX2l0dF9lcnJvcl9zdWNjZXNzICAgICAgID0gMCwgLyohPCBubyBlcnJvciAqLworICAgIF9faXR0X2Vycm9yX25vX21vZHVsZSAgICAgPSAxLCAvKiE8IG1vZHVsZSBjYW4ndCBiZSBsb2FkZWQgKi8KKyAgICAvKiAlMSRzIC0tIGxpYnJhcnkgbmFtZTsgd2luOiAlMiRkIC0tIHN5c3RlbSBlcnJvciBjb2RlOyB1bng6ICUyJHMgLS0gc3lzdGVtIGVycm9yIG1lc3NhZ2UuICovCisgICAgX19pdHRfZXJyb3Jfbm9fc3ltYm9sICAgICA9IDIsIC8qITwgc3ltYm9sIG5vdCBmb3VuZCAqLworICAgIC8qICUxJHMgLS0gbGlicmFyeSBuYW1lLCAlMiRzIC0tIHN5bWJvbCBuYW1lLiAqLworICAgIF9faXR0X2Vycm9yX3Vua25vd25fZ3JvdXAgPSAzLCAvKiE8IHVua25vd24gZ3JvdXAgc3BlY2lmaWVkICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJHMgLS0gZ3JvdXAgbmFtZS4gKi8KKyAgICBfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52ID0gNCwgLyohPCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkgZmFpbGVkICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJGQgLS0gc3lzdGVtIGVycm9yLiAqLworICAgIF9faXR0X2Vycm9yX2Vudl90b29fbG9uZyAgPSA1LCAvKiE8IHZhcmlhYmxlIHZhbHVlIHRvbyBsb25nICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJGQgLS0gYWN0dWFsIGxlbmd0aCBvZiB0aGUgdmFyLCAlMyRkIC0tIG1heCBhbGxvd2VkIGxlbmd0aC4gKi8KKyAgICBfX2l0dF9lcnJvcl9zeXN0ZW0gICAgICAgID0gNiAgLyohPCBwdGhyZWFkX211dGV4YXR0cl9pbml0IG9yIHB0aHJlYWRfbXV0ZXhfaW5pdCBmYWlsZWQgKi8KKyAgICAvKiAlMSRzIC0tIGZ1bmN0aW9uIG5hbWUsICUyJGQgLS0gZXJybm8uICovCit9IF9faXR0X2Vycm9yX2NvZGU7CisKK3R5cGVkZWYgdm9pZCAoX19pdHRfZXJyb3JfaGFuZGxlcl90KShfX2l0dF9lcnJvcl9jb2RlIGNvZGUsIHZhX2xpc3QpOworX19pdHRfZXJyb3JfaGFuZGxlcl90KiBfX2l0dF9zZXRfZXJyb3JfaGFuZGxlcihfX2l0dF9lcnJvcl9oYW5kbGVyX3QqKTsKKworY29uc3QgY2hhciogSVRUQVBJIF9faXR0X2FwaV92ZXJzaW9uKHZvaWQpOworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNkZWZpbmUgX19pdHRfZXJyb3JfaGFuZGxlciBJVFRfSk9JTihJTlRFTF9JVFROT1RJRllfUFJFRklYLCBlcnJvcl9oYW5kbGVyKQordm9pZCBfX2l0dF9lcnJvcl9oYW5kbGVyKF9faXR0X2Vycm9yX2NvZGUgY29kZSwgdmFfbGlzdCBhcmdzKTsKK2V4dGVybiBjb25zdCBpbnQgSVRUTk9USUZZX05BTUUoZXJyKTsKKyNkZWZpbmUgX19pdHRfZXJyIElUVE5PVElGWV9OQU1FKGVycikKK0lUVF9TVFVCKElUVEFQSSwgY29uc3QgY2hhciosIGFwaV92ZXJzaW9uLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uICAgICBJVFROT1RJRllfREFUQShhcGlfdmVyc2lvbikKKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIElUVE5PVElGWV9OQU1FKGFwaV92ZXJzaW9uKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb24oKSAgIChjb25zdCBjaGFyKikwCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9JVFROT1RJRllfUFJJVkFURV8gKi8KKworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURSAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9jb25maWcuaCBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjZTJmYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfY29uZmlnLmgKQEAgLTAsMCArMSw0OTAgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfSVRUTk9USUZZX0NPTkZJR19IXworI2RlZmluZSBfSVRUTk9USUZZX0NPTkZJR19IXworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSVRUX09TX1dJTgorIyAgZGVmaW5lIElUVF9PU19XSU4gICAxCisjZW5kaWYgLyogSVRUX09TX1dJTiAqLworCisjaWZuZGVmIElUVF9PU19MSU5VWAorIyAgZGVmaW5lIElUVF9PU19MSU5VWCAyCisjZW5kaWYgLyogSVRUX09TX0xJTlVYICovCisKKyNpZm5kZWYgSVRUX09TX01BQworIyAgZGVmaW5lIElUVF9PU19NQUMgICAzCisjZW5kaWYgLyogSVRUX09TX01BQyAqLworCisjaWZuZGVmIElUVF9PUworIyAgaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIF9XSU4zMgorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19XSU4KKyMgIGVsaWYgZGVmaW5lZCggX19BUFBMRV9fICkgJiYgZGVmaW5lZCggX19NQUNIX18gKQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTElOVVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX09TICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1dJTgorIyAgZGVmaW5lIElUVF9QTEFURk9STV9XSU4gMQorI2VuZGlmIC8qIElUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fUE9TSVggMgorI2VuZGlmIC8qIElUVF9QTEFURk9STV9QT1NJWCAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9NQUMKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fTUFDIDMKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fTUFDICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNCisjICBpZiBJVFRfT1M9PUlUVF9PU19XSU4KKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fV0lOCisjICBlbGlmIElUVF9PUz09SVRUX09TX01BQworIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNICovCisKKyNpZiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChVTklDT0RFKQorI2RlZmluZSBVTklDT0RFCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2luY2x1ZGUgPHRjaGFyLmg+CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIENERUNMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIENERUNMIF9fY2RlY2wKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIENERUNMIF9fYXR0cmlidXRlX18gKChjZGVjbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgQ0RFQ0wgLyogYWN0dWFsIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIENERUNMICovCisKKyNpZm5kZWYgU1REQ0FMTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBTVERDQUxMIF9fc3RkY2FsbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgU1REQ0FMTCBfX2F0dHJpYnV0ZV9fICgoc3RkY2FsbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgU1REQ0FMTCAvKiBzdXBwb3J0ZWQgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogU1REQ0FMTCAqLworCisjZGVmaW5lIElUVEFQSSAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUEkgQ0RFQ0wKKworLyogVE9ETzogVGVtcG9yYXJ5IGZvciBjb21wYXRpYmlsaXR5ISAqLworI2RlZmluZSBJVFRBUElfQ0FMTCAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUElfQ0FMTCBDREVDTAorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisvKiB1c2UgX19mb3JjZWlubGluZSAoVkMrKyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgX19mb3JjZWlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSAvKiBub3RoaW5nICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKgorICogR2VuZXJhbGx5LCBmdW5jdGlvbnMgYXJlIG5vdCBpbmxpbmVkIHVubGVzcyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWVkLgorICogRm9yIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbmxpbmUsIHRoaXMgYXR0cmlidXRlIGlubGluZXMgdGhlIGZ1bmN0aW9uIGV2ZW4KKyAqIGlmIG5vIG9wdGltaXphdGlvbiBsZXZlbCB3YXMgc3BlY2lmaWVkLgorICovCisjaWZkZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UgIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMgaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyCisjICBkZWZpbmUgSVRUX0FSQ0hfSUEzMiAgMQorI2VuZGlmIC8qIElUVF9BUkNIX0lBMzIgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyRQorIyAgZGVmaW5lIElUVF9BUkNIX0lBMzJFIDIKKyNlbmRpZiAvKiBJVFRfQVJDSF9JQTMyRSAqLworCisvKiBXYXMgdGhlcmUgYSBtYWdpY2FsIHJlYXNvbiB3ZSBkaWRuJ3QgaGF2ZSAzIGhlcmUgYmVmb3JlPyAqLworI2lmbmRlZiBJVFRfQVJDSF9BQVJDSDY0CisjICBkZWZpbmUgSVRUX0FSQ0hfQUFSQ0g2NCAgMworI2VuZGlmIC8qIElUVF9BUkNIX0FBUkNINjQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9BUk0KKyMgIGRlZmluZSBJVFRfQVJDSF9BUk0gIDQKKyNlbmRpZiAvKiBJVFRfQVJDSF9BUk0gKi8KKworI2lmbmRlZiBJVFRfQVJDSF9QUEM2NAorIyAgZGVmaW5lIElUVF9BUkNIX1BQQzY0ICA1CisjZW5kaWYgLyogSVRUX0FSQ0hfUFBDNjQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9NSVBTCisjICBkZWZpbmUgSVRUX0FSQ0hfTUlQUyAgNgorI2VuZGlmIC8qIElUVF9BUkNIX01JUFMgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9NSVBTNjQKKyMgIGRlZmluZSBJVFRfQVJDSF9NSVBTNjQgIDYKKyNlbmRpZiAvKiBJVFRfQVJDSF9NSVBTNjQgKi8KKworCisjaWZuZGVmIElUVF9BUkNICisjICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUEzMgorIyAgZWxpZiBkZWZpbmVkIF9NX1g2NCB8fCBkZWZpbmVkIF9NX0FNRDY0IHx8IGRlZmluZWQgX194ODZfNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUEzMkUKKyMgIGVsaWYgZGVmaW5lZCBfTV9JQTY0IHx8IGRlZmluZWQgX19pYTY0X18KKyMgICAgZGVmaW5lIElUVF9BUkNIIElUVF9BUkNIX0lBNjQKKyMgIGVsaWYgZGVmaW5lZCBfTV9BUk0gfHwgX19hcm1fXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfQVJNCisjICBlbGlmIGRlZmluZWQgX19wb3dlcnBjNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfUFBDNjQKKyMgIGVsaWYgZGVmaW5lZCBfX2FhcmNoNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfQUFSQ0g2NAorIyAgZWxpZiBkZWZpbmVkIF9fbWlwc19fICYmICFkZWZpbmVkIF9fbWlwczY0CisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9NSVBTCisjICBlbGlmIGRlZmluZWQgX19taXBzX18gJiYgZGVmaW5lZCBfX21pcHM2NAorIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfTUlQUzY0CisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIElUVF9FWFRFUk5fQyBleHRlcm4gIkMiCisjICBkZWZpbmUgSVRUX0VYVEVSTl9DX0JFR0lOIGV4dGVybiAiQyIgeworIyAgZGVmaW5lIElUVF9FWFRFUk5fQ19FTkQgfQorI2Vsc2UKKyMgIGRlZmluZSBJVFRfRVhURVJOX0MgLyogbm90aGluZyAqLworIyAgZGVmaW5lIElUVF9FWFRFUk5fQ19CRUdJTiAvKiBub3RoaW5nICovCisjICBkZWZpbmUgSVRUX0VYVEVSTl9DX0VORCAvKiBub3RoaW5nICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2RlZmluZSBJVFRfVE9fU1RSX0FVWCh4KSAjeAorI2RlZmluZSBJVFRfVE9fU1RSKHgpICAgICBJVFRfVE9fU1RSX0FVWCh4KQorCisjZGVmaW5lIF9fSVRUX0JVSUxEX0FTU0VSVChleHByLCBzdWZmaXgpIGRvIHsgXAorICAgIHN0YXRpYyBjaGFyIF9faXR0X2J1aWxkX2NoZWNrXyMjc3VmZml4WyhleHByKSA/IDEgOiAtMV07IFwKKyAgICBfX2l0dF9idWlsZF9jaGVja18jI3N1ZmZpeFswXSA9IDA7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgX0lUVF9CVUlMRF9BU1NFUlQoZXhwciwgc3VmZml4KSAgX19JVFRfQlVJTERfQVNTRVJUKChleHByKSwgc3VmZml4KQorI2RlZmluZSBJVFRfQlVJTERfQVNTRVJUKGV4cHIpICAgICAgICAgICBfSVRUX0JVSUxEX0FTU0VSVCgoZXhwciksIF9fTElORV9fKQorCisjZGVmaW5lIElUVF9NQUdJQyB7IDB4RUQsIDB4QUIsIDB4QUIsIDB4RUMsIDB4MEQsIDB4RUUsIDB4REEsIDB4MzAgfQorCisvKiBSZXBsYWNlIHdpdGggc25hcHNob3QgZGF0ZSBZWVlZTU1ERCBmb3IgcHJvbW90aW9uIGJ1aWxkLiAqLworI2RlZmluZSBBUElfVkVSU0lPTl9CVUlMRCAgICAyMDExMTExMQorCisjaWZuZGVmIEFQSV9WRVJTSU9OX05VTQorI2RlZmluZSBBUElfVkVSU0lPTl9OVU0gMC4wLjAKKyNlbmRpZiAvKiBBUElfVkVSU0lPTl9OVU0gKi8KKworI2RlZmluZSBBUElfVkVSU0lPTiAiSVRULUFQSS1WZXJzaW9uICIgSVRUX1RPX1NUUihBUElfVkVSU0lPTl9OVU0pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiBJVFRfVE9fU1RSKEFQSV9WRVJTSU9OX0JVSUxEKSAiKSIKKworLyogT1MgY29tbXVuaWNhdGlvbiBmdW5jdGlvbnMgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+Cit0eXBlZGVmIEhNT0RVTEUgICAgICAgICAgIGxpYl90OwordHlwZWRlZiBEV09SRCAgICAgICAgICAgICBUSURUOwordHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OICBtdXRleF90OworI2RlZmluZSBNVVRFWF9JTklUSUFMSVpFUiB7IDAgfQorI2RlZmluZSBzdHJvbmdfYWxpYXMobmFtZSwgYWxpYXNuYW1lKSAvKiBlbXB0eSBmb3IgV2luZG93cyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPGRsZmNuLmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRSAxIC8qIG5lZWQgZm9yIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFICovCisjZW5kaWYgLyogX0dOVV9TT1VSQ0UgKi8KKyNpZm5kZWYgX19VU0VfVU5JWDk4CisjZGVmaW5lIF9fVVNFX1VOSVg5OCAxIC8qIG5lZWQgZm9yIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFLCBvbiBTTEVTMTEuMSB3aXRoIGdjYyA0LjMuNCB3aGVyZWluIHB0aHJlYWQuaCBtaXNzaW5nIGRlcGVuZGVuY3kgb24gX19VU0VfWE9QRU4ySzggKi8KKyNlbmRpZiAvKl9fVVNFX1VOSVg5OCovCisjaW5jbHVkZSA8cHRocmVhZC5oPgordHlwZWRlZiB2b2lkKiAgICAgICAgICAgICBsaWJfdDsKK3R5cGVkZWYgcHRocmVhZF90ICAgICAgICAgVElEVDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90ICAgbXV0ZXhfdDsKKyNkZWZpbmUgTVVURVhfSU5JVElBTElaRVIgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorI2RlZmluZSBfc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgXAorICAgICAgICAgICAgZXh0ZXJuIF9fdHlwZW9mIChuYW1lKSBhbGlhc25hbWUgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgjbmFtZSkpKTsKKyNkZWZpbmUgc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgX3N0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZ2V0X3Byb2MobGliLCBuYW1lKSBHZXRQcm9jQWRkcmVzcyhsaWIsIG5hbWUpCisjZGVmaW5lIF9faXR0X211dGV4X2luaXQobXV0ZXgpICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfbG9jayhtdXRleCkgICBFbnRlckNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfdW5sb2NrKG11dGV4KSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbG9hZF9saWIobmFtZSkgICAgICBMb2FkTGlicmFyeUEobmFtZSkKKyNkZWZpbmUgX19pdHRfdW5sb2FkX2xpYihoYW5kbGUpICBGcmVlTGlicmFyeShoYW5kbGUpCisjZGVmaW5lIF9faXR0X3N5c3RlbV9lcnJvcigpICAgICAgKGludClHZXRMYXN0RXJyb3IoKQorI2RlZmluZSBfX2l0dF9mc3RyY21wKHMxLCBzMikgICAgIGxzdHJjbXBBKHMxLCBzMikKKyNkZWZpbmUgX19pdHRfZnN0cmxlbihzKSAgICAgICAgICBsc3RybGVuQShzKQorI2RlZmluZSBfX2l0dF9mc3RyY3B5bihzMSwgczIsIGwpIGxzdHJjcHluQShzMSwgczIsIGwpCisjZGVmaW5lIF9faXR0X2ZzdHJkdXAocykgICAgICAgICAgX3N0cmR1cChzKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWQoKSAgICAgICAgIEdldEN1cnJlbnRUaHJlYWRJZCgpCisjZGVmaW5lIF9faXR0X3RocmVhZF95aWVsZCgpICAgICAgU3dpdGNoVG9UaHJlYWQoKQorI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKK0lUVF9JTkxJTkUgbG9uZworX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIGxvbmcgX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikKK3sKKyAgICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQocHRyKTsKK30KKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9nZXRfcHJvYyhsaWIsIG5hbWUpIGRsc3ltKGxpYiwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfaW5pdChtdXRleCkgICB7XAorICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhfYXR0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4X2F0dHIsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsgICAgICAgIFwKKyAgICBpZiAoZXJyb3JfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9zeXN0ZW0sICJwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnJvcl9jb2RlID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhfYXR0cik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleF9pbml0IiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBfX2l0dF9tdXRleF9sb2NrKG11dGV4KSAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfdW5sb2NrKG11dGV4KSBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCkKKyNkZWZpbmUgX19pdHRfbG9hZF9saWIobmFtZSkgICAgICBkbG9wZW4obmFtZSwgUlRMRF9MQVpZKQorI2RlZmluZSBfX2l0dF91bmxvYWRfbGliKGhhbmRsZSkgIGRsY2xvc2UoaGFuZGxlKQorI2RlZmluZSBfX2l0dF9zeXN0ZW1fZXJyb3IoKSAgICAgIGVycm5vCisjZGVmaW5lIF9faXR0X2ZzdHJjbXAoczEsIHMyKSAgICAgc3RyY21wKHMxLCBzMikKKyNkZWZpbmUgX19pdHRfZnN0cmxlbihzKSAgICAgICAgICBzdHJsZW4ocykKKyNkZWZpbmUgX19pdHRfZnN0cmNweW4oczEsIHMyLCBsKSBzdHJuY3B5KHMxLCBzMiwgbCkKKyNkZWZpbmUgX19pdHRfZnN0cmR1cChzKSAgICAgICAgICBzdHJkdXAocykKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lkKCkgICAgICAgICBwdGhyZWFkX3NlbGYoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfeWllbGQoKSAgICAgIHNjaGVkX3lpZWxkKCkKKyNpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUE2NAorI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNkZWZpbmUgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQoYWRkciwgdmFsKSBfX2ZldGNoYWRkNF9hY3EoKHZvaWQgKilhZGRyLCB2YWwpCisjZWxzZSAgLyogX19JTlRFTF9DT01QSUxFUiAqLworLyogVE9ETzogQWRkIFN1cHBvcnQgZm9yIG5vdCBJbnRlbCBjb21waWxlcnMgZm9yIElBLTY0IGFyY2hpdGVjdHVyZSAqLworI2VuZGlmIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KKyNlbGlmIElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyIHx8IElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyRSAvKiBJVFRfQVJDSCE9SVRUX0FSQ0hfSUE2NCAqLworSVRUX0lOTElORSBsb25nCitfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNCh2b2xhdGlsZSB2b2lkKiBwdHIsIGxvbmcgYWRkZW5kKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgbG9uZyBfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNCh2b2xhdGlsZSB2b2lkKiBwdHIsIGxvbmcgYWRkZW5kKQoreworICAgIGxvbmcgcmVzdWx0OworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsb2NrXG54YWRkICUwLCUxIgorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIocmVzdWx0KSwiPW0iKCooaW50KilwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiKGFkZGVuZCksICJtIigqKGludCopcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VsaWYgSVRUX0FSQ0g9PUlUVF9BUkNIX0FSTSB8fCBJVFRfQVJDSD09SVRUX0FSQ0hfUFBDNjQgfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX0FBUkNINjQgfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX01JUFMgfHwgIElUVF9BUkNIPT1JVFRfQVJDSF9NSVBTNjQKKyNkZWZpbmUgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQoYWRkciwgdmFsKSBfX3N5bmNfZmV0Y2hfYW5kX2FkZChhZGRyLCB2YWwpCisjZW5kaWYgLyogSVRUX0FSQ0g9PUlUVF9BUkNIX0lBNjQgKi8KKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCitJVFRfSU5MSU5FIGxvbmcKK19faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpIElUVF9JTkxJTkVfQVRUUklCVVRFOworSVRUX0lOTElORSBsb25nIF9faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpCit7CisgICAgcmV0dXJuIF9fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KHB0ciwgMSkgKyAxTDsKK30KKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBfX2l0dF9jb2xsZWN0aW9uX25vcm1hbCA9IDAsCisgICAgX19pdHRfY29sbGVjdGlvbl9wYXVzZWQgPSAxCit9IF9faXR0X2NvbGxlY3Rpb25fc3RhdGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfdGhyZWFkX25vcm1hbCAgPSAwLAorICAgIF9faXR0X3RocmVhZF9pZ25vcmVkID0gMQorfSBfX2l0dF90aHJlYWRfc3RhdGU7CisKKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfdGhyZWFkX2luZm8KK3sKKyAgICBjb25zdCBjaGFyKiBuYW1lQTsgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIG5hbWVXOyAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgbmFtZSBpbiBVTklDT0RFLiAqLworI2Vsc2UgIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICB2b2lkKiBuYW1lVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgVElEVCAgICAgICAgICAgICAgIHRpZDsKKyAgICBfX2l0dF90aHJlYWRfc3RhdGUgc3RhdGU7ICAgLyohPCBUaHJlYWQgc3RhdGUgKHBhdXNlZCBvciBub3JtYWwpICovCisgICAgaW50ICAgICAgICAgICAgICAgIGV4dHJhMTsgIC8qITwgUmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgZXh0cmEyOyAgLyohPCBSZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIHN0cnVjdCBfX19pdHRfdGhyZWFkX2luZm8qIG5leHQ7Cit9IF9faXR0X3RocmVhZF9pbmZvOworCisjaW5jbHVkZSAiaXR0bm90aWZ5X3R5cGVzLmgiIC8qIEZvciBfX2l0dF9ncm91cF9pZCBkZWZpbml0aW9uICovCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9hcGlfaW5mb18yMDEwMTAwMQoreworICAgIGNvbnN0IGNoYXIqICAgIG5hbWU7CisgICAgdm9pZCoqICAgICAgICAgZnVuY19wdHI7CisgICAgdm9pZCogICAgICAgICAgaW5pdF9mdW5jOworICAgIF9faXR0X2dyb3VwX2lkIGdyb3VwOworfSAgX19pdHRfYXBpX2luZm9fMjAxMDEwMDE7CisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9hcGlfaW5mbworeworICAgIGNvbnN0IGNoYXIqICAgIG5hbWU7CisgICAgdm9pZCoqICAgICAgICAgZnVuY19wdHI7CisgICAgdm9pZCogICAgICAgICAgaW5pdF9mdW5jOworICAgIHZvaWQqICAgICAgICAgIG51bGxfZnVuYzsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cDsKK30gIF9faXR0X2FwaV9pbmZvOworCitzdHJ1Y3QgX19faXR0X2RvbWFpbjsKK3N0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2dsb2JhbAoreworICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgbWFnaWNbOF07CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2ZXJzaW9uX21ham9yOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmVyc2lvbl9taW5vcjsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZlcnNpb25fYnVpbGQ7CisgICAgdm9sYXRpbGUgbG9uZyAgICAgICAgICBhcGlfaW5pdGlhbGl6ZWQ7CisgICAgdm9sYXRpbGUgbG9uZyAgICAgICAgICBtdXRleF9pbml0aWFsaXplZDsKKyAgICB2b2xhdGlsZSBsb25nICAgICAgICAgIGF0b21pY19jb3VudGVyOworICAgIG11dGV4X3QgICAgICAgICAgICAgICAgbXV0ZXg7CisgICAgbGliX3QgICAgICAgICAgICAgICAgICBsaWI7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICBlcnJvcl9oYW5kbGVyOworICAgIGNvbnN0IGNoYXIqKiAgICAgICAgICAgZGxsX3BhdGhfcHRyOworICAgIF9faXR0X2FwaV9pbmZvKiAgICAgICAgYXBpX2xpc3RfcHRyOworICAgIHN0cnVjdCBfX19pdHRfZ2xvYmFsKiAgbmV4dDsKKyAgICAvKiBKb2luYWJsZSBzdHJ1Y3R1cmVzIGJlbG93ICovCisgICAgX19pdHRfdGhyZWFkX2luZm8qICAgICB0aHJlYWRfbGlzdDsKKyAgICBzdHJ1Y3QgX19faXR0X2RvbWFpbiogIGRvbWFpbl9saXN0OworICAgIHN0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZSogc3RyaW5nX2xpc3Q7CisgICAgX19pdHRfY29sbGVjdGlvbl9zdGF0ZSBzdGF0ZTsKK30gX19pdHRfZ2xvYmFsOworCisjcHJhZ21hIHBhY2socG9wKQorCisjZGVmaW5lIE5FV19USFJFQURfSU5GT19XKGdwdHIsaCxoX3RhaWwsdCxzLG4pIHsgXAorICAgIGggPSAoX19pdHRfdGhyZWFkX2luZm8qKW1hbGxvYyhzaXplb2YoX19pdHRfdGhyZWFkX2luZm8pKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT50aWQgICAgPSB0OyBcCisgICAgICAgIGgtPm5hbWVBICA9IE5VTEw7IFwKKyAgICAgICAgaC0+bmFtZVcgID0gbiA/IF93Y3NkdXAobikgOiBOVUxMOyBcCisgICAgICAgIGgtPnN0YXRlICA9IHM7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPnRocmVhZF9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfVEhSRUFEX0lORk9fQShncHRyLGgsaF90YWlsLHQscyxuKSB7IFwKKyAgICBoID0gKF9faXR0X3RocmVhZF9pbmZvKiltYWxsb2Moc2l6ZW9mKF9faXR0X3RocmVhZF9pbmZvKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+dGlkICAgID0gdDsgXAorICAgICAgICBoLT5uYW1lQSAgPSBuID8gX19pdHRfZnN0cmR1cChuKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+bmFtZVcgID0gTlVMTDsgXAorICAgICAgICBoLT5zdGF0ZSAgPSBzOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT50aHJlYWRfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX0RPTUFJTl9XKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9kb21haW4qKW1hbGxvYyhzaXplb2YoX19pdHRfZG9tYWluKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+ZmxhZ3MgID0gMDsgICAgLyogZG9tYWluIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8gXAorICAgICAgICBoLT5uYW1lQSAgPSBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IG5hbWUgPyBfd2NzZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+ZG9tYWluX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19ET01BSU5fQShncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfZG9tYWluKiltYWxsb2Moc2l6ZW9mKF9faXR0X2RvbWFpbikpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPmZsYWdzICA9IDA7ICAgIC8qIGRvbWFpbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0ICovIFwKKyAgICAgICAgaC0+bmFtZUEgID0gbmFtZSA/IF9faXR0X2ZzdHJkdXAobmFtZSkgOiBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPmRvbWFpbl9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfU1RSSU5HX0hBTkRMRV9XKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9zdHJpbmdfaGFuZGxlKiltYWxsb2Moc2l6ZW9mKF9faXR0X3N0cmluZ19oYW5kbGUpKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5zdHJBICAgPSBOVUxMOyBcCisgICAgICAgIGgtPnN0clcgICA9IG5hbWUgPyBfd2NzZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+c3RyaW5nX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19TVFJJTkdfSEFORExFX0EoZ3B0cixoLGhfdGFpbCxuYW1lKSB7IFwKKyAgICBoID0gKF9faXR0X3N0cmluZ19oYW5kbGUqKW1hbGxvYyhzaXplb2YoX19pdHRfc3RyaW5nX2hhbmRsZSkpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPnN0ckEgICA9IG5hbWUgPyBfX2l0dF9mc3RyZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5zdHJXICAgPSBOVUxMOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT5zdHJpbmdfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNlbmRpZiAvKiBfSVRUTk9USUZZX0NPTkZJR19IXyAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYyBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0ZmU0MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMKQEAgLTAsMCArMSwxMDU3IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisjaW5jbHVkZSAiaXR0bm90aWZ5X2NvbmZpZy5oIgorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIFBBVEhfTUFYIDUxMgorI2Vsc2UgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgSU5URUxfTk9fTUFDUk9fQk9EWQorI2RlZmluZSBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyNpbmNsdWRlICJpdHRub3RpZnkuaCIKKyNpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisKKyNpbmNsdWRlICJkaXNhYmxlX3dhcm5pbmdzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGFwaV92ZXJzaW9uW10gPSBBUElfVkVSU0lPTiAiXDBcbkAoIykgJFJldmlzaW9uOiA0MzM3NSAkXG4iOworCisjZGVmaW5lIF9OXyhuKSBJVFRfSk9JTihJTlRFTF9JVFROT1RJRllfUFJFRklYLG4pCisKKyNpZiBJVFRfT1M9PUlUVF9PU19XSU4KK3N0YXRpYyBjb25zdCBjaGFyKiBpdHRub3RpZnlfbGliX25hbWUgPSAibGliaXR0bm90aWZ5LmRsbCI7CisjZWxpZiBJVFRfT1M9PUlUVF9PU19MSU5VWAorc3RhdGljIGNvbnN0IGNoYXIqIGl0dG5vdGlmeV9saWJfbmFtZSA9ICJsaWJpdHRub3RpZnkuc28iOworI2VsaWYgSVRUX09TPT1JVFRfT1NfTUFDCitzdGF0aWMgY29uc3QgY2hhciogaXR0bm90aWZ5X2xpYl9uYW1lID0gImxpYml0dG5vdGlmeS5keWxpYiI7CisjZWxzZQorI2Vycm9yIFVuc3VwcG9ydGVkIG9yIHVua25vd24gT1MuCisjZW5kaWYKKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKworI2lmZGVmIElUVF9BTkRST0lEX0xPRworICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HX1RBRyAgICJJTlRFTF9WVFVORV9VU0VSQVBJIgorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HSSguLi4pICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sIElUVF9BTkRST0lEX0xPR19UQUcsIF9fVkFfQVJHU19fKSkKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR1coLi4uKSAoKHZvaWQpX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19XQVJOLCBJVFRfQU5EUk9JRF9MT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dFKC4uLikgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfRVJST1IsSVRUX0FORFJPSURfTE9HX1RBRywgX19WQV9BUkdTX18pKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HRCguLi4pICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0RFQlVHLElUVF9BTkRST0lEX0xPR19UQUcsIF9fVkFfQVJHU19fKSkKKyNlbHNlCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dJKC4uLikKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR1coLi4uKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HRSguLi4pCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dEKC4uLikKKyNlbmRpZgorCisvKiBkZWZhdWx0IGxvY2F0aW9uIG9mIHVzZXJhcGkgY29sbGVjdG9yIG9uIEFuZHJvaWQgKi8KKyNkZWZpbmUgQU5EUk9JRF9JVFROT1RJRllfREVGQVVMVF9QQVRIICAiL2RhdGEvZGF0YS9jb20uaW50ZWwudnR1bmUvaW50ZWwvbGliaXR0bm90aWZ5LnNvIgorI2VuZGlmCisKKworI2lmbmRlZiBMSUJfVkFSX05BTUUKKyNpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUEzMiB8fCBJVFRfQVJDSD09SVRUX0FSQ0hfQVJNIHx8IElUVF9BUkNIPT1JVFRfQVJDSF9NSVBTCisjZGVmaW5lIExJQl9WQVJfTkFNRSBJTlRFTF9MSUJJVFROT1RJRlkzMgorI2Vsc2UKKyNkZWZpbmUgTElCX1ZBUl9OQU1FIElOVEVMX0xJQklUVE5PVElGWTY0CisjZW5kaWYKKyNlbmRpZiAvKiBMSUJfVkFSX05BTUUgKi8KKworI2RlZmluZSBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIXAubXV0ZXhfaW5pdGlhbGl6ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKF9faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCgmcC5hdG9taWNfY291bnRlcikgPT0gMSkgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9faXR0X211dGV4X2luaXQoJnAubXV0ZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHAubXV0ZXhfaW5pdGlhbGl6ZWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdoaWxlICghcC5tdXRleF9pbml0aWFsaXplZCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBfX2l0dF90aHJlYWRfeWllbGQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9tdXRleF9sb2NrKCZwLm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitjb25zdCBpbnQgX05fKGVycikgPSAwOworCit0eXBlZGVmIGludCAoX19pdHRfaW5pdF9pdHRsaWJfdCkoY29uc3QgY2hhciosIF9faXR0X2dyb3VwX2lkKTsKKworLyogdGhpcyBkZWZpbmUgdXNlZCB0byBjb250cm9sIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG5hbWUuICovCisjaWZuZGVmIF9faXR0X2luaXRfaXR0bGliX25hbWUKK0lUVF9FWFRFUk5fQyBpbnQgX05fKGluaXRfaXR0bGliKShjb25zdCBjaGFyKiwgX19pdHRfZ3JvdXBfaWQpOworc3RhdGljIF9faXR0X2luaXRfaXR0bGliX3QqIF9faXR0X2luaXRfaXR0bGliX3B0ciA9IF9OXyhpbml0X2l0dGxpYik7CisjZGVmaW5lIF9faXR0X2luaXRfaXR0bGliX25hbWUgX19pdHRfaW5pdF9pdHRsaWJfcHRyCisjZW5kaWYgLyogX19pdHRfaW5pdF9pdHRsaWJfbmFtZSAqLworCit0eXBlZGVmIHZvaWQgKF9faXR0X2ZpbmlfaXR0bGliX3QpKHZvaWQpOworCisvKiB0aGlzIGRlZmluZSB1c2VkIHRvIGNvbnRyb2wgZmluYWxpemF0aW9uIGZ1bmN0aW9uIG5hbWUuICovCisjaWZuZGVmIF9faXR0X2ZpbmlfaXR0bGliX25hbWUKK0lUVF9FWFRFUk5fQyB2b2lkIF9OXyhmaW5pX2l0dGxpYikodm9pZCk7CitzdGF0aWMgX19pdHRfZmluaV9pdHRsaWJfdCogX19pdHRfZmluaV9pdHRsaWJfcHRyID0gX05fKGZpbmlfaXR0bGliKTsKKyNkZWZpbmUgX19pdHRfZmluaV9pdHRsaWJfbmFtZSBfX2l0dF9maW5pX2l0dGxpYl9wdHIKKyNlbmRpZiAvKiBfX2l0dF9maW5pX2l0dGxpYl9uYW1lICovCisKKy8qIGJ1aWxkaW5nIHBvaW50ZXJzIHRvIGltcG9ydGVkIGZ1bmNzICovCisjdW5kZWYgSVRUX1NUVUJWCisjdW5kZWYgSVRUX1NUVUIKKyNkZWZpbmUgSVRUX1NUVUIoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzO1wKK3R5cGVkZWYgdHlwZSBhcGkgSVRUX0pPSU4oX05fKG5hbWUpLF90KSBhcmdzOyAgICAgICAgICAgICAgICAgIFwKK0lUVF9FWFRFUk5fQ19CRUdJTiBJVFRfSk9JTihfTl8obmFtZSksX3QpKiBJVFROT1RJRllfTkFNRShuYW1lKSA9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpOyBJVFRfRVhURVJOX0NfRU5EIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7ICAgICAgICAgICAgIFwKKyAgICBpZiAoSVRUTk9USUZZX05BTUUobmFtZSkgJiYgSVRUTk9USUZZX05BTUUobmFtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkpIFwKKyAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKG5hbWUpIHBhcmFtczsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuICh0eXBlKTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBJVFRfU1RVQlYoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DX0JFR0lOIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7IElUVF9FWFRFUk5fQ19FTkQgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3MgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsgICAgICAgICAgICAgXAorICAgIGlmIChJVFROT1RJRllfTkFNRShuYW1lKSAmJiBJVFROT1RJRllfTkFNRShuYW1lKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSkgXAorICAgICAgICBJVFROT1RJRllfTkFNRShuYW1lKSBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjdW5kZWYgX19JVFRfSU5URVJOQUxfSU5JVAorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKworI3VuZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUJWCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0NfQkVHSU4gSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsgSVRUX0VYVEVSTl9DX0VORAorCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLHB0cixncm91cCxmb3JtYXQpICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0NfQkVHSU4gSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsgSVRUX0VYVEVSTl9DX0VORAorCisjZGVmaW5lIF9fSVRUX0lOVEVSTkFMX0lOSVQKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisjdW5kZWYgX19JVFRfSU5URVJOQUxfSU5JVAorCitJVFRfR1JPVVBfTElTVChncm91cF9saXN0KTsKKworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9ncm91cF9hbGlhcworeworICAgIGNvbnN0IGNoYXIqICAgIGVudl92YXI7CisgICAgX19pdHRfZ3JvdXBfaWQgZ3JvdXBzOworfSBfX2l0dF9ncm91cF9hbGlhczsKKworc3RhdGljIF9faXR0X2dyb3VwX2FsaWFzIGdyb3VwX2FsaWFzW10gPSB7CisgICAgeyAiS01QX0ZPUl9UUFJPRklMRSIsIChfX2l0dF9ncm91cF9pZCkoX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX3N5bmMgIHwgX19pdHRfZ3JvdXBfbWFyaykgfSwKKyAgICB7ICJLTVBfRk9SX1RDSEVDSyIsICAgKF9faXR0X2dyb3VwX2lkKShfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfc3luYyAgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9zdXBwcmVzcykgfSwKKyAgICB7IE5VTEwsICAgICAgICAgICAgICAgKF9faXR0X2dyb3VwX25vbmUpIH0sCisgICAgeyBhcGlfdmVyc2lvbiwgICAgICAgIChfX2l0dF9ncm91cF9ub25lKSB9IC8qICEhISBKdXN0IHRvIGF2b2lkIHVudXNlZCBjb2RlIGVsaW1pbmF0aW9uICEhISAqLworfTsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA1NCkgLyogd2FybmluZyBDNDA1NDogJ3R5cGUgY2FzdCcgOiBmcm9tIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgdG8gZGF0YSBwb2ludGVyICd2b2lkIConICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3N0YXRpYyBfX2l0dF9hcGlfaW5mbyBhcGlfbGlzdFtdID0geworLyogRGVmaW5lIGZ1bmN0aW9ucyB3aXRoIHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLworI3VuZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUJWCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMsbmFtZWluZGxsLGdyb3VwLGZvcm1hdCkgeyBJVFRfVE9fU1RSKElUVF9KT0lOKF9faXR0XyxuYW1laW5kbGwpKSwgKHZvaWQqKikodm9pZCopJklUVE5PVElGWV9OQU1FKG5hbWUpLCAodm9pZCopKHNpemVfdCkmSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSksICh2b2lkKikoc2l6ZV90KSZJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSwgKF9faXR0X2dyb3VwX2lkKShncm91cCl9LAorI2RlZmluZSBJVFRfU1RVQlYgSVRUX1NUVUIKKyNkZWZpbmUgX19JVFRfSU5URVJOQUxfSU5JVAorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKyN1bmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisvKiBEZWZpbmUgZnVuY3Rpb25zIHdpdGhvdXQgc3RhdGljIGltcGxlbWVudGF0aW9uICovCisjdW5kZWYgSVRUX1NUVUIKKyN1bmRlZiBJVFRfU1RVQlYKKyNkZWZpbmUgSVRUX1NUVUIoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxuYW1laW5kbGwsZ3JvdXAsZm9ybWF0KSB7SVRUX1RPX1NUUihJVFRfSk9JTihfX2l0dF8sbmFtZWluZGxsKSksICh2b2lkKiopKHZvaWQqKSZJVFROT1RJRllfTkFNRShuYW1lKSwgKHZvaWQqKShzaXplX3QpJklUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpLCBOVUxMLCAoX19pdHRfZ3JvdXBfaWQpKGdyb3VwKX0sCisjZGVmaW5lIElUVF9TVFVCViBJVFRfU1RVQgorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgX19pdHRfZ3JvdXBfbm9uZX0KK307CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qIHByaXZhdGUsIGluaXQgdGhyZWFkIGluZm8gaXRlbS4gdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgKi8KK3N0YXRpYyBfX2l0dF90aHJlYWRfaW5mbyBpbml0X3RocmVhZF9pbmZvID0geworICAgIChjb25zdCBjaGFyKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVBICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIChjb25zdCB3Y2hhcl90KilOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZWxzZQorICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZW5kaWYKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aWQgKi8KKyAgICBfX2l0dF90aHJlYWRfbm9ybWFsLCAgICAgICAgICAgICAgICAgICAgICAvKiBzdGF0ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMSAqLworICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMiAqLworICAgIChfX2l0dF90aHJlYWRfaW5mbyopTlVMTCAgICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KK307CisKKy8qIHByaXZhdGUsIE5VTEwgZG9tYWluIGl0ZW0uIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzICovCitzdGF0aWMgX19pdHRfZG9tYWluIG51bGxfZG9tYWluID0geworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzOiAgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLworICAgIChjb25zdCBjaGFyKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVBICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIChjb25zdCB3Y2hhcl90KilOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZWxzZQorICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZW5kaWYKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTEgKi8KKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTIgKi8KKyAgICAoX19pdHRfZG9tYWluKilOVUxMICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0ICovCit9OworCisvKiBwcml2YXRlLCBOVUxMIHN0cmluZyBoYW5kbGUgaXRlbS4gdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgKi8KK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlIG51bGxfc3RyaW5nX2hhbmRsZSA9IHsKKyAgICAoY29uc3QgY2hhciopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJBICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIChjb25zdCB3Y2hhcl90KilOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIHN0clcgKi8KKyNlbHNlCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RyVyAqLworI2VuZGlmCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmExICovCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEyICovCisgICAgKF9faXR0X3N0cmluZ19oYW5kbGUqKU5VTEwgICAgICAgICAgICAgICAgLyogbmV4dCAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgZGxsX3BhdGhbUEFUSF9NQVhdID0geyAwIH07CisKKy8qIHN0YXRpYyBwYXJ0IGRlc2NyaXB0b3Igd2hpY2ggaGFuZGxlcy4gYWxsIG5vdGlmaWNhdGlvbiBhcGkgYXR0cmlidXRlcy4gKi8KK19faXR0X2dsb2JhbCBfTl8oX2l0dGFwaV9nbG9iYWwpID0geworICAgIElUVF9NQUdJQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWRlbnRpZmljYXRpb24gaW5mbyAqLworICAgIElUVF9NQUpPUiwgSVRUX01JTk9SLCBBUElfVkVSU0lPTl9CVUlMRCwgICAgICAgLyogdmVyc2lvbiBpbmZvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcGlfaW5pdGlhbGl6ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11dGV4X2luaXRpYWxpemVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdG9taWNfY291bnRlciAqLworICAgIE1VVEVYX0lOSVRJQUxJWkVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXV0ZXggKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgbGlicmFyeSBoYW5kbGUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yX2hhbmRsZXIgKi8KKyAgICAoY29uc3QgY2hhcioqKSZkbGxfcGF0aCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRsbF9wYXRoX3B0ciAqLworICAgIChfX2l0dF9hcGlfaW5mbyopJmFwaV9saXN0LCAgICAgICAgICAgICAgICAgICAgLyogYXBpX2xpc3RfcHRyICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IF9faXR0X2dsb2JhbCAqLworICAgIChfX2l0dF90aHJlYWRfaW5mbyopJmluaXRfdGhyZWFkX2luZm8sICAgICAgICAgLyogdGhyZWFkX2xpc3QgKi8KKyAgICAoX19pdHRfZG9tYWluKikmbnVsbF9kb21haW4sICAgICAgICAgICAgICAgICAgIC8qIGRvbWFpbl9saXN0ICovCisgICAgKF9faXR0X3N0cmluZ19oYW5kbGUqKSZudWxsX3N0cmluZ19oYW5kbGUsICAgICAvKiBzdHJpbmdfbGlzdCAqLworICAgIF9faXR0X2NvbGxlY3Rpb25fbm9ybWFsICAgICAgICAgICAgICAgICAgICAgICAgLyogY29sbGVjdGlvbiBzdGF0ZSAqLworfTsKKwordHlwZWRlZiB2b2lkIChfX2l0dF9hcGlfaW5pdF90KShfX2l0dF9nbG9iYWwqLCBfX2l0dF9ncm91cF9pZCk7Cit0eXBlZGVmIHZvaWQgKF9faXR0X2FwaV9maW5pX3QpKF9faXR0X2dsb2JhbCopOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZmRlZiBJVFRfTk9USUZZX0VYVF9SRVBPUlQKK0lUVF9FWFRFUk5fQyB2b2lkIF9OXyhlcnJvcl9oYW5kbGVyKShfX2l0dF9lcnJvcl9jb2RlLCB2YV9saXN0IGFyZ3MpOworI2VuZGlmIC8qIElUVF9OT1RJRllfRVhUX1JFUE9SVCAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU1KSAvKiB3YXJuaW5nIEM0MDU1OiAndHlwZSBjYXN0JyA6IGZyb20gZGF0YSBwb2ludGVyICd2b2lkIConIHRvIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworc3RhdGljIHZvaWQgX19pdHRfcmVwb3J0X2Vycm9yKHVuc2lnbmVkIGNvZGVfYXJnLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGNvZGVfYXJnKTsKKworICAgIC8vIFdlIHVzZSB1bnNpZ25lZCBmb3IgdGhlIGNvZGUgYXJndW1lbnQgYW5kIGV4cGxpY2l0bHkgY2FzdCBpdCBoZXJlIHRvIHRoZQorICAgIC8vIHJpZ2h0IGVudW1lcmF0b3IgYmVjYXVzZSB2YXJpYWRpYyBmdW5jdGlvbnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGgKKyAgICAvLyBkZWZhdWx0IHByb21vdGlvbnMuCisgICAgX19pdHRfZXJyb3JfY29kZSBjb2RlID0gKF9faXR0X2Vycm9yX2NvZGUpY29kZV9hcmc7CisKKyAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5lcnJvcl9oYW5kbGVyICE9IE5VTEwpCisgICAgeworICAgICAgICBfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIGhhbmRsZXIgPSAoX19pdHRfZXJyb3JfaGFuZGxlcl90Kikoc2l6ZV90KV9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlcjsKKyAgICAgICAgaGFuZGxlcihjb2RlLCBhcmdzKTsKKyAgICB9CisjaWZkZWYgSVRUX05PVElGWV9FWFRfUkVQT1JUCisgICAgX05fKGVycm9yX2hhbmRsZXIpKGNvZGUsIGFyZ3MpOworI2VuZGlmIC8qIElUVF9OT1RJRllfRVhUX1JFUE9SVCAqLworICAgIHZhX2VuZChhcmdzKTsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIF9faXR0X2RvbWFpbiogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlVyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lKQoreworICAgIF9faXR0X2RvbWFpbiAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlVykgJiYgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlVyksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlVykobmFtZSk7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9OXyhfaXR0YXBpX2dsb2JhbCkuZG9tYWluX2xpc3Q7CisKKyAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+bmFtZVcgIT0gTlVMTCAmJiAhd2NzY21wKGgtPm5hbWVXLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX0RPTUFJTl9XKCZfTl8oX2l0dGFwaV9nbG9iYWwpLGgsaF90YWlsLG5hbWUpOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIHJldHVybiBoOworfQorCitzdGF0aWMgX19pdHRfZG9tYWluKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGVBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgX19pdHRfZG9tYWluKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGUpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3sKKyAgICBfX2l0dF9kb21haW4gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpICYmIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVBKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZUEpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpKG5hbWUpOworI2Vsc2UKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpICYmIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpKG5hbWUpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9OXyhfaXR0YXBpX2dsb2JhbCkuZG9tYWluX2xpc3Q7CisKKyAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+bmFtZUEgIT0gTlVMTCAmJiAhX19pdHRfZnN0cmNtcChoLT5uYW1lQSwgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19ET01BSU5fQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIF9faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGVXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUpCit7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpICYmIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlVykgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlVyksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpKG5hbWUpOworICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0cmluZ19saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnN0clcgIT0gTlVMTCAmJiAhd2NzY21wKGgtPnN0clcsIG5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfU1RSSU5HX0hBTkRMRV9XKCZfTl8oX2l0dGFwaV9nbG9iYWwpLGgsaF90YWlsLG5hbWUpOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIHJldHVybiBoOworfQorCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpICYmIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlQSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpKG5hbWUpOworI2Vsc2UKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKSAmJiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKShuYW1lKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0cmluZ19saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnN0ckEgIT0gTlVMTCAmJiAhX19pdHRfZnN0cmNtcChoLT5zdHJBLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1NUUklOR19IQU5ETEVfQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhwYXVzZSksX2luaXQpKSh2b2lkKQoreworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShwYXVzZSkgJiYgSVRUTk9USUZZX05BTUUocGF1c2UpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhwYXVzZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUocGF1c2UpKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5zdGF0ZSA9IF9faXR0X2NvbGxlY3Rpb25fcGF1c2VkOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHJlc3VtZSksX2luaXQpKSh2b2lkKQoreworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShyZXN1bWUpICYmIElUVE5PVElGWV9OQU1FKHJlc3VtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHJlc3VtZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUocmVzdW1lKSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RhdGUgPSBfX2l0dF9jb2xsZWN0aW9uX25vcm1hbDsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUpCit7CisgICAgVElEVCB0aWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICBfX2l0dF90aHJlYWRfaW5mbyAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVXKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVXKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lVyksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+dGlkID09IHRpZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1RIUkVBRF9JTkZPX1coJl9OXyhfaXR0YXBpX2dsb2JhbCksIGgsIGhfdGFpbCwgdGlkLCBfX2l0dF90aHJlYWRfbm9ybWFsLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaC0+bmFtZVcgPSBuYW1lID8gX3djc2R1cChuYW1lKSA6IE5VTEw7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJfbmFtZV9zZXRXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGludCBuYW1lbGVuKQoreworICAgIG5hbWVsZW4gPSBuYW1lbGVuOworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVXKSxfaW5pdCkpKG5hbWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZUEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit7CisgICAgVElEVCB0aWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICBfX2l0dF90aHJlYWRfaW5mbyAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVBKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVBKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lQSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZSkgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWUpKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgfQorCisgICAgX19pdHRfbXV0ZXhfbG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnRpZCA9PSB0aWQpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19USFJFQURfSU5GT19BKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBoLCBoX3RhaWwsIHRpZCwgX19pdHRfdGhyZWFkX25vcm1hbCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPm5hbWVBID0gbmFtZSA/IF9faXR0X2ZzdHJkdXAobmFtZSkgOiBOVUxMOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitzdGF0aWMgaW50IElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX25hbWVfc2V0QSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBuYW1lbGVuID0gbmFtZWxlbjsKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lQSksX2luaXQpKShuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyBpbnQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJfbmFtZV9zZXQpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgbmFtZWxlbiA9IG5hbWVsZW47CisgICAgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZSksX2luaXQpKShuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfaWdub3JlKSxfaW5pdCkpKHZvaWQpCit7CisgICAgVElEVCB0aWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICBfX2l0dF90aHJlYWRfaW5mbyAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX2lnbm9yZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9faXR0X211dGV4X2xvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT50aWQgPT0gdGlkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogbmFtZSA9ICJ1bmtub3duIjsKKyAgICAgICAgTkVXX1RIUkVBRF9JTkZPX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksIGgsIGhfdGFpbCwgdGlkLCBfX2l0dF90aHJlYWRfaWdub3JlZCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPnN0YXRlID0gX19pdHRfdGhyZWFkX2lnbm9yZWQ7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX2lnbm9yZSksX2luaXQpKSh2b2lkKQoreworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfaWdub3JlKSxfaW5pdCkpKCk7Cit9CisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZW5hYmxlX2F0dGFjaCksX2luaXQpKSh2b2lkKQoreworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgLyoKKyAgICAgKiBpZiBMSUJfVkFSX05BTUUgZW52IHZhcmlhYmxlIHdlcmUgc2V0IGJlZm9yZSB0aGVuIHN0YXkgcHJldmlvdXMgdmFsdWUKKyAgICAgKiBlbHNlIHNldCBkZWZhdWx0IHBhdGgKKyAgICAqLworICAgIHNldGVudihJVFRfVE9fU1RSKExJQl9WQVJfTkFNRSksIEFORFJPSURfSVRUTk9USUZZX0RFRkFVTFRfUEFUSCwgMCk7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIqIF9faXR0X2ZzcGxpdChjb25zdCBjaGFyKiBzLCBjb25zdCBjaGFyKiBzZXAsIGNvbnN0IGNoYXIqKiBvdXQsIGludCogbGVuKQoreworICAgIGludCBpOworICAgIGludCBqOworCisgICAgaWYgKCFzIHx8ICFzZXAgfHwgIW91dCB8fCAhbGVuKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IHNbaV07IGkrKykKKyAgICB7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgc2VwW2pdOyBqKyspCisgICAgICAgICAgICBpZiAoc1tpXSA9PSBzZXBbal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICghYikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghc1tpXSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAqbGVuID0gMDsKKyAgICAqb3V0ID0gJnNbaV07CisKKyAgICBmb3IgKDsgc1tpXTsgaSsrLCAoKmxlbikrKykKKyAgICB7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgc2VwW2pdOyBqKyspCisgICAgICAgICAgICBpZiAoc1tpXSA9PSBzZXBbal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChiKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZm9yICg7IHNbaV07IGkrKykKKyAgICB7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgc2VwW2pdOyBqKyspCisgICAgICAgICAgICBpZiAoc1tpXSA9PSBzZXBbal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICghYikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAmc1tpXTsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgZW52IHZhcmlhYmxlIHRoYXQgcGxhY2VkIGludG8gc3RhdGljIGJ1ZmZlci4KKyAqICEhISBUaGUgc2FtZSBzdGF0aWMgYnVmZmVyIGlzIHVzZWQgZm9yIHN1YnNlcXVlbnQgY2FsbHMuICEhIQorICogVGhpcyB3YXMgZG9uZSB0byBhdmlvZCBkeW5hbWljIGFsbG9jYXRpb24gZm9yIGZldyBjYWxscy4KKyAqIEFjdHVhbGx5IHdlIG5lZWQgdGhpcyBmdW5jdGlvbiBvbmx5IGZvdXIgdGltZXMuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBfX2l0dF9nZXRfZW52X3Zhcihjb25zdCBjaGFyKiBuYW1lKQoreworI2RlZmluZSBNQVhfRU5WX1ZBTFVFX1NJWkUgNDA4NgorICAgIHN0YXRpYyBjaGFyICBlbnZfYnVmZltNQVhfRU5WX1ZBTFVFX1NJWkVdOworICAgIHN0YXRpYyBjaGFyKiBlbnZfdmFsdWUgPSAoY2hhciopZW52X2J1ZmY7CisKKyAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgIHsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgc2l6ZV90IG1heF9sZW4gPSBNQVhfRU5WX1ZBTFVFX1NJWkUgLSAoc2l6ZV90KShlbnZfdmFsdWUgLSBlbnZfYnVmZik7CisgICAgICAgIERXT1JEIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEobmFtZSwgZW52X3ZhbHVlLCAoRFdPUkQpbWF4X2xlbik7CisgICAgICAgIGlmIChyYyA+PSBtYXhfbGVuKQorICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX2Vudl90b29fbG9uZywgbmFtZSwgKHNpemVfdClyYyAtIDEsIChzaXplX3QpKG1heF9sZW4gLSAxKSk7CisgICAgICAgIGVsc2UgaWYgKHJjID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciogcmV0ID0gKGNvbnN0IGNoYXIqKWVudl92YWx1ZTsKKyAgICAgICAgICAgIGVudl92YWx1ZSArPSByYyArIDE7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogSWYgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZW1wdHksIEdldEVudmlyb3JubWVudFZhcmlhYmxlcygpCisgICAgICAgICAgICAgKiByZXR1cm5zIHplcm8gKG51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIG51bGwpLAorICAgICAgICAgICAgICogYW5kIEdldExhc3RFcnJvcigpIHJldHVybnMgRVJST1JfU1VDQ0VTUy4gKi8KKyAgICAgICAgICAgIERXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHJldHVybiBlbnZfdmFsdWU7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gRVJST1JfRU5WVkFSX05PVF9GT1VORCkKKyAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3JfY2FudF9yZWFkX2VudiwgbmFtZSwgKGludCllcnIpOworICAgICAgICB9CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgIGNoYXIqIGVudiA9IGdldGVudihuYW1lKTsKKyAgICAgICAgaWYgKGVudiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKGVudik7CisgICAgICAgICAgICBzaXplX3QgbWF4X2xlbiA9IE1BWF9FTlZfVkFMVUVfU0laRSAtIChzaXplX3QpKGVudl92YWx1ZSAtIGVudl9idWZmKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCBtYXhfbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJldCA9IChjb25zdCBjaGFyKillbnZfdmFsdWU7CisgICAgICAgICAgICAgICAgc3RybmNweShlbnZfdmFsdWUsIGVudiwgbGVuICsgMSk7CisgICAgICAgICAgICAgICAgZW52X3ZhbHVlICs9IGxlbiArIDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcsIG5hbWUsIChzaXplX3QpbGVuLCAoc2l6ZV90KShtYXhfbGVuIC0gMSkpOworICAgICAgICB9CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciogX19pdHRfZ2V0X2xpYl9uYW1lKHZvaWQpCit7CisgICAgY29uc3QgY2hhciogbGliX25hbWUgPSBfX2l0dF9nZXRfZW52X3ZhcihJVFRfVE9fU1RSKExJQl9WQVJfTkFNRSkpOworCisjaWZkZWYgX19BTkRST0lEX18KKyAgICBpZiAobGliX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IHN5c3RlbV93aWRlX21hcmtlcl9maWxlbmFtZSA9ICIvZGF0YS9sb2NhbC90bXAvY29tLmludGVsLml0dC5jb2xsZWN0b3JfbGliIjsKKyAgICAgICAgaW50IGl0dF9tYXJrZXJfZmlsZV9mZCA9IG9wZW4oc3lzdGVtX3dpZGVfbWFya2VyX2ZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgICAgIHNzaXplX3QgcmVzID0gMDsKKworICAgICAgICBpZiAoaXR0X21hcmtlcl9maWxlX2ZkID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBwaWRfdCBteV9waWQgPSBnZXRwaWQoKTsKKyAgICAgICAgICAgIGNoYXIgY21kbGluZV9wYXRoW1BBVEhfTUFYXSA9IHswfTsKKyAgICAgICAgICAgIGNoYXIgcGFja2FnZV9uYW1lW1BBVEhfTUFYXSA9IHswfTsKKyAgICAgICAgICAgIGNoYXIgYXBwX3NhbmRib3hfZmlsZVtQQVRIX01BWF0gPSB7MH07CisgICAgICAgICAgICBpbnQgY21kbGluZV9mZCA9IDA7CisKKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIlVuYWJsZSB0byBvcGVuIHN5c3RlbS13aWRlIG1hcmtlciBmaWxlLiIpOworICAgICAgICAgICAgc25wcmludGYoY21kbGluZV9wYXRoLCBQQVRIX01BWCAtIDEsICIvcHJvYy8lZC9jbWRsaW5lIiwgbXlfcGlkKTsKKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIkNNRCBmaWxlOiAlc1xuIiwgY21kbGluZV9wYXRoKTsKKyAgICAgICAgICAgIGNtZGxpbmVfZmQgPSBvcGVuKGNtZGxpbmVfcGF0aCwgT19SRE9OTFkpOworICAgICAgICAgICAgaWYgKGNtZGxpbmVfZmQgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIG9wZW4gJXMgZmlsZSEiLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IHJlYWQoY21kbGluZV9mZCwgcGFja2FnZV9uYW1lLCBQQVRIX01BWCAtIDEpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gcmVhZCAlcyBmaWxlISIsIGNtZGxpbmVfcGF0aCk7CisgICAgICAgICAgICAgICAgcmVzID0gY2xvc2UoY21kbGluZV9mZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBjbG9zZSAlcyBmaWxlISIsIGNtZGxpbmVfcGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IGNsb3NlKGNtZGxpbmVfZmQpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gY2xvc2UgJXMgZmlsZSEiLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIlBhY2thZ2UgbmFtZTogJXNcbiIsIHBhY2thZ2VfbmFtZSk7CisgICAgICAgICAgICBzbnByaW50ZihhcHBfc2FuZGJveF9maWxlLCBQQVRIX01BWCAtIDEsICIvZGF0YS9kYXRhLyVzL2NvbS5pbnRlbC5pdHQuY29sbGVjdG9yX2xpYiIsIHBhY2thZ2VfbmFtZSk7CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJMaWIgbWFya2VyIGZpbGUgbmFtZTogJXNcbiIsIGFwcF9zYW5kYm94X2ZpbGUpOworICAgICAgICAgICAgaXR0X21hcmtlcl9maWxlX2ZkID0gb3BlbihhcHBfc2FuZGJveF9maWxlLCBPX1JET05MWSk7CisgICAgICAgICAgICBpZiAoaXR0X21hcmtlcl9maWxlX2ZkID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBvcGVuIGFwcCBtYXJrZXIgZmlsZSEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGl0dF9saWJfbmFtZVtQQVRIX01BWF0gPSB7MH07CisKKyAgICAgICAgICAgIHJlcyA9IHJlYWQoaXR0X21hcmtlcl9maWxlX2ZkLCBpdHRfbGliX25hbWUsIFBBVEhfTUFYIC0gMSk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byByZWFkICVzIGZpbGUhIiwgaXR0X21hcmtlcl9maWxlX2ZkKTsKKyAgICAgICAgICAgICAgICByZXMgPSBjbG9zZShpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gY2xvc2UgJXMgZmlsZSEiLCBpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJJVFQgTGliIHBhdGg6ICVzIiwgaXR0X2xpYl9uYW1lKTsKKyAgICAgICAgICAgIHJlcyA9IGNsb3NlKGl0dF9tYXJrZXJfZmlsZV9mZCk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBjbG9zZSAlcyBmaWxlISIsIGl0dF9tYXJrZXJfZmlsZV9mZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiU2V0IGVudiIpOworICAgICAgICAgICAgcmVzID0gc2V0ZW52KElUVF9UT19TVFIoTElCX1ZBUl9OQU1FKSwgaXR0X2xpYl9uYW1lLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIHNldCBlbnYgdmFyISIpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpYl9uYW1lID0gX19pdHRfZ2V0X2Vudl92YXIoSVRUX1RPX1NUUihMSUJfVkFSX05BTUUpKTsKKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIklUVCBMaWIgcGF0aCBmcm9tIGVudjogJXMiLCBpdHRfbGliX25hbWUpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gbGliX25hbWU7Cit9CisKKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLGIpIChhKSA8IChiKSA/IChhKSA6IChiKQorI2VuZGlmIC8qIG1pbiAqLworCitzdGF0aWMgX19pdHRfZ3JvdXBfaWQgX19pdHRfZ2V0X2dyb3Vwcyh2b2lkKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIF9faXR0X2dyb3VwX2lkIHJlcyA9IF9faXR0X2dyb3VwX25vbmU7CisgICAgY29uc3QgY2hhciogdmFyX25hbWUgID0gIklOVEVMX0lUVE5PVElGWV9HUk9VUFMiOworICAgIGNvbnN0IGNoYXIqIGdyb3VwX3N0ciA9IF9faXR0X2dldF9lbnZfdmFyKHZhcl9uYW1lKTsKKworICAgIGlmIChncm91cF9zdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGNoYXIgZ3JbMjU1XTsKKyAgICAgICAgY29uc3QgY2hhciogY2h1bms7CisgICAgICAgIHdoaWxlICgoZ3JvdXBfc3RyID0gX19pdHRfZnNwbGl0KGdyb3VwX3N0ciwgIiw7ICIsICZjaHVuaywgJmxlbikpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9faXR0X2ZzdHJjcHluKGdyLCBjaHVuaywgc2l6ZW9mKGdyKSAtIDEpOworICAgICAgICAgICAgZ3JbbWluKGxlbiwgKGludCkoc2l6ZW9mKGdyKSAtIDEpKV0gPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBncm91cF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX19pdHRfZnN0cmNtcChnciwgZ3JvdXBfbGlzdFtpXS5uYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IChfX2l0dF9ncm91cF9pZCkocmVzIHwgZ3JvdXBfbGlzdFtpXS5pZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBUT0RPOiAhISEgV29ya2Fyb3VuZCBmb3IgYnVnIHdpdGggd2FybmluZyBmb3IgdW5rbm93biBncm91cCAhISEKKyAgICAgICAgICogU2hvdWxkIGJlIGZpeGVkIGluIG5ldyBpbml0aWFsaXphdGlvbiBzY2hlbWUuCisgICAgICAgICAqIE5vdyB0aGUgZm9sbG93aW5nIGdyb3VwcyBzaG91bGQgYmUgc2V0IGFsd2F5cy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgZ3JvdXBfbGlzdFtpXS5pZCAhPSBfX2l0dF9ncm91cF9ub25lOyBpKyspCisgICAgICAgICAgICBpZiAoZ3JvdXBfbGlzdFtpXS5pZCAhPSBfX2l0dF9ncm91cF9hbGwgJiYKKyAgICAgICAgICAgICAgICBncm91cF9saXN0W2ldLmlkID4gX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWluICYmCisgICAgICAgICAgICAgICAgZ3JvdXBfbGlzdFtpXS5pZCA8IF9faXR0X2dyb3VwX3NwbGl0dGVyX21heCkKKyAgICAgICAgICAgICAgICByZXMgPSAoX19pdHRfZ3JvdXBfaWQpKHJlcyB8IGdyb3VwX2xpc3RbaV0uaWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBncm91cF9hbGlhc1tpXS5lbnZfdmFyICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgIGlmIChfX2l0dF9nZXRfZW52X3Zhcihncm91cF9hbGlhc1tpXS5lbnZfdmFyKSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBncm91cF9hbGlhc1tpXS5ncm91cHM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBfX2l0dF9saWJfdmVyc2lvbihsaWJfdCBsaWIpCit7CisgICAgaWYgKGxpYiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoX19pdHRfZ2V0X3Byb2MobGliLCAiX19pdHRfYXBpX2luaXQiKSkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKF9faXR0X2dldF9wcm9jKGxpYiwgIl9faXR0X2FwaV92ZXJzaW9uIikpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisvKiBJdCdzIG5vdCB1c2VkIHJpZ2h0IG5vdyEgQ29tbWVudCBpdCBvdXQgdG8gYXZvaWQgd2FybmluZ3MuCitzdGF0aWMgdm9pZCBfX2l0dF9yZWluaXRfYWxsX3BvaW50ZXJzKHZvaWQpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgLy8gRmlsbCBhbGwgcG9pbnRlcnMgd2l0aCBpbml0aWFsIHN0dWJzCisgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmluaXRfZnVuYzsKK30KKyovCisKK3N0YXRpYyB2b2lkIF9faXR0X251bGxpZnlfYWxsX3BvaW50ZXJzKHZvaWQpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgLyogTnVsaWZ5IGFsbCBwb2ludGVycyBleGNlcHQgZG9tYWluX2NyZWF0ZSBhbmQgc3RyaW5nX2hhbmRsZV9jcmVhdGUgKi8KKyAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU0KSAvKiB3YXJuaW5nIEM0MDU0OiAndHlwZSBjYXN0JyA6IGZyb20gZnVuY3Rpb24gcG9pbnRlciAnWFhYJyB0byBkYXRhIHBvaW50ZXIgJ3ZvaWQgKicgKi8KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU1KSAvKiB3YXJuaW5nIEM0MDU1OiAndHlwZSBjYXN0JyA6IGZyb20gZGF0YSBwb2ludGVyICd2b2lkIConIHRvIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX0VYVEVSTl9DIHZvaWQgX05fKGZpbmlfaXR0bGliKSh2b2lkKQoreworICAgIF9faXR0X2FwaV9maW5pX3QqIF9faXR0X2FwaV9maW5pX3B0cjsKKyAgICBzdGF0aWMgdm9sYXRpbGUgVElEVCBjdXJyZW50X3RocmVhZCA9IDA7CisKKyAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VycmVudF90aHJlYWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgICAgICAgICAgICAgIF9faXR0X2FwaV9maW5pX3B0ciA9IChfX2l0dF9hcGlfZmluaV90Kikoc2l6ZV90KV9faXR0X2dldF9wcm9jKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliLCAiX19pdHRfYXBpX2ZpbmkiKTsKKyAgICAgICAgICAgICAgICBpZiAoX19pdHRfYXBpX2ZpbmlfcHRyKQorICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfZmluaV9wdHIoJl9OXyhfaXR0YXBpX2dsb2JhbCkpOworCisgICAgICAgICAgICAgICAgX19pdHRfbnVsbGlmeV9hbGxfcG9pbnRlcnMoKTsKKworIC8qIFRPRE86ICEhISBub3Qgc2FmZSAhISEgZG9uJ3Qgc3VwcG9ydCB1bmxvYWQgc28gZmFyLgorICAqICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiAhPSBOVUxMKQorICAqICAgICAgICAgICAgICAgICBfX2l0dF91bmxvYWRfbGliKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliKTsKKyAgKiAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiA9IE5VTEw7CisgICovCisgICAgICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgPSAwOworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIH0KK30KKworSVRUX0VYVEVSTl9DIGludCBfTl8oaW5pdF9pdHRsaWIpKGNvbnN0IGNoYXIqIGxpYl9uYW1lLCBfX2l0dF9ncm91cF9pZCBpbml0X2dyb3VwcykKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cHM7CisjaWZkZWYgSVRUX0NPTVBMRVRFX0dST1VQCisgICAgX19pdHRfZ3JvdXBfaWQgemVyb19ncm91cCA9IF9faXR0X2dyb3VwX25vbmU7CisjZW5kaWYgLyogSVRUX0NPTVBMRVRFX0dST1VQICovCisgICAgc3RhdGljIHZvbGF0aWxlIFRJRFQgY3VycmVudF90aHJlYWQgPSAwOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCkKKyAgICB7CisjaWZuZGVmIElUVF9TSU1QTEVfSU5JVAorICAgICAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKworICAgICAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VycmVudF90aHJlYWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9IGN1cnJlbnRfdGhyZWFkOworICAgICAgICAgICAgICAgIGlmIChsaWJfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBsaWJfbmFtZSA9IF9faXR0X2dldF9saWJfbmFtZSgpOworICAgICAgICAgICAgICAgIGdyb3VwcyA9IF9faXR0X2dldF9ncm91cHMoKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzICE9IF9faXR0X2dyb3VwX25vbmUgfHwgbGliX25hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkubGliID0gX19pdHRfbG9hZF9saWIoKGxpYl9uYW1lID09IE5VTEwpID8gaXR0bm90aWZ5X2xpYl9uYW1lIDogbGliX25hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfaW5pdF90KiBfX2l0dF9hcGlfaW5pdF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGliX3ZlcnNpb24gPSBfX2l0dF9saWJfdmVyc2lvbihfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobGliX3ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMgPSBfX2l0dF9ncm91cF9sZWdhY3k7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsbCBhbGwgcG9pbnRlcnMgZnJvbSBkeW5hbWljIGxpYnJhcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5ncm91cCAmIGdyb3VwcyAmIGluaXRfZ3JvdXBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSAodm9pZCopX19pdHRfZ2V0X3Byb2MoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIsIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgcG9pbnRlcnMgZm9yIGZ1bmN0aW9uIHdpdGggc3RhdGljIGltcGxlbWVudGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9ub19zeW1ib2wsIGxpYl9uYW1lLCBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lKTsKKyNpZmRlZiBJVFRfQ09NUExFVEVfR1JPVVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvX2dyb3VwID0gKF9faXR0X2dyb3VwX2lkKSh6ZXJvX2dyb3VwIHwgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXApOworI2VuZGlmIC8qIElUVF9DT01QTEVURV9HUk9VUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzID09IF9faXR0X2dyb3VwX2xlZ2FjeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgdG9vbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkgID0gSVRUTk9USUZZX05BTUUodGhyX2lnbm9yZSk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlQSkgICA9IElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGVXKSAgID0gSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZVcpOworI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZSkgICAgPSBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19wcmVwYXJlKSAgID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcHJlcGFyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY2FuY2VsKSAgICA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2NhbmNlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfYWNxdWlyZWQpICA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2FjcXVpcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19yZWxlYXNpbmcpID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcmVsZWFzaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBJVFRfQ09NUExFVEVfR1JPVVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmdyb3VwICYgemVyb19ncm91cCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKKyNlbmRpZiAvKiBJVFRfQ09NUExFVEVfR1JPVVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfaW5pdF9wdHIgPSAoX19pdHRfYXBpX2luaXRfdCopKHNpemVfdClfX2l0dF9nZXRfcHJvYyhfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiwgIl9faXR0X2FwaV9pbml0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9faXR0X2FwaV9pbml0X3B0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfYXBpX2luaXRfcHRyKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBpbml0X2dyb3Vwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfbm9fbW9kdWxlLCBsaWJfbmFtZSwKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zeXN0ZW1fZXJyb3IoKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsZXJyb3IoKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCA9IDE7CisgICAgICAgICAgICAgICAgY3VycmVudF90aHJlYWQgPSAwOworICAgICAgICAgICAgICAgIC8qICEhISBKdXN0IHRvIGF2b2lkIHVudXNlZCBjb2RlIGVsaW1pbmF0aW9uICEhISAqLworICAgICAgICAgICAgICAgIGlmIChfX2l0dF9maW5pX2l0dGxpYl9wdHIgPT0gX05fKGZpbmlfaXR0bGliKSkgY3VycmVudF90aHJlYWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCisgICAgICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisgICAgfQorCisgICAgLyogRXZhbHVhdGluZyBpZiBhbnkgZnVuY3Rpb24gcHRyIGlzIG5vbiBlbXB0eSBhbmQgaXQncyBpbiBpbml0X2dyb3VwcyAqLworICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICBpZiAoKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyICE9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYyAmJgorICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXAgJiBpbml0X2dyb3VwcykKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitJVFRfRVhURVJOX0MgX19pdHRfZXJyb3JfaGFuZGxlcl90KiBfTl8oc2V0X2Vycm9yX2hhbmRsZXIpKF9faXR0X2Vycm9yX2hhbmRsZXJfdCogaGFuZGxlcikKK3sKKyAgICBfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIHByZXYgPSAoX19pdHRfZXJyb3JfaGFuZGxlcl90Kikoc2l6ZV90KV9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlcjsKKyAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXIgPSAodm9pZCopKHNpemVfdCloYW5kbGVyOworICAgIHJldHVybiBwcmV2OworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5oIGIvcmMzL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjE4Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaApAQCAtMCwwICsxLDMxNiBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiaXR0bm90aWZ5X2NvbmZpZy5oIgorCisjaWZuZGVmIElUVF9GT1JNQVRfREVGSU5FRAorIyAgaWZuZGVmIElUVF9GT1JNQVQKKyMgICAgZGVmaW5lIElUVF9GT1JNQVQKKyMgIGVuZGlmIC8qIElUVF9GT1JNQVQgKi8KKyMgIGlmbmRlZiBJVFRfTk9fUEFSQU1TCisjICAgIGRlZmluZSBJVFRfTk9fUEFSQU1TCisjICBlbmRpZiAvKiBJVFRfTk9fUEFSQU1TICovCisjZW5kaWYgLyogSVRUX0ZPUk1BVF9ERUZJTkVEICovCisKKy8qCisgKiBwYXJhbWV0ZXJzIGZvciBtYWNybyBleHBlY3RlZDoKKyAqIElUVF9TVFVCKGFwaSwgdHlwZSwgZnVuY19uYW1lLCBhcmd1bWVudHMsIHBhcmFtcywgZnVuY19uYW1lX2luX2RsbCwgZ3JvdXAsIHByaW50Zl9mbXQpCisgKi8KKyNpZmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgZG9tYWluX2NyZWF0ZUEsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2RvbWFpbiosIGRvbWFpbl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBkb21haW5fY3JlYXRlVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIGRvbWFpbl9jcmVhdGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHN0cmluZ19oYW5kbGVfY3JlYXRlQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgc3RyaW5nX2hhbmRsZV9jcmVhdGVXLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIHBhdXNlLCAgX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVzdW1lLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgcmVzdW1lLCBfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHRocmVhZF9zZXRfbmFtZUEsIF9faXR0X2dyb3VwX3RocmVhZCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCB0aHJlYWRfc2V0X25hbWVXLCBfX2l0dF9ncm91cF90aHJlYWQsICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgdGhyZWFkX3NldF9uYW1lLCAgX19pdHRfZ3JvdXBfdGhyZWFkLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9pZ25vcmUsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCB0aHJlYWRfaWdub3JlLCBfX2l0dF9ncm91cF90aHJlYWQsICJubyBhcmdzIikKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICB0aHJfbmFtZV9zZXRBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgdGhyX25hbWVfc2V0QSwgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIHRocl9uYW1lX3NldFcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCB0aHJfbmFtZV9zZXRXLCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVTXCIsICVkIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgdGhyX25hbWVfc2V0LCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIHRocl9uYW1lX3NldCwgIF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJXNcIiwgJWQiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgdGhyX2lnbm9yZSwgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgICAgdGhyX2lnbm9yZSwgICAgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBlbmFibGVfYXR0YWNoLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgZW5hYmxlX2F0dGFjaCwgX19pdHRfZ3JvdXBfYWxsLCAibm8gYXJncyIpCisKKyNlbHNlICAvKiBfX0lUVF9JTlRFUk5BTF9JTklUICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX2NyZWF0ZUEsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfY3JlYXRlVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJVNcIiwgXCIlU1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgYWRkciwgbmFtZSksIHN5bmNfcmVuYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgYWRkciwgbmFtZSksIHN5bmNfcmVuYW1lVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19jcmVhdGUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiLCBcIiVzXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBuYW1lKSwgc3luY19yZW5hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfZGVzdHJveSwgICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19kZXN0cm95LCAgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19wcmVwYXJlLCAgICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NhbmNlbCwgICAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfY2FuY2VsLCAgICBfX2l0dF9ncm91cF9zeW5jLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfYWNxdWlyZWQsICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX3N5bmMsICAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZWxlYXNpbmcsICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX3B1c2gsICAgICAgICh1bnNpZ25lZCBpbnQgbWFzayksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBtYXNrKSwgc3VwcHJlc3NfcHVzaCwgIF9faXR0X2dyb3VwX3N1cHByZXNzLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX3BvcCwgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgc3VwcHJlc3NfcG9wLCAgIF9faXR0X2dyb3VwX3N1cHByZXNzLCAgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfbWFya19yYW5nZSwgKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSwoSVRUX0ZPUk1BVCBtb2RlLCBtYXNrLCBhZGRyZXNzLCBzaXplKSwgc3VwcHJlc3NfbWFya19yYW5nZSwgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICIlZCwgJXAsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19jbGVhcl9yYW5nZSwoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpLChJVFRfRk9STUFUIG1vZGUsIG1hc2ssIGFkZHJlc3MsIHNpemUpLCBzdXBwcmVzc19jbGVhcl9yYW5nZSxfX2l0dF9ncm91cF9zdXBwcmVzcywgIiVkLCAlcCwgJXAsICVkIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcHJlcGFyZSwgICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19jYW5jZWwsICAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfY2FuY2VsLCAgICBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX2FjcXVpcmVkLCAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcmVsZWFzaW5nLCAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW4sICAgICAgICAgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSksIChJVFRfRk9STUFUIHNpdGUsIGluc3RhbmNlLCBuYW1lKSwgbW9kZWxfc2l0ZV9iZWdpbiwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZCwgICAgICAgICAgICAoX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UpLCAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBzaXRlLCBpbnN0YW5jZSksICAgICAgIG1vZGVsX3NpdGVfZW5kLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW4sICAgICAgICAgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSksIChJVFRfRk9STUFUIHRhc2ssIGluc3RhbmNlLCBuYW1lKSwgbW9kZWxfdGFza19iZWdpbiwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZCwgICAgICAgICAgICAoX19pdHRfbW9kZWxfdGFzayAqdGFzaywgX19pdHRfbW9kZWxfdGFza19pbnN0YW5jZSAqaW5zdGFuY2UpLCAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCB0YXNrLCBpbnN0YW5jZSksICAgICAgIG1vZGVsX3Rhc2tfZW5kLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZSwgICAgICAgICh2b2lkICpsb2NrKSwgKElUVF9GT1JNQVQgbG9jayksIG1vZGVsX2xvY2tfYWNxdWlyZSwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX3JlbGVhc2UsICAgICAgICAodm9pZCAqbG9jayksIChJVFRfRk9STUFUIGxvY2spLCBtb2RlbF9sb2NrX3JlbGVhc2UsIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVjb3JkX2FsbG9jYXRpb24sICAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24sICh2b2lkICphZGRyKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGFkZHIpLCAgICAgICBtb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2luZHVjdGlvbl91c2VzLCAgICAgICh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtb2RlbF9pbmR1Y3Rpb25fdXNlcywgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWR1Y3Rpb25fdXNlcywgICAgICAodm9pZCogYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbW9kZWxfcmVkdWN0aW9uX3VzZXMsICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfb2JzZXJ2ZV91c2VzLCAgICAgICAgKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX29ic2VydmVfdXNlcywgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2NsZWFyX3VzZXMsICAgICAgICAgICh2b2lkKiBhZGRyKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGFkZHIpLCAgICAgICBtb2RlbF9jbGVhcl91c2VzLCAgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luVywgICAgICAgICAoY29uc3Qgd2NoYXJfdCAqbmFtZSksICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfc2l0ZV9iZWdpblcsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpblcsICAgICAgICAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX3Rhc2tfYmVnaW5XLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrVywgICAgIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF9pdGVyYXRpb25fdGFza1csICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luQSwgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfc2l0ZV9iZWdpbkEsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbkFMLCAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF9zaXRlX2JlZ2luQUwsICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luQSwgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfdGFza19iZWdpbkEsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbkFMLCAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF90YXNrX2JlZ2luQUwsICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0EsICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBLCAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCwgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF9pdGVyYXRpb25fdGFza0FMLCBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9lbmRfMiwgICAgICAgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgIG1vZGVsX3NpdGVfZW5kXzIsICAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZF8yLCAgICAgICAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgbW9kZWxfdGFza19lbmRfMiwgICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZV8yLCAgICAgICh2b2lkICpsb2NrKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGxvY2spLCAgICAgICBtb2RlbF9sb2NrX2FjcXVpcmVfMiwgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfcmVsZWFzZV8yLCAgICAgICh2b2lkICpsb2NrKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGxvY2spLCAgICAgICBtb2RlbF9sb2NrX3JlbGVhc2VfMiwgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2FnZ3JlZ2F0ZV90YXNrLCAgICAgIChzaXplX3QgY291bnQpLCAgICAgICAgICAgIChJVFRfRk9STUFUIGNvdW50KSwgICAgICBtb2RlbF9hZ2dyZWdhdGVfdGFzaywgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcHVzaCwgICAgICAgIChfX2l0dF9tb2RlbF9kaXNhYmxlIHgpLCAgIChJVFRfRk9STUFUIHgpLCAgICAgICAgICBtb2RlbF9kaXNhYmxlX3B1c2gsICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcG9wLCAgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICBtb2RlbF9kaXNhYmxlX3BvcCwgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgX19pdHRfZ3JvdXBfaGVhcCwgIlwiJXNcIiwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfaGVhcF9mdW5jdGlvbiwgaGVhcF9mdW5jdGlvbl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgaGVhcF9mdW5jdGlvbl9jcmVhdGVXLCBfX2l0dF9ncm91cF9oZWFwLCAiXCIlc1wiLCBcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2hlYXAsICJcIiVzXCIsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9iZWdpbiwgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgICAgICAgICAgICAgKElUVF9GT1JNQVQgaCwgc2l6ZSwgaW5pdGlhbGl6ZWQpLCAgICAgICBoZWFwX2FsbG9jYXRlX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9lbmQsICAgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiogYWRkciwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCksIChJVFRfRk9STUFUIGgsIGFkZHIsIHNpemUsIGluaXRpYWxpemVkKSwgaGVhcF9hbGxvY2F0ZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfYmVnaW4sICAgICAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyKSwgKElUVF9GT1JNQVQgaCwgYWRkciksIGhlYXBfZnJlZV9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfZW5kLCAgICAgICAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyKSwgKElUVF9GT1JNQVQgaCwgYWRkciksIGhlYXBfZnJlZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaCwgYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKSwgICAgICAgICAgIGhlYXBfcmVhbGxvY2F0ZV9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfZW5kLCAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyLCB2b2lkKiogbmV3X2FkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgKElUVF9GT1JNQVQgaCwgYWRkciwgbmV3X2FkZHIsIG5ld19zaXplLCBpbml0aWFsaXplZCksIGhlYXBfcmVhbGxvY2F0ZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4sICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kLCAgICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kLCAgICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3Jlc2V0X2RldGVjdGlvbiwgKHVuc2lnbmVkIGludCByZXNldF9tYXNrKSwgIChJVFRfRk9STUFUIHJlc2V0X21hc2spLCBoZWFwX3Jlc2V0X2RldGVjdGlvbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiV1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkLCAgICAgICAgICAodW5zaWduZWQgaW50IHJlY29yZF9tYXNrKSwgKElUVF9GT1JNQVQgcmVjb3JkX21hc2spLCAgaGVhcF9yZWNvcmQsICAgICAgICBfX2l0dF9ncm91cF9oZWFwLCAiJXUiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9jcmVhdGUsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksIGlkX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCBpZF9kZXN0cm95LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKKworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90aW1lc3RhbXAsIGdldF90aW1lc3RhbXAsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBnZXRfdGltZXN0YW1wLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAibm8gYXJncyIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9iZWdpbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgcmVnaW9uX2JlZ2luLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9lbmQsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksICAgICAgICAgICAgICAgcmVnaW9uX2VuZCwgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbl92MywgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgICAgICAgICAgICAgZnJhbWVfYmVnaW5fdjMsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfZW5kX3YzLCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksICAgICAgICAgICAgIGZyYW1lX2VuZF92MywgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX3N1Ym1pdF92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGJlZ2luLCBlbmQpLCBmcmFtZV9zdWJtaXRfdjMsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19ncm91cCwgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIG5hbWUpLCB0YXNrX2dyb3VwLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW4sICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgbmFtZSksIHRhc2tfYmVnaW4sICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCB2b2lkKiBmbiksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBmbiksICAgdGFza19iZWdpbl9mbiwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4pLCAgICAgICAgICAgICAgICAgICB0YXNrX2VuZCwgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX3YzLCAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgbmFtZSksICAgICAgICBjb3VudGVyX2luY192MywgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhX3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSksIChJVFRfRk9STUFUIGRvbWFpbiwgbmFtZSwgdmFsdWUpLCBjb3VudGVyX2luY19kZWx0YV92MywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtYXJrZXIsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgbmFtZSwgc2NvcGUpLCBtYXJrZXIsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlZCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX2FkZCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCB0eXBlLCBjb3VudCwgZGF0YSksIG1ldGFkYXRhX2FkZCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVkLCAlbHUsICVwIikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRBLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkVywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVwLCAlbHUiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZCwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCksICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlcCwgJWx1IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpLCAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIHJlbGF0aW9uLCB0YWlsKSwgICAgICAgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgKElUVF9GT1JNQVQgZG9tYWluLCBoZWFkLCByZWxhdGlvbiwgdGFpbCksIHJlbGF0aW9uX2FkZCwgICAgICAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJXAiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCBldmVudF9jcmVhdGVBLCBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgZXZlbnRfY3JlYXRlVywgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJVNcIiwgJWQiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIGV2ZW50X2NyZWF0ZSwgIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVzXCIsICVkIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgZXZlbnRfc3RhcnQsICAgICAgICAgIChfX2l0dF9ldmVudCBldmVudCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGV2ZW50KSwgICAgICAgICBldmVudF9zdGFydCwgICBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICBldmVudF9lbmQsICAgICAgICAgICAgKF9faXR0X2V2ZW50IGV2ZW50KSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZXZlbnQpLCAgICAgICAgIGV2ZW50X2VuZCwgICAgIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlZCIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWVBLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlc1wiLCBcIiVzXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlU1wiLCBcIiVTXCIsICV4IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZUEsICh2b2lkICpwLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBwLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpLCBub3RpZnlfc3luY19uYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJXNcIiwgJWQsIFwiJXNcIiwgJWQsICV4IikKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lVywgKHZvaWQgKnAsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIHAsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSksIG5vdGlmeV9zeW5jX25hbWVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlU1wiLCAlZCwgXCIlU1wiLCAlZCwgJXgiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWUsICAodm9pZCAqcCwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgcCwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKSwgbm90aWZ5X3N5bmNfbmFtZSwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCBcIiVzXCIsICVkLCBcIiVzXCIsICVkLCAleCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3ByZXBhcmUsICAgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfcHJlcGFyZSwgICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19jYW5jZWwsICAgICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX2NhbmNlbCwgICAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfYWNxdWlyZWQsICAodm9pZCAqcCksIChJVFRfRk9STUFUIHApLCBub3RpZnlfc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwIikKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3JlbGVhc2luZywgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfcmVsZWFzaW5nLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfcmVhZCwgICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3JlYWQsICAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfd3JpdGUsICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3dyaXRlLCAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfdXBkYXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3VwZGF0ZSwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCisKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfc3RhdGVfdCwgICAgIHN0YXRlX2dldCwgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICBzdGF0ZV9nZXQsICAgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCAgICAgc3RhdGVfc2V0LCAgICAoX19pdHRfc3RhdGVfdCBzKSwgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgcyksICAgIHN0YXRlX3NldCwgICAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9vYmpfc3RhdGVfdCwgb2JqX21vZGVfc2V0LCAoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKSwgKElUVF9GT1JNQVQgcCwgcyksIG9ial9tb2RlX3NldCwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQsICVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfdGhyX3N0YXRlX3QsIHRocl9tb2RlX3NldCwgKF9faXR0X3Rocl9wcm9wX3QgcCwgX19pdHRfdGhyX3N0YXRlX3QgcyksIChJVFRfRk9STUFUIHAsIHMpLCB0aHJfbW9kZV9zZXQsIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkLCAlZCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIGRvbWFpbiksIGZyYW1lX2NyZWF0ZUEsIF9faXR0X2dyb3VwX2ZyYW1lLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpkb21haW4pLCAoSVRUX0ZPUk1BVCBkb21haW4pLCBmcmFtZV9jcmVhdGVXLCBfX2l0dF9ncm91cF9mcmFtZSwgIlwiJXNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgZG9tYWluKSwgZnJhbWVfY3JlYXRlLCAgX19pdHRfZ3JvdXBfZnJhbWUsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2JlZ2luLCAgICAgICAgIChfX2l0dF9mcmFtZSBmcmFtZSksICAgICAoSVRUX0ZPUk1BVCBmcmFtZSksICBmcmFtZV9iZWdpbiwgICBfX2l0dF9ncm91cF9mcmFtZSwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZCwgICAgICAgICAgIChfX2l0dF9mcmFtZSBmcmFtZSksICAgICAoSVRUX0ZPUk1BVCBmcmFtZSksICBmcmFtZV9lbmQsICAgICBfX2l0dF9ncm91cF9mcmFtZSwgIiVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGNvdW50ZXJfY3JlYXRlQSwgX19pdHRfZ3JvdXBfY291bnRlciwgIlwiJXNcIiwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgY291bnRlcl9jcmVhdGVXLCBfX2l0dF9ncm91cF9jb3VudGVyLCAiXCIlc1wiLCBcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBjb3VudGVyX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2NvdW50ZXIsICJcIiVzXCIsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9kZXN0cm95LCAgIChfX2l0dF9jb3VudGVyIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBpZCksICAgICAgICBjb3VudGVyX2Rlc3Ryb3ksICAgX19pdHRfZ3JvdXBfY291bnRlciwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jLCAgICAgICAoX19pdHRfY291bnRlciBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaWQpLCAgICAgICAgY291bnRlcl9pbmMsICAgICAgIF9faXR0X2dyb3VwX2NvdW50ZXIsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY19kZWx0YSwgKF9faXR0X2NvdW50ZXIgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSksIChJVFRfRk9STUFUIGlkLCB2YWx1ZSksIGNvdW50ZXJfaW5jX2RlbHRhLCBfX2l0dF9ncm91cF9jb3VudGVyLCAiJXAsICVsdSIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgbWFya19jcmVhdGVBLCBfX2l0dF9ncm91cF9tYXJrLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIG1hcmtfY3JlYXRlVywgX19pdHRfZ3JvdXBfbWFyaywgIlwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBtYXJrX2NyZWF0ZSwgIF9faXR0X2dyb3VwX21hcmssICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya0EsICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya0EsIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya1csICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya1csIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFyaywgICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFyaywgIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpLCAoSVRUX0ZPUk1BVCBtdCksIG1hcmtfb2ZmLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQiKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbEEsIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrX2dsb2JhbEEsIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWxXLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya19nbG9iYWxXLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfZ2xvYmFsLCAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtfZ2xvYmFsLCAgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVTXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbF9vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpLCAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIG10KSwgICAgICAgICAgICBtYXJrX2dsb2JhbF9vZmYsIF9faXR0X2dyb3VwX21hcmssICIlZCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jYWxsZXIsIHN0YWNrX2NhbGxlcl9jcmVhdGUsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBzdGFja19jYWxsZXJfY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3RpdGNoLCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVyX2Rlc3Ryb3ksIChfX2l0dF9jYWxsZXIgaWQpLCAoSVRUX0ZPUk1BVCBpZCksIHN0YWNrX2NhbGxlcl9kZXN0cm95LCBfX2l0dF9ncm91cF9zdGl0Y2gsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfZW50ZXIsICAgKF9faXR0X2NhbGxlciBpZCksIChJVFRfRk9STUFUIGlkKSwgc3RhY2tfY2FsbGVlX2VudGVyLCAgIF9faXR0X2dyb3VwX3N0aXRjaCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlZV9sZWF2ZSwgICAoX19pdHRfY2FsbGVyIGlkKSwgKElUVF9GT1JNQVQgaWQpLCBzdGFja19jYWxsZWVfbGVhdmUsICAgX19pdHRfZ3JvdXBfc3RpdGNoLCAiJXAiKQorCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF9jbG9ja19kb21haW4qLCBjbG9ja19kb21haW5fY3JlYXRlLCAoX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm4sIHZvaWQqIGZuX2RhdGEpLCAoSVRUX0ZPUk1BVCBmbiwgZm5fZGF0YSksIGNsb2NrX2RvbWFpbl9jcmVhdGUsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCAgICAgICAgICAgICAgICBjbG9ja19kb21haW5fcmVzZXQsICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgIGNsb2NrX2RvbWFpbl9yZXNldCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfY3JlYXRlX2V4LCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIGlkX2NyZWF0ZV9leCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveV9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIGlkX2Rlc3Ryb3lfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBuYW1lKSwgdGFza19iZWdpbl9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2ZuX2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKSwgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCwgcGFyZW50aWQsIGZuKSwgdGFza19iZWdpbl9mbl9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9leCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wKSwgdGFza19lbmRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCwgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgdGFza19iZWdpbl9vdmVybGFwcGVkLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBuYW1lKSwgdGFza19iZWdpbl9vdmVybGFwcGVkX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksIHRhc2tfZW5kX292ZXJsYXBwZWQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfb3ZlcmxhcHBlZF9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyX2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCwgbmFtZSwgc2NvcGUpLCBtYXJrZXJfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSksIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgdHlwZSwgY291bnQsIGRhdGEpLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJWQsICVsdSwgJXAiKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBzY29wZSwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWQsICVwLCAlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCksIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJXAsICVsdSIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVwLCAlbHUiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgcmVsYXRpb24sIHRhaWwpLCAgICAgICByZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVkLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX2V4LCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaGVhZCwgcmVsYXRpb24sIHRhaWwpLCByZWxhdGlvbl9hZGRfZXgsICAgICAgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWQsICVsdSIpCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF90cmFja19ncm91cCosIHRyYWNrX2dyb3VwX2NyZWF0ZSwgKF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX2dyb3VwX3R5cGUgdHJhY2tfZ3JvdXBfdHlwZSksICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lLCB0cmFja19ncm91cF90eXBlKSwgICAgICAgIHRyYWNrX2dyb3VwX2NyZWF0ZSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkIikKK0lUVF9TVFVCKElUVEFQSSwgIF9faXR0X3RyYWNrKiwgICAgICAgdHJhY2tfY3JlYXRlLCAgICAgICAoX19pdHRfdHJhY2tfZ3JvdXAqIHRyYWNrX2dyb3VwLF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX3R5cGUgdHJhY2tfdHlwZSksIChJVFRfRk9STUFUIHRyYWNrX2dyb3VwLCBuYW1lLCB0cmFja190eXBlKSwgdHJhY2tfY3JlYXRlLCAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsICAgICAgICAgICAgICAgc2V0X3RyYWNrLCAgICAgICAgICAoX19pdHRfdHJhY2sgKnRyYWNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHRyYWNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RyYWNrLCAgICAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorSVRUX1NUVUIoSVRUQVBJLCBjb25zdCBjaGFyKiwgYXBpX3ZlcnNpb24sICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBhcGlfdmVyc2lvbiwgX19pdHRfZ3JvdXBfYWxsICYgfl9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZUEsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmVBLCBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlc1wiLCAlZCIpCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZVcsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmVXLCBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlU1wiLCAlZCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZSwgICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmUsICBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlc1wiLCAlZCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfSU5JVCAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV90eXBlcy5oIGIvcmMzL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTVhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3R5cGVzLmgKQEAgLTAsMCArMSw2NyBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9JVFROT1RJRllfVFlQRVNfSF8KKyNkZWZpbmUgX0lUVE5PVElGWV9UWVBFU19IXworCit0eXBlZGVmIGVudW0gX19faXR0X2dyb3VwX2lkCit7CisgICAgX19pdHRfZ3JvdXBfbm9uZSAgICAgID0gMCwKKyAgICBfX2l0dF9ncm91cF9sZWdhY3kgICAgPSAxPDwwLAorICAgIF9faXR0X2dyb3VwX2NvbnRyb2wgICA9IDE8PDEsCisgICAgX19pdHRfZ3JvdXBfdGhyZWFkICAgID0gMTw8MiwKKyAgICBfX2l0dF9ncm91cF9tYXJrICAgICAgPSAxPDwzLAorICAgIF9faXR0X2dyb3VwX3N5bmMgICAgICA9IDE8PDQsCisgICAgX19pdHRfZ3JvdXBfZnN5bmMgICAgID0gMTw8NSwKKyAgICBfX2l0dF9ncm91cF9qaXQgICAgICAgPSAxPDw2LAorICAgIF9faXR0X2dyb3VwX21vZGVsICAgICA9IDE8PDcsCisgICAgX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWluID0gMTw8NywKKyAgICBfX2l0dF9ncm91cF9jb3VudGVyICAgPSAxPDw4LAorICAgIF9faXR0X2dyb3VwX2ZyYW1lICAgICA9IDE8PDksCisgICAgX19pdHRfZ3JvdXBfc3RpdGNoICAgID0gMTw8MTAsCisgICAgX19pdHRfZ3JvdXBfaGVhcCAgICAgID0gMTw8MTEsCisgICAgX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWF4ID0gMTw8MTIsCisgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlID0gMTw8MTIsCisgICAgX19pdHRfZ3JvdXBfc3VwcHJlc3MgPSAxPDwxMywKKyAgICBfX2l0dF9ncm91cF9hcnJheXMgICAgPSAxPDwxNCwKKyAgICBfX2l0dF9ncm91cF9hbGwgICAgICAgPSAtMQorfSBfX2l0dF9ncm91cF9pZDsKKworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9ncm91cF9saXN0Cit7CisgICAgX19pdHRfZ3JvdXBfaWQgaWQ7CisgICAgY29uc3QgY2hhciogICAgbmFtZTsKK30gX19pdHRfZ3JvdXBfbGlzdDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2RlZmluZSBJVFRfR1JPVVBfTElTVCh2YXJuYW1lKSBcCisgICAgc3RhdGljIF9faXR0X2dyb3VwX2xpc3QgdmFybmFtZVtdID0geyAgICAgICBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfYWxsLCAgICAgICAiYWxsIiAgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfY29udHJvbCwgICAiY29udHJvbCIgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfdGhyZWFkLCAgICAidGhyZWFkIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbWFyaywgICAgICAibWFyayIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3luYywgICAgICAic3luYyIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfZnN5bmMsICAgICAiZnN5bmMiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfaml0LCAgICAgICAiaml0IiAgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbW9kZWwsICAgICAibW9kZWwiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfY291bnRlciwgICAiY291bnRlciIgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfZnJhbWUsICAgICAiZnJhbWUiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3RpdGNoLCAgICAic3RpdGNoIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfaGVhcCwgICAgICAiaGVhcCIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAic3RydWN0dXJlIiB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICAic3VwcHJlc3MiICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfYXJyYXlzLCAgICAiYXJyYXlzIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbm9uZSwgICAgICBOVUxMICAgICAgICB9ICBcCisgICAgfQorCisjZW5kaWYgLyogX0lUVE5PVElGWV9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2xlZ2FjeS9pdHRub3RpZnkuaCBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9sZWdhY3kvaXR0bm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjMmMwYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9sZWdhY3kvaXR0bm90aWZ5LmgKQEAgLTAsMCArMSw5NzIgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTEVHQUNZX0lUVE5PVElGWV9IXworI2RlZmluZSBfTEVHQUNZX0lUVE5PVElGWV9IXworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgTGVnYWN5IFVzZXIgQVBJIGZ1bmN0aW9ucyBhbmQgdHlwZXMKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSVRUX09TX1dJTgorIyAgZGVmaW5lIElUVF9PU19XSU4gICAxCisjZW5kaWYgLyogSVRUX09TX1dJTiAqLworCisjaWZuZGVmIElUVF9PU19MSU5VWAorIyAgZGVmaW5lIElUVF9PU19MSU5VWCAyCisjZW5kaWYgLyogSVRUX09TX0xJTlVYICovCisKKyNpZm5kZWYgSVRUX09TX01BQworIyAgZGVmaW5lIElUVF9PU19NQUMgICAzCisjZW5kaWYgLyogSVRUX09TX01BQyAqLworCisjaWZuZGVmIElUVF9PUworIyAgaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIF9XSU4zMgorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19XSU4KKyMgIGVsaWYgZGVmaW5lZCggX19BUFBMRV9fICkgJiYgZGVmaW5lZCggX19NQUNIX18gKQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTElOVVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX09TICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1dJTgorIyAgZGVmaW5lIElUVF9QTEFURk9STV9XSU4gMQorI2VuZGlmIC8qIElUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fUE9TSVggMgorI2VuZGlmIC8qIElUVF9QTEFURk9STV9QT1NJWCAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9NQUMKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fTUFDIDMKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fTUFDICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNCisjICBpZiBJVFRfT1M9PUlUVF9PU19XSU4KKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fV0lOCisjICBlbGlmIElUVF9PUz09SVRUX09TX01BQworIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNICovCisKKyNpZiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChVTklDT0RFKQorI2RlZmluZSBVTklDT0RFCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2luY2x1ZGUgPHRjaGFyLmg+CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIENERUNMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIENERUNMIF9fY2RlY2wKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIENERUNMIF9fYXR0cmlidXRlX18gKChjZGVjbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgQ0RFQ0wgLyogYWN0dWFsIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIENERUNMICovCisKKyNpZm5kZWYgU1REQ0FMTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBTVERDQUxMIF9fc3RkY2FsbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgU1REQ0FMTCBfX2F0dHJpYnV0ZV9fICgoc3RkY2FsbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgU1REQ0FMTCAvKiBzdXBwb3J0ZWQgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogU1REQ0FMTCAqLworCisjZGVmaW5lIElUVEFQSSAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUEkgQ0RFQ0wKKworLyogVE9ETzogVGVtcG9yYXJ5IGZvciBjb21wYXRpYmlsaXR5ISAqLworI2RlZmluZSBJVFRBUElfQ0FMTCAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUElfQ0FMTCBDREVDTAorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisvKiB1c2UgX19mb3JjZWlubGluZSAoVkMrKyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgX19mb3JjZWlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSAvKiBub3RoaW5nICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKgorICogR2VuZXJhbGx5LCBmdW5jdGlvbnMgYXJlIG5vdCBpbmxpbmVkIHVubGVzcyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWVkLgorICogRm9yIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbmxpbmUsIHRoaXMgYXR0cmlidXRlIGlubGluZXMgdGhlIGZ1bmN0aW9uIGV2ZW4KKyAqIGlmIG5vIG9wdGltaXphdGlvbiBsZXZlbCB3YXMgc3BlY2lmaWVkLgorICovCisjaWZkZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UgIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMgaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisvKiBIZWxwZXIgbWFjcm8gZm9yIGpvaW5pbmcgdG9rZW5zICovCisjZGVmaW5lIElUVF9KT0lOX0FVWChwLG4pIHAjI24KKyNkZWZpbmUgSVRUX0pPSU4ocCxuKSAgICAgSVRUX0pPSU5fQVVYKHAsbikKKworI2lmZGVmIElUVF9NQUpPUgorI3VuZGVmIElUVF9NQUpPUgorI2VuZGlmCisjaWZkZWYgSVRUX01JTk9SCisjdW5kZWYgSVRUX01JTk9SCisjZW5kaWYKKyNkZWZpbmUgSVRUX01BSk9SICAgICAzCisjZGVmaW5lIElUVF9NSU5PUiAgICAgMAorCisvKiBTdGFuZGFyZCB2ZXJzaW9uaW5nIG9mIGEgdG9rZW4gd2l0aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIElUVF9WRVJTSU9OSVpFKHgpICAgIFwKKyAgICBJVFRfSk9JTih4LCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKF8sICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oSVRUX01BSk9SLCAgICAgIFwKKyAgICBJVFRfSk9JTihfLCBJVFRfTUlOT1IpKSkpCisKKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BSRUZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QUkVGSVggX19pdHRfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BSRUZJWCAqLworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QT1NURklYIF9wdHJfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BPU1RGSVggKi8KKworI2RlZmluZSBJVFROT1RJRllfTkFNRV9BVVgobikgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCxuKQorI2RlZmluZSBJVFROT1RJRllfTkFNRShuKSAgICAgSVRUX1ZFUlNJT05JWkUoSVRUTk9USUZZX05BTUVfQVVYKElUVF9KT0lOKG4sSU5URUxfSVRUTk9USUZZX1BPU1RGSVgpKSkKKworI2RlZmluZSBJVFROT1RJRllfVk9JRChuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKQorI2RlZmluZSBJVFROT1RJRllfREFUQShuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKworI2lmZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUIKKyNlbmRpZgorI2lmZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCVgorI2VuZGlmCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlIChhcGkqIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSkgYXJnczsgICBcCisgICAgZXh0ZXJuIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSBJVFROT1RJRllfTkFNRShuYW1lKTsKKyNkZWZpbmUgSVRUX1NUVUIgSVRUX1NUVUJWCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3kgTGVnYWN5IEFQSQorICogQHsKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X2NvbnRyb2wgQ29sbGVjdGlvbiBDb250cm9sCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEdlbmVyYWwgYmVoYXZpb3I6IGFwcGxpY2F0aW9uIGNvbnRpbnVlcyB0byBydW4sIGJ1dCBubyBwcm9maWxpbmcgaW5mb3JtYXRpb24gaXMgYmVpbmcgY29sbGVjdGVkCisgKgorICogUGF1c2luZyBvY2N1cnMgbm90IG9ubHkgZm9yIHRoZSBjdXJyZW50IHRocmVhZCBidXQgZm9yIGFsbCBwcm9jZXNzIGFzIHdlbGwgYXMgc3Bhd25lZCBwcm9jZXNzZXMKKyAqIC0gSW50ZWwoUikgUGFyYWxsZWwgSW5zcGVjdG9yIGFuZCBJbnRlbChSKSBJbnNwZWN0b3IgWEU6CisgKiAgIC0gRG9lcyBub3QgYW5hbHl6ZSBvciByZXBvcnQgZXJyb3JzIHRoYXQgaW52b2x2ZSBtZW1vcnkgYWNjZXNzLgorICogICAtIE90aGVyIGVycm9ycyBhcmUgcmVwb3J0ZWQgYXMgdXN1YWwuIFBhdXNpbmcgZGF0YSBjb2xsZWN0aW9uIGluCisgKiAgICAgSW50ZWwoUikgUGFyYWxsZWwgSW5zcGVjdG9yIGFuZCBJbnRlbChSKSBJbnNwZWN0b3IgWEUKKyAqICAgICBvbmx5IHBhdXNlcyB0cmFjaW5nIGFuZCBhbmFseXppbmcgbWVtb3J5IGFjY2Vzcy4KKyAqICAgICBJdCBkb2VzIG5vdCBwYXVzZSB0cmFjaW5nIG9yIGFuYWx5emluZyB0aHJlYWRpbmcgQVBJcy4KKyAqICAgLgorICogLSBJbnRlbChSKSBQYXJhbGxlbCBBbXBsaWZpZXIgYW5kIEludGVsKFIpIFZUdW5lKFRNKSBBbXBsaWZpZXIgWEU6CisgKiAgIC0gRG9lcyBjb250aW51ZSB0byByZWNvcmQgd2hlbiBuZXcgdGhyZWFkcyBhcmUgc3RhcnRlZC4KKyAqICAgLgorICogLSBPdGhlciBlZmZlY3RzOgorICogICAtIFBvc3NpYmxlIHJlZHVjdGlvbiBvZiBydW50aW1lIG92ZXJoZWFkLgorICogICAuCisgKiBAeworICovCisjaWZuZGVmIF9JVFROT1RJRllfSF8KKy8qKiBAYnJpZWYgUGF1c2UgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcGF1c2Uodm9pZCk7CisvKiogQGJyaWVmIFJlc3VtZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9yZXN1bWUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgICh2b2lkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlc3VtZSwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfcGF1c2UgICAgICBJVFROT1RJRllfVk9JRChwYXVzZSkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICBJVFROT1RJRllfTkFNRShwYXVzZSkKKyNkZWZpbmUgX19pdHRfcmVzdW1lICAgICBJVFROT1RJRllfVk9JRChyZXN1bWUpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgSVRUTk9USUZZX05BTUUocmVzdW1lKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2UoKQorI2RlZmluZSBfX2l0dF9wYXVzZV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfcmVzdW1lKCkKKyNkZWZpbmUgX19pdHRfcmVzdW1lX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworI2VuZGlmIC8qIF9JVFROT1RJRllfSF8gKi8KKy8qKiBAfSBsZWdhY3lfY29udHJvbCBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfdGhyZWFkcyBUaHJlYWRzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIFRocmVhZHMgZ3JvdXAKKyAqIEB3YXJuaW5nIExlZ2FjeSBBUEkKKyAqIEB7CisgKi8KKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIFNldCBuYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aHJlYWQgaW4gYW5hbHlzaXMgR1VJLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbCxuYW1lIGFuZCBuYW1lbGVuIG1pc21hdGNoZWQpCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBMSUJJVFRBUEkgX19pdHRfdGhyX25hbWVfc2V0QShjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbik7CitpbnQgTElCSVRUQVBJIF9faXR0X3Rocl9uYW1lX3NldFcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQgICAgIF9faXR0X3Rocl9uYW1lX3NldFcKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIF9faXR0X3Rocl9uYW1lX3NldFdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldCAgICAgX19pdHRfdGhyX25hbWVfc2V0QQorIyAgZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfdGhyX25hbWVfc2V0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIHRocl9uYW1lX3NldEEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgdGhyX25hbWVfc2V0VywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCB0aHJfbmFtZV9zZXQsICAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBICAgICBJVFROT1RJRllfREFUQSh0aHJfbmFtZV9zZXRBKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXRBKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXICAgICBJVFROT1RJRllfREFUQSh0aHJfbmFtZV9zZXRXKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXRXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldCAgICAgSVRUTk9USUZZX0RBVEEodGhyX25hbWVfc2V0KQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIElUVE5PVElGWV9OQU1FKHRocl9uYW1lX3NldCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEEobmFtZSwgbmFtZWxlbikKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgMAorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXKG5hbWUsIG5hbWVsZW4pCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQobmFtZSwgbmFtZWxlbikKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgMAorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIE1hcmsgY3VycmVudCB0aHJlYWQgYXMgaWdub3JlZCBmcm9tIHRoaXMgcG9pbnQgb24sIGZvciB0aGUgZHVyYXRpb24gb2YgaXRzIGV4aXN0ZW5jZS4KKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfdGhyX2lnbm9yZSh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgdGhyX2lnbm9yZSwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlICAgICBJVFROT1RJRllfVk9JRCh0aHJfaWdub3JlKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfaWdub3JlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZSgpCisjZGVmaW5lIF9faXR0X3Rocl9pZ25vcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X3RocmVhZHMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X3N5bmMgU3luY2hyb25pemF0aW9uCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIFN5bmNocm9uaXphdGlvbiBncm91cAorICogQHdhcm5pbmcgTGVnYWN5IEFQSQorICogQHsKKyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9iYXJyaWVyIDEKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9tdXRleCAgIDIKKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgQXNzaWduIGEgbmFtZSB0byBhIHN5bmMgb2JqZWN0IHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcKKyAqIEBwYXJhbVtpbl0gYWRkciAgICAtIHBvaW50ZXIgdG8gdGhlIHN5bmMgb2JqZWN0LiBZb3Ugc2hvdWxkIHVzZSBhIHJlYWwgcG9pbnRlciB0byB5b3VyIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlcyBkb24ndCBjbGFzaCB3aXRoIG90aGVyIG9iamVjdCBhZGRyZXNzZXMKKyAqIEBwYXJhbVtpbl0gb2JqdHlwZSAtIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMgcGFzc2VkLCB0aGUgb2JqZWN0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlIGFzc3VtZWQgdG8gYmUgb2YgZ2VuZXJpYyAiVXNlciBTeW5jaHJvbml6YXRpb24iIHR5cGUKKyAqIEBwYXJhbVtpbl0gb2JqbmFtZSAtIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuIElmIE5VTEwsIG5vIG5hbWUgd2lsbCBiZSBhc3NpZ25lZAorICogICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG9iamVjdCAtLSB5b3UgY2FuIHVzZSB0aGUgX19pdHRfc3luY19yZW5hbWUgY2FsbCBsYXRlciB0byBhc3NpZ24KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lCisgKiBAcGFyYW1baW5dIGF0dHJpYnV0ZSAtIG9uZSBvZiBbI19faXR0X2F0dHJfYmFycmllciwgI19faXR0X2F0dHJfbXV0ZXhdIHZhbHVlcyB3aGljaCBkZWZpbmVzIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgZXhhY3Qgc2VtYW50aWNzIG9mIGhvdyBwcmVwYXJlL2FjcXVpcmVkL3JlbGVhc2luZyBjYWxscyB3b3JrLgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lQSh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfc2V0X25hbWVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBfX2l0dF9zeW5jX3NldF9uYW1lVworIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWUgICAgIF9faXR0X3N5bmNfc2V0X25hbWVBCisjICBkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZV9wdHIgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIqIG9ianR5cGUsIGNvbnN0IGNoYXIqIG9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lVyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19zZXRfbmFtZVcpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBJVFROT1RJRllfVk9JRChzeW5jX3NldF9uYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUEoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lVyhhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgQXNzaWduIGEgbmFtZSBhbmQgdHlwZSB0byBhIHN5bmMgb2JqZWN0IHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcKKyAqIEBwYXJhbVtpbl0gYWRkciAtICAgICAgcG9pbnRlciB0byB0aGUgc3luYyBvYmplY3QuIFlvdSBzaG91bGQgdXNlIGEgcmVhbCBwb2ludGVyIHRvIHlvdXIgb2JqZWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgZG9uJ3QgY2xhc2ggd2l0aCBvdGhlciBvYmplY3QgYWRkcmVzc2VzCisgKiBAcGFyYW1baW5dIG9ianR5cGUgLSAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMgcGFzc2VkLCB0aGUgb2JqZWN0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXNzdW1lZCB0byBiZSBvZiBnZW5lcmljICJVc2VyIFN5bmNocm9uaXphdGlvbiIgdHlwZQorICogQHBhcmFtW2luXSBvYmpuYW1lIC0gICBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IG5hbWUgc3RyaW5nLiBJZiBOVUxMLCBubyBuYW1lIHdpbGwgYmUgYXNzaWduZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG9iamVjdCAtLSB5b3UgY2FuIHVzZSB0aGUgX19pdHRfc3luY19yZW5hbWUgY2FsbCBsYXRlciB0byBhc3NpZ24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5hbWUKKyAqIEBwYXJhbVtpbl0gdHlwZWxlbiwgbmFtZWxlbiAtICAgYSBsZW5ndGggb2Ygc3RyaW5nIGZvciBhcHByb3ByaWF0ZSBvYmp0eXBlIGFuZCBvYmpuYW1lIHBhcmFtZXRlcgorICogQHBhcmFtW2luXSBhdHRyaWJ1dGUgLSBvbmUgb2YgWyNfX2l0dF9hdHRyX2JhcnJpZXIsICNfX2l0dF9hdHRyX211dGV4XSB2YWx1ZXMgd2hpY2ggZGVmaW5lcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Qgc2VtYW50aWNzIG9mIGhvdyBwcmVwYXJlL2FjcXVpcmVkL3JlbGVhc2luZyBjYWxscyB3b3JrLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbCxuYW1lIGFuZCBuYW1lbGVuIG1pc21hdGNoZWQpCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKTsKK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVcodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVworI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBCisjZW5kaWYKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19uYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSkpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEgICAgIElUVE5PVElGWV9EQVRBKG5vdGlmeV9zeW5jX25hbWVBKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQV9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfbmFtZUEpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXICAgICBJVFROT1RJRllfREFUQShub3RpZnlfc3luY19uYW1lVykKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVdfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWUgICAgIElUVE5PVElGWV9EQVRBKG5vdGlmeV9zeW5jX25hbWUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQShhZGRyLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXKGFkZHIsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lKGFkZHIsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBFbnRlciBzcGluIGxvb3Agb24gdXNlci1kZWZpbmVkIHN5bmMgb2JqZWN0CisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfcHJlcGFyZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgUXVpdCBzcGluIGxvb3Agd2l0aG91dCBhY3F1aXJpbmcgc3BpbiBvYmplY3QKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChub3RpZnlfc3luY19jYW5jZWwpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTdWNjZXNzZnVsIHNwaW4gbG9vcCBjb21wbGV0aW9uIChzeW5jIG9iamVjdCBhY3F1aXJlZCkKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWQodm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX2FjcXVpcmVkLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkICAgICBJVFROT1RJRllfVk9JRChub3RpZnlfc3luY19hY3F1aXJlZCkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2FjcXVpcmVkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWQoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTdGFydCBzeW5jIG9iamVjdCByZWxlYXNpbmcgY29kZS4gSXMgY2FsbGVkIGJlZm9yZSB0aGUgbG9jayByZWxlYXNlIGNhbGwuCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfcmVsZWFzaW5nKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3JlbGVhc2luZykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyhhZGRyKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfc3luYyBncm91cCAqLworCisjaWZuZGVmIF9JVFROT1RJRllfSF8KKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9ldmVudHMgRXZlbnRzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEV2ZW50cyBncm91cAorICogQHsKKyAqLworCisvKiogQGJyaWVmIHVzZXIgZXZlbnQgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfZXZlbnQ7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhbiBldmVudCBub3RpZmljYXRpb24KKyAqIEBub3RlIG5hbWUgb3IgbmFtZWxlbiBiZWluZyBudWxsL25hbWUgYW5kIG5hbWVsZW4gbm90IG1hdGNoaW5nLCB1c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQKKyAqIEByZXR1cm4gbm9uLXplcm8gZXZlbnQgaWRlbnRpZmllciB1cG9uIHN1Y2Nlc3MgYW5kIF9faXR0X2VyciBvdGhlcndpc2UKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pOworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgX19pdHRfZXZlbnRfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGUsICAoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQShuYW1lLCBuYW1lbGVuKSAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVcobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZShuYW1lLCBuYW1lbGVuKSAgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IG9jY3VycmVuY2UuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKGludmFsaWQgZXZlbnQgaWQvdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkKQorICovCitpbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X3N0YXJ0KF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X3N0YXJ0LCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydCAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfc3RhcnQpCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciBJVFROT1RJRllfTkFNRShldmVudF9zdGFydCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0KGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZXZlbnQgZW5kIG9jY3VycmVuY2UuCisgKiBAbm90ZSBJdCBpcyBvcHRpb25hbCBpZiBldmVudHMgZG8gbm90IGhhdmUgZHVyYXRpb25zLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9lbmQoX19pdHRfZXZlbnQgZXZlbnQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgZXZlbnRfZW5kLCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9lbmQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2VuZCkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmQoZXZlbnQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfZXZlbnRzIGdyb3VwICovCisjZW5kaWYgLyogX0lUVE5PVElGWV9IXyAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfbWVtb3J5IE1lbW9yeSBBY2Nlc3NlcworICogQGluZ3JvdXAgbGVnYWN5CisgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgSW5mb3JtIHRoZSB0b29sIG9mIG1lbW9yeSBhY2Nlc3NlcyBvbiByZWFkaW5nCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X21lbW9yeV9yZWFkKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3JlYWQsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkICAgICBJVFROT1RJRllfVk9JRChtZW1vcnlfcmVhZCkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIElUVE5PVElGWV9OQU1FKG1lbW9yeV9yZWFkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWQoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfcmVhZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBJbmZvcm0gdGhlIHRvb2wgb2YgbWVtb3J5IGFjY2Vzc2VzIG9uIHdyaXRpbmcKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbWVtb3J5X3dyaXRlKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3dyaXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGUgICAgIElUVE5PVElGWV9WT0lEKG1lbW9yeV93cml0ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciBJVFROT1RJRllfTkFNRShtZW1vcnlfd3JpdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGUoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEluZm9ybSB0aGUgdG9vbCBvZiBtZW1vcnkgYWNjZXNzZXMgb24gdXBkYXRpbmcKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbWVtb3J5X3VwZGF0ZSh2b2lkICphZGRyZXNzLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV91cGRhdGUsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGUgICAgIElUVE5PVElGWV9WT0lEKG1lbW9yeV91cGRhdGUpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGVfcHRyIElUVE5PVElGWV9OQU1FKG1lbW9yeV91cGRhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X21lbW9yeSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfc3RhdGUgVGhyZWFkIGFuZCBPYmplY3QgU3RhdGVzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqLworCisvKiogQGJyaWVmIHN0YXRlIHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X3N0YXRlX3Q7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiBlbnVtIF9faXR0X29ial9zdGF0ZSB7CisgICAgX19pdHRfb2JqX3N0YXRlX2VyciA9IDAsCisgICAgX19pdHRfb2JqX3N0YXRlX2NsciA9IDEsCisgICAgX19pdHRfb2JqX3N0YXRlX3NldCA9IDIsCisgICAgX19pdHRfb2JqX3N0YXRlX3VzZSA9IDMKK30gX19pdHRfb2JqX3N0YXRlX3Q7CisKK3R5cGVkZWYgZW51bSBfX2l0dF90aHJfc3RhdGUgeworICAgIF9faXR0X3Rocl9zdGF0ZV9lcnIgPSAwLAorICAgIF9faXR0X3Rocl9zdGF0ZV9jbHIgPSAxLAorICAgIF9faXR0X3Rocl9zdGF0ZV9zZXQgPSAyCit9IF9faXR0X3Rocl9zdGF0ZV90OworCit0eXBlZGVmIGVudW0gX19pdHRfb2JqX3Byb3AgeworICAgIF9faXR0X29ial9wcm9wX3dhdGNoICAgID0gMSwKKyAgICBfX2l0dF9vYmpfcHJvcF9pZ25vcmUgICA9IDIsCisgICAgX19pdHRfb2JqX3Byb3Bfc2hhcmFibGUgPSAzCit9IF9faXR0X29ial9wcm9wX3Q7CisKK3R5cGVkZWYgZW51bSBfX2l0dF90aHJfcHJvcCB7CisgICAgX19pdHRfdGhyX3Byb3BfcXVpZXQgPSAxCit9IF9faXR0X3Rocl9wcm9wX3Q7CisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgbWFuYWdpbmcgdGhyZWFkIGFuZCBvYmplY3Qgc3RhdGVzCisgKi8KK19faXR0X3N0YXRlX3QgTElCSVRUQVBJIF9faXR0X3N0YXRlX2dldCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCBzdGF0ZV9nZXQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0ICAgICBJVFROT1RJRllfREFUQShzdGF0ZV9nZXQpCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldF9wdHIgSVRUTk9USUZZX05BTUUoc3RhdGVfZ2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0KHZvaWQpIChfX2l0dF9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IHN0YXRlcworICovCitfX2l0dF9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9zdGF0ZV9zZXQoX19pdHRfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCBzdGF0ZV9zZXQsIChfX2l0dF9zdGF0ZV90IHMpKQorI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHN0YXRlX3NldCkKKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0X3B0ciBJVFROT1RJRllfTkFNRShzdGF0ZV9zZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXQocykgKF9faXR0X3N0YXRlX3QpMAorI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgbWFuYWdpbmcgdGhyZWFkIGFuZCBvYmplY3QgbW9kZXMKKyAqLworX19pdHRfdGhyX3N0YXRlX3QgTElCSVRUQVBJIF9faXR0X3Rocl9tb2RlX3NldChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3Rocl9zdGF0ZV90LCB0aHJfbW9kZV9zZXQsIChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpKQorI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHRocl9tb2RlX3NldCkKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbW9kZV9zZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXQocCwgcykgKF9faXR0X3Rocl9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IG1vZGVzCisgKi8KK19faXR0X29ial9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9vYmpfbW9kZV9zZXQoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9vYmpfc3RhdGVfdCwgb2JqX21vZGVfc2V0LCAoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKSkKKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0ICAgICBJVFROT1RJRllfREFUQShvYmpfbW9kZV9zZXQpCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgSVRUTk9USUZZX05BTUUob2JqX21vZGVfc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0KHAsIHMpIChfX2l0dF9vYmpfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV9zdGF0ZSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBmcmFtZXMgRnJhbWVzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEZyYW1lcyBncm91cAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgb3BhcXVlIHN0cnVjdHVyZSBmb3IgZnJhbWUgaWRlbnRpZmljYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19pdHRfZnJhbWVfdCAqX19pdHRfZnJhbWU7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhIGdsb2JhbCBmcmFtZSB3aXRoIGdpdmVuIGRvbWFpbgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9mcmFtZSBJVFRBUEkgX19pdHRfZnJhbWVfY3JlYXRlQShjb25zdCBjaGFyICAgICpkb21haW4pOworX19pdHRfZnJhbWUgSVRUQVBJIF9faXR0X2ZyYW1lX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqZG9tYWluKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlICAgICBfX2l0dF9mcmFtZV9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgX19pdHRfZnJhbWVfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2ZyYW1lIElUVEFQSSBfX2l0dF9mcmFtZV9jcmVhdGUoY29uc3QgY2hhciAqZG9tYWluKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKmRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqZG9tYWluKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZSwgIChjb25zdCBjaGFyICpkb21haW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShmcmFtZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShmcmFtZV9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoZnJhbWVfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGZyYW1lX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUEoZG9tYWluKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZVcoZG9tYWluKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBSZWNvcmQgYW4gZnJhbWUgYmVnaW4gb2NjdXJyZW5jZS4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2JlZ2luKF9faXR0X2ZyYW1lIGZyYW1lKTsKKy8qKiBAYnJpZWYgUmVjb3JkIGFuIGZyYW1lIGVuZCBvY2N1cnJlbmNlLiAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfZW5kICAoX19pdHRfZnJhbWUgZnJhbWUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbiwgKF9faXR0X2ZyYW1lIGZyYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZCwgICAoX19pdHRfZnJhbWUgZnJhbWUpKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoZnJhbWVfYmVnaW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kICAgICAgIElUVE5PVElGWV9WT0lEKGZyYW1lX2VuZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3B0ciAgIElUVE5PVElGWV9OQU1FKGZyYW1lX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luKGZyYW1lKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmQoZnJhbWUpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBmcmFtZXMgZ3JvdXAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9MRUdBQ1lfSVRUTk9USUZZX0hfICovCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvdHNhbl9hbm5vdGF0aW9ucy5jcHAgYi9yYzMvcnVudGltZS9zcmMvdHNhbl9hbm5vdGF0aW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwNTU1NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy90c2FuX2Fubm90YXRpb25zLmNwcApAQCAtMCwwICsxLDYzIEBACisvKgorICogdHNhbl9hbm5vdGF0aW9ucy5jcHAgLS0gVGhyZWFkU2FuaXRpemVyIGFubm90YXRpb25zIHRvIHN1cHBvcnQgZGF0YQorICogcmFjZSBkZXRlY3Rpb24gaW4gT3Blbk1QIHByb2dyYW1zLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgInRzYW5fYW5ub3RhdGlvbnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1cHRyOwordHlwZWRlZiBzaWduZWQgICBsb25nIHNwdHI7CisKK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVIYXBwZW5zQmVmb3JlKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIGFkZHIpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlSGFwcGVuc0FmdGVyKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIGFkZHIpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlQ29uZFZhclNpZ25hbChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBjdikge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVDb25kVmFyU2lnbmFsQWxsKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIGN2KSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZU11dGV4SXNOb3RQSEIoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbXUpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlQ29uZFZhcldhaXQoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgY3YsIHVwdHIgbG9jaykge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVSV0xvY2tDcmVhdGUoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVSV0xvY2tDcmVhdGVTdGF0aWMoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVSV0xvY2tEZXN0cm95KGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG0pIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlUldMb2NrQWNxdWlyZWQoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbSwgdXB0ciBpc193KSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZVJXTG9ja1JlbGVhc2VkKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG0sIHVwdHIgaXNfdykge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVUcmFjZU1lbW9yeShjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0pIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlRmx1c2hTdGF0ZShjb25zdCBjaGFyICpmLCBpbnQgbCkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVOZXdNZW1vcnkoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbWVtLCB1cHRyIHNpemUpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlTm9PcChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0pIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlRmx1c2hFeHBlY3RlZFJhY2VzKGNvbnN0IGNoYXIgKmYsIGludCBsKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZUVuYWJsZVJhY2VEZXRlY3Rpb24oIGNvbnN0IGNoYXIgKmYsIGludCBsLCBpbnQgZW5hYmxlKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZU11dGV4SXNVc2VkQXNDb25kVmFyKCBjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtdSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVQQ1FHZXQoIGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIHBjcSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVQQ1FQdXQoIGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIHBjcSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVQQ1FEZXN0cm95KCBjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBwY3EpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlUENRQ3JlYXRlKCBjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBwY3EpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlRXhwZWN0UmFjZSggY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbWVtLCBjaGFyICpkZXNjKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZUJlbmlnblJhY2VTaXplZCggY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbWVtLCB1cHRyIHNpemUsIGNoYXIgKmRlc2MpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlQmVuaWduUmFjZSggY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbWVtLCBjaGFyICpkZXNjKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZUlnbm9yZVJlYWRzQmVnaW4oY29uc3QgY2hhciAqZiwgaW50IGwpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlSWdub3JlUmVhZHNFbmQoY29uc3QgY2hhciAqZiwgaW50IGwpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlSWdub3JlV3JpdGVzQmVnaW4oY29uc3QgY2hhciAqZiwgaW50IGwpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlSWdub3JlV3JpdGVzRW5kKGNvbnN0IGNoYXIgKmYsIGludCBsKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZUlnbm9yZVN5bmNCZWdpbihjb25zdCBjaGFyICpmLCBpbnQgbCkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVJZ25vcmVTeW5jRW5kKGNvbnN0IGNoYXIgKmYsIGludCBsKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZVB1Ymxpc2hNZW1vcnlSYW5nZSggY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgYWRkciwgdXB0ciBzaXplKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZVVucHVibGlzaE1lbW9yeVJhbmdlKCBjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyLCB1cHRyIHNpemUpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlVGhyZWFkTmFtZSggY29uc3QgY2hhciAqZiwgaW50IGwsIGNoYXIgKm5hbWUpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIFdURkFubm90YXRlSGFwcGVuc0JlZm9yZShjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBXVEZBbm5vdGF0ZUhhcHBlbnNBZnRlcihjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBXVEZBbm5vdGF0ZUJlbmlnblJhY2VTaXplZCggY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbWVtLCB1cHRyIHN6LCBjaGFyICpkZXNjKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgaW50IFJ1bm5pbmdPblZhbGdyaW5kKCkge3JldHVybiAwO30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIGRvdWJsZSBWYWxncmluZFNsb3dkb3duKHZvaWQpIHtyZXR1cm4gMDt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSBjb25zdCBjaGFyIF9fYXR0cmlidXRlX18oKHdlYWspKSogVGhyZWFkU2FuaXRpemVyUXVlcnkoY29uc3QgY2hhciAqcXVlcnkpIHtyZXR1cm4gMDt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlTWVtb3J5SXNJbml0aWFsaXplZChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0sIHVwdHIgc3opIHt9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvdHNhbl9hbm5vdGF0aW9ucy5oIGIvcmMzL3J1bnRpbWUvc3JjL3RzYW5fYW5ub3RhdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYyNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL3RzYW5fYW5ub3RhdGlvbnMuaApAQCAtMCwwICsxLDE2OCBAQAorLyohIFxmaWxlICovCisvKgorICogdHNhbl9hbm5vdGF0aW9ucy5oIC0tIFRocmVhZFNhbml0aXplciBhbm5vdGF0aW9ucyB0byBzdXBwb3J0IGRhdGEKKyAqIHJhY2UgZGV0ZWN0aW9uIGluIE9wZW5NUCBwcm9ncmFtcy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgVFNBTl9BTk5PVEFUSU9OU19ICisjZGVmaW5lIFRTQU5fQU5OT1RBVElPTlNfSAorCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCisvKiB0eXBlcyBhcyB1c2VkIGluIHRzYW4vcnRsL3RzYW5faW50ZXJmYWNlX2Fubi5jYyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVwdHI7Cit0eXBlZGVmIHNpZ25lZCAgIGxvbmcgc3B0cjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBEZWNsYXJhdGlvbiBvZiBhbGwgYW5ub3RhdGlvbiBmdW5jdGlvbnMgaW4gdHNhbi9ydGwvdHNhbl9pbnRlcmZhY2VfYW5uLmNjICovCit2b2lkIEFubm90YXRlSGFwcGVuc0JlZm9yZShjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyKTsKK3ZvaWQgQW5ub3RhdGVIYXBwZW5zQWZ0ZXIoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgYWRkcik7Cit2b2lkIEFubm90YXRlQ29uZFZhclNpZ25hbChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBjdik7Cit2b2lkIEFubm90YXRlQ29uZFZhclNpZ25hbEFsbChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBjdik7Cit2b2lkIEFubm90YXRlTXV0ZXhJc05vdFBIQihjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtdSk7Cit2b2lkIEFubm90YXRlQ29uZFZhcldhaXQoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgY3YsIHVwdHIgbG9jayk7Cit2b2lkIEFubm90YXRlUldMb2NrQ3JlYXRlKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG0pOwordm9pZCBBbm5vdGF0ZVJXTG9ja0NyZWF0ZVN0YXRpYyhjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtKTsKK3ZvaWQgQW5ub3RhdGVSV0xvY2tEZXN0cm95KGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG0pOwordm9pZCBBbm5vdGF0ZVJXTG9ja0FjcXVpcmVkKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG0sIHVwdHIgaXNfdyk7Cit2b2lkIEFubm90YXRlUldMb2NrUmVsZWFzZWQoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbSwgdXB0ciBpc193KTsKK3ZvaWQgQW5ub3RhdGVUcmFjZU1lbW9yeShjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0pOwordm9pZCBBbm5vdGF0ZUZsdXNoU3RhdGUoY29uc3QgY2hhciAqZiwgaW50IGwpOwordm9pZCBBbm5vdGF0ZU5ld01lbW9yeShjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0sIHVwdHIgc2l6ZSk7Cit2b2lkIEFubm90YXRlTm9PcChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0pOwordm9pZCBBbm5vdGF0ZUZsdXNoRXhwZWN0ZWRSYWNlcyhjb25zdCBjaGFyICpmLCBpbnQgbCk7Cit2b2lkIEFubm90YXRlRW5hYmxlUmFjZURldGVjdGlvbiggY29uc3QgY2hhciAqZiwgaW50IGwsIGludCBlbmFibGUpOwordm9pZCBBbm5vdGF0ZU11dGV4SXNVc2VkQXNDb25kVmFyKCBjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtdSk7Cit2b2lkIEFubm90YXRlUENRR2V0KCBjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBwY3EpOwordm9pZCBBbm5vdGF0ZVBDUVB1dCggY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgcGNxKTsKK3ZvaWQgQW5ub3RhdGVQQ1FEZXN0cm95KCBjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBwY3EpOwordm9pZCBBbm5vdGF0ZVBDUUNyZWF0ZSggY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgcGNxKTsKK3ZvaWQgQW5ub3RhdGVFeHBlY3RSYWNlKCBjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0sIGNoYXIgKmRlc2MpOwordm9pZCBBbm5vdGF0ZUJlbmlnblJhY2VTaXplZCggY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbWVtLCB1cHRyIHNpemUsIGNoYXIgKmRlc2MpOwordm9pZCBBbm5vdGF0ZUJlbmlnblJhY2UoIGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG1lbSwgY2hhciAqZGVzYyk7Cit2b2lkIEFubm90YXRlSWdub3JlUmVhZHNCZWdpbihjb25zdCBjaGFyICpmLCBpbnQgbCk7Cit2b2lkIEFubm90YXRlSWdub3JlUmVhZHNFbmQoY29uc3QgY2hhciAqZiwgaW50IGwpOwordm9pZCBBbm5vdGF0ZUlnbm9yZVdyaXRlc0JlZ2luKGNvbnN0IGNoYXIgKmYsIGludCBsKTsKK3ZvaWQgQW5ub3RhdGVJZ25vcmVXcml0ZXNFbmQoY29uc3QgY2hhciAqZiwgaW50IGwpOwordm9pZCBBbm5vdGF0ZUlnbm9yZVN5bmNCZWdpbihjb25zdCBjaGFyICpmLCBpbnQgbCk7Cit2b2lkIEFubm90YXRlSWdub3JlU3luY0VuZChjb25zdCBjaGFyICpmLCBpbnQgbCk7Cit2b2lkIEFubm90YXRlUHVibGlzaE1lbW9yeVJhbmdlKCBjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyLCB1cHRyIHNpemUpOwordm9pZCBBbm5vdGF0ZVVucHVibGlzaE1lbW9yeVJhbmdlKCBjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyLCB1cHRyIHNpemUpOwordm9pZCBBbm5vdGF0ZVRocmVhZE5hbWUoIGNvbnN0IGNoYXIgKmYsIGludCBsLCBjaGFyICpuYW1lKTsKK3ZvaWQgV1RGQW5ub3RhdGVIYXBwZW5zQmVmb3JlKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIGFkZHIpOwordm9pZCBXVEZBbm5vdGF0ZUhhcHBlbnNBZnRlcihjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyKTsKK3ZvaWQgV1RGQW5ub3RhdGVCZW5pZ25SYWNlU2l6ZWQoIGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG1lbSwgdXB0ciBzeiwgY2hhciAqZGVzYyk7CitpbnQgUnVubmluZ09uVmFsZ3JpbmQoKTsKK2RvdWJsZSBWYWxncmluZFNsb3dkb3duKHZvaWQpOworY29uc3QgY2hhciAqIFRocmVhZFNhbml0aXplclF1ZXJ5KGNvbnN0IGNoYXIgKnF1ZXJ5KTsKK3ZvaWQgQW5ub3RhdGVNZW1vcnlJc0luaXRpYWxpemVkKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG1lbSwgdXB0ciBzeik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNpZmRlZiBUU0FOX1NVUFBPUlQKKyNkZWZpbmUgQU5OT1RBVEVfSEFQUEVOU19BRlRFUihhZGRyKSBBbm5vdGF0ZUhhcHBlbnNBZnRlcihfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWFkZHIpCisjZGVmaW5lIEFOTk9UQVRFX0hBUFBFTlNfQkVGT1JFKGFkZHIpIEFubm90YXRlSGFwcGVuc0JlZm9yZShfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWFkZHIpCisjZGVmaW5lIEFOTk9UQVRFX0lHTk9SRV9XUklURVNfQkVHSU4oKSBBbm5vdGF0ZUlnbm9yZVdyaXRlc0JlZ2luKF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgQU5OT1RBVEVfSUdOT1JFX1dSSVRFU19FTkQoKSBBbm5vdGF0ZUlnbm9yZVdyaXRlc0VuZChfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lIEFOTk9UQVRFX1JXTE9DS19DUkVBVEUobGNrKSBBbm5vdGF0ZVJXTG9ja0NyZWF0ZShfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWxjaykKKyNkZWZpbmUgQU5OT1RBVEVfUldMT0NLX1JFTEVBU0VEKGxjaykgQW5ub3RhdGVSV0xvY2tBY3F1aXJlZChfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWxjaywgMSkKKyNkZWZpbmUgQU5OT1RBVEVfUldMT0NLX0FDUVVJUkVEKGxjaykgQW5ub3RhdGVSV0xvY2tSZWxlYXNlZChfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWxjaywgMSkKKworLyogbmV3IGhpZ2hlciBsZXZlbCBiYXJyaWVyIGFubm90YXRpb25zICovCisjZGVmaW5lIEFOTk9UQVRFX05FV19CQVJSSUVSX0JFR0lOKGFkZHIpIEFubm90YXRlSGFwcGVuc0JlZm9yZShfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWFkZHIpCisjZGVmaW5lIEFOTk9UQVRFX05FV19CQVJSSUVSX0VORChhZGRyKSBBbm5vdGF0ZUhhcHBlbnNBZnRlcihfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWFkZHIpCisvLyAjZGVmaW5lIEFOTk9UQVRFX05FV19CQVJSSUVSX0JFR0lOKGFkZHIpCisvLyAjZGVmaW5lIEFOTk9UQVRFX05FV19CQVJSSUVSX0VORChhZGRyKQorCisKKyNkZWZpbmUgQU5OT1RBVEVfUkVEVUNFX0FGVEVSKGFkZHIpIEFubm90YXRlSGFwcGVuc0FmdGVyKF9fRklMRV9fLCBfX0xJTkVfXywgKHVwdHIpYWRkcikKKyNkZWZpbmUgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRShhZGRyKSBBbm5vdGF0ZUhhcHBlbnNCZWZvcmUoX19GSUxFX18sIF9fTElORV9fLCAodXB0cilhZGRyKQorLy8gI2RlZmluZSBBTk5PVEFURV9SRURVQ0VfQUZURVIoYWRkcikKKy8vICNkZWZpbmUgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRShhZGRyKQorCisjZWxzZQorI2RlZmluZSBBTk5PVEFURV9IQVBQRU5TX0FGVEVSKGFkZHIpCisjZGVmaW5lIEFOTk9UQVRFX0hBUFBFTlNfQkVGT1JFKGFkZHIpCisjZGVmaW5lIEFOTk9UQVRFX0lHTk9SRV9XUklURVNfQkVHSU4oKQorI2RlZmluZSBBTk5PVEFURV9JR05PUkVfV1JJVEVTX0VORCgpCisjZGVmaW5lIEFOTk9UQVRFX1JXTE9DS19DUkVBVEUobGNrKQorI2RlZmluZSBBTk5PVEFURV9SV0xPQ0tfUkVMRUFTRUQobGNrKQorI2RlZmluZSBBTk5PVEFURV9SV0xPQ0tfQUNRVUlSRUQobGNrKQorI2RlZmluZSBBTk5PVEFURV9ORVdfQkFSUklFUl9CRUdJTihhZGRyKQorI2RlZmluZSBBTk5PVEFURV9ORVdfQkFSUklFUl9FTkQoYWRkcikKKyNkZWZpbmUgQU5OT1RBVEVfUkVEVUNFX0FGVEVSKGFkZHIpCisjZGVmaW5lIEFOTk9UQVRFX1JFRFVDRV9CRUZPUkUoYWRkcikKKyNlbmRpZgorCisjZGVmaW5lIEFOTk9UQVRFX1FVRVVJTkcKKyNkZWZpbmUgQU5OT1RBVEVfVElDS0VUCisjZGVmaW5lIEFOTk9UQVRFX0ZVVEVYCisjZGVmaW5lIEFOTk9UQVRFX1RBUworI2RlZmluZSBBTk5PVEFURV9EUkRQQQorCisjaWZkZWYgQU5OT1RBVEVfUVVFVUlORworI2RlZmluZSBBTk5PVEFURV9RVUVVSU5HX0NSRUFURShsY2spCisjZGVmaW5lIEFOTk9UQVRFX1FVRVVJTkdfUkVMRUFTRUQobGNrKSBBTk5PVEFURV9IQVBQRU5TX0JFRk9SRShsY2spCisjZGVmaW5lIEFOTk9UQVRFX1FVRVVJTkdfQUNRVUlSRUQobGNrKSBBTk5PVEFURV9IQVBQRU5TX0FGVEVSKGxjaykKKyNlbHNlCisjZGVmaW5lIEFOTk9UQVRFX1FVRVVJTkdfQ1JFQVRFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfUVVFVUlOR19SRUxFQVNFRChsY2spCisjZGVmaW5lIEFOTk9UQVRFX1FVRVVJTkdfQUNRVUlSRUQobGNrKQorI2VuZGlmCisKKyNpZmRlZiBBTk5PVEFURV9USUNLRVQKKyNkZWZpbmUgQU5OT1RBVEVfVElDS0VUX0NSRUFURShsY2spCisjZGVmaW5lIEFOTk9UQVRFX1RJQ0tFVF9SRUxFQVNFRChsY2spIEFOTk9UQVRFX0hBUFBFTlNfQkVGT1JFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfVElDS0VUX0FDUVVJUkVEKGxjaykgQU5OT1RBVEVfSEFQUEVOU19BRlRFUihsY2spCisjZWxzZQorI2RlZmluZSBBTk5PVEFURV9USUNLRVRfQ1JFQVRFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfVElDS0VUX1JFTEVBU0VEKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfVElDS0VUX0FDUVVJUkVEKGxjaykKKyNlbmRpZgorCisjaWZkZWYgQU5OT1RBVEVfRlVURVgKKyNkZWZpbmUgQU5OT1RBVEVfRlVURVhfQ1JFQVRFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfRlVURVhfUkVMRUFTRUQobGNrKSBBTk5PVEFURV9IQVBQRU5TX0JFRk9SRShsY2spCisjZGVmaW5lIEFOTk9UQVRFX0ZVVEVYX0FDUVVJUkVEKGxjaykgQU5OT1RBVEVfSEFQUEVOU19BRlRFUihsY2spCisjZWxzZQorI2RlZmluZSBBTk5PVEFURV9GVVRFWF9DUkVBVEUobGNrKQorI2RlZmluZSBBTk5PVEFURV9GVVRFWF9SRUxFQVNFRChsY2spCisjZGVmaW5lIEFOTk9UQVRFX0ZVVEVYX0FDUVVJUkVEKGxjaykKKyNlbmRpZgorCisjaWZkZWYgQU5OT1RBVEVfVEFTCisjZGVmaW5lIEFOTk9UQVRFX1RBU19DUkVBVEUobGNrKQorI2RlZmluZSBBTk5PVEFURV9UQVNfUkVMRUFTRUQobGNrKSBBTk5PVEFURV9IQVBQRU5TX0JFRk9SRShsY2spCisjZGVmaW5lIEFOTk9UQVRFX1RBU19BQ1FVSVJFRChsY2spIEFOTk9UQVRFX0hBUFBFTlNfQUZURVIobGNrKQorI2Vsc2UKKyNkZWZpbmUgQU5OT1RBVEVfVEFTX0NSRUFURShsY2spCisjZGVmaW5lIEFOTk9UQVRFX1RBU19SRUxFQVNFRChsY2spCisjZGVmaW5lIEFOTk9UQVRFX1RBU19BQ1FVSVJFRChsY2spCisjZW5kaWYKKworI2lmZGVmIEFOTk9UQVRFX0RSRFBBCisjZGVmaW5lIEFOTk9UQVRFX0RSRFBBX0NSRUFURShsY2spCisjZGVmaW5lIEFOTk9UQVRFX0RSRFBBX1JFTEVBU0VEKGxjaykgQU5OT1RBVEVfSEFQUEVOU19CRUZPUkUobGNrKQorI2RlZmluZSBBTk5PVEFURV9EUkRQQV9BQ1FVSVJFRChsY2spIEFOTk9UQVRFX0hBUFBFTlNfQUZURVIobGNrKQorI2Vsc2UKKyNkZWZpbmUgQU5OT1RBVEVfRFJEUEFfQ1JFQVRFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfRFJEUEFfUkVMRUFTRUQobGNrKQorI2RlZmluZSBBTk5PVEFURV9EUkRQQV9BQ1FVSVJFRChsY2spCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvel9MaW51eF9hc20ucyBiL3JjMy9ydW50aW1lL3NyYy96X0xpbnV4X2FzbS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTFjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvel9MaW51eF9hc20ucwpAQCAtMCwwICsxLDE4MDcgQEAKKy8vICB6X0xpbnV4X2FzbS5zOiAgLSBtaWNyb3Rhc2tpbmcgcm91dGluZXMgc3BlY2lmaWNhbGx5CisvLyAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiBmb3IgSW50ZWwgcGxhdGZvcm1zIHJ1bm5pbmcgTGludXgqIE9TCisKKy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8vCisvLy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vLy8KKy8vLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8vLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vLy8KKy8vLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtYWNyb3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyMgaWYgS01QX01JQworLy8KKy8vIHRoZSAnZGVsYXkgcjE2L3IzMi9yNjQnIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlICdwYXVzZScuCisvLyBUaGUgZGVsYXkgb3BlcmF0aW9uIGhhcyB0aGUgZWZmZWN0IG9mIHJlbW92aW5nIHRoZSBjdXJyZW50IHRocmVhZCBmcm9tCisvLyB0aGUgcm91bmQtcm9iaW4gSFQgbWVjaGFuaXNtLCBhbmQgdGhlcmVmb3JlIHNwZWVkcyB1cCB0aGUgaXNzdWUgcmF0ZSBvZgorLy8gdGhlIG90aGVyIHRocmVhZHMgb24gdGhlIHNhbWUgY29yZS4KKy8vCisvLyBBIHZhbHVlIG9mIDAgd29ya3MgZmluZSBmb3IgPD0gMiB0aHJlYWRzIHBlciBjb3JlLCBidXQgY2F1c2VzIHRoZSBFUENDCisvLyBiYXJyaWVyIHRpbWUgdG8gaW5jcmVhc2UgZ3JlYXRseSBmb3IgMyBvciBtb3JlIHRocmVhZHMgcGVyIGNvcmUuCisvLworLy8gQSB2YWx1ZSBvZiAxMDAgd29ya3MgcHJldHR5IHdlbGwgZm9yIHVwIHRvIDQgdGhyZWFkcyBwZXIgY29yZSwgYnV0IGlzbid0CisvLyBxdWl0ZSBhcyBmYXN0IGFzIDAgZm9yIDIgdGhyZWFkcyBwZXIgY29yZS4KKy8vCisvLyBXZSBuZWVkIHRvIGNoZWNrIHdoYXQgaGFwcGVucyBmb3Igb3ZlcnN1YnNjcmlwdGlvbiAvID4gNCB0aHJlYWRzIHBlciBjb3JlLgorLy8gSXQgaXMgcG9zc2libGUgdGhhdCB3ZSBuZWVkIHRvIHBhc3MgdGhlIGRlbGF5IHZhbHVlIGluIGFzIGEgcGFyYW1ldGVyCisvLyB0aGF0IHRoZSBjYWxsZXIgZGV0ZXJtaW5lcyBiYXNlZCBvbiB0aGUgdG90YWwgIyB0aHJlYWRzIC8gIyBjb3Jlcy4KKy8vCisvLy5tYWNybyBwYXVzZV9vcAorLy8JbW92ICAgICQxMDAsICVyYXgKKy8vCWRlbGF5ICAlcmF4CisvLy5lbmRtCisjIGVsc2UKKyMgIGRlZmluZSBwYXVzZV9vcCAgIC5ieXRlIDB4ZjMsMHg5MAorIyBlbmRpZiAvLyBLTVBfTUlDCisKKyMgaWYgS01QX09TX0RBUldJTgorIyAgZGVmaW5lIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSh4KSBfIyN4ICAvLyBleHRyYSB1bmRlcnNjb3JlIGZvciBPUyBYKiBzeW1ib2xzCisjICBkZWZpbmUgS01QX0xBQkVMKHgpIExfIyN4ICAgICAgICAgICAgIC8vIGZvcm0gdGhlIG5hbWUgb2YgbGFiZWwKKy5tYWNybyBLTVBfQ0ZJX0RFRl9PRkZTRVQKKy5lbmRtYWNybworLm1hY3JvIEtNUF9DRklfT0ZGU0VUCisuZW5kbWFjcm8KKy5tYWNybyBLTVBfQ0ZJX1JFR0lTVEVSCisuZW5kbWFjcm8KKy5tYWNybyBLTVBfQ0ZJX0RFRgorLmVuZG1hY3JvCisubWFjcm8gQUxJR04KKwkuYWxpZ24gJDAKKy5lbmRtYWNybworLm1hY3JvIERFQlVHX0lORk8KKy8qIE5vdCBzdXJlIHdoYXQgLnNpemUgZG9lcyBpbiBpY2MsIG5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nCisgICBzaW1pbGFyIGZvciBPUyBYKi4KKyovCisuZW5kbWFjcm8KKy5tYWNybyBQUk9DCisJQUxJR04gIDQKKwkuZ2xvYmwgS01QX1BSRUZJWF9VTkRFUlNDT1JFKCQwKQorS01QX1BSRUZJWF9VTkRFUlNDT1JFKCQwKToKKy5lbmRtYWNybworIyBlbHNlIC8vIEtNUF9PU19EQVJXSU4KKyMgIGRlZmluZSBLTVBfUFJFRklYX1VOREVSU0NPUkUoeCkgeCAgLy8gbm8gZXh0cmEgdW5kZXJzY29yZSBmb3IgTGludXgqIE9TIHN5bWJvbHMKKy8vIEZvcm1hdCBsYWJlbHMgc28gdGhhdCB0aGV5IGRvbid0IG92ZXJyaWRlIGZ1bmN0aW9uIG5hbWVzIGluIGdkYidzIGJhY2t0cmFjZXMKKy8vIE1JQyBhc3NlbWJsZXIgZG9lc24ndCBhY2NlcHQgLkwgc3ludGF4LCB0aGUgTCB3b3JrcyBmaW5lIHRoZXJlIChhcyB3ZWxsIGFzIG9uIE9TIFgqKQorIyBpZiBLTVBfTUlDCisjICBkZWZpbmUgS01QX0xBQkVMKHgpIExfIyN4ICAgICAgICAgIC8vIGxvY2FsIGxhYmVsCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfTEFCRUwoeCkgLkxfIyN4ICAgICAgICAgLy8gbG9jYWwgbGFiZWwgaGlkZGVuIGZyb20gYmFja3RyYWNlcworIyBlbmRpZiAvLyBLTVBfTUlDCisubWFjcm8gQUxJR04gc2l6ZQorCS5hbGlnbiAxPDwoXHNpemUpCisuZW5kbQorLm1hY3JvIERFQlVHX0lORk8gcHJvYworCS5jZmlfZW5kcHJvYworLy8gTm90IHN1cmUgd2h5IHdlIG5lZWQgLnR5cGUgYW5kIC5zaXplIGZvciB0aGUgZnVuY3Rpb25zCisJLmFsaWduIDE2CisJLnR5cGUgIFxwcm9jLEBmdW5jdGlvbgorICAgICAgICAuc2l6ZSAgXHByb2MsLi1ccHJvYworLmVuZG0KKy5tYWNybyBQUk9DIHByb2MKKwlBTElHTiAgNAorICAgICAgICAuZ2xvYmwgS01QX1BSRUZJWF9VTkRFUlNDT1JFKFxwcm9jKQorS01QX1BSRUZJWF9VTkRFUlNDT1JFKFxwcm9jKToKKwkuY2ZpX3N0YXJ0cHJvYworLmVuZG0KKy5tYWNybyBLTVBfQ0ZJX0RFRl9PRkZTRVQgc3oKKwkuY2ZpX2RlZl9jZmFfb2Zmc2V0CVxzegorLmVuZG0KKy5tYWNybyBLTVBfQ0ZJX09GRlNFVCByZWcsIHN6CisJLmNmaV9vZmZzZXQJXHJlZyxcc3oKKy5lbmRtCisubWFjcm8gS01QX0NGSV9SRUdJU1RFUiByZWcKKwkuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJXHJlZworLmVuZG0KKy5tYWNybyBLTVBfQ0ZJX0RFRiByZWcsIHN6CisJLmNmaV9kZWZfY2ZhCVxyZWcsXHN6CisuZW5kbQorIyBlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX3g4Nl82NAorCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX0FBUkNINjQKKworIyAgZGVmaW5lIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSh4KSB4ICAvLyBubyBleHRyYSB1bmRlcnNjb3JlIGZvciBMaW51eCogT1Mgc3ltYm9scworLy8gRm9ybWF0IGxhYmVscyBzbyB0aGF0IHRoZXkgZG9uJ3Qgb3ZlcnJpZGUgZnVuY3Rpb24gbmFtZXMgaW4gZ2RiJ3MgYmFja3RyYWNlcworIyAgZGVmaW5lIEtNUF9MQUJFTCh4KSAuTF8jI3ggICAgICAgICAvLyBsb2NhbCBsYWJlbCBoaWRkZW4gZnJvbSBiYWNrdHJhY2VzCisKKy5tYWNybyBBTElHTiBzaXplCisJLmFsaWduIDE8PChcc2l6ZSkKKy5lbmRtCisKKy5tYWNybyBERUJVR19JTkZPIHByb2MKKwkuY2ZpX2VuZHByb2MKKy8vIE5vdCBzdXJlIHdoeSB3ZSBuZWVkIC50eXBlIGFuZCAuc2l6ZSBmb3IgdGhlIGZ1bmN0aW9ucworCUFMSUdOIDIKKwkudHlwZSAgXHByb2MsQGZ1bmN0aW9uCisJLnNpemUgIFxwcm9jLC4tXHByb2MKKy5lbmRtCisKKy5tYWNybyBQUk9DIHByb2MKKwlBTElHTiAyCisJLmdsb2JsIEtNUF9QUkVGSVhfVU5ERVJTQ09SRShccHJvYykKK0tNUF9QUkVGSVhfVU5ERVJTQ09SRShccHJvYyk6CisJLmNmaV9zdGFydHByb2MKKy5lbmRtCisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgS01QX0FSQ0hfQUFSQ0g2NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGF0YQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCisvLworLy8gU3VwcG9ydCBmb3IgdW5uYW1lZCBjb21tb24gYmxvY2tzLgorLy8KKy8vIEJlY2F1c2UgdGhlIHN5bWJvbCAiLmdvbXBfY3JpdGljYWxfdXNlcl8iIGNvbnRhaW5zIGEgIi4iLCB3ZSBoYXZlIHRvCisvLyBwdXQgdGhpcyBzdHVmZiBpbiBhc3NlbWJseS4KKy8vCisKKyMgaWYgS01QX0FSQ0hfWDg2CisjICBpZiBLTVBfT1NfREFSV0lOCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyCisgICAgICAgIC5kYXRhCisgICAgICAgIC5nbG9ibCBfX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgICAgICAubG9uZyAuZ29tcF9jcml0aWNhbF91c2VyXworIyAgZWxzZSAvKiBMaW51eCogT1MgKi8KKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIsOAorICAgICAgICAuZGF0YQorCUFMSUdOIDQKKyAgICAgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLjRieXRlIC5nb21wX2NyaXRpY2FsX3VzZXJfCisgICAgICAgIC50eXBlIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcixAb2JqZWN0CisgICAgICAgIC5zaXplIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciw0CisjICBlbmRpZiAvKiBLTVBfT1NfREFSV0lOICovCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGlmIEtNUF9BUkNIX1g4Nl82NAorIyAgaWYgS01QX09TX0RBUldJTgorICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMgorICAgICAgICAuZGF0YQorICAgICAgICAuZ2xvYmwgX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLnF1YWQgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyMgIGVsc2UgLyogTGludXgqIE9TICovCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAgICAgLmRhdGEKKwlBTElHTiA4CisgICAgICAgIC5nbG9iYWwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC44Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgICAgICAudHlwZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsQG9iamVjdAorICAgICAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsOAorIyAgZW5kaWYgLyogS01QX09TX0RBUldJTiAqLworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODZfNjQgKi8KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKKyNpZiBLTVBfQVJDSF9YODYgJiYgIUtNUF9BUkNIX1BQQzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtaWNyb3Rhc2tpbmcgcm91dGluZXMgc3BlY2lmaWNhbGx5IHdyaXR0ZW4gZm9yIElBLTMyIGFyY2hpdGVjdHVyZQorLy8gcnVubmluZyBMaW51eCogT1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisJLmlkZW50ICJJbnRlbCBDb3Jwb3JhdGlvbiIKKwkuZGF0YQorCUFMSUdOIDQKKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApOworLy8KKworICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX3g4Nl9wYXVzZQorCisgICAgICAgIHBhdXNlX29wCisgICAgICAgIHJldAorCisJREVCVUdfSU5GTyBfX2ttcF94ODZfcGF1c2UKKworLy8KKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgdm9pZCAqY3B1aWRfYnVmZmVyICk7CisvLworCVBST0MgIF9fa21wX3g4Nl9jcHVpZAorCisJcHVzaGwgJWVicAorCW1vdmwgICVlc3AsJWVicAorICAgICAgICBwdXNobCAlZWRpCisgICAgICAgIHB1c2hsICVlYngKKyAgICAgICAgcHVzaGwgJWVjeAorICAgICAgICBwdXNobCAlZWR4CisKKwltb3ZsICA4KCVlYnApLCAlZWF4CisJbW92bCAgMTIoJWVicCksICVlY3gKKwljcHVpZAkJCQkvLyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisJbW92bCAgMTYoJWVicCksICVlZGkKKwltb3ZsICAlZWF4LCAwKCVlZGkpCisJbW92bCAgJWVieCwgNCglZWRpKQorCW1vdmwgICVlY3gsIDgoJWVkaSkKKwltb3ZsICAlZWR4LCAxMiglZWRpKQorCisgICAgICAgIHBvcGwgICVlZHgKKyAgICAgICAgcG9wbCAgJWVjeAorICAgICAgICBwb3BsICAlZWJ4CisgICAgICAgIHBvcGwgICVlZGkKKyAgICAgICAgbW92bCAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAlZWJwCisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX3g4Nl9jcHVpZAorCisKKyMgaWYgIUtNUF9BU01fSU5UUklOUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworCisgICAgICAgIFBST0MgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZsICAgICAgOCglZXNwKSwgJWVheAorICAgICAgICBsb2NrCisgICAgICAgIHhhZGRsICAgICAlZWF4LCglZWN4KQorICAgICAgICByZXQKKworCURFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDgKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVhbAorCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQ4CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3ggICAgLy8gInAiCisgICAgICAgIG1vdmIgICAgICA4KCVlc3ApLCAlYWwJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnYiAgICAgJWFsLCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQ4CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vIHJldHVybjogICAgICVheAorCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQxNgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4ICAgIC8vICJwIgorICAgICAgICBtb3Z3ICAgICAgOCglZXNwKSwgJWF4CS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ3cgICAgICVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgk0KCVlc3ApCisvLyAJZDoJOCglZXNwKQorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4ICAgIC8vICJwIgorICAgICAgICBtb3ZsICAgICAgOCglZXNwKSwgJWVheAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdsICAgICAlZWF4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQzMgorCisKKy8vCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmIgICAgICA4KCVlc3ApLCAlYWwKKyAgICAgICAgbW92YiAgICAgIDEyKCVlc3ApLCAlZGwKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglZWN4KQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYWwgPT0gKCVlY3gpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92dyAgICAgIDgoJWVzcCksICVheAorICAgICAgICBtb3Z3ICAgICAgMTIoJWVzcCksICVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGd3ICAlZHgsKCVlY3gpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVheCA9PSAoJWVjeCkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmQgICAgICAgJDEsICVlYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbW92bCAgICAgIDEyKCVlc3ApLCAlZWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2wgICVlZHgsKCVlY3gpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVlYXggPT0gKCVlY3gpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKy8vCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKworICAgICAgICBwdXNobCAgICAgJWVicAorICAgICAgICBtb3ZsICAgICAgJWVzcCwgJWVicAorICAgICAgICBwdXNobCAgICAgJWVieAorICAgICAgICBwdXNobCAgICAgJWVkaQorICAgICAgICBtb3ZsICAgICAgOCglZWJwKSwgJWVkaQorICAgICAgICBtb3ZsICAgICAgMTIoJWVicCksICVlYXggICAgICAgIC8vICJjdiIgbG93IG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDE2KCVlYnApLCAlZWR4ICAgICAgICAvLyAiY3YiIGhpZ2ggb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMjAoJWVicCksICVlYnggICAgICAgIC8vICJzdiIgbG93IG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDI0KCVlYnApLCAlZWN4ICAgICAgICAvLyAic3YiIGhpZ2ggb3JkZXIgd29yZAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGc4YiAoJWVkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWVkeDplYXggPT0gKCVlZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcG9wbCAgICAgICVlZGkKKyAgICAgICAgcG9wbCAgICAgICVlYngKKyAgICAgICAgbW92bCAgICAgICVlYnAsICVlc3AKKyAgICAgICAgcG9wbCAgICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKy8vCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92YiAgICAgIDgoJWVzcCksICVhbAorICAgICAgICBtb3ZiICAgICAgMTIoJWVzcCksICVkbAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdiICAlZGwsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdncgICAgICA4KCVlc3ApLCAlYXgKKyAgICAgICAgbW92dyAgICAgIDEyKCVlc3ApLCAlZHgKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbW92bCAgICAgIDEyKCVlc3ApLCAlZWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2wgICVlZHgsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKworLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKy8vCisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisKKyAgICAgICAgcHVzaGwgICAgICVlYnAKKyAgICAgICAgbW92bCAgICAgICVlc3AsICVlYnAKKyAgICAgICAgcHVzaGwgICAgICVlYngKKyAgICAgICAgcHVzaGwgICAgICVlZGkKKyAgICAgICAgbW92bCAgICAgIDgoJWVicCksICVlZGkKKyAgICAgICAgbW92bCAgICAgIDEyKCVlYnApLCAlZWF4ICAgICAgICAvLyAiY3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAxNiglZWJwKSwgJWVkeCAgICAgICAgLy8gImN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDIwKCVlYnApLCAlZWJ4ICAgICAgICAvLyAic3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyNCglZWJwKSwgJWVjeCAgICAgICAgLy8gInN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnOGIgKCVlZGkpCisgICAgICAgIHBvcGwgICAgICAlZWRpCisgICAgICAgIHBvcGwgICAgICAlZWJ4CisgICAgICAgIG1vdmwgICAgICAlZWJwLCAlZXNwCisgICAgICAgIHBvcGwgICAgICAlZWJwCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCisvLworLy8ga21wX3JlYWwzMgorLy8gX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKmFkZHIsIGttcF9yZWFsMzIgZGF0YSApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJYWRkcjoJNCglZXNwKQorLy8gCWRhdGE6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVlYXgKKworCisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfcmVhbDMyCisKKyAgICAgICAgcHVzaGwgICAlZWJwCisgICAgICAgIG1vdmwgICAgJWVzcCwgJWVicAorICAgICAgICBzdWJsICAgICQ0LCAlZXNwCisgICAgICAgIHB1c2hsICAgJWVzaQorCisgICAgICAgIG1vdmwgICAgNCglZWJwKSwgJWVzaQorICAgICAgICBmbGRzICAgICglZXNpKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCA8YWRkcj4KKyAgICAgICAgZnN0cyAgICAtNCglZWJwKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgb2xkIHZhbHVlCisKKyAgICAgICAgbW92bCAgICA4KCVlYnApLCAlZWF4CisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICVlYXgsICglZXNpKQorCisgICAgICAgIGZsZHMgICAgLTQoJWVicCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBvbGQgdmFsdWUKKworICAgICAgICBwb3BsICAgICVlc2kKKyAgICAgICAgbW92bCAgICAlZWJwLCAlZXNwCisgICAgICAgIHBvcGwgICAgJWVicAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfcmVhbDMyCisKKyMgZW5kaWYgLyogIUtNUF9BU01fSU5UUklOUyAqLworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8KKworICAgICAgICBQUk9DICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKyAgICAgICAgbW92bCAgNCglZXNwKSwgJWVheAorICAgICAgICBmbGRjdyAoJWVheCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBtb3ZsICA0KCVlc3ApLCAlZWF4CisgICAgICAgIGZzdGN3ICglZWF4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworLy8KKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHR5cGVkZWYgdm9pZAkoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7CisvLworLy8gaW50CisvLyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLCBpbnQgZ3RpZCwgaW50IHRpZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApIHsKKy8vICAgICgqcGtmbikoICYgZ3RpZCwgJiBndGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorCisvLyAtLSBCZWdpbiBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyBtYXJrX2JlZ2luOworCVBST0MgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCXB1c2hsICVlYnAKKwlLTVBfQ0ZJX0RFRl9PRkZTRVQgOAorCUtNUF9DRklfT0ZGU0VUIGVicCwtOAorCW1vdmwgJWVzcCwlZWJwCQkvLyBlc3RhYmxpc2ggdGhlIGJhc2UgcG9pbnRlciBmb3IgdGhpcyByb3V0aW5lLgorCUtNUF9DRklfUkVHSVNURVIgZWJwCisJc3VibCAkOCwlZXNwCQkvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgdHdvIGxvY2FsIHZhcmlhYmxlcy4KKwkJCQkvLyBUaGVzZSB2YXJpYmFsZXMgYXJlOgorCQkJCS8vCWFyZ3Y6IC00KCVlYnApCisJCQkJLy8JdGVtcDogLTgoJWVicCkKKwkJCQkvLworCXB1c2hsICVlYngJCS8vIHNhdmUgJWVieCB0byB1c2UgZHVyaW5nIHRoaXMgcm91dGluZQorCQkJCS8vCisjaWYgT01QVF9TVVBQT1JUCisJbW92bCAyOCglZWJwKSwlZWJ4CS8vIGdldCBleGl0X2ZyYW1lIGFkZHJlc3MKKwltb3ZsICVlYnAsKCVlYngpCS8vIHNhdmUgZXhpdF9mcmFtZQorI2VuZGlmCisKKwltb3ZsIDIwKCVlYnApLCVlYngJLy8gU3RhY2sgYWxpZ25tZW50IC0gIyBhcmdzCisJYWRkbCAkMiwlZWJ4CQkvLyAjYXJncyArMiAgQWx3YXlzIHBhc3MgYXQgbGVhc3QgMiBhcmdzIChndGlkIGFuZCB0aWQpCisJc2hsbCAkMiwlZWJ4CQkvLyBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBvbiBzdGFjazogKCNhcmdzKzIpKjQKKwltb3ZsICVlc3AsJWVheAkJLy8KKwlzdWJsICVlYngsJWVheAkJLy8gJWVzcC0oKCNhcmdzKzIpKjQpIC0+ICVlYXggLS0gd2l0aG91dCBtb2RzLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdmwgJWVheCwlZWJ4CQkvLyBTYXZlIHRvICVlYngKKwlhbmRsICQweEZGRkZGRjgwLCVlYXgJLy8gbWFzayBvZmYgNyBiaXRzCisJc3VibCAlZWF4LCVlYngJCS8vIEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tICVlc3AKKwlzdWJsICVlYngsJWVzcAkJLy8gUHJlcGFyZSB0aGUgc3RhY2sgcHRyIC0tCisJCQkJLy8gICBub3cgaXQgd2lsbCBiZSBhbGlnbmVkIG9uIDEyOC1ieXRlIGJvdW5kYXJ5IGF0IHRoZSBjYWxsCisKKwltb3ZsIDI0KCVlYnApLCVlYXgJLy8gY29weSBmcm9tIHBfYXJndltdCisJbW92bCAlZWF4LC00KCVlYnApCS8vIGludG8gdGhlIGxvY2FsIHZhcmlhYmxlICphcmd2LgorCisJbW92bCAyMCglZWJwKSwlZWJ4CS8vIGFyZ2MgaXMgMjAoJWVicCkKKwlzaGxsICQyLCVlYngKKworS01QX0xBQkVMKGludm9rZV8yKToKKwljbXBsICQwLCVlYngKKwlqZyAgS01QX0xBQkVMKGludm9rZV80KQorCWptcCBLTVBfTEFCRUwoaW52b2tlXzMpCisJQUxJR04gMgorS01QX0xBQkVMKGludm9rZV80KToKKwltb3ZsIC00KCVlYnApLCVlYXgKKwlzdWJsICQ0LCVlYngJCQkvLyBkZWNyZW1lbnQgYXJnYy4KKwlhZGRsICVlYngsJWVheAkJCS8vIGluZGV4IGludG8gYXJndi4KKwltb3ZsICglZWF4KSwlZWR4CisJcHVzaGwgJWVkeAorCisJam1wIEtNUF9MQUJFTChpbnZva2VfMikKKwlBTElHTiAyCitLTVBfTEFCRUwoaW52b2tlXzMpOgorCWxlYWwgMTYoJWVicCksJWVheAkJLy8gcHVzaCAmIHRpZAorCXB1c2hsICVlYXgKKworCWxlYWwgMTIoJWVicCksJWVheAkJLy8gcHVzaCAmIGd0aWQKKwlwdXNobCAlZWF4CisKKwltb3ZsIDgoJWVicCksJWVieAorCWNhbGwgKiVlYngJCQkvLyBjYWxsICgqcGtmbikoKTsKKworCW1vdmwgJDEsJWVheAkJCS8vIHJldHVybiAxOworCisJbW92bCAtMTIoJWVicCksJWVieAkJLy8gcmVzdG9yZSAlZWJ4CisJbGVhdmUKKwlLTVBfQ0ZJX0RFRiBlc3AsNAorCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyAtLSBFbmQgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCisvLyBrbXBfdWludDY0CisvLyBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCkKKwlQUk9DICBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKwlyZHRzYworCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKy8vIC0tIEVuZCAgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKworI2lmIEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kCisvLyBJbnRlbChSKSA2NCBydW5uaW5nIExpbnV4KiBPUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0gTWFjaGluZSB0eXBlIFAKKy8vIG1hcmtfZGVzY3JpcHRpb24gIkludGVsIENvcnBvcmF0aW9uIjsKKwkuaWRlbnQgIkludGVsIENvcnBvcmF0aW9uIgorLy8gLS0JLmZpbGUgInpfTGludXhfYXNtLnMiCisJLmRhdGEKKwlBTElHTiA0CisKKy8vIFRvIHByZXZlbnQgZ2V0dGluZyBvdXIgY29kZSBpbnRvIC5kYXRhIHNlY3Rpb24gLnRleHQgYWRkZWQgdG8gZXZlcnkgcm91dGluZSBkZWZpbml0aW9uIGZvciB4ODZfNjQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3g4Nl9jcHVpZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgdm9pZCAqY3B1aWRfYnVmZmVyICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAltb2RlOgkJJWVkaQorLy8gCW1vZGUyOgkJJWVzaQorLy8gCWNwdWlkX2J1ZmZlcjoJJXJkeAorCisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfeDg2X2NwdWlkCisKKwlwdXNocSAgJXJicAorCW1vdnEgICAlcnNwLCVyYnAKKyAgICAgICAgcHVzaHEgICVyYngJCQkvLyBjYWxsZWUtc2F2ZSByZWdpc3RlcgorCisJbW92bCAgICVlc2ksICVlY3gJCS8vICJtb2RlMiIKKwltb3ZsICAgJWVkaSwgJWVheAkJLy8gIm1vZGUiCisgICAgICAgIG1vdnEgICAlcmR4LCAlcnNpICAgICAgICAgICAgICAgLy8gY3B1aWRfYnVmZmVyCisJY3B1aWQJCQkJLy8gUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworCW1vdmwgICAlZWF4LCAwKCVyc2kpCQkvLyBzdG9yZSByZXN1bHRzIGludG8gYnVmZmVyCisJbW92bCAgICVlYngsIDQoJXJzaSkKKwltb3ZsICAgJWVjeCwgOCglcnNpKQorCW1vdmwgICAlZWR4LCAxMiglcnNpKQorCisgICAgICAgIHBvcHEgICAlcmJ4CQkJLy8gY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgbW92cSAgICVyYnAsICVyc3AKKyAgICAgICAgcG9wcSAgICVyYnAKKwlyZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3g4Nl9jcHVpZAorCisKKworIyBpZiAhS01QX0FTTV9JTlRSSU5TCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklZXNpCisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImQiCisgICAgICAgIGxvY2sKKyAgICAgICAgeGFkZGwgICAgICVlYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF90ZXN0X3RoZW5fYWRkNjQKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVyc2kKKy8vCXJldHVybjoJJXJheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4CS8vICJkIgorICAgICAgICBsb2NrCisgICAgICAgIHhhZGRxICAgICAlcmF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDgKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVzaWwKKy8vCisvLyByZXR1cm46CSVhbAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQ4CisKKyAgICAgICAgbW92YiAgICAgICVzaWwsICVhbAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdiICAgICAlYWwsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDgKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXNpCisvLyByZXR1cm46ICAgICAlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMTYKKworICAgICAgICBtb3Z3ICAgICAgJXNpLCAlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hndyAgICAgJWF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQxNgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF94Y2hnX2ZpeGVkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklZXNpCisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICAgJWVheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQ2NAorLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfeGNoZ19maXhlZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXJzaQorLy8gcmV0dXJuOgklcmF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hncSAgICAgJXJheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkNjQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorLy8KKy8vIGttcF9pbnQ4CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworICAgICAgICBtb3ZiICAgICAgJXNpbCwgJWFsCS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYWwgPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2Ogklc2kKKy8vCXN2OgklZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYXggPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlZWF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVyc2kKKy8vCXN2OgklcmR4CisvLwlyZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXggICAgLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdxICAlcmR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlcmF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorLy8KKy8vIGttcF9pbnQ4CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVlc2kKKy8vCXN2OgklZWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisgICAgICAgIG1vdmIgICAgICAlc2lsLCAlYWwJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdiICAlZGwsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTZfcmV0KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVzaQorLy8Jc3Y6CSVkeAorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnbCAgJWVkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVyc2kKKy8vCXN2OgklcmR4CisvLwlyZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4ICAgIC8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hncSAgJXJkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisjIGVuZGlmIC8qICFLTVBfQVNNX0lOVFJJTlMgKi8KKworCisjIGlmICFLTVBfTUlDCisKKyMgaWYgIUtNUF9BU01fSU5UUklOUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCisvLworLy8ga21wX3JlYWwzMgorLy8gX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKmFkZHIsIGttcF9yZWFsMzIgZGF0YSApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJYWRkcjoJJXJkaQorLy8gCWRhdGE6CSV4bW0wIChsb3dlciA0IGJ5dGVzKQorLy8KKy8vIHJldHVybjoJJXhtbTAgKGxvd2VyIDQgYnl0ZXMpCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19yZWFsMzIKKworCW1vdmQJJXhtbTAsICVlYXgJLy8gbG9hZCAiZGF0YSIgdG8gZWF4CisKKyAgICAgICAgIGxvY2sKKyAgICAgICAgIHhjaGdsICVlYXgsICglcmRpKQorCisJbW92ZAklZWF4LCAleG1tMAkvLyBsb2FkIG9sZCB2YWx1ZSBpbnRvIHJldHVybiByZWdpc3RlcgorCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19yZWFsMzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDY0CisvLworLy8ga21wX3JlYWw2NAorLy8gX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKmFkZHIsIGttcF9yZWFsNjQgZGF0YSApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAgICAgIGFkZHI6ICAgJXJkaQorLy8gICAgICBkYXRhOiAgICV4bW0wIChsb3dlciA4IGJ5dGVzKQorLy8gICAgICByZXR1cm46ICV4bW0wIChsb3dlciA4IGJ5dGVzKQorLy8KKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX3JlYWw2NAorCisJbW92ZAkleG1tMCwgJXJheAkvLyBsb2FkICJkYXRhIiB0byByYXgKKworICAgICAgICAgbG9jaworCXhjaGdxICAlcmF4LCAoJXJkaSkKKworCW1vdmQJJXJheCwgJXhtbTAJLy8gbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX3JlYWw2NAorCisKKyMgZW5kaWYgLyogIUtNUF9NSUMgKi8KKworIyBlbmRpZiAvKiAhS01QX0FTTV9JTlRSSU5TICovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmbGRjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmc3RjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKy8vCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworI2lmIEtNUF9NSUMKKy8vIFRPRE86IHJlbW92ZSB0aGUgd29ya2Fyb3VuZCBmb3IgcHJvYmxlbSB3aXRoIGZuY2xleCBpbnN0cnVjdGlvbiAobm8gQ1Ega25vd24pCisgICAgICAgIGZzdGVudiAgLTMyKCVyc3ApICAgICAgICAgICAgICAvLyBzdG9yZSBGUCBlbnYKKyAgICAgICAgYW5kdyAgICAkfjB4ODBmZiwgNC0zMiglcnNwKSAgIC8vIGNsZWFyIDAtNywxNSBiaXRzIG9mIEZQIFNXCisgICAgICAgIGZsZGVudiAgLTMyKCVyc3ApICAgICAgICAgICAgICAvLyBsb2FkIEZQIGVudiBiYWNrCisgICAgICAgIHJldAorI2Vsc2UKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorI2VuZGlmCisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyB0eXBlZGVmIHZvaWQJKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworLy8KKy8vIGludAorLy8gX19rbXBfaW52b2tlX21pY3JvdGFzayggdm9pZCAoKnBrZm4pIChpbnQgZ3RpZCwgaW50IHRpZCwgLi4uKSwKKy8vCQkgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworLy8gICAgKCpwa2ZuKSggJiBndGlkLCAmIHRpZCwgYXJndlswXSwgLi4uICk7CisvLyAgICByZXR1cm4gMTsKKy8vIH0KKy8vCisvLyBub3RlOgorLy8JYXQgY2FsbCB0byBwa2ZuIG11c3QgaGF2ZSAlcnNwIDEyOC1ieXRlIGFsaWduZWQgZm9yIGNvbXBpbGVyCisvLworLy8gcGFyYW1ldGVyczoKKy8vICAgICAgJXJkaTogIAlwa2ZuCisvLwklZXNpOglndGlkCisvLwklZWR4Ogl0aWQKKy8vCSVlY3g6CWFyZ2MKKy8vCSVyODoJcF9hcmd2CisvLwklcjk6CSZleGl0X2ZyYW1lCisvLworLy8gbG9jYWxzOgorLy8JX19ndGlkOglndGlkIHBhcm0gcHVzaGVkIG9uIHN0YWNrIHNvIGNhbiBwYXNzICZndGlkIHRvIHBrZm4KKy8vCV9fdGlkOgl0aWQgcGFybSBwdXNoZWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJnRpZCB0byBwa2ZuCisvLworLy8gcmVnIHRlbXBzOgorLy8JJXJheDoJdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UKKy8vCSVyZHg6CXVzZWQgaW4gc3RhY2sgcG9pbnRlciBhbGlnbm1lbnQgY2FsY3VsYXRpb24KKy8vCSVyMTE6CXVzZWQgdG8gdHJhdmVyc2UgcF9hcmd2IGFycmF5CisvLwklcnNpOgl1c2VkIGFzIHRlbXBvcmFyeSBmb3Igc3RhY2sgcGFyYW1ldGVycworLy8JCXVzZWQgYXMgdGVtcG9yYXJ5IGZvciBudW1iZXIgb2YgcGtmbiBwYXJtcyB0byBwdXNoCisvLwklcmJ4Ogl1c2VkIHRvIGhvbGQgcGtmbiBhZGRyZXNzLCBhbmQgemVybyBjb25zdGFudCwgY2FsbGVlLXNhdmUKKy8vCisvLyByZXR1cm46CSVlYXggCShhbHdheXMgMS9UUlVFKQorLy8KKworX19ndGlkID0gLTE2CitfX3RpZCA9IC0yNAorCisvLyAtLSBCZWdpbiBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyBtYXJrX2JlZ2luOworICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCXB1c2hxIAklcmJwCQkvLyBzYXZlIGJhc2UgcG9pbnRlcgorCUtNUF9DRklfREVGX09GRlNFVCAxNgorCUtNUF9DRklfT0ZGU0VUIHJicCwtMTYKKwltb3ZxIAklcnNwLCVyYnAJLy8gZXN0YWJsaXNoIHRoZSBiYXNlIHBvaW50ZXIgZm9yIHRoaXMgcm91dGluZS4KKwlLTVBfQ0ZJX1JFR0lTVEVSIHJicAorCisjaWYgT01QVF9TVVBQT1JUCisJbW92cQklcmJwLCAoJXI5KQkvLyBzYXZlIGV4aXRfZnJhbWUKKyNlbmRpZgorCisJcHVzaHEgCSVyYngJCS8vICVyYnggaXMgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyCisJcHVzaHEJJXJzaQkJLy8gUHV0IGd0aWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJnRnaWQgdG8gcGtmbgorCXB1c2hxCSVyZHgJCS8vIFB1dCB0aWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJnRpZCB0byBwa2ZuCisKKwltb3ZxCSVyY3gsICVyYXgJLy8gU3RhY2sgYWxpZ25tZW50IGNhbGN1bGF0aW9uIGJlZ2luczsgYXJnYyAtPiAlcmF4CisJbW92cQkkMCwgJXJieAkvLyBjb25zdGFudCBmb3IgY21vdnMgbGF0ZXIKKwlzdWJxCSQ0LCAlcmF4CS8vIHN1YnRyYWN0IGZvdXIgYXJncyBwYXNzZWQgaW4gcmVnaXN0ZXJzIHRvIHBrZm4KKyNpZiBLTVBfTUlDCisJanMJS01QX0xBQkVMKGttcF8wKQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJS01QX0xBQkVMKGttcF8wX2V4aXQpCS8vIGp1bXAgYWhlYWQKK0tNUF9MQUJFTChrbXBfMCk6CisJbW92cQklcmJ4LCAlcmF4CS8vIHplcm8gbmVnYXRpdmUgdmFsdWUgaW4gJXJheCA8LSBtYXgoMCwgYXJnYy00KQorS01QX0xBQkVMKGttcF8wX2V4aXQpOgorI2Vsc2UKKwljbW92c3EJJXJieCwgJXJheAkvLyB6ZXJvIG5lZ2F0aXZlIHZhbHVlIGluICVyYXggPC0gbWF4KDAsIGFyZ2MtNCkKKyNlbmRpZiAvLyBLTVBfTUlDCisKKwltb3ZxCSVyYXgsICVyc2kJLy8gc2F2ZSBtYXgoMCwgYXJnYy00KSAtPiAlcnNpIGZvciBsYXRlcgorCXNobHEgCSQzLCAlcmF4CS8vIE51bWJlciBvZiBieXRlcyB1c2VkIG9uIHN0YWNrOiBtYXgoMCwgYXJnYy00KSo4CisKKwltb3ZxIAklcnNwLCAlcmR4CS8vCisJc3VicSAJJXJheCwgJXJkeAkvLyAlcnNwLShtYXgoMCxhcmdjLTQpKjgpIC0+ICVyZHggLS0KKwkJCQkvLyB3aXRob3V0IGFsaWduLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdnEgCSVyZHgsICVyYXgJLy8gU2F2ZSB0byAlcmF4CisKKwlhbmRxIAkkMHhGRkZGRkZGRkZGRkZGRjgwLCAlcmF4ICAvLyBtYXNrIG9mZiBsb3dlciA3IGJpdHMgKDEyOCBieXRlcyBhbGlnbikKKwlzdWJxIAklcmF4LCAlcmR4CS8vIEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tICVyc3AKKwlzdWJxIAklcmR4LCAlcnNwCS8vIFByZXBhcmUgdGhlIHN0YWNrIHB0ciAtLQorCQkJCS8vIG5vdyAlcnNwIHdpbGwgYWxpZ24gdG8gMTI4LWJ5dGUgYm91bmRhcnkgYXQgY2FsbCBzaXRlCisKKwkJCQkvLyBzZXR1cCBwa2ZuIHBhcmFtZXRlciByZWcgYW5kIHN0YWNrCisJbW92cQklcmN4LCAlcmF4CS8vIGFyZ2MgLT4gJXJheAorCWNtcHEJJDAsICVyc2kKKwlqZQlLTVBfTEFCRUwoa21wX2ludm9rZV9wYXNzX3Bhcm1zKQkvLyBqdW1wIGFoZWFkIGlmIG5vIHBhcm1zIHRvIHB1c2gKKwlzaGxxCSQzLCAlcmN4CS8vIGFyZ2MqOCAtPiAlcmN4CisJbW92cSAJJXI4LCAlcmR4CS8vIHBfYXJndiAtPiAlcmR4CisJYWRkcQklcmN4LCAlcmR4CS8vICZwX2FyZ3ZbYXJnY10gLT4gJXJkeAorCisJbW92cQklcnNpLCAlcmN4CS8vIG1heCAoMCwgYXJnYy00KSAtPiAlcmN4CisKK0tNUF9MQUJFTChrbXBfaW52b2tlX3B1c2hfcGFybXMpOgorCS8vIHB1c2ggbnRoIC0gN3RoIHBhcm1zIHRvIHBrZm4gb24gc3RhY2sKKwlzdWJxCSQ4LCAlcmR4CS8vIGRlY3JlbWVudCBwX2FyZ3YgcG9pbnRlciB0byBwcmV2aW91cyBwYXJtCisJbW92cQkoJXJkeCksICVyc2kJLy8gcF9hcmd2WyVyY3gtMV0gLT4gJXJzaQorCXB1c2hxCSVyc2kJCS8vIHB1c2ggcF9hcmd2WyVyY3gtMV0gb250byBzdGFjayAocmV2ZXJzZSBvcmRlcikKKwlzdWJsCSQxLCAlZWN4CisKKy8vIEM2OTU3MDogIlg4Nl82NF9SRUxPQ19CUkFOQ0ggbm90IHN1cHBvcnRlZCIgZXJyb3IgYXQgbGlua2luZyBvbiBtYWNfMzJlCisvLwkJaWYgdGhlIG5hbWUgb2YgdGhlIGxhYmVsIHRoYXQgaXMgYW4gb3BlcmFuZCBvZiB0aGlzIGplY3h6IHN0YXJ0cyB3aXRoIGEgZG90ICgiLiIpOworLy8JICAgQXBwbGUncyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCAxLWJ5dGUgbGVuZ3RoIHJlbG9jYXRpb247CisvLyAgICAgICAgIFJlc29sdXRpb246IHJlcGxhY2UgYWxsIC5sYWJlbFggZW50cmllcyB3aXRoIExfbGFiZWxYLgorCisJamVjeHogICBLTVBfTEFCRUwoa21wX2ludm9rZV9wYXNzX3Bhcm1zKSAgLy8gc3RvcCB3aGVuIGZvdXIgcF9hcmd2W10gcGFybXMgbGVmdAorCWptcAlLTVBfTEFCRUwoa21wX2ludm9rZV9wdXNoX3Bhcm1zKQorCUFMSUdOIDMKK0tNUF9MQUJFTChrbXBfaW52b2tlX3Bhc3NfcGFybXMpOgkvLyBwdXQgMXN0IC0gNnRoIHBhcm1zIHRvIHBrZm4gaW4gcmVnaXN0ZXJzLgorCQkJCS8vIG9yZGVyIGhlcmUgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHRyYXNoaW5nCisJCQkJLy8gcmVnaXN0ZXJzIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBwYXJtcyEKKwltb3ZxCSVyZGksICVyYngJLy8gcGtmbiAtPiAlcmJ4CisJbGVhcQlfX2d0aWQoJXJicCksICVyZGkgLy8gJmd0aWQgLT4gJXJkaSAoc3RvcmUgMXN0IHBhcm0gdG8gcGtmbikKKwlsZWFxCV9fdGlkKCVyYnApLCAlcnNpICAvLyAmdGlkIC0+ICVyc2kgKHN0b3JlIDJuZCBwYXJtIHRvIHBrZm4pCisKKwltb3ZxCSVyOCwgJXIxMQkvLyBwX2FyZ3YgLT4gJXIxMQorCisjaWYgS01QX01JQworCWNtcHEJJDQsICVyYXgJLy8gYXJnYyA+PSA0PworCWpucwlLTVBfTEFCRUwoa21wXzQpCS8vIGp1bXAgdG8gbW92cQorCWptcAlLTVBfTEFCRUwoa21wXzRfZXhpdCkJLy8ganVtcCBhaGVhZAorS01QX0xBQkVMKGttcF80KToKKwltb3ZxCTI0KCVyMTEpLCAlcjkJLy8gcF9hcmd2WzNdIC0+ICVyOSAoc3RvcmUgNnRoIHBhcm0gdG8gcGtmbikKK0tNUF9MQUJFTChrbXBfNF9leGl0KToKKworCWNtcHEJJDMsICVyYXgJLy8gYXJnYyA+PSAzPworCWpucwlLTVBfTEFCRUwoa21wXzMpCS8vIGp1bXAgdG8gbW92cQorCWptcAlLTVBfTEFCRUwoa21wXzNfZXhpdCkJLy8ganVtcCBhaGVhZAorS01QX0xBQkVMKGttcF8zKToKKwltb3ZxCTE2KCVyMTEpLCAlcjgJLy8gcF9hcmd2WzJdIC0+ICVyOCAoc3RvcmUgNXRoIHBhcm0gdG8gcGtmbikKK0tNUF9MQUJFTChrbXBfM19leGl0KToKKworCWNtcHEJJDIsICVyYXgJLy8gYXJnYyA+PSAyPworCWpucwlLTVBfTEFCRUwoa21wXzIpCS8vIGp1bXAgdG8gbW92cQorCWptcAlLTVBfTEFCRUwoa21wXzJfZXhpdCkJLy8ganVtcCBhaGVhZAorS01QX0xBQkVMKGttcF8yKToKKwltb3ZxCTgoJXIxMSksICVyY3gJLy8gcF9hcmd2WzFdIC0+ICVyY3ggKHN0b3JlIDR0aCBwYXJtIHRvIHBrZm4pCitLTVBfTEFCRUwoa21wXzJfZXhpdCk6CisKKwljbXBxCSQxLCAlcmF4CS8vIGFyZ2MgPj0gMT8KKwlqbnMJS01QX0xBQkVMKGttcF8xKQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJS01QX0xBQkVMKGttcF8xX2V4aXQpCS8vIGp1bXAgYWhlYWQKK0tNUF9MQUJFTChrbXBfMSk6CisJbW92cQkoJXIxMSksICVyZHgJLy8gcF9hcmd2WzBdIC0+ICVyZHggKHN0b3JlIDNyZCBwYXJtIHRvIHBrZm4pCitLTVBfTEFCRUwoa21wXzFfZXhpdCk6CisjZWxzZQorCWNtcHEJJDQsICVyYXgJLy8gYXJnYyA+PSA0PworCWNtb3Zuc3EJMjQoJXIxMSksICVyOQkvLyBwX2FyZ3ZbM10gLT4gJXI5IChzdG9yZSA2dGggcGFybSB0byBwa2ZuKQorCisJY21wcQkkMywgJXJheAkvLyBhcmdjID49IDM/CisJY21vdm5zcQkxNiglcjExKSwgJXI4CS8vIHBfYXJndlsyXSAtPiAlcjggKHN0b3JlIDV0aCBwYXJtIHRvIHBrZm4pCisKKwljbXBxCSQyLCAlcmF4CS8vIGFyZ2MgPj0gMj8KKwljbW92bnNxCTgoJXIxMSksICVyY3gJLy8gcF9hcmd2WzFdIC0+ICVyY3ggKHN0b3JlIDR0aCBwYXJtIHRvIHBrZm4pCisKKwljbXBxCSQxLCAlcmF4CS8vIGFyZ2MgPj0gMT8KKwljbW92bnNxCSglcjExKSwgJXJkeAkvLyBwX2FyZ3ZbMF0gLT4gJXJkeCAoc3RvcmUgM3JkIHBhcm0gdG8gcGtmbikKKyNlbmRpZiAvLyBLTVBfTUlDCisKKwljYWxsCSolcmJ4CQkvLyBjYWxsICgqcGtmbikoKTsKKwltb3ZxCSQxLCAlcmF4CS8vIG1vdmUgMSBpbnRvIHJldHVybiByZWdpc3RlcjsKKworCW1vdnEJLTgoJXJicCksICVyYngJLy8gcmVzdG9yZSAlcmJ4CXVzaW5nICVyYnAgc2luY2UgJXJzcCB3YXMgbW9kaWZpZWQKKwltb3ZxIAklcmJwLCAlcnNwCS8vIHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCXBvcHEgCSVyYnAJCS8vIHJlc3RvcmUgZnJhbWUgcG9pbnRlcgorCUtNUF9DRklfREVGIHJzcCw4CisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIC0tIEVuZCAgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisvLyBrbXBfdWludDY0CisvLyBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCkKKyAgICAgICAgLnRleHQKKwlQUk9DICBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKwlyZHRzYworCXNobHEgICAgJDMyLCAlcmR4CisJb3JxICAgICAlcmR4LCAlcmF4CisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorLy8gLS0gRW5kICBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9ic3IzMgorLy8KKy8vIGludAorLy8gX19rbXBfYnNyMzIoIGludCApOworLy8KKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9ic3IzMgorCisgICAgICAgIGJzciAgICAlZWRpLCVlYXgKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9ic3IzMgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vICcKKyNpZiBLTVBfT1NfTElOVVggJiYgS01QX0FSQ0hfQUFSQ0g2NAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHR5cGVkZWYgdm9pZAkoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7CisvLworLy8gaW50CisvLyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCB2b2lkICgqcGtmbikgKGludCBndGlkLCBpbnQgdGlkLCAuLi4pLAorLy8JCSAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgdm9pZCAqcF9hcmd2W10gKSB7CisvLyAgICAoKnBrZm4pKCAmIGd0aWQsICYgdGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorLy8KKy8vIHBhcmFtZXRlcnM6CisvLwl4MDoJcGtmbgorLy8JdzE6CWd0aWQKKy8vCXcyOgl0aWQKKy8vCXczOglhcmdjCisvLwl4NDoJcF9hcmd2CisvLwl4NToJJmV4aXRfZnJhbWUKKy8vCisvLyBsb2NhbHM6CisvLwlfX2d0aWQ6CWd0aWQgcGFybSBwdXNoZWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJmd0aWQgdG8gcGtmbgorLy8JX190aWQ6CXRpZCBwYXJtIHB1c2hlZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGlkIHRvIHBrZm4KKy8vCisvLyByZWcgdGVtcHM6CisvLwkgeDg6CXVzZWQgdG8gaG9sZCBwa2ZuIGFkZHJlc3MKKy8vCSB3OToJdXNlZCBhcyB0ZW1wb3JhcnkgZm9yIG51bWJlciBvZiBwa2ZuIHBhcm1zCisvLwl4MTA6CXVzZWQgdG8gdHJhdmVyc2UgcF9hcmd2IGFycmF5CisvLwl4MTE6CXVzZWQgYXMgdGVtcG9yYXJ5IGZvciBzdGFjayBwbGFjZW1lbnQgY2FsY3VsYXRpb24KKy8vCXgxMjoJdXNlZCBhcyB0ZW1wb3JhcnkgZm9yIHN0YWNrIHBhcmFtZXRlcnMKKy8vCXgxOToJdXNlZCB0byBwcmVzZXJ2ZSBleGl0X2ZyYW1lX3B0ciwgY2FsbGVlLXNhdmUKKy8vCisvLyByZXR1cm46CXcwCShhbHdheXMgMS9UUlVFKQorLy8KKworX19ndGlkID0gNAorX190aWQgPSA4CisKKy8vIC0tIEJlZ2luIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIG1hcmtfYmVnaW47CisJLnRleHQKKwlQUk9DIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCXN0cAl4MjksIHgzMCwgW3NwLCAjLTE2XSEKKyMgaWYgT01QVF9TVVBQT1JUCisJc3RwCXgxOSwgeDIwLCBbc3AsICMtMTZdIQorIyBlbmRpZgorCW1vdgl4MjksIHNwCisKKwlvcnIJdzksIHd6ciwgIzEKKwlhZGQJdzksIHc5LCB3MywgbHNyICMxCisJc3ViCXNwLCBzcCwgdzksIGxzbCAjNAorCW1vdgl4MTEsIHNwCisKKwltb3YJeDgsIHgwCisJc3RyCXcxLCBbeDI5LCAjLV9fZ3RpZF0KKwlzdHIJdzIsIFt4MjksICMtX190aWRdCisJbW92CXc5LCB3MworCW1vdgl4MTAsIHg0CisjIGlmIE9NUFRfU1VQUE9SVAorCW1vdgl4MTksIHg1CisJc3RyCXgyOSwgW3gxOV0KKyMgZW5kaWYKKworCXN1Ygl4MCwgeDI5LCAjX19ndGlkCisJc3ViCXgxLCB4MjksICNfX3RpZAorCisJY2J6CXc5LCBLTVBfTEFCRUwoa21wXzEpCisJbGRyCXgyLCBbeDEwXQorCisJc3ViCXc5LCB3OSwgIzEKKwljYnoJdzksIEtNUF9MQUJFTChrbXBfMSkKKwlsZHIJeDMsIFt4MTAsICM4XSEKKworCXN1Ygl3OSwgdzksICMxCisJY2J6CXc5LCBLTVBfTEFCRUwoa21wXzEpCisJbGRyCXg0LCBbeDEwLCAjOF0hCisKKwlzdWIJdzksIHc5LCAjMQorCWNiegl3OSwgS01QX0xBQkVMKGttcF8xKQorCWxkcgl4NSwgW3gxMCwgIzhdIQorCisJc3ViCXc5LCB3OSwgIzEKKwljYnoJdzksIEtNUF9MQUJFTChrbXBfMSkKKwlsZHIJeDYsIFt4MTAsICM4XSEKKworCXN1Ygl3OSwgdzksICMxCisJY2J6CXc5LCBLTVBfTEFCRUwoa21wXzEpCisJbGRyCXg3LCBbeDEwLCAjOF0hCisKK0tNUF9MQUJFTChrbXBfMCk6CisJc3ViCXc5LCB3OSwgIzEKKwljYnoJdzksIEtNUF9MQUJFTChrbXBfMSkKKwlsZHIJeDEyLCBbeDEwLCAjOF0hCisJc3RyCXgxMiwgW3gxMV0sICM4CisJYglLTVBfTEFCRUwoa21wXzApCitLTVBfTEFCRUwoa21wXzEpOgorCWJscgl4OAorCW9ycgl3MCwgd3pyLCAjMQorCW1vdglzcCwgeDI5CisjIGlmIE9NUFRfU1VQUE9SVAorCXN0cgl4enIsIFt4MTldCisJbGRwCXgxOSwgeDIwLCBbc3BdLCAjMTYKKyMgZW5kaWYKKwlsZHAJeDI5LCB4MzAsIFtzcF0sICMxNgorCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyAtLSBFbmQgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAmJiBLTVBfQVJDSF9BQVJDSDY0ICovCisKKyNpZiBLTVBfQVJDSF9QUEM2NAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHR5cGVkZWYgdm9pZAkoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7CisvLworLy8gaW50CisvLyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCB2b2lkICgqcGtmbikgKGludCBndGlkLCBpbnQgdGlkLCAuLi4pLAorLy8JCSAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgdm9pZCAqcF9hcmd2W10gKSB7CisvLyAgICAoKnBrZm4pKCAmIGd0aWQsICYgdGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorLy8KKy8vIHBhcmFtZXRlcnM6CisvLwlyMzoJcGtmbgorLy8JcjQ6CWd0aWQKKy8vCXI1Ogl0aWQKKy8vCXI2OglhcmdjCisvLwlyNzoJcF9hcmd2CisvLwlyODoJJmV4aXRfZnJhbWUKKy8vCisvLyByZXR1cm46CXIzCShhbHdheXMgMS9UUlVFKQorLy8KKwkudGV4dAorIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorCS5hYml2ZXJzaW9uIDIKKyMgZW5kaWYKKwkuZ2xvYmwJX19rbXBfaW52b2tlX21pY3JvdGFzaworCisjIGlmIEtNUF9BUkNIX1BQQzY0X0xFCisJLnAyYWxpZ24JNAorIyBlbHNlCisJLnAyYWxpZ24JMgorIyBlbmRpZgorCisJLnR5cGUJX19rbXBfaW52b2tlX21pY3JvdGFzayxAZnVuY3Rpb24KKworIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorX19rbXBfaW52b2tlX21pY3JvdGFzazoKKy5MZnVuY19iZWdpbjA6CisuTGZ1bmNfZ2VwMDoKKwlhZGRpcyAyLCAxMiwgLlRPQy4tLkxmdW5jX2dlcDBAaGEKKwlhZGRpIDIsIDIsIC5UT0MuLS5MZnVuY19nZXAwQGwKKy5MZnVuY19sZXAwOgorCS5sb2NhbGVudHJ5CV9fa21wX2ludm9rZV9taWNyb3Rhc2ssIC5MZnVuY19sZXAwLS5MZnVuY19nZXAwCisjIGVsc2UKKwkuc2VjdGlvbgkub3BkLCJhdyIsQHByb2diaXRzCitfX2ttcF9pbnZva2VfbWljcm90YXNrOgorCS5wMmFsaWduCTMKKwkucXVhZAkuTGZ1bmNfYmVnaW4wCisJLnF1YWQJLlRPQy5AdG9jYmFzZQorCS5xdWFkCTAKKwkudGV4dAorLkxmdW5jX2JlZ2luMDoKKyMgZW5kaWYKKworLy8gLS0gQmVnaW4gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gbWFya19iZWdpbjsKKworLy8gV2UgbmVlZCB0byBhbGxvY2F0ZSBhIHN0YWNrIGZyYW1lIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCBvZiB0aGUgcGFyYW1ldGVycworLy8gb24gdGhlIHN0YWNrIGZvciB0aGUgbWljcm90YXNrIHBsdXMgd2hhdCB0aGlzIGZ1bmN0aW9uIG5lZWRzLiBUaGF0J3MgNDgKKy8vIGJ5dGVzIHVuZGVyIHRoZSBFTEZ2MSBBQkkgKDMyIGJ5dGVzIHVuZGVyIEVMRnYyKSwgcGx1cyA4KigyICsgYXJnYykgZm9yIHRoZQorLy8gcGFyYW1ldGVycyB0byB0aGUgbWljcm90YXNrLCBwbHVzIDggYnl0ZXMgdG8gc3RvcmUgdGhlIHZhbHVlcyBvZiByNCBhbmQgcjUsCisvLyBhbmQgOCBieXRlcyB0byBzdG9yZSByMzEuIFdpdGggT01QLVQgc3VwcG9ydCwgd2UgbmVlZCBhbiBhZGRpdGlvbmFsIDggYnl0ZXMKKy8vIHRvIHNhdmUgcjMwIHRvIGhvbGQgYSBjb3B5IG9mIHI4LgorCisJLmNmaV9zdGFydHByb2MKKwltZmxyIDAKKwlzdGQgMzEsIC04KDEpCisJc3RkIDAsIDE2KDEpCisKKy8vIFRoaXMgaXMgdW51c3VhbCBiZWNhdXNlIG5vcm1hbGx5IHdlJ2Qgc2V0IHIzMSBlcXVhbCB0byByMSBhZnRlciB0aGUgc3RhY2sKKy8vIGZyYW1lIGlzIGVzdGFibGlzaGVkLiBJbiB0aGlzIGNhc2UsIGhvd2V2ZXIsIHdlIG5lZWQgdG8gZHluYW1pY2FsbHkgY29tcHV0ZQorLy8gdGhlIHN0YWNrIGZyYW1lIHNpemUsIGFuZCBzbyB3ZSBrZWVwIGEgZGlyZWN0IGNvcHkgb2YgcjEgdG8gYWNjZXNzIG91cgorLy8gcmVnaXN0ZXIgc2F2ZSBhcmVhcyBhbmQgcmVzdG9yZSB0aGUgcjEgdmFsdWUgYmVmb3JlIHJldHVybmluZy4KKwltciAzMSwgMQorCS5jZmlfZGVmX2NmYV9yZWdpc3RlciByMzEKKwkuY2ZpX29mZnNldCByMzEsIC04CisJLmNmaV9vZmZzZXQgbHIsIDE2CisKKy8vIENvbXB1dGUgdGhlIHNpemUgbmVjZXNzYXJ5IGZvciB0aGUgbG9jYWwgc3RhY2sgZnJhbWUuCisjIGlmIEtNUF9BUkNIX1BQQzY0X0xFCisJbGkgMTIsIDcyCisjIGVsc2UKKwlsaSAxMiwgODgKKyMgZW5kaWYKKwlzbGRpIDAsIDYsIDMKKwlhZGQgMTIsIDAsIDEyCisJbmVnIDEyLCAxMgorCisvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdGFjayBmcmFtZSBzdGF5cyBhbGlnbmVkICh0byAxNiBieXRlcywgZXhjZXB0CisvLyB1bmRlciB0aGUgQkcvUSBDTkssIHdoZXJlIGl0IG11c3QgYmUgdG8gMzIgYnl0ZXMpLgorIyBpZiBLTVBfT1NfQ05LCisJbGkgMCwgLTMyCisjIGVsc2UKKwlsaSAwLCAtMTYKKyMgZW5kaWYKKwlhbmQgMTIsIDAsIDEyCisKKy8vIEVzdGFibGlzaCB0aGUgbG9jYWwgc3RhY2sgZnJhbWUuCisJc3RkdXggMSwgMSwgMTIKKworIyBpZiBPTVBUX1NVUFBPUlQKKwkuY2ZpX29mZnNldCByMzAsIC0xNgorCXN0ZCAzMCwgLTE2KDMxKQorCXN0ZCAxLCAwKDgpCisJbXIgMzAsIDgKKyMgZW5kaWYKKworLy8gU3RvcmUgZ3RpZCBhbmQgdGlkIHRvIHRoZSBzdGFjayBiZWNhdXNlIHRoZXkncmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSB0byB0aGUgbWljcm90YXNrLgorCXN0dyA0LCAtMjAoMzEpCisJc3R3IDUsIC0yNCgzMSkKKworCW1yIDEyLCA2CisJbXIgNCwgNworCisJY21wd2kgMCwgMTIsIDEKKwlibHQJIDAsIC5MY2FsbAorCisJbGQgNSwgMCg0KQorCisJY21wd2kgMCwgMTIsIDIKKwlibHQJIDAsIC5MY2FsbAorCisJbGQgNiwgOCg0KQorCisJY21wd2kgMCwgMTIsIDMKKwlibHQJIDAsIC5MY2FsbAorCisJbGQgNywgMTYoNCkKKworCWNtcHdpIDAsIDEyLCA0CisJYmx0CSAwLCAuTGNhbGwKKworCWxkIDgsIDI0KDQpCisKKwljbXB3aSAwLCAxMiwgNQorCWJsdAkgMCwgLkxjYWxsCisKKwlsZCA5LCAzMig0KQorCisJY21wd2kgMCwgMTIsIDYKKwlibHQJIDAsIC5MY2FsbAorCisJbGQgMTAsIDQwKDQpCisKKwljbXB3aSAwLCAxMiwgNworCWJsdAkgMCwgLkxjYWxsCisKKy8vIFRoZXJlIGFyZSBtb3JlIHRoYW4gNiBtaWNyb3Rhc2sgcGFyYW1ldGVycywgc28gd2UgbmVlZCB0byBzdG9yZSB0aGUKKy8vIHJlbWFpbmRlciB0byB0aGUgc3RhY2suCisJYWRkaSAxMiwgMTIsIC02CisJbXRjdHIgMTIKKworLy8gVGhlc2UgYXJlIHNldCB0byA4IGJ5dGVzIGJlZm9yZSB0aGUgZmlyc3QgZGVzaXJlZCBzdG9yZSBhZGRyZXNzICh3ZSdyZSB1c2luZworLy8gcHJlLWluY3JlbWVudCBsb2FkcyBhbmQgc3RvcmVzIGluIHRoZSBsb29wIGJlbG93KS4gVGhlIHBhcmFtZXRlciBzYXZlIGFyZWEKKy8vIGZvciB0aGUgbWljcm90YXNrIGJlZ2lucyA0OCArIDgqOCA9PSAxMTIgYnl0ZXMgYWJvdmUgcjEgZm9yIEVMRnYxIGFuZAorLy8gMzIgKyA4KjggPT0gOTYgYnl0ZXMgYWJvdmUgcjEgZm9yIEVMRnYyLgorCWFkZGkgNCwgNCwgNDAKKyMgaWYgS01QX0FSQ0hfUFBDNjRfTEUKKwlhZGRpIDEyLCAxLCA4OAorIyBlbHNlCisJYWRkaSAxMiwgMSwgMTA0CisjIGVuZGlmCisKKy5MbmV4dDoKKwlsZHUgMCwgOCg0KQorCXN0ZHUgMCwgOCgxMikKKwliZG56IC5MbmV4dAorCisuTGNhbGw6CisjIGlmIEtNUF9BUkNIX1BQQzY0X0xFCisJc3RkIDIsIDI0KDEpCisJbXIgMTIsIDMKKyNlbHNlCisJc3RkIDIsIDQwKDEpCisvLyBGb3IgRUxGdjEsIHdlIG5lZWQgdG8gbG9hZCB0aGUgYWN0dWFsIGZ1bmN0aW9uIGFkZHJlc3MgZnJvbSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvci4KKwlsZCAxMiwgMCgzKQorCWxkIDIsIDgoMykKKwlsZCAxMSwgMTYoMykKKyNlbmRpZgorCisJYWRkaSAzLCAzMSwgLTIwCisJYWRkaSA0LCAzMSwgLTI0CisKKwltdGN0ciAxMgorCWJjdHJsCisjIGlmIEtNUF9BUkNIX1BQQzY0X0xFCisJbGQgMiwgMjQoMSkKKyMgZWxzZQorCWxkIDIsIDQwKDEpCisjIGVuZGlmCisKKyMgaWYgT01QVF9TVVBQT1JUCisJbGkgMywgMAorCXN0ZCAzLCAwKDMwKQorIyBlbmRpZgorCisJbGkgMywgMQorCisjIGlmIE9NUFRfU1VQUE9SVAorCWxkIDMwLCAtMTYoMzEpCisjIGVuZGlmCisKKwltciAxLCAzMQorCWxkIDAsIDE2KDEpCisJbGQgMzEsIC04KDEpCisJbXRsciAwCisJYmxyCisKKwkubG9uZwkwCisJLnF1YWQJMAorLkxmdW5jX2VuZDA6CisJLnNpemUJX19rbXBfaW52b2tlX21pY3JvdGFzaywgLkxmdW5jX2VuZDAtLkxmdW5jX2JlZ2luMAorCS5jZmlfZW5kcHJvYworCisvLyAtLSBFbmQgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworI2VuZGlmIC8qIEtNUF9BUkNIX1BQQzY0ICovCisKKyNpZiBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfTUlQUworICAgIC5kYXRhCisgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIsOAorICAgIC5kYXRhCisgICAgLmFsaWduIDQKKyAgICAuZ2xvYmFsIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgIC40Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgIC5zaXplIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciw0CisjZW5kaWYgLyogS01QX0FSQ0hfQVJNICovCisKKyNpZiBLTVBfQVJDSF9QUEM2NCB8fCBLTVBfQVJDSF9BQVJDSDY0IHx8IEtNUF9BUkNIX01JUFM2NAorICAgIC5kYXRhCisgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIsOAorICAgIC5kYXRhCisgICAgLmFsaWduIDgKKyAgICAuZ2xvYmFsIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgIC44Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgIC5zaXplIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciw4CisjZW5kaWYgLyogS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NCAqLworCisjaWYgS01QX09TX0xJTlVYCisjIGlmIEtNUF9BUkNIX0FSTQorLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLCVwcm9nYml0cworIyBlbHNlCisuc2VjdGlvbiAubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy96X0xpbnV4X3V0aWwuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL3pfTGludXhfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0OTBlYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy96X0xpbnV4X3V0aWwuY3BwCkBAIC0wLDAgKzEsMjYxMiBAQAorLyoKKyAqIHpfTGludXhfdXRpbC5jcHAgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisjaW5jbHVkZSAia21wX2FmZmluaXR5LmgiCisKKyNpZiAhS01QX09TX0ZSRUVCU0QgJiYgIUtNUF9PU19ORVRCU0QKKyMgaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+ICAgICAgICAgICAgICAgLy8gSFVHRV9WQUwuCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWYgS01QX09TX0xJTlVYICYmICFLTVBfT1NfQ05LCisjIGluY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisjIGlmIEtNUF9VU0VfRlVURVgKKy8vIFdlIHNob3VsZCByZWFsbHkgaW5jbHVkZSA8ZnV0ZXguaD4sIGJ1dCB0aGF0IGNhdXNlcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIG9uIGRpZmZlcmVudAorLy8gTGludXgqIE9TIGRpc3RyaWJ1dGlvbnMgdGhhdCBlaXRoZXIgcmVxdWlyZSB0aGF0IHlvdSBpbmNsdWRlIChvciBicmVhayB3aGVuIHlvdSB0cnkgdG8gaW5jbHVkZSkKKy8vIDxwY2kvdHlwZXMuaD4uCisvLyBTaW5jZSBhbGwgd2UgbmVlZCBpcyB0aGUgdHdvIG1hY3JvcyBiZWxvdyAod2hpY2ggYXJlIHBhcnQgb2YgdGhlIGtlcm5lbCBBQkksIHNvIGNhbid0IGNoYW5nZSkKKy8vIHdlIGp1c3QgZGVmaW5lIHRoZSBjb25zdGFudHMgaGVyZSBhbmQgZG9uJ3QgaW5jbHVkZSA8ZnV0ZXguaD4KKyMgIGlmbmRlZiBGVVRFWF9XQUlUCisjICAgZGVmaW5lIEZVVEVYX1dBSVQgICAgMAorIyAgZW5kaWYKKyMgIGlmbmRlZiBGVVRFWF9XQUtFCisjICAgZGVmaW5lIEZVVEVYX1dBS0UgICAgMQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbGlmIEtNUF9PU19EQVJXSU4KKyMgaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorIyBpbmNsdWRlIDxtYWNoL21hY2guaD4KKyNlbGlmIEtNUF9PU19GUkVFQlNECisjIGluY2x1ZGUgPHB0aHJlYWRfbnAuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAidHNhbl9hbm5vdGF0aW9ucy5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3Qga21wX3N5c190aW1lciB7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICBzdGFydDsKK307CisKKy8vIENvbnZlcnQgdGltZXNwZWMgdG8gbmFub3NlY29uZHMuCisjZGVmaW5lIFRTMk5TKHRpbWVzcGVjKSAoKCh0aW1lc3BlYykudHZfc2VjICogMWU5KSArICh0aW1lc3BlYykudHZfbnNlYykKKworc3RhdGljIHN0cnVjdCBrbXBfc3lzX3RpbWVyIF9fa21wX3N5c190aW1lcl9kYXRhOworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIHNpZ19mdW5jX3QgKSggaW50ICk7CisgICAgU1RBVElDX0VGSTJfV09SS0FST1VORCBzdHJ1Y3Qgc2lnYWN0aW9uICAgIF9fa21wX3NpZ2hsZHJzWyBOU0lHIF07CisgICAgc3RhdGljIHNpZ3NldF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3NpZ3NldDsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9fa21wX2luaXRfcnVudGltZSAgID0gRkFMU0U7CisKK3N0YXRpYyBpbnQgX19rbXBfZm9ya19jb3VudCA9IDA7CisKK3N0YXRpYyBwdGhyZWFkX2NvbmRhdHRyX3QgIF9fa21wX3N1c3BlbmRfY29uZF9hdHRyOworc3RhdGljIHB0aHJlYWRfbXV0ZXhhdHRyX3QgX19rbXBfc3VzcGVuZF9tdXRleF9hdHRyOworCitzdGF0aWMga21wX2NvbmRfYWxpZ25fdCAgICBfX2ttcF93YWl0X2N2Oworc3RhdGljIGttcF9tdXRleF9hbGlnbl90ICAgX19rbXBfd2FpdF9teDsKKworZG91YmxlIF9fa21wX3RpY2tzX3Blcl9uc2VjOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAorc3RhdGljIHZvaWQKK19fa21wX3ByaW50X2NvbmQoIGNoYXIgKmJ1ZmZlciwga21wX2NvbmRfYWxpZ25fdCAqY29uZCApCit7CisgICAgS01QX1NOUFJJTlRGKCBidWZmZXIsIDEyOCwgIihjb25kIChsb2NrICglbGQsICVkKSksIChkZXNjciAoJXApKSkiLAorICAgICAgICAgICAgICAgICAgICAgIGNvbmQtPmNfY29uZC5fX2NfbG9jay5fX3N0YXR1cywgY29uZC0+Y19jb25kLl9fY19sb2NrLl9fc3BpbmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgY29uZC0+Y19jb25kLl9fY193YWl0aW5nICk7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmICggS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQpCisKKy8qCisgKiBBZmZpbml0eSBzdXBwb3J0CisgKi8KKwordm9pZAorX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoIGludCB3aGljaCApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKG1hc2spOworICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKyAgICBLTVBfQ1BVX1NFVCh3aGljaCwgbWFzayk7CisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShtYXNrLCBUUlVFKTsKKyAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhtYXNrKTsKK30KKworLyoKKyAqIERldGVybWluZSBpZiB3ZSBjYW4gYWNjZXNzIGFmZmluaXR5IGZ1bmN0aW9uYWxpdHkgb24gdGhpcyB2ZXJzaW9uIG9mCisgKiBMaW51eCogT1MgYnkgY2hlY2tpbmcgX19OUl9zY2hlZF97Z2V0LHNldH1hZmZpbml0eSBzeXN0ZW0gY2FsbHMsIGFuZCBzZXQKKyAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgKDAgbWVhbnMgbm90IGNhcGFibGUpLgorICovCit2b2lkCitfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZShjb25zdCBjaGFyICplbnZfdmFyKQoreworICAgIC8vCisgICAgLy8gQ2hlY2sgYW5kIHNlZSBpZiB0aGUgT1Mgc3VwcG9ydHMgdGhyZWFkIGFmZmluaXR5LgorICAgIC8vCisKKyMgZGVmaW5lIEtNUF9DUFVfU0VUX1NJWkVfTElNSVQgICAgICAgICAgKDEwMjQqMTAyNCkKKworICAgIGludCBnQ29kZTsKKyAgICBpbnQgc0NvZGU7CisgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgIGJ1ZiA9ICggdW5zaWduZWQgY2hhciAqICkgS01QX0lOVEVSTkFMX01BTExPQyggS01QX0NQVV9TRVRfU0laRV9MSU1JVCApOworCisgICAgLy8gSWYgTGludXgqIE9TOgorICAgIC8vIElmIHRoZSBzeXNjYWxsIGZhaWxzIG9yIHJldHVybnMgYSBzdWdnZXN0aW9uIGZvciB0aGUgc2l6ZSwKKyAgICAvLyB0aGVuIHdlIGRvbid0IGhhdmUgdG8gc2VhcmNoIGZvciBhbiBhcHByb3ByaWF0ZSBzaXplLgorICAgIGdDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgS01QX0NQVV9TRVRfU0laRV9MSU1JVCwgYnVmICk7CisgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgImluaXRpYWwgZ2V0YWZmaW5pdHkgY2FsbCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgIGdDb2RlLCBlcnJubykpOworCisgICAgLy9pZiAoKGdDb2RlIDwgMCkgJiYgKGVycm5vID09IEVOT1NZUykpCisgICAgaWYgKGdDb2RlIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkCisgICAgICAgIC8vCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkKKyAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIGttcF9tc2dfdCBlcnJfY29kZSA9IEtNUF9FUlIoIGVycm9yICk7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgS01QX01TRyggR2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCwgZW52X3ZhciApLAorICAgICAgICAgICAgICAgIGVycl9jb2RlLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChnQ29kZSA+IDApIHsgLy8gTGludXgqIE9TIG9ubHkKKyAgICAgICAgLy8gVGhlIG9wdGltYWwgc2l0dWF0aW9uOiB0aGUgT1MgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgICAgIC8vIGl0IGV4cGVjdHMuCisgICAgICAgIC8vCisgICAgICAgIC8vIEEgdmVyaWZpY2F0aW9uIG9mIGNvcnJlY3QgYmVoYXZpb3IgaXMgdGhhdCBJc2V0YWZmaW5pdHkgb24gYSBOVUxMCisgICAgICAgIC8vIGJ1ZmZlciB3aXRoIHRoZSBzYW1lIHNpemUgZmFpbHMgd2l0aCBlcnJubyBzZXQgdG8gRUZBVUxULgorICAgICAgICBzQ29kZSA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIDAsIGdDb2RlLCBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAic2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICBnQ29kZSwgc0NvZGUsIGVycm5vKSk7CisgICAgICAgIGlmIChzQ29kZSA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9TWVMpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgICAga21wX21zZ190IGVycl9jb2RlID0gS01QX0VSUiggZXJyb3IgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyICksCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUZBVUxUKSB7CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0VOQUJMRShnQ29kZSk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAgICAgICAiYWZmaW5pdHkgc3VwcG9ydGVkIChtYXNrIHNpemUgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUpKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gQ2FsbCB0aGUgZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwgcmVwZWF0ZWRseSB3aXRoIGluY3JlYXNpbmcgc2V0IHNpemVzCisgICAgLy8gdW50aWwgd2Ugc3VjY2VlZCwgb3IgcmVhY2ggYW4gdXBwZXIgYm91bmQgb24gdGhlIHNlYXJjaC4KKyAgICAvLworICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgInNlYXJjaGluZyBmb3IgcHJvcGVyIHNldCBzaXplXG4iKSk7CisgICAgaW50IHNpemU7CisgICAgZm9yIChzaXplID0gMTsgc2l6ZSA8PSBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlUOyBzaXplICo9IDIpIHsKKyAgICAgICAgZ0NvZGUgPSBzeXNjYWxsKCBfX05SX3NjaGVkX2dldGFmZmluaXR5LCAwLCAgc2l6ZSwgYnVmICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICJnZXRhZmZpbml0eSBmb3IgbWFzayBzaXplICVkIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsIHNpemUsCisgICAgICAgICAgICBnQ29kZSwgZXJybm8pKTsKKworICAgICAgICBpZiAoZ0NvZGUgPCAwKSB7CisgICAgICAgICAgICBpZiAoIGVycm5vID09IEVOT1NZUyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgZ2V0IGhlcmUKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudCBPUyBjYWxsIGJlaGF2aW9yOiBlcnJubyA9PSBFTk9TWVMgZm9yIG1hc2sgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzaXplKSk7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICAgICAgICAgIGttcF9tc2dfdCBlcnJfY29kZSA9IEtNUF9FUlIoIGVycm9yICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggR2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCwgZW52X3ZhciApLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZikgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmVycl9jb2RlLnN0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc0NvZGUgPSBzeXNjYWxsKCBfX05SX3NjaGVkX3NldGFmZmluaXR5LCAwLCBnQ29kZSwgTlVMTCApOworICAgICAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgInNldGFmZmluaXR5IGZvciBtYXNrIHNpemUgJWQgcmV0dXJuZWQgJWQgZXJybm8gPSAlZFxuIiwKKyAgICAgICAgICAgZ0NvZGUsIHNDb2RlLCBlcnJubykpOworICAgICAgICBpZiAoc0NvZGUgPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRU5PU1lTKSB7IC8vIExpbnV4KiBPUyBvbmx5CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgZ2V0IGhlcmUKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudCBPUyBjYWxsIGJlaGF2aW9yOiBlcnJubyA9PSBFTk9TWVMgZm9yIG1hc2sgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzaXplKSk7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAgICAgICAgICAgIGttcF9tc2dfdCBlcnJfY29kZSA9IEtNUF9FUlIoIGVycm9yICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggU2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCwgZW52X3ZhciApLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZikgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmVycl9jb2RlLnN0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRU5BQkxFKGdDb2RlKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICJhZmZpbml0eSBzdXBwb3J0ZWQgKG1hc2sgc2l6ZSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUpKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvL2ludCBlcnJvciA9IGVycm5vOyAgLy8gc2F2ZSB1bmNhdWdodCBlcnJvciBjb2RlCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAvLyBlcnJubyA9IGVycm9yOyAgLy8gcmVzdG9yZSB1bmNhdWdodCBlcnJvciBjb2RlLCB3aWxsIGJlIHByaW50ZWQgYXQgdGhlIG5leHQgS01QX1dBUk5JTkcgYmVsb3cKKworICAgIC8vCisgICAgLy8gQWZmaW5pdHkgaXMgbm90IHN1cHBvcnRlZAorICAgIC8vCisgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICJjYW5ub3QgZGV0ZXJtaW5lIG1hc2sgc2l6ZSAtIGFmZmluaXR5IG5vdCBzdXBwb3J0ZWRcbiIpKTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICBLTVBfV0FSTklORyggQWZmQ2FudEdldE1hc2tTaXplLCBlbnZfdmFyICk7CisgICAgfQorfQorCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9VU0VfRlVURVgKKworaW50CitfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZSgpCit7CisgICAgaW50IGxvYyA9IDA7CisgICAgaW50IHJjID0gc3lzY2FsbCggX19OUl9mdXRleCwgJmxvYywgRlVURVhfV0FLRSwgMSwgTlVMTCwgTlVMTCwgMCApOworICAgIGludCByZXR2YWwgPSAoIHJjID09IDAgKSB8fCAoIGVycm5vICE9IEVOT1NZUyApOworCisgICAgS0FfVFJBQ0UoMTAsICggIl9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlOiByYyA9ICVkIGVycm5vID0gJWRcbiIsIHJjLAorICAgICAgZXJybm8gKSApOworICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZTogZnV0ZXggc3lzY2FsbCVzIHN1cHBvcnRlZFxuIiwKKyAgICAgICAgcmV0dmFsID8gIiIgOiAiIG5vdCIgKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmIC8vIEtNUF9VU0VfRlVURVgKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KSAmJiAoISBLTVBfQVNNX0lOVFJJTlMpCisvKgorICogT25seSAzMi1iaXQgImFkZC1leGNoYW5nZSIgaW5zdHJ1Y3Rpb24gb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGNhdXNlcyB1cyB0bworICogdXNlIGNvbXBhcmVfYW5kX3N0b3JlIGZvciB0aGVzZSByb3V0aW5lcworICovCisKK2ttcF9pbnQ4CitfX2ttcF90ZXN0X3RoZW5fb3I4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApCit7CisgICAga21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50OAorX19rbXBfdGVzdF90aGVuX2FuZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICkKK3sKKyAgICBrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDggKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzEoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQzMgorX19rbXBfdGVzdF90aGVuX29yMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKQoreworICAgIGttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1BQQzY0IHx8IChLTVBfT1NfTElOVVggJiYgS01QX0FSQ0hfQUFSQ0g2NCkKK2ttcF9pbnQ4CitfX2ttcF90ZXN0X3RoZW5fYWRkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKQoreworICAgIGttcF9pbnQ4IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzEoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfUFBDNjQgfHwgKEtNUF9PU19MSU5VWCAmJiBLTVBfQVJDSF9BQVJDSDY0KSAqLworCitrbXBfaW50NjQKK19fa21wX3Rlc3RfdGhlbl9vcjY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyNlbmRpZiAvKiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkgJiYgKCEgS01QX0FTTV9JTlRSSU5TKSAqLworCit2b2lkCitfX2ttcF90ZXJtaW5hdGVfdGhyZWFkKCBpbnQgZ3RpZCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfaW5mb190ICAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBpZiAoICF0aCApIHJldHVybjsKKworICAgICNpZmRlZiBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3Rlcm1pbmF0ZV90aHJlYWQ6IGtpbGwgKCVkKVxuIiwgZ3RpZCApICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY2FuY2VsKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRVNSQ0ggKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRUZXJtaW5hdGVXb3JrZXJUaHJlYWQgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYKKyAgICBfX2ttcF95aWVsZCggVFJVRSApOworfSAvLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogU2V0IHRocmVhZCBzdGFjayBpbmZvIGFjY29yZGluZyB0byB2YWx1ZXMgcmV0dXJuZWQgYnkKKyAqIHB0aHJlYWRfZ2V0YXR0cl9ucCgpLgorICogSWYgdmFsdWVzIGFyZSB1bnJlYXNvbmFibGUsIGFzc3VtZSBjYWxsIGZhaWxlZCBhbmQgdXNlCisgKiBpbmNyZW1lbnRhbCBzdGFjayByZWZpbmVtZW50IG1ldGhvZCBpbnN0ZWFkLgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBzdGFjayBwYXJhbWV0ZXJzIGNvdWxkIGJlIGRldGVybWluZWQgZXhhY3RseSwKKyAqIEZBTFNFIGlmIGluY3JlbWVudGFsIHJlZmluZW1lbnQgaXMgbmVjZXNzYXJ5LgorICovCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9zZXRfc3RhY2tfaW5mbyggaW50IGd0aWQsIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgICAgICAgICAgICBzdGFja19kYXRhOworI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisgICAgLyogTGludXgqIE9TIG9ubHkgLS0gbm8gcHRocmVhZF9nZXRhdHRyX25wIHN1cHBvcnQgb24gT1MgWCogKi8KKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIGludCAgICAgICAgICAgIHN0YXR1czsKKyAgICBzaXplX3QgICAgICAgICBzaXplID0gMDsKKyAgICB2b2lkICogICAgICAgICBhZGRyID0gMDsKKworICAgIC8qIEFsd2F5cyBkbyBpbmNyZW1lbnRhbCBzdGFjayByZWZpbmVtZW50IGZvciB1YmVybWFzdGVyIHRocmVhZHMgc2luY2UgdGhlIGluaXRpYWwKKyAgICAgICB0aHJlYWQgc3RhY2sgcmFuZ2UgY2FuIGJlIHJlZHVjZWQgYnkgc2libGluZyB0aHJlYWQgY3JlYXRpb24gc28gcHRocmVhZF9hdHRyX2dldHN0YWNrCisgICAgICAgbWF5IGNhdXNlIHRocmVhZCBndGlkIGFsaWFzaW5nICovCisgICAgaWYgKCAhIEtNUF9VQkVSX0dUSUQoZ3RpZCkgKSB7CisKKyAgICAgICAgLyogRmV0Y2ggdGhlIHJlYWwgdGhyZWFkIGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2luaXQoICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2luaXQiLCBzdGF0dXMgKTsKKyNpZiBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9nZXRfbnAoIHB0aHJlYWRfc2VsZigpLCAmYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9nZXRfbnAiLCBzdGF0dXMgKTsKKyNlbHNlCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfZ2V0YXR0cl9ucCggcHRocmVhZF9zZWxmKCksICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9nZXRhdHRyX25wIiwgc3RhdHVzICk7CisjZW5kaWYKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2dldHN0YWNrKCAmYXR0ciwgJmFkZHIsICZzaXplICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2dldHN0YWNrIiwgc3RhdHVzICk7CisgICAgICAgIEtBX1RSQUNFKCA2MCwgKCAiX19rbXBfc2V0X3N0YWNrX2luZm86IFQjJWQgcHRocmVhZF9hdHRyX2dldHN0YWNrIHJldHVybmVkIHNpemU6ICVsdSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgImxvdyBhZGRyOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHNpemUsIGFkZHIgKSk7CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2Rlc3Ryb3koICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICB9CisKKyAgICBpZiAoIHNpemUgIT0gMCAmJiBhZGRyICE9IDAgKSB7ICAgICAvKiB3YXMgc3RhY2sgcGFyYW1ldGVyIGRldGVybWluYXRpb24gc3VjY2Vzc2Z1bD8gKi8KKyAgICAgICAgLyogU3RvcmUgdGhlIGNvcnJlY3QgYmFzZSBhbmQgc2l6ZSAqLworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgKCgoY2hhciAqKWFkZHIpICsgc2l6ZSkpOworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgc2l6ZSk7CisgICAgICAgIFRDV180KHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdywgRkFMU0UpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisjZW5kaWYgLyogS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QgKi8KKyAgICAvKiBVc2UgaW5jcmVtZW50YWwgcmVmaW5lbWVudCBzdGFydGluZyBmcm9tIGluaXRpYWwgY29uc2VydmF0aXZlIGVzdGltYXRlICovCisgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIDApOworICAgIFRDV19QVFIodGggLT4gdGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICZzdGFja19kYXRhKTsKKyAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIFRSVUUpOworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQqCitfX2ttcF9sYXVuY2hfd29ya2VyKCB2b2lkICp0aHIgKQoreworICAgIGludCBzdGF0dXMsIG9sZF90eXBlLCBvbGRfc3RhdGU7CisjaWZkZWYgS01QX0JMT0NLX1NJR05BTFMKKyAgICBzaWdzZXRfdCAgICBuZXdfc2V0LCBvbGRfc2V0OworI2VuZGlmIC8qIEtNUF9CTE9DS19TSUdOQUxTICovCisgICAgdm9pZCAqZXhpdF92YWw7CisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKyAgICB2b2lkICogdm9sYXRpbGUgcGFkZGluZyA9IDA7CisjZW5kaWYKKyAgICBpbnQgZ3RpZDsKKworICAgIGd0aWQgPSAoKGttcF9pbmZvX3QqKXRocikgLT4gdGgudGhfaW5mby5kcy5kc19ndGlkOworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gZ3RpZDsKKyNlbmRpZgorI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAgLy8gc2V0IF9fdGhyZWFkIGxvY2FsIGluZGV4IHRvIHBvaW50IHRvIHRocmVhZC1zcGVjaWZpYyBzdGF0cworICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHIgPSAoKGttcF9pbmZvX3QqKXRociktPnRoLnRoX3N0YXRzOworICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfd29ya2VyX3RocmVhZF9saWZlKTsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURShJRExFKTsKKyAgICBLTVBfSU5JVF9QQVJUSVRJT05FRF9USU1FUlMoT01QX2lkbGUpOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9uYW1lKCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGd0aWQsIEZBTFNFICk7CisjZW5kaWYKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSggUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmIG9sZF90eXBlICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHR5cGUiLCBzdGF0dXMgKTsKKyAgICAvKiBqb3NoIHRvZG86IGlzbid0IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSBkZWZhdWx0IGZvciBuZXdseS1jcmVhdGVkIHRocmVhZHM/ICovCisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggUFRIUkVBRF9DQU5DRUxfRU5BQkxFLCAmIG9sZF9zdGF0ZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTZXQgdGhlIEZQIGNvbnRyb2wgcmVncyB0byBiZSBhIGNvcHkgb2YKKyAgICAvLyB0aGUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MuCisgICAgLy8KKyAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJl9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICBfX2ttcF9sb2FkX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gc2lnZmlsbHNldCggJiBuZXdfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJzaWdmaWxsc2V0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfQkxPQ0ssICYgbmV3X3NldCwgJiBvbGRfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKyAgICBpZiAoIF9fa21wX3N0a29mZnNldCA+IDAgJiYgZ3RpZCA+IDAgKSB7CisgICAgICAgIHBhZGRpbmcgPSBLTVBfQUxMT0NBKCBndGlkICogX19rbXBfc3Rrb2Zmc2V0ICk7CisgICAgfQorI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKyAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggZ3RpZCwgKGttcF9pbmZvX3QqKXRociApOworCisgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggKGttcF9pbmZvX3QqKXRociApOworCisgICAgZXhpdF92YWwgPSBfX2ttcF9sYXVuY2hfdGhyZWFkKCAoa21wX2luZm9fdCAqKSB0aHIgKTsKKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfU0VUTUFTSywgJiBvbGRfc2V0LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisgICAgcmV0dXJuIGV4aXRfdmFsOworfQorCisjaWYgS01QX1VTRV9NT05JVE9SCisvKiBUaGUgbW9uaXRvciB0aHJlYWQgY29udHJvbHMgYWxsIG9mIHRoZSB0aHJlYWRzIGluIHRoZSBjb21wbGV4ICovCisKK3N0YXRpYyB2b2lkKgorX19rbXBfbGF1bmNoX21vbml0b3IoIHZvaWQgKnRociApCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzLCBvbGRfdHlwZSwgb2xkX3N0YXRlOworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc2lnc2V0X3QgICAgbmV3X3NldDsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworICAgIHN0cnVjdCB0aW1lc3BlYyAgaW50ZXJ2YWw7CisgICAgaW50IHlpZWxkX2NvdW50OworICAgIGludCB5aWVsZF9jeWNsZXMgPSAwOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICMxIGxhdW5jaGVkXG4iICkgKTsKKworICAgIC8qIHJlZ2lzdGVyIHVzIGFzIHRoZSBtb25pdG9yIHRocmVhZCAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBLTVBfR1RJRF9NT05JVE9SICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsgICAgLy8gSW5zdHJ1Y3QgSW50ZWwoUikgVGhyZWFkaW5nIFRvb2xzIHRvIGlnbm9yZSBtb25pdG9yIHRocmVhZC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggKChrbXBfaW5mb190Kil0aHIpLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsIChrbXBfaW5mb190Kil0aHIgKTsKKworICAgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIChrbXBfaW5mb190Kil0aHIgKTsKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSggUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmIG9sZF90eXBlICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHR5cGUiLCBzdGF0dXMgKTsKKyAgICAvKiBqb3NoIHRvZG86IGlzbid0IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSBkZWZhdWx0IGZvciBuZXdseS1jcmVhdGVkIHRocmVhZHM/ICovCisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggUFRIUkVBRF9DQU5DRUxfRU5BQkxFLCAmIG9sZF9zdGF0ZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworI2VuZGlmCisKKyAgICAjaWYgS01QX1JFQUxfVElNRV9GSVgKKyAgICAvLyBUaGlzIGlzIGEgcG90ZW50aWFsIGZpeCB3aGljaCBhbGxvd3MgYXBwbGljYXRpb24gd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kgd29yay4KKyAgICAvLyBIb3dldmVyLCBkZWNpc2lvbiBhYm91dCB0aGUgZml4IGlzIG5vdCBtYWRlIHlldCwgc28gaXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICB7IC8vIEFyZSBwcm9ncmFtIHN0YXJ0ZWQgd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3k/CisgICAgICAgIGludCBzY2hlZCA9IHNjaGVkX2dldHNjaGVkdWxlciggMCApOworICAgICAgICBpZiAoIHNjaGVkID09IFNDSEVEX0ZJRk8gfHwgc2NoZWQgPT0gU0NIRURfUlIgKSB7CisgICAgICAgICAgICAvLyBZZXMsIHdlIGFyZSBhIHBhcnQgb2YgcmVhbC10aW1lIGFwcGxpY2F0aW9uLiBUcnkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoZQorICAgICAgICAgICAgLy8gbW9uaXRvci4KKyAgICAgICAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKyAgICAgICAgICAgIGludCAgICBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KCBzY2hlZCApOworICAgICAgICAgICAgaW50ICAgIHJjOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFJlYWxUaW1lU2NoZWROb3RTdXBwb3J0ZWQgKTsKKyAgICAgICAgICAgIHNjaGVkX2dldHBhcmFtKCAwLCAmIHBhcmFtICk7CisgICAgICAgICAgICBpZiAoIHBhcmFtLnNjaGVkX3ByaW9yaXR5IDwgbWF4X3ByaW9yaXR5ICkgeworICAgICAgICAgICAgICAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5ICs9IDE7CisgICAgICAgICAgICAgICAgcmMgPSBzY2hlZF9zZXRzY2hlZHVsZXIoIDAsIHNjaGVkLCAmIHBhcmFtICk7CisgICAgICAgICAgICAgICAgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgICAga21wX21zZ190IGVycl9jb2RlID0gS01QX0VSUiggZXJyb3IgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q2hhbmdlTW9uaXRvclByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIE1vbml0b3JXaWxsU3RhcnZlICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZikgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmVycl9jb2RlLnN0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgYWJvcnQgaGVyZSwgYmVjYXVzZSBudW1iZXIgb2YgQ1BVcyBtYXkgYmUgZW5vdWdoIGZvciBhbGwgdGhlIHRocmVhZHMsCisgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBtb25pdG9yIHRocmVhZCwgc28gYXBwbGljYXRpb24gY291bGQgcG90ZW50aWFsbHkgd29yay4uLgorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFJ1bm5pbmdBdE1heFByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIE1vbml0b3JXaWxsU3RhcnZlICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFJ1bm5pbmdBdE1heFByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgMCApOyAgLy8gQUM6IGZyZWUgdGhyZWFkIHRoYXQgd2FpdHMgZm9yIG1vbml0b3Igc3RhcnRlZAorICAgIH0KKyAgICAjZW5kaWYgLy8gS01QX1JFQUxfVElNRV9GSVgKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3dha2V1cHMgPT0gMSApIHsKKyAgICAgICAgaW50ZXJ2YWwudHZfc2VjICA9IDE7CisgICAgICAgIGludGVydmFsLnR2X25zZWMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludGVydmFsLnR2X3NlYyAgPSAwOworICAgICAgICBpbnRlcnZhbC50dl9uc2VjID0gKEtNUF9OU0VDX1BFUl9TRUMgLyBfX2ttcF9tb25pdG9yX3dha2V1cHMpOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzIgbW9uaXRvclxuIiApICk7CisKKyAgICBpZiAoX19rbXBfeWllbGRfY3ljbGUpIHsKKyAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAwOyAgLyogU3RhcnQgb3V0IHdpdGggeWllbGRpbmcgc2h1dCBvZmYgKi8KKyAgICAgICAgeWllbGRfY291bnQgPSBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOyAgLyogWWllbGRpbmcgaXMgb24gcGVybWFuZW50bHkgKi8KKyAgICB9CisKKyAgICB3aGlsZSggISBUQ1JfNCggX19rbXBfZ2xvYmFsLmcuZ19kb25lICkgKSB7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAgbm93OworICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgIHR2YWw7CisKKyAgICAgICAgLyogIFRoaXMgdGhyZWFkIG1vbml0b3JzIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDE1LCAoICJfX2ttcF9sYXVuY2hfbW9uaXRvcjogdXBkYXRlXG4iICkgKTsKKworICAgICAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICZ0dmFsLCBOVUxMICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmbm93ICk7CisKKyAgICAgICAgbm93LnR2X3NlYyAgKz0gaW50ZXJ2YWwudHZfc2VjOworICAgICAgICBub3cudHZfbnNlYyArPSBpbnRlcnZhbC50dl9uc2VjOworCisgICAgICAgIGlmIChub3cudHZfbnNlYyA+PSBLTVBfTlNFQ19QRVJfU0VDKSB7CisgICAgICAgICAgICBub3cudHZfc2VjICArPSAxOworICAgICAgICAgICAgbm93LnR2X25zZWMgLT0gS01QX05TRUNfUEVSX1NFQzsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jayggJiBfX2ttcF93YWl0X214Lm1fbXV0ZXggKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMgKTsKKyAgICAgICAgLy8gQUM6IHRoZSBtb25pdG9yIHNob3VsZCBub3QgZmFsbCBhc2xlZXAgaWYgZ19kb25lIGhhcyBiZWVuIHNldAorICAgICAgICBpZiAoICFUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeyAgLy8gY2hlY2sgb25jZSBtb3JlIHVuZGVyIG11dGV4CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCAmX19rbXBfd2FpdF9jdi5jX2NvbmQsICZfX2ttcF93YWl0X214Lm1fbXV0ZXgsICZub3cgKTsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gRVRJTUVET1VUICYmIHN0YXR1cyAhPSBFSU5UUiApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfdGltZWR3YWl0Iiwgc3RhdHVzICk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmIF9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisKKyAgICAgICAgaWYgKF9fa21wX3lpZWxkX2N5Y2xlKSB7CisgICAgICAgICAgICB5aWVsZF9jeWNsZXMrKzsKKyAgICAgICAgICAgIGlmICggKHlpZWxkX2N5Y2xlcyAlIHlpZWxkX2NvdW50KSA9PSAwICkgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF95aWVsZGluZ19vbikgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDA7ICAgLyogVHVybiBpdCBvZmYgbm93ICovCisgICAgICAgICAgICAgICAgICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb2ZmX2NvdW50OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMTsgICAvKiBUdXJuIGl0IG9uIG5vdyAqLworICAgICAgICAgICAgICAgICAgICB5aWVsZF9jb3VudCA9IF9fa21wX3lpZWxkX29uX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB5aWVsZF9jeWNsZXMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOworICAgICAgICB9CisKKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLAorICAgICAgICAgIFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSApICsgMSApOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzMgY2xlYW51cFxuIiApICk7CisKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICAgIHN0YXR1cyA9IHNpZ2ZpbGxzZXQoICYgbmV3X3NldCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAic2lnZmlsbHNldCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2lnbWFzayggU0lHX1VOQkxPQ0ssICYgbmV3X3NldCwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zaWdtYXNrIiwgc3RhdHVzICk7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzQgZmluaXNoZWRcbiIgKSApOworCisgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgIT0gMCApIHsKKyAgICAgICAgLyogbm93IHdlIG5lZWQgdG8gdGVybWluYXRlIHRoZSB3b3JrZXIgdGhyZWFkcyAgKi8KKyAgICAgICAgLyogdGhlIHZhbHVlIG9mIHRfYWJvcnQgaXMgdGhlIHNpZ25hbCB3ZSBjYXVnaHQgKi8KKworICAgICAgICBpbnQgZ3RpZDsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM1IHRlcm1pbmF0ZSBzaWc9JWRcbiIsIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSApOworCisgICAgICAgIC8qIHRlcm1pbmF0ZSB0aGUgT3Blbk1QIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIC8qIFRPRE8gdGhpcyBpcyBub3QgdmFsaWQgZm9yIHNpYmxpbmcgdGhyZWFkcyEhCisgICAgICAgICAqIHRoZSB1YmVyIG1hc3RlciBtaWdodCBub3QgYmUgMCBhbnltb3JlLi4gKi8KKyAgICAgICAgZm9yIChndGlkID0gMTsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrZ3RpZCkKKyAgICAgICAgICAgIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGd0aWQgKTsKKworICAgICAgICBfX2ttcF9jbGVhbnVwKCk7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjNiByYWlzZSBzaWc9JWRcbiIsIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSApOworCisgICAgICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID4gMCkKKyAgICAgICAgICAgIHJhaXNlKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICk7CisKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM3IGV4aXRcbiIgKSApOworCisgICAgcmV0dXJuIHRocjsKK30KKyNlbmRpZiAvLyBLTVBfVVNFX01PTklUT1IKKwordm9pZAorX19rbXBfY3JlYXRlX3dvcmtlciggaW50IGd0aWQsIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc3RhY2tfc2l6ZSApCit7CisgICAgcHRocmVhZF90ICAgICAgaGFuZGxlOworICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOworICAgIGludCAgICAgICAgICAgIHN0YXR1czsKKworCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IGd0aWQ7CisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIC8vIHNldHMgdXAgd29ya2VyIHRocmVhZCBzdGF0cworICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2soJl9fa21wX3N0YXRzX2xvY2ssIGd0aWQpOworCisgICAgLy8gdGgtPnRoLnRoX3N0YXRzIGlzIHVzZWQgdG8gdHJhbnNmZXIgdGhyZWFkIHNwZWNpZmljIHN0YXRzLXBvaW50ZXIgdG8gX19rbXBfbGF1bmNoX3dvcmtlcgorICAgIC8vIFNvIHdoZW4gdGhyZWFkIGlzIGNyZWF0ZWQgKGdvZXMgaW50byBfX2ttcF9sYXVuY2hfd29ya2VyKSBpdCB3aWxsCisgICAgLy8gc2V0IGl0J3MgX190aHJlYWQgbG9jYWwgcG9pbnRlciB0byB0aC0+dGgudGhfc3RhdHMKKyAgICBpZighS01QX1VCRVJfR1RJRChndGlkKSkgeworICAgICAgICB0aC0+dGgudGhfc3RhdHMgPSBfX2ttcF9zdGF0c19saXN0LT5wdXNoX2JhY2soZ3RpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRm9yIHJvb3QgdGhyZWFkcywgdGhlIF9fa21wX3N0YXRzX3RocmVhZF9wdHIgaXMgc2V0IGluIF9fa21wX3JlZ2lzdGVyX3Jvb3QoKSwgc28KKyAgICAgICAgLy8gc2V0IHRoZSB0aC0+dGgudGhfc3RhdHMgZmllbGQgdG8gaXQuCisgICAgICAgIHRoLT50aC50aF9zdGF0cyA9IF9fa21wX3N0YXRzX3RocmVhZF9wdHI7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfdGFzX2xvY2soJl9fa21wX3N0YXRzX2xvY2ssIGd0aWQpOworCisjZW5kaWYgLy8gS01QX1NUQVRTX0VOQUJMRUQKKworICAgIGlmICggS01QX1VCRVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IHViZXIgdGhyZWFkICglZClcbiIsIGd0aWQgKSApOworICAgICAgICB0aCAtPiB0aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IHB0aHJlYWRfc2VsZigpOworICAgICAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggZ3RpZCwgdGggKTsKKyAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGggKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdHJ5IHRvIGNyZWF0ZSB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworI2lmZGVmIEtNUF9USFJFQURfQVRUUgorICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9pbml0KCAmdGhyZWFkX2F0dHIgKTsKKyAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKCBDYW50SW5pdFRocmVhZEF0dHJzICksIEtNUF9FUlIoIHN0YXR1cyApLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgfTsgLy8gaWYKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoICYgdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFICk7CisgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyggQ2FudFNldFdvcmtlclN0YXRlICksIEtNUF9FUlIoIHN0YXR1cyApLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgfTsgLy8gaWYKKworICAgIC8qIFNldCBzdGFjayBzaXplIGZvciB0aGlzIHRocmVhZCBub3cuCisgICAgICogVGhlIG11bHRpcGxlIG9mIDIgaXMgdGhlcmUgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzLCByZXF1ZXN0aW5nIGFuIHVudXN1YWwgc3RhY2tzaXplCisgICAgICogY2F1c2VzIHRoZSB0aHJlYWQgdG8gaGF2ZSBhbiBvZmZzZXQgYmVmb3JlIHRoZSBkdW1teSBhbGxvY2EoKSB0YWtlcyBwbGFjZSB0byBjcmVhdGUgdGhlCisgICAgICogb2Zmc2V0LiAgU2luY2Ugd2Ugd2FudCB0aGUgdXNlciB0byBoYXZlIGEgc3VmZmljaWVudCBzdGFja3NpemUgQU5EIHN1cHBvcnQgYSBzdGFjayBvZmZzZXQsIHdlCisgICAgICogYWxsb2NhKCkgdHdpY2UgdGhlIG9mZnNldCBzbyB0aGF0IHRoZSB1cGNvbWluZyBhbGxvY2EoKSBkb2VzIG5vdCBlbGltaW5hdGUgYW55IHByZW1hZGUKKyAgICAgKiBvZmZzZXQsIGFuZCBhbHNvIGdpdmVzIHRoZSB1c2VyIHRoZSBzdGFjayBzcGFjZSB0aGV5IHJlcXVlc3RlZCBmb3IgYWxsIHRocmVhZHMgKi8KKyAgICBzdGFja19zaXplICs9IGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQgKiAyOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfd29ya2VyOiBUIyVkLCBkZWZhdWx0IHN0YWNrc2l6ZSA9ICVsdSBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAiX19rbXBfc3Rrc2l6ZSA9ICVsdSBieXRlcywgZmluYWwgc3RhY2tzaXplID0gJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBLTVBfREVGQVVMVF9TVEtTSVpFLCBfX2ttcF9zdGtzaXplLCBzdGFja19zaXplICkgKTsKKworIyBpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSggJiB0aHJlYWRfYXR0ciwgc3RhY2tfc2l6ZSApOworIyAgaWZkZWYgS01QX0JBQ0tVUF9TVEtTSVpFCisgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgaWYgKCAhIF9fa21wX2Vudl9zdGtzaXplICkgeworICAgICAgICAgICAgc3RhY2tfc2l6ZSA9IEtNUF9CQUNLVVBfU1RLU0laRSArIGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQ7CisgICAgICAgICAgICBfX2ttcF9zdGtzaXplID0gS01QX0JBQ0tVUF9TVEtTSVpFOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IFQjJWQsIGRlZmF1bHQgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfc3Rrc2l6ZSA9ICVsdSBieXRlcywgKGJhY2t1cCkgZmluYWwgc3RhY2tzaXplID0gJWx1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9ERUZBVUxUX1NUS1NJWkUsIF9fa21wX3N0a3NpemUsIHN0YWNrX3NpemUgKQorICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmdGhyZWFkX2F0dHIsIHN0YWNrX3NpemUgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorIyAgZW5kaWYgLyogS01QX0JBQ0tVUF9TVEtTSVpFICovCisgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyggQ2FudFNldFdvcmtlclN0YWNrU2l6ZSwgc3RhY2tfc2l6ZSApLCBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIENoYW5nZVdvcmtlclN0YWNrU2l6ZSAgKSwgX19rbXBfbXNnX251bGwpOworICAgIH07IC8vIGlmCisjIGVuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKworI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoICYgaGFuZGxlLCAmIHRocmVhZF9hdHRyLCBfX2ttcF9sYXVuY2hfd29ya2VyLCAodm9pZCAqKSB0aCApOworICAgIGlmICggc3RhdHVzICE9IDAgfHwgISBoYW5kbGUgKSB7IC8vID8/PyBXaHkgZG8gd2UgY2hlY2sgaGFuZGxlPz8KKyNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgIGlmICggc3RhdHVzID09IEVJTlZBTCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coIENhbnRTZXRXb3JrZXJTdGFja1NpemUsIHN0YWNrX3NpemUgKSwgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggSW5jcmVhc2VXb3JrZXJTdGFja1NpemUgKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICB9OworICAgICAgICBpZiAoIHN0YXR1cyA9PSBFTk9NRU0gKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKCBDYW50U2V0V29ya2VyU3RhY2tTaXplLCBzdGFja19zaXplICksIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlV29ya2VyU3RhY2tTaXplICksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgfTsKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgICAgIGlmICggc3RhdHVzID09IEVBR0FJTiApIHsKKyAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coIE5vUmVzb3VyY2VzRm9yV29ya2VyVGhyZWFkICksIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlX05VTV9USFJFQURTICksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgIH07IC8vIGlmCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisKKyNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZGVzdHJveSggJiB0aHJlYWRfYXR0ciApOworICAgIGlmICggc3RhdHVzICkgeworICAgICAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfRVJSKCBzdGF0dXMgKTsKKyAgICAgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBDYW50RGVzdHJveVRocmVhZEF0dHJzICksIGVycl9jb2RlLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgICAgfQorICAgIH07IC8vIGlmCisjZW5kaWYgLyogS01QX1RIUkVBRF9BVFRSICovCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiBkb25lIGNyZWF0aW5nIHRocmVhZCAoJWQpXG4iLCBndGlkICkgKTsKKworfSAvLyBfX2ttcF9jcmVhdGVfd29ya2VyCisKKworI2lmIEtNUF9VU0VfTU9OSVRPUgordm9pZAorX19rbXBfY3JlYXRlX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBwdGhyZWFkX3QgICAgICAgICAgIGhhbmRsZTsKKyAgICBwdGhyZWFkX2F0dHJfdCAgICAgIHRocmVhZF9hdHRyOworICAgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGF1dG9fYWRqX3NpemUgPSBGQUxTRTsKKworICAgIGlmKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBtb25pdG9yIHRocmVhZCBpbiBjYXNlIG9mIE1BWF9CTE9DS1RJTUUKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBza2lwcGluZyBtb25pdG9yIHRocmVhZCBiZWNhdXNlIG9mIE1BWCBibG9ja3RpbWVcbiIgKSApOworICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgID0gMDsgLy8gdGhpcyBtYWtlcyByZWFwX21vbml0b3Igbm8tb3AKKyAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiB0cnkgdG8gY3JlYXRlIG1vbml0b3JcbiIgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgID0gS01QX0dUSURfTU9OSVRPUjsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyAgICAjaWYgS01QX1JFQUxfVElNRV9GSVgKKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAtMSApOyAvLyBXaWxsIHVzZSBpdCBmb3Igc3luY2hyb25pemF0aW9uIGEgYml0IGxhdGVyLgorICAgICNlbHNlCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgMCApOworICAgICNlbmRpZiAvLyBLTVBfUkVBTF9USU1FX0ZJWAorCisgICAgI2lmZGVmIEtNUF9USFJFQURfQVRUUgorICAgICAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFOworICAgICAgICAgICAgYXV0b19hZGpfc2l6ZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2luaXQoICZ0aHJlYWRfYXR0ciApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50SW5pdFRocmVhZEF0dHJzICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSggJiB0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldE1vbml0b3JTdGF0ZSApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZ2V0c3RhY2tzaXplKCAmIHRocmVhZF9hdHRyLCAmIHNpemUgKTsKKyAgICAgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2dldHN0YWNrc2l6ZSIsIHN0YXR1cyApOworICAgICAgICAjZWxzZQorICAgICAgICAgICAgc2l6ZSA9IF9fa21wX3N5c19taW5fc3Rrc2l6ZTsKKyAgICAgICAgI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyAgICAjZW5kaWYgLyogS01QX1RIUkVBRF9BVFRSICovCisKKyAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9PSAwICkgeworICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSBLTVBfREVGQVVMVF9NT05JVE9SX1NUS1NJWkU7CisgICAgfQorICAgIGlmICggX19rbXBfbW9uaXRvcl9zdGtzaXplIDwgX19rbXBfc3lzX21pbl9zdGtzaXplICkgeworICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSBfX2ttcF9zeXNfbWluX3N0a3NpemU7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfbW9uaXRvcjogZGVmYXVsdCBzdGFja3NpemUgPSAlbHUgYnl0ZXMsIgorICAgICAgICAgICAgICAgICAgICAicmVxdWVzdGVkIHN0YWNrc2l6ZSA9ICVsdSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSwgX19rbXBfbW9uaXRvcl9zdGtzaXplICkgKTsKKworICAgIHJldHJ5OgorCisgICAgLyogU2V0IHN0YWNrIHNpemUgZm9yIHRoaXMgdGhyZWFkIG5vdy4gKi8KKworICAgICNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX21vbml0b3I6IHNldHRpbmcgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSApOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmIHRocmVhZF9hdHRyLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIGlmICggYXV0b19hZGpfc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgKj0gMjsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAga21wX21zZ190IGVycl9jb2RlID0gS01QX0VSUiggc3RhdHVzICk7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsICAvLyBzaG91bGQgdGhpcyBiZSBmYXRhbD8gIEJCCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldE1vbml0b3JTdGFja1NpemUsIChsb25nIGludCkgX19rbXBfbW9uaXRvcl9zdGtzaXplICksCisgICAgICAgICAgICAgICAgZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgS01QX0hOVCggQ2hhbmdlTW9uaXRvclN0YWNrU2l6ZSApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLworCisgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoICZoYW5kbGUsICYgdGhyZWFkX2F0dHIsIF9fa21wX2xhdW5jaF9tb25pdG9yLCAodm9pZCAqKSB0aCApOworCisgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICAgICAgICAgIGlmICggc3RhdHVzID09IEVJTlZBTCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGF1dG9fYWRqX3NpemUgICYmICggX19rbXBfbW9uaXRvcl9zdGtzaXplIDwgKHNpemVfdCkweDQwMDAwMDAwICkgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSAqPSAyOworICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFNldE1vbml0b3JTdGFja1NpemUsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggSW5jcmVhc2VNb25pdG9yU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBFTk9NRU0gKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRNb25pdG9yU3RhY2tTaXplLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLworICAgICAgICBpZiAoIHN0YXR1cyA9PSBFQUdBSU4gKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIE5vUmVzb3VyY2VzRm9yTW9uaXRvclRocmVhZCApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlTnVtYmVyT2ZUaHJlYWRzSW5Vc2UgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgIH07IC8vIGlmCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisKKyAgICAjaWYgS01QX1JFQUxfVElNRV9GSVgKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG1vbml0b3IgdGhyZWFkIGlzIHJlYWxseSBzdGFydGVkIGFuZCBzZXQgaXRzICpwcmlvcml0eSouCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX3VpbnQzMiApID09IHNpemVvZiggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUgKSApOworICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzQoCisgICAgICAgICAgICAoa21wX3VpbnQzMiB2b2xhdGlsZSAqKSAmIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAtMSwgJiBfX2ttcF9uZXFfNCwgTlVMTAorICAgICAgICApOworICAgICNlbmRpZiAvLyBLTVBfUkVBTF9USU1FX0ZJWAorCisgICAgI2lmZGVmIEtNUF9USFJFQURfQVRUUgorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZGVzdHJveSggJiB0aHJlYWRfYXR0ciApOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAga21wX21zZ190IGVycl9jb2RlID0gS01QX0VSUiggc3RhdHVzICk7CisgICAgICAgICAgICBfX2ttcF9tc2coIAorICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnREZXN0cm95VGhyZWFkQXR0cnMgKSwKKyAgICAgICAgICAgICAgICBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmVycl9jb2RlLnN0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX21vbml0b3I6IG1vbml0b3IgY3JlYXRlZCAlIy44bHhcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKK30gLy8gX19rbXBfY3JlYXRlX21vbml0b3IKKyNlbmRpZiAvLyBLTVBfVVNFX01PTklUT1IKKwordm9pZAorX19rbXBfZXhpdF90aHJlYWQoCisgICAgaW50IGV4aXRfc3RhdHVzCispIHsKKyAgICBwdGhyZWFkX2V4aXQoICh2b2lkICopKGludHB0cl90KSBleGl0X3N0YXR1cyApOworfSAvLyBfX2ttcF9leGl0X3RocmVhZAorCisjaWYgS01QX1VTRV9NT05JVE9SCit2b2lkIF9fa21wX3Jlc3VtZV9tb25pdG9yKCk7CisKK3ZvaWQKK19fa21wX3JlYXBfbW9uaXRvcigga21wX2luZm9fdCAqdGggKQoreworICAgIGludCAgICAgICAgICBzdGF0dXM7CisgICAgdm9pZCAgICAgICAgKmV4aXRfdmFsOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogdHJ5IHRvIHJlYXAgbW9uaXRvciB0aHJlYWQgd2l0aCBoYW5kbGUgJSMuOGx4XG4iLAorICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKKyAgICAvLyBJZiBtb25pdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIGl0cyB0aWQgYW5kIGd0aWQgc2hvdWxkIGJlIEtNUF9HVElEX01PTklUT1IuCisgICAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIDAsIGl0IG1lYW5zIHRoZSBtb25pdG9yIGRpZCBub3QgZXZlciBzdGFydC4KKyAgICAvLyBJZiBib3RoIHRpZCBhbmQgZ3RpZCBhcmUgS01QX0dUSURfRE5FLCB0aGUgbW9uaXRvciBoYXMgYmVlbiBzaHV0IGRvd24uCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID09IHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKTsKKyAgICBpZiAoIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgIT0gS01QX0dUSURfTU9OSVRPUiApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogbW9uaXRvciBkaWQgbm90IHN0YXJ0LCByZXR1cm5pbmdcbiIpICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKworICAgIC8qIEZpcnN0LCBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgbW9uaXRvciB0aHJlYWQgZXhpc3RzIHRvIHdha2UgaXQgdXAuIFRoaXMgaXMKKyAgICAgICB0byBhdm9pZCBwZXJmb3JtYW5jZSBwcm9ibGVtIHdoZW4gdGhlIG1vbml0b3Igc2xlZXBzIGR1cmluZyBibG9ja3RpbWUtc2l6ZQorICAgICAgIGludGVydmFsICovCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2tpbGwoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgMCApOworICAgIGlmIChzdGF0dXMgIT0gRVNSQ0gpIHsKKyAgICAgICAgX19rbXBfcmVzdW1lX21vbml0b3IoKTsgICAvLyBXYWtlIHVwIHRoZSBtb25pdG9yIHRocmVhZAorICAgIH0KKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiB0cnkgdG8gam9pbiB3aXRoIG1vbml0b3JcbiIpICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9qb2luKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsICYgZXhpdF92YWwpOworICAgIGlmIChleGl0X3ZhbCAhPSB0aCkgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBSZWFwTW9uaXRvckVycm9yICksCisgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IEtNUF9HVElEX0RORTsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gS01QX0dUSURfRE5FOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogZG9uZSByZWFwaW5nIG1vbml0b3IgdGhyZWFkIHdpdGggaGFuZGxlICUjLjhseFxuIiwKKyAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKK30KKyNlbmRpZiAvLyBLTVBfVVNFX01PTklUT1IKKwordm9pZAorX19rbXBfcmVhcF93b3JrZXIoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgICAgICAgICAgc3RhdHVzOworICAgIHZvaWQgICAgICAgICpleGl0X3ZhbDsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiB0cnkgdG8gcmVhcCBUIyVkXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfam9pbiggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAmIGV4aXRfdmFsKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAvKiBEb24ndCBleHBvc2UgdGhlc2UgdG8gdGhlIHVzZXIgdW50aWwgd2UgdW5kZXJzdGFuZCB3aGVuIHRoZXkgdHJpZ2dlciAqLworICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coIFJlYXBXb3JrZXJFcnJvciApLCBLTVBfRVJSKCBzdGF0dXMgKSwgX19rbXBfbXNnX251bGwpOworICAgIH0KKyAgICBpZiAoIGV4aXRfdmFsICE9IHRoICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX3JlYXBfd29ya2VyOiB3b3JrZXIgVCMlZCBkaWQgbm90IHJlYXAgcHJvcGVybHksIGV4aXRfdmFsID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkLCBleGl0X3ZhbCApICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiBkb25lIHJlYXBpbmcgVCMlZFxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisKKworc3RhdGljIHZvaWQKK19fa21wX251bGxfaGFuZGxlciggaW50IHNpZ25vICkKK3sKKyAgICAvLyAgRG8gbm90aGluZywgZm9yIGRvaW5nIFNJR19JR04tdHlwZSBhY3Rpb25zLgorfSAvLyBfX2ttcF9udWxsX2hhbmRsZXIKKworCitzdGF0aWMgdm9pZAorX19rbXBfdGVhbV9oYW5kbGVyKCBpbnQgc2lnbm8gKQoreworICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9PSAwICkgeworICAgICAgICAvKiBTdGFnZSAxIHNpZ25hbCBoYW5kbGVyLCBsZXQncyBzaHV0IGRvd24gYWxsIG9mIHRoZSB0aHJlYWRzICovCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIl9fa21wX3RlYW1faGFuZGxlcjogY2F1Z2h0IHNpZ25hbCA9ICVkXG4iLCBzaWdubyApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgc3dpdGNoICggc2lnbm8gKSB7CisgICAgICAgICAgICBjYXNlIFNJR0hVUCAgOgorICAgICAgICAgICAgY2FzZSBTSUdJTlQgIDoKKyAgICAgICAgICAgIGNhc2UgU0lHUVVJVCA6CisgICAgICAgICAgICBjYXNlIFNJR0lMTCAgOgorICAgICAgICAgICAgY2FzZSBTSUdBQlJUIDoKKyAgICAgICAgICAgIGNhc2UgU0lHRlBFICA6CisgICAgICAgICAgICBjYXNlIFNJR0JVUyAgOgorICAgICAgICAgICAgY2FzZSBTSUdTRUdWIDoKKyAgICAgICAgICAgICNpZmRlZiBTSUdTWVMKKyAgICAgICAgICAgICAgICBjYXNlIFNJR1NZUyA6CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgU0lHVEVSTSA6CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCwgc2lnbm8gKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUgKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIl9fa21wX3RlYW1faGFuZGxlcjogdW5rbm93biBzaWduYWwgdHlwZSIgKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfdGVhbV9oYW5kbGVyCisKKworc3RhdGljCit2b2lkIF9fa21wX3NpZ2FjdGlvbiggaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqIGFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqIG9sZGFjdCApIHsKKyAgICBpbnQgcmMgPSBzaWdhY3Rpb24oIHNpZ251bSwgYWN0LCBvbGRhY3QgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggInNpZ2FjdGlvbiIsIHJjICk7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIGludCBzaWcsIHNpZ19mdW5jX3QgaGFuZGxlcl9mdW5jLCBpbnQgcGFyYWxsZWxfaW5pdCApCit7CisgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoICVkLCAuLi4sICVkIClcbiIsIHNpZywgcGFyYWxsZWxfaW5pdCApICk7CisgICAgaWYgKCBwYXJhbGxlbF9pbml0ICkgeworICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIG5ld19hY3Rpb247CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gb2xkX2FjdGlvbjsKKyAgICAgICAgbmV3X2FjdGlvbi5zYV9oYW5kbGVyID0gaGFuZGxlcl9mdW5jOworICAgICAgICBuZXdfYWN0aW9uLnNhX2ZsYWdzICAgPSAwOworICAgICAgICBzaWdmaWxsc2V0KCAmIG5ld19hY3Rpb24uc2FfbWFzayApOworICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBuZXdfYWN0aW9uLCAmIG9sZF9hY3Rpb24gKTsKKyAgICAgICAgaWYgKCBvbGRfYWN0aW9uLnNhX2hhbmRsZXIgPT0gX19rbXBfc2lnaGxkcnNbIHNpZyBdLnNhX2hhbmRsZXIgKSB7CisgICAgICAgICAgICBzaWdhZGRzZXQoICYgX19rbXBfc2lnc2V0LCBzaWcgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUva2VlcCB1c2VyJ3MgaGFuZGxlciBpZiBvbmUgcHJldmlvdXNseSBpbnN0YWxsZWQuCisgICAgICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBvbGRfYWN0aW9uLCBOVUxMICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2F2ZSBpbml0aWFsL3N5c3RlbSBzaWduYWwgaGFuZGxlcnMgdG8gc2VlIGlmIHVzZXIgaGFuZGxlcnMgaW5zdGFsbGVkLgorICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgTlVMTCwgJiBfX2ttcF9zaWdobGRyc1sgc2lnIF0gKTsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCit9IC8vIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIKKworCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBpbnQgc2lnICkKK3sKKyAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggJWQgKVxuIiwgc2lnICkgKTsKKyAgICBpZiAoIHNpZ2lzbWVtYmVyKCAmIF9fa21wX3NpZ3NldCwgc2lnICkgKSB7CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gb2xkOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBfX2ttcF9zaWdobGRyc1sgc2lnIF0sICYgb2xkICk7CisgICAgICAgIGlmICggKCBvbGQuc2FfaGFuZGxlciAhPSBfX2ttcF90ZWFtX2hhbmRsZXIgKSAmJiAoIG9sZC5zYV9oYW5kbGVyICE9IF9fa21wX251bGxfaGFuZGxlciApICkgeworICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgdXNlcnMgc2lnbmFsIGhhbmRsZXIuCisgICAgICAgICAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogb29wcywgbm90IG91ciBoYW5kbGVyLCByZXN0b3Jpbmc6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICAgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCAmIG9sZCwgTlVMTCApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzaWdkZWxzZXQoICYgX19rbXBfc2lnc2V0LCBzaWcgKTsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIKKworCit2b2lkCitfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIGludCBwYXJhbGxlbF9pbml0ICkKK3sKKyAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX2luc3RhbGxfc2lnbmFscyggJWQgKVxuIiwgcGFyYWxsZWxfaW5pdCApICk7CisgICAgaWYgKCBfX2ttcF9oYW5kbGVfc2lnbmFscyB8fCAhIHBhcmFsbGVsX2luaXQgKSB7CisgICAgICAgIC8vIElmICEgcGFyYWxsZWxfaW5pdCwgd2UgZG8gbm90IGluc3RhbGwgaGFuZGxlcnMsIGp1c3Qgc2F2ZSBvcmlnaW5hbCBoYW5kbGVycy4KKyAgICAgICAgLy8gTGV0IHVzIGRvIGl0IGV2ZW4gX19oYW5kbGVfc2lnbmFscyBpcyAwLgorICAgICAgICBzaWdlbXB0eXNldCggJiBfX2ttcF9zaWdzZXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSFVQLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lOVCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdRVUlULCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSUxMLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0FCUlQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdGUEUsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHQlVTLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1NFR1YsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjaWZkZWYgU0lHU1lTCisgICAgICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdTWVMsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgI2VuZGlmIC8vIFNJR1NZUworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdURVJNLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgI2lmZGVmIFNJR1BJUEUKKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1BJUEUsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjZW5kaWYgLy8gU0lHUElQRQorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX2luc3RhbGxfc2lnbmFscworCisKK3ZvaWQKK19fa21wX3JlbW92ZV9zaWduYWxzKCB2b2lkICkKK3sKKyAgICBpbnQgICAgc2lnOworICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVtb3ZlX3NpZ25hbHMoKVxuIiApICk7CisgICAgZm9yICggc2lnID0gMTsgc2lnIDwgTlNJRzsgKysgc2lnICkgeworICAgICAgICBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoIHNpZyApOworICAgIH07IC8vIGZvciBzaWcKK30gLy8gX19rbXBfcmVtb3ZlX3NpZ25hbHMKKworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2VuYWJsZSggaW50IG5ld19zdGF0ZSApCit7CisgICAgI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgICAgICBpbnQgc3RhdHVzLCBvbGRfc3RhdGU7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoIG5ld19zdGF0ZSwgJiBvbGRfc3RhdGUgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9sZF9zdGF0ZSA9PSBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQKK19fa21wX2Rpc2FibGUoIGludCAqIG9sZF9zdGF0ZSApCit7CisgICAgI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKCBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFLCBvbGRfc3RhdGUgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzICk7CisgICAgI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdGZvcmtfcHJlcGFyZSAodm9pZCkKK3sKKyAgICAvKiAgbm90aGluZyB0byBkbyAgKi8KK30KKworc3RhdGljIHZvaWQKK19fa21wX2F0Zm9ya19wYXJlbnQgKHZvaWQpCit7CisgICAgLyogIG5vdGhpbmcgdG8gZG8gICovCit9CisKKy8qCisgICAgUmVzZXQgdGhlIGxpYnJhcnkgc28gZXhlY3V0aW9uIGluIHRoZSBjaGlsZCBzdGFydHMgImFsbCBvdmVyIGFnYWluIiB3aXRoCisgICAgY2xlYW4gZGF0YSBzdHJ1Y3R1cmVzIGluIGluaXRpYWwgc3RhdGVzLiAgRG9uJ3Qgd29ycnkgYWJvdXQgZnJlZWluZyBtZW1vcnkKKyAgICBhbGxvY2F0ZWQgYnkgcGFyZW50LCBqdXN0IGFiYW5kb24gaXQgdG8gYmUgc2FmZS4KKyovCitzdGF0aWMgdm9pZAorX19rbXBfYXRmb3JrX2NoaWxkICh2b2lkKQoreworICAgIC8qIFRPRE8gbWFrZSBzdXJlIHRoaXMgaXMgZG9uZSByaWdodCBmb3IgbmVzdGVkL3NpYmxpbmcgKi8KKyAgICAvLyBBVFQ6ICBNZW1vcnkgbGVha3MgYXJlIGhlcmU/IFRPRE86IENoZWNrIGl0IGFuZCBmaXguCisgICAgLyogS01QX0FTU0VSVCggMCApOyAqLworCisgICAgKytfX2ttcF9mb3JrX2NvdW50OworCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7CisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgX19rbXBfaW5pdF9tb25pdG9yID0gMDsKKyNlbmRpZgorICAgIF9fa21wX2luaXRfcGFyYWxsZWwgPSBGQUxTRTsKKyAgICBfX2ttcF9pbml0X21pZGRsZSA9IEZBTFNFOworICAgIF9fa21wX2luaXRfc2VyaWFsID0gRkFMU0U7CisgICAgVENXXzQoX19rbXBfaW5pdF9ndGlkLCBGQUxTRSk7CisgICAgX19rbXBfaW5pdF9jb21tb24gPSBGQUxTRTsKKworICAgIFRDV180KF9fa21wX2luaXRfdXNlcl9sb2NrcywgRkFMU0UpOworI2lmICEgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA9IDE7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCA9IDA7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlID0gTlVMTDsKKyAgICBfX2ttcF9sb2NrX2Jsb2NrcyA9IE5VTEw7CisjZW5kaWYKKworICAgIF9fa21wX2FsbF9udGggPSAwOworICAgIFRDV180KF9fa21wX250aCwgMCk7CisKKyAgICAvKiBNdXN0IGFjdHVhbGx5IHplcm8gYWxsIHRoZSAqY2FjaGUgYXJndW1lbnRzIHBhc3NlZCB0byBfX2ttcGNfdGhyZWFkcHJpdmF0ZSBoZXJlCisgICAgICAgc28gdGhyZWFkcHJpdmF0ZSBkb2Vzbid0IHVzZSBzdGFsZSBkYXRhICovCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9hdGZvcmtfY2hpbGQ6IGNoZWNraW5nIGNhY2hlIGFkZHJlc3MgbGlzdCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ICkgKTsKKworICAgIHdoaWxlICggX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ICE9IE5VTEwgKSB7CisKKyAgICAgICAgaWYgKCAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0IC0+IGFkZHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCA1MCwgKCAiX19rbXBfYXRmb3JrX2NoaWxkOiB6ZXJvaW5nIGNhY2hlIGF0IGFkZHJlc3MgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAmKCpfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgLT4gYWRkcikgKSApOworCisgICAgICAgICAgICAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0IC0+IGFkZHIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAtPiBuZXh0OworICAgIH0KKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworCisgICAgLyogcmVzZXQgc3RhdGljYWxseSBpbml0aWFsaXplZCBsb2NrcyAqLworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJl9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfY29uc29sZV9sb2NrICk7CisKKyAgICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgbm8gc3RhbGUgZGF0YSBpcyBsZWZ0IGFyb3VuZCAqLworICAgIC8qIEFDOiBjdXN0b21lcnMgY29tcGxhaW4gdGhhdCB3ZSB1c2UgdW5zYWZlIHJvdXRpbmVzIGluIHRoZSBhdGZvcmsKKyAgICAgICBoYW5kbGVyLiBNYXRod29ya3M6IGRsc3ltKCkgaXMgdW5zYWZlLiBXZSBjYWxsIGRsc3ltIGFuZCBkbG9wZW4KKyAgICAgICBpbiBkeW5hbWljX2xpbmsgd2hlbiBjaGVjayB0aGUgcHJlc2VuY2Ugb2Ygc2hhcmVkIHRiYm1hbGxvYyBsaWJyYXJ5LgorICAgICAgIFN1Z2dlc3Rpb24gaXMgdG8gbWFrZSB0aGUgbGlicmFyeSBpbml0aWFsaXphdGlvbiBsYXppZXIsIHNpbWlsYXIKKyAgICAgICB0byB3aGF0IGRvbmUgZm9yIF9fa21wY19iZWdpbigpLiAqLworICAgIC8vIFRPRE86IHN5bmNocm9uaXplIGFsbCBzdGF0aWMgaW5pdGlhbGl6YXRpb25zIHdpdGggcmVndWxhciBsaWJyYXJ5CisgICAgLy8gICAgICAgc3RhcnR1cDsgbG9vayBhdCBrbXBfZ2xvYmFsLmNwcCBhbmQgZXRjLgorICAgIC8vX19rbXBfaW50ZXJuYWxfYmVnaW4gKCk7CisKK30KKwordm9pZAorX19rbXBfcmVnaXN0ZXJfYXRmb3JrKHZvaWQpIHsKKyAgICBpZiAoIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrICkgeworICAgICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9hdGZvcmsoIF9fa21wX2F0Zm9ya19wcmVwYXJlLCBfX2ttcF9hdGZvcmtfcGFyZW50LCBfX2ttcF9hdGZvcmtfY2hpbGQgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2F0Zm9yayIsIHN0YXR1cyApOworICAgICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayA9IEZBTFNFOworICAgIH0KK30KKwordm9pZAorX19rbXBfc3VzcGVuZF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoICZfX2ttcF9zdXNwZW5kX211dGV4X2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRhdHRyX2luaXQoICZfX2ttcF9zdXNwZW5kX2NvbmRfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kYXR0cl9pbml0Iiwgc3RhdHVzICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgQU5OT1RBVEVfSEFQUEVOU19BRlRFUigmdGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCk7CisgICAgaWYgKCB0aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50IDw9IF9fa21wX2ZvcmtfY291bnQgKSB7CisgICAgICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCB0aGUgc3VzcGVuc2lvbiBwdGhyZWFkIG9iamVjdHMgZm9yIHRoaXMgdGhyZWFkCisgICAgICAgICAgIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgaW50ICAgICBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9pbml0KCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YuY19jb25kLCAmX19rbXBfc3VzcGVuZF9jb25kX2F0dHIgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfaW5pdCIsIHN0YXR1cyApOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4LCAmIF9fa21wX3N1c3BlbmRfbXV0ZXhfYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfaW5pdCIsIHN0YXR1cyApOworICAgICAgICAqKHZvbGF0aWxlIGludCopJnRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPSBfX2ttcF9mb3JrX2NvdW50ICsgMTsKKyAgICAgICAgQU5OT1RBVEVfSEFQUEVOU19CRUZPUkUoJnRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQpOworICAgIH07Cit9CisKK3ZvaWQKK19fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKQoreworICAgIGlmKHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPiBfX2ttcF9mb3JrX2NvdW50KSB7CisgICAgICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZSBpbml0aWFsaXplIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YuY19jb25kICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZICkgeworICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfZGVzdHJveSIsIHN0YXR1cyApOworICAgICAgICB9OworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZICkgeworICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICAgICAgfTsKKyAgICAgICAgLS10aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50OworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPT0gX19rbXBfZm9ya19jb3VudCk7CisgICAgfQorfQorCisvKiBUaGlzIHJvdXRpbmUgcHV0cyB0aGUgY2FsbGluZyB0aHJlYWQgdG8gc2xlZXAgYWZ0ZXIgc2V0dGluZyB0aGUKKyAqIHNsZWVwIGJpdCBmb3IgdGhlIGluZGljYXRlZCBmbGFnIHZhcmlhYmxlIHRvIHRydWUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSB2b2lkIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUoIGludCB0aF9ndGlkLCBDICpmbGFnICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soVVNFUl9zdXNwZW5kKTsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbdGhfZ3RpZF07CisgICAgaW50IHN0YXR1czsKKyAgICB0eXBlbmFtZSBDOjpmbGFnX3Qgb2xkX3NwaW47CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBlbnRlciBmb3IgZmxhZyA9ICVwXG4iLCB0aF9ndGlkLCBmbGFnLT5nZXQoKSApICk7CisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCB0aCApOworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9sb2NrIiwgc3RhdHVzICk7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc2V0dGluZyBzbGVlcCBiaXQgZm9yIHNwaW4oJXApXG4iLAorICAgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBmbGFnLT5nZXQoKSApICk7CisKKyAgICAvKiBUT0RPOiBzaG91bGRuJ3QgdGhpcyB1c2UgcmVsZWFzZSBzZW1hbnRpY3MgdG8gZW5zdXJlIHRoYXQgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZAorICAgICAgIGdldHMgY2FsbGVkIGZpcnN0PworICAgICovCisgICAgb2xkX3NwaW4gPSBmbGFnLT5zZXRfc2xlZXBpbmcoKTsKKworICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNldCBzbGVlcCBiaXQgZm9yIHNwaW4oJXApPT0leCwgd2FzICV4XG4iLAorICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpLCAqKGZsYWctPmdldCgpKSwgb2xkX3NwaW4gKSApOworCisgICAgaWYgKCBmbGFnLT5kb25lX2NoZWNrX3ZhbChvbGRfc3BpbikgKSB7CisgICAgICAgIG9sZF9zcGluID0gZmxhZy0+dW5zZXRfc2xlZXBpbmcoKTsKKyAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgZmFsc2UgYWxhcm0sIHJlc2V0IHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpKSApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEVuY2Fwc3VsYXRlIGluIGEgbG9vcCBhcyB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGlzIG1heQorICAgICAgICAgKiAid2l0aCBsb3cgcHJvYmFiaWxpdHkiIHJldHVybiB3aGVuIHRoZSBjb25kaXRpb24gdmFyaWFibGUgaGFzCisgICAgICAgICAqIG5vdCBiZWVuIHNpZ25hbGVkIG9yIGJyb2FkY2FzdAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGRlYWN0aXZhdGVkID0gRkFMU0U7CisgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgKHZvaWQgKilmbGFnKTsKKyAgICAgICAgd2hpbGUgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgICAgICAgICBfX2ttcF9zdXNwZW5kX2NvdW50Kys7CisgICAgICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZ0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogc3VzcGVuZGluZyBUIyVkOiAlc1xuIiwgdGhfZ3RpZCwgYnVmZmVyICk7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIE1hcmsgdGhlIHRocmVhZCBhcyBubyBsb25nZXIgYWN0aXZlIChvbmx5IGluIHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIGxvb3ApLgorICAgICAgICAgICAgaWYgKCAhIGRlYWN0aXZhdGVkICkgeworICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoCisgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKworI2lmIFVTRV9TVVNQRU5EX1RJTUVPVVQKKyAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAgbm93OworICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgICB0dmFsOworICAgICAgICAgICAgaW50IG1zZWNzOworCisgICAgICAgICAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICZ0dmFsLCBOVUxMICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgICAgICAgICAgVElNRVZBTF9UT19USU1FU1BFQyggJnR2YWwsICZub3cgKTsKKworICAgICAgICAgICAgbXNlY3MgPSAoNCpfX2ttcF9kZmx0X2Jsb2NrdGltZSkgKyAyMDA7CisgICAgICAgICAgICBub3cudHZfc2VjICArPSBtc2VjcyAvIDEwMDA7CisgICAgICAgICAgICBub3cudHZfbnNlYyArPSAobXNlY3MgJSAxMDAwKSoxMDAwOworCisgICAgICAgICAgICBLRl9UUkFDRSggMTUsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gcGVyZm9ybSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQgKSApOworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCwgJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXgsICYgbm93ICk7CisjZWxzZQorICAgICAgICAgICAgS0ZfVFJBQ0UoIDE1LCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGFib3V0IHRvIHBlcmZvcm0gcHRocmVhZF9jb25kX3dhaXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCApICk7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCwgJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoIChzdGF0dXMgIT0gMCkgJiYgKHN0YXR1cyAhPSBFSU5UUikgJiYgKHN0YXR1cyAhPSBFVElNRURPVVQpICkgeworICAgICAgICAgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jb25kX3dhaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVRJTUVET1VUKSB7CisgICAgICAgICAgICAgICAgaWYgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAwLCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHRpbWVvdXQgd2FrZXVwXG4iLCB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSggMiwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCB0aW1lb3V0IHdha2V1cCwgc2xlZXAgYml0IG5vdCBzZXQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworICAgICAgICAgICAgICAgIEtGX1RSQUNFKCAxMDAsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc3B1cmlvdXMgd2FrZXVwXG4iLCB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IC8vIHdoaWxlCisKKyAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIGFjdGl2ZSBhZ2FpbiAoaWYgaXQgd2FzIHByZXZpb3VzIG1hcmtlZCBhcyBpbmFjdGl2ZSkKKyAgICAgICAgaWYgKCBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgaWYgKCBUQ1JfNCh0aC0+dGgudGhfaW5fcG9vbCkgKSB7CisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZ0aC0+dGgudGhfc3VzcGVuZF9jdik7CisgICAgICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgaGFzIGF3YWtlbmVkOiAlc1xuIiwgdGhfZ3RpZCwgYnVmZmVyICk7CisgICAgfQorI2VuZGlmCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBleGl0XG4iLCB0aF9ndGlkICkgKTsKK30KKwordm9pZCBfX2ttcF9zdXNwZW5kXzMyKGludCB0aF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3N1c3BlbmRfNjQoaW50IHRoX2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfc3VzcGVuZF9vbmNvcmUoaW50IHRoX2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9CisKKworLyogVGhpcyByb3V0aW5lIHNpZ25hbHMgdGhlIHRocmVhZCBzcGVjaWZpZWQgYnkgdGFyZ2V0X2d0aWQgdG8gd2FrZSB1cAorICogYWZ0ZXIgc2V0dGluZyB0aGUgc2xlZXAgYml0IGluZGljYXRlZCBieSB0aGUgZmxhZyBhcmd1bWVudCB0byBGQUxTRS4KKyAqIFRoZSB0YXJnZXQgdGhyZWFkIG11c3QgYWxyZWFkeSBoYXZlIGNhbGxlZCBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKCkKKyAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfcmVzdW1lX3RlbXBsYXRlKCBpbnQgdGFyZ2V0X2d0aWQsIEMgKmZsYWcgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhVU0VSX3Jlc3VtZSk7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RhcmdldF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCB3YW50cyB0byB3YWtldXAgVCMlZCBlbnRlclxuIiwgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgIT0gdGFyZ2V0X2d0aWQgKTsKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIHRoICk7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMgKTsKKworICAgIGlmICghZmxhZykgeyAvLyBjb21pbmcgZnJvbSBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyCisgICAgICAgIGZsYWcgPSAoQyAqKXRoLT50aC50aF9zbGVlcF9sb2M7CisgICAgfQorCisgICAgLy8gRmlyc3QsIGNoZWNrIGlmIHRoZSBmbGFnIGlzIG51bGwgb3IgaXRzIHR5cGUgaGFzIGNoYW5nZWQuIElmIHNvLCBzb21lb25lIGVsc2Ugd29rZSBpdCB1cC4KKyAgICBpZiAoIWZsYWcgfHwgZmxhZy0+Z2V0X3R5cGUoKSAhPSBmbGFnLT5nZXRfcHRyX3R5cGUoKSkgeyAvLyBnZXRfcHRyX3R5cGUgc2ltcGx5IHNob3dzIHdoYXQgZmxhZyB3YXMgY2FzdCB0bworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgYXdha2U6IGZsYWcoJXApXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgTlVMTCApICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSB7IC8vIGlmIG11bHRpcGxlIHRocmVhZHMgYXJlIHNsZWVwaW5nLCBmbGFnIHNob3VsZCBiZSBpbnRlcm5hbGx5IHJlZmVycmluZyB0byBhIHNwZWNpZmljIHRocmVhZCBoZXJlCisgICAgICAgIHR5cGVuYW1lIEM6OmZsYWdfdCBvbGRfc3BpbiA9IGZsYWctPnVuc2V0X3NsZWVwaW5nKCk7CisgICAgICAgIGlmICggISBmbGFnLT5pc19zbGVlcGluZ192YWwob2xkX3NwaW4pICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nLCB0aHJlYWQgVCMlZCBhbHJlYWR5IGF3YWtlOiBmbGFnKCVwKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIGZsYWctPmdldCgpLCBvbGRfc3BpbiwgKmZsYWctPmdldCgpICkgKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgICAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X3VubG9jayIsIHN0YXR1cyApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gd2FrZXVwIFQjJWQsIHJlc2V0IHNsZWVwIGJpdCBmb3IgZmxhZydzIGxvYyglcCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgZmxhZy0+Z2V0KCksIG9sZF9zcGluLCAqZmxhZy0+Z2V0KCkgKSApOworICAgIH0KKyAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsIE5VTEwpOworCisKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZ0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgICAgICBfX2ttcF9wcmludGYoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgcmVzdW1pbmcgVCMlZDogJXNcbiIsIGd0aWQsIHRhcmdldF9ndGlkLCBidWZmZXIgKTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZF9zaWduYWwiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgZXhpdGluZyBhZnRlciBzaWduYWxpbmcgd2FrZSB1cCBmb3IgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworfQorCit2b2lkIF9fa21wX3Jlc3VtZV8zMihpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzMyICpmbGFnKSB7CisgICAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfcmVzdW1lXzY0KGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcpIHsKKyAgICBfX2ttcF9yZXN1bWVfdGVtcGxhdGUodGFyZ2V0X2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9yZXN1bWVfb25jb3JlKGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnKSB7CisgICAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KKworI2lmIEtNUF9VU0VfTU9OSVRPUgordm9pZAorX19rbXBfcmVzdW1lX21vbml0b3IoKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhVU0VSX3Jlc3VtZSk7CisgICAgaW50IHN0YXR1czsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgZ3RpZCA9IFRDUl80KF9fa21wX2luaXRfZ3RpZCkgPyBfX2ttcF9nZXRfZ3RpZCgpIDogLTE7CisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWVfbW9uaXRvcjogVCMlZCB3YW50cyB0byB3YWtldXAgVCMlZCBlbnRlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgS01QX0dUSURfTU9OSVRPUiApICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCAhPSBLTVBfR1RJRF9NT05JVE9SICk7CisjZW5kaWYKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZfX2ttcF93YWl0X214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyApOworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICB7CisgICAgICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgICAgIF9fa21wX3ByaW50X2NvbmQoIGJ1ZmZlciwgJl9fa21wX3dhaXRfY3YuY19jb25kICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3Jlc3VtZV9tb25pdG9yOiBUIyVkIHJlc3VtaW5nIFQjJWQ6ICVzXG4iLCBndGlkLCBLTVBfR1RJRF9NT05JVE9SLCBidWZmZXIgKTsKKyAgICB9CisjZW5kaWYKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCAmX19rbXBfd2FpdF9jdi5jX2NvbmQgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZF9zaWduYWwiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJl9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZV9tb25pdG9yOiBUIyVkIGV4aXRpbmcgYWZ0ZXIgc2lnbmFsaW5nIHdha2UgdXAgZm9yIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9HVElEX01PTklUT1IgKSApOworfQorI2VuZGlmIC8vIEtNUF9VU0VfTU9OSVRPUgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF95aWVsZCggaW50IGNvbmQgKQoreworICAgIGlmIChjb25kCisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgICAgICYmIF9fa21wX3lpZWxkaW5nX29uCisjZW5kaWYKKyAgICApIHsKKyAgICAgICAgc2NoZWRfeWllbGQoKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBpbnQgZ3RpZCApCit7CisgICAgaWYoIF9fa21wX2luaXRfZ3RpZCApIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9zZXRzcGVjaWZpYyggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgKHZvaWQqKShpbnRwdHJfdCkoZ3RpZCsxKSApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0c3BlY2lmaWMiLCBzdGF0dXMgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWM6IHJ1bnRpbWUgc2h1dGRvd24sIHJldHVybmluZ1xuIiApICk7CisgICAgfQorfQorCitpbnQKK19fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBpZiAoICFfX2ttcF9pbml0X2d0aWQgKSB7CisgICAgICAgIEtBX1RSQUNFKCA1MCwgKCJfX2ttcF9ndGlkX2dldF9zcGVjaWZpYzogcnVudGltZSBzaHV0ZG93biwgcmV0dXJuaW5nIEtNUF9HVElEX1NIVVRET1dOXG4iICkgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9HVElEX1NIVVRET1dOOworICAgIH0KKyAgICBndGlkID0gKGludCkoc2l6ZV90KXB0aHJlYWRfZ2V0c3BlY2lmaWMoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICBpZiAoIGd0aWQgPT0gMCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGd0aWQtLTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBrZXk6JWQgZ3RpZDolZFxuIiwKKyAgICAgICAgICAgICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksIGd0aWQgKSk7CisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2RvdWJsZQorX19rbXBfcmVhZF9jcHVfdGltZSggdm9pZCApCit7CisgICAgLypjbG9ja190ICAgdDsqLworICAgIHN0cnVjdCB0bXMgIGJ1ZmZlcjsKKworICAgIC8qdCA9Ki8gIHRpbWVzKCAmIGJ1ZmZlciApOworCisgICAgcmV0dXJuIChidWZmZXIudG1zX3V0aW1lICsgYnVmZmVyLnRtc19jdXRpbWUpIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUM7Cit9CisKK2ludAorX19rbXBfcmVhZF9zeXN0ZW1faW5mbyggc3RydWN0IGttcF9zeXNfaW5mbyAqaW5mbyApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdHJ1Y3QgcnVzYWdlIHJfdXNhZ2U7CisKKyAgICBtZW1zZXQoIGluZm8sIDAsIHNpemVvZiggKmluZm8gKSApOworCisgICAgc3RhdHVzID0gZ2V0cnVzYWdlKCBSVVNBR0VfU0VMRiwgJnJfdXNhZ2UpOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0cnVzYWdlIiwgc3RhdHVzICk7CisKKyAgICBpbmZvLT5tYXhyc3MgID0gcl91c2FnZS5ydV9tYXhyc3M7ICAvKiB0aGUgbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSB1dGlsaXplZCAoaW4ga2lsb2J5dGVzKSAgICAgKi8KKyAgICBpbmZvLT5taW5mbHQgID0gcl91c2FnZS5ydV9taW5mbHQ7ICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHdpdGhvdXQgYW55IEkvTyAgICAgICAgKi8KKyAgICBpbmZvLT5tYWpmbHQgID0gcl91c2FnZS5ydV9tYWpmbHQ7ICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHRoYXQgcmVxdWlyZWQgSS9PICAgICAgKi8KKyAgICBpbmZvLT5uc3dhcCAgID0gcl91c2FnZS5ydV9uc3dhcDsgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgInN3YXBwZWQiIG91dCBvZiBtZW1vcnkgKi8KKyAgICBpbmZvLT5pbmJsb2NrID0gcl91c2FnZS5ydV9pbmJsb2NrOyAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBpbnB1dCAgKi8KKyAgICBpbmZvLT5vdWJsb2NrID0gcl91c2FnZS5ydV9vdWJsb2NrOyAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgICBpbmZvLT5udmNzdyAgID0gcl91c2FnZS5ydV9udmNzdzsgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIHZvbHVudGFyaWx5ICAgICAgKi8KKyAgICBpbmZvLT5uaXZjc3cgID0gcl91c2FnZS5ydV9uaXZjc3c7ICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIGZvcmNlZCAgICAgICAgICAgKi8KKworICAgIHJldHVybiAoc3RhdHVzICE9IDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCBkb3VibGUgKmRlbHRhICkKK3sKKyAgICBkb3VibGUgICAgICAgICAgICAgIHRfbnM7CisgICAgc3RydWN0IHRpbWV2YWwgICAgICB0dmFsOworICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgc3RvcDsKKyAgICBpbnQgc3RhdHVzOworCisgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmdHZhbCwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgVElNRVZBTF9UT19USU1FU1BFQyggJnR2YWwsICZzdG9wICk7CisgICAgdF9ucyA9IFRTMk5TKHN0b3ApIC0gVFMyTlMoX19rbXBfc3lzX3RpbWVyX2RhdGEuc3RhcnQpOworICAgICpkZWx0YSA9ICh0X25zICogMWUtOSk7Cit9CisKK3ZvaWQKK19fa21wX2NsZWFyX3N5c3RlbV90aW1lKCB2b2lkICkKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCB0dmFsOworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmdHZhbCwgTlVMTCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisgICAgVElNRVZBTF9UT19USU1FU1BFQyggJnR2YWwsICZfX2ttcF9zeXNfdGltZXJfZGF0YS5zdGFydCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQlVJTERfVFYKKwordm9pZAorX19rbXBfdHZfdGhyZWFkcHJpdmF0ZV9zdG9yZSgga21wX2luZm9fdCAqdGgsIHZvaWQgKmdsb2JhbF9hZGRyLCB2b2lkICp0aHJlYWRfYWRkciApCit7CisgICAgc3RydWN0IHR2X2RhdGEgKnA7CisKKyAgICBwID0gKHN0cnVjdCB0dl9kYXRhICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoICpwICkgKTsKKworICAgIHAtPnUudHAuZ2xvYmFsX2FkZHIgPSBnbG9iYWxfYWRkcjsKKyAgICBwLT51LnRwLnRocmVhZF9hZGRyID0gdGhyZWFkX2FkZHI7CisKKyAgICBwLT50eXBlID0gKHZvaWQgKikgMTsKKworICAgIHAtPm5leHQgPSAgdGgtPnRoLnRoX2xvY2FsLnR2X2RhdGE7CisgICAgdGgtPnRoLnRoX2xvY2FsLnR2X2RhdGEgPSBwOworCisgICAgaWYgKCBwLT5uZXh0ID09IDAgKSB7CisgICAgICAgIGludCByYyA9IHB0aHJlYWRfc2V0c3BlY2lmaWMoIF9fa21wX3R2X2tleSwgcCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfc2V0c3BlY2lmaWMiLCByYyApOworICAgIH0KK30KKworI2VuZGlmIC8qIEJVSUxEX1RWICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQKK19fa21wX2dldF94cHJvYyggdm9pZCApIHsKKworICAgIGludCByID0gMDsKKworICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorCisgICAgICAgIHIgPSBzeXNjb25mKCBfU0NfTlBST0NFU1NPUlNfT05MTiApOworCisgICAgI2VsaWYgS01QX09TX0RBUldJTgorCisgICAgICAgIC8vIEJ1ZyBDNzcwMTEgSGlnaCAiT3Blbk1QIFRocmVhZHMgYW5kIG51bWJlciBvZiBhY3RpdmUgY29yZXMiLgorCisgICAgICAgIC8vIEZpbmQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgQ1BVcy4KKyAgICAgICAga2Vybl9yZXR1cm5fdCAgICAgICAgICByYzsKKyAgICAgICAgaG9zdF9iYXNpY19pbmZvX2RhdGFfdCBpbmZvOworICAgICAgICBtYWNoX21zZ190eXBlX251bWJlcl90IG51bSA9IEhPU1RfQkFTSUNfSU5GT19DT1VOVDsKKyAgICAgICAgcmMgPSBob3N0X2luZm8oIG1hY2hfaG9zdF9zZWxmKCksIEhPU1RfQkFTSUNfSU5GTywgKGhvc3RfaW5mb190KSAmIGluZm8sICYgbnVtICk7CisgICAgICAgIGlmICggcmMgPT0gMCAmJiBudW0gPT0gSE9TVF9CQVNJQ19JTkZPX0NPVU5UICkgeworICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBLQV9UUkFDRSgpIGhlcmUgYmVjYXVzZSB0aGlzIGNvZGUgd29ya3MgYmVmb3JlIHRyYWNlIHN1cHBvcnQgaXMKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemVkLgorICAgICAgICAgICAgciA9IGluZm8uYXZhaWxfY3B1czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50R2V0TnVtQXZhaWxDUFUgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIEFzc3VtZWROdW1DUFUgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICNlbHNlCisKKyAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLiIKKworICAgICNlbmRpZgorCisgICAgcmV0dXJuIHIgPiAwID8gciA6IDI7IC8qIGd1ZXNzIHZhbHVlIG9mIDIgaWYgT1MgdG9sZCB1cyAwICovCisKK30gLy8gX19rbXBfZ2V0X3hwcm9jCisKK2ludAorX19rbXBfcmVhZF9mcm9tX2ZpbGUoIGNoYXIgY29uc3QgKnBhdGgsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uICkKK3sKKyAgICBpbnQgcmVzdWx0OworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgRklMRSAqZiA9IGZvcGVuKHBhdGgsICJyYiIpOworICAgIGlmICggZiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmVzdWx0ID0gdmZzY2FuZihmLCBmb3JtYXQsIGFyZ3MpOworICAgIGZjbG9zZShmKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQKK19fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4X2F0dHI7CisgICAgcHRocmVhZF9jb25kYXR0cl90ICBjb25kX2F0dHI7CisKKyAgICBpZiAoIF9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICAjaWYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICkKKyAgICAgICAgaWYgKCAhIF9fa21wX2NwdWluZm8uaW5pdGlhbGl6ZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9xdWVyeV9jcHVpZCggJl9fa21wX2NwdWluZm8gKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgX19rbXBfeHByb2MgPSBfX2ttcF9nZXRfeHByb2MoKTsKKworICAgIGlmICggc3lzY29uZiggX1NDX1RIUkVBRFMgKSApIHsKKworICAgICAgICAvKiBRdWVyeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyAqLworICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IHN5c2NvbmYoIF9TQ19USFJFQURfVEhSRUFEU19NQVggKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zeXNfbWF4X250aCA9PSAtMSApIHsKKyAgICAgICAgICAgIC8qIFVubGltaXRlZCB0aHJlYWRzIGZvciBOUFRMICovCisgICAgICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IElOVF9NQVg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX3N5c19tYXhfbnRoIDw9IDEgKSB7CisgICAgICAgICAgICAvKiBDYW4ndCB0ZWxsLCBqdXN0IHVzZSBQVEhSRUFEX1RIUkVBRFNfTUFYICovCisgICAgICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IEtNUF9NQVhfTlRIOworICAgICAgICB9CisKKyAgICAgICAgLyogUXVlcnkgdGhlIG1pbmltdW0gc3RhY2sgc2l6ZSAqLworICAgICAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUgPSBzeXNjb25mKCBfU0NfVEhSRUFEX1NUQUNLX01JTiApOworICAgICAgICBpZiAoIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA8PSAxICkgeworICAgICAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplID0gS01QX01JTl9TVEtTSVpFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHVwIG1pbmltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gc3dpdGNoIHRvIFRMUyBndGlkICovCisgICAgX19rbXBfdGxzX2d0aWRfbWluID0gS01QX1RMU19HVElEX01JTjsKKworICAgICNpZmRlZiBCVUlMRF9UVgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmMgPSBwdGhyZWFkX2tleV9jcmVhdGUoICYgX19rbXBfdHZfa2V5LCAwICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfa2V5X2NyZWF0ZSIsIHJjICk7CisgICAgICAgIH0KKyAgICAjZW5kaWYKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfa2V5X2NyZWF0ZSggJl9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksIF9fa21wX2ludGVybmFsX2VuZF9kZXN0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2tleV9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCAmIG11dGV4X2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoICYgX19rbXBfd2FpdF9teC5tX211dGV4LCAmIG11dGV4X2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZGF0dHJfaW5pdCggJiBjb25kX2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZGF0dHJfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9pbml0KCAmIF9fa21wX3dhaXRfY3YuY19jb25kLCAmIGNvbmRfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jb25kX2luaXQiLCBzdGF0dXMgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2luaXRpYWxpemUoKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBUUlVFOworfQorCit2b2lkCitfX2ttcF9ydW50aW1lX2Rlc3Ryb3koIHZvaWQgKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBpZiAoICEgX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gZG8uCisgICAgfTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfZGVzdHJveSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfa2V5X2RlbGV0ZSggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9rZXlfZGVsZXRlIiwgc3RhdHVzICk7CisgICAgI2lmZGVmIEJVSUxEX1RWCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfa2V5X2RlbGV0ZSggX19rbXBfdHZfa2V5ICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9rZXlfZGVsZXRlIiwgc3RhdHVzICk7CisgICAgI2VuZGlmCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koICYgX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRUJVU1kgKSB7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9tdXRleF9kZXN0cm95Iiwgc3RhdHVzICk7CisgICAgfQorICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCAmIF9fa21wX3dhaXRfY3YuY19jb25kICk7CisgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRUJVU1kgKSB7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jb25kX2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICB9CisgICAgI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKCk7CisgICAgI2VuZGlmCisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKK30KKworCisvKiBQdXQgdGhlIHRocmVhZCB0byBzbGVlcCBmb3IgYSB0aW1lIHBlcmlvZCAqLworLyogTk9URTogbm90IGN1cnJlbnRseSB1c2VkIGFueXdoZXJlICovCit2b2lkCitfX2ttcF90aHJlYWRfc2xlZXAoIGludCBtaWxsaXMgKQoreworICAgIHNsZWVwKCAgKCBtaWxsaXMgKyA1MDAgKSAvIDEwMDAgKTsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGltZSBmb3IgdGhlIHVzZXIgKi8KK3ZvaWQKK19fa21wX2VsYXBzZWQoIGRvdWJsZSAqdCApCit7CisgICAgaW50IHN0YXR1czsKKyMgaWZkZWYgRklYX1NHSV9DTE9DSworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKworICAgIHN0YXR1cyA9IGNsb2NrX2dldHRpbWUoIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgJnRzICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJjbG9ja19nZXR0aW1lIiwgc3RhdHVzICk7CisgICAgKnQgPSAoZG91YmxlKSB0cy50dl9uc2VjICogKDEuMCAvIChkb3VibGUpIEtNUF9OU0VDX1BFUl9TRUMpICsKKyAgICAgICAgKGRvdWJsZSkgdHMudHZfc2VjOworIyBlbHNlCisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisKKyAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICYgdHYsIE5VTEwgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgICp0ID0gKGRvdWJsZSkgdHYudHZfdXNlYyAqICgxLjAgLyAoZG91YmxlKSBLTVBfVVNFQ19QRVJfU0VDKSArCisgICAgICAgIChkb3VibGUpIHR2LnR2X3NlYzsKKyMgZW5kaWYKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGljayBmb3IgdGhlIHVzZXIgKi8KK3ZvaWQKK19fa21wX2VsYXBzZWRfdGljayggZG91YmxlICp0ICkKK3sKKyAgICAqdCA9IDEgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQzsKK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgc3RhbXAgaW4gbnNlYyAqLwora21wX3VpbnQ2NAorX19rbXBfbm93X25zZWMoKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgZ2V0dGltZW9mZGF5KCZ0LCBOVUxMKTsKKyAgICByZXR1cm4gS01QX05TRUNfUEVSX1NFQyp0LnR2X3NlYyArIDEwMDAqdC50dl91c2VjOworfQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLyogTWVhc3VyZSBjbG9jayB0aWNrIHBlciBuYW5vc2Vjb25kICovCit2b2lkCitfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCkKK3sKKyAgICBrbXBfdWludDY0IGRlbGF5ID0gMTAwMDAwOyAvLyA1MH4xMDAgdXNlYyBvbiBtb3N0IG1hY2hpbmVzLgorICAgIGttcF91aW50NjQgbnNlYyA9IF9fa21wX25vd19uc2VjKCk7CisgICAga21wX3VpbnQ2NCBnb2FsID0gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKCkgKyBkZWxheTsKKyAgICBrbXBfdWludDY0IG5vdzsKKyAgICB3aGlsZSAoKG5vdyA9IF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCgpKSA8IGdvYWwpOworICAgIF9fa21wX3RpY2tzX3Blcl9uc2VjID0gMS4wICogKGRlbGF5ICsgKG5vdyAtIGdvYWwpKSAvIChfX2ttcF9ub3dfbnNlYygpIC0gbnNlYyk7Cit9CisjZW5kaWYKKworLyoKKyAgICBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBtYXBwZWQgaW50byB0aGUgY3VycmVudCBhZGRyZXNzIHNwYWNlLgorKi8KKworaW50CitfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggdm9pZCAqIGFkZHIgKSB7CisKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByYzsKKworICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QKKworICAgICAgICAvKgorICAgICAgICAgICAgT24gTGludXgqIE9TLCByZWFkIHRoZSAvcHJvYy88cGlkPi9tYXBzIHBzZXVkby1maWxlIHRvIGdldCBhbGwgdGhlIGFkZHJlc3MgcmFuZ2VzIG1hcHBlZAorICAgICAgICAgICAgaW50byB0aGUgYWRkcmVzcyBzcGFjZS4KKyAgICAgICAgKi8KKworICAgICAgICBjaGFyICogbmFtZSA9IF9fa21wX3N0cl9mb3JtYXQoICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkgKTsKKyAgICAgICAgRklMRSAqIGZpbGUgID0gTlVMTDsKKworICAgICAgICBmaWxlID0gZm9wZW4oIG5hbWUsICJyIiApOworICAgICAgICBLTVBfQVNTRVJUKCBmaWxlICE9IE5VTEwgKTsKKworICAgICAgICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgICAgIHZvaWQgKiBiZWdpbm5pbmcgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqIGVuZGluZyAgICA9IE5VTEw7CisgICAgICAgICAgICBjaGFyICAgcGVybXNbIDUgXTsKKworICAgICAgICAgICAgcmMgPSBmc2NhbmYoIGZpbGUsICIlcC0lcCAlNHMgJSpbXlxuXVxuIiwgJiBiZWdpbm5pbmcsICYgZW5kaW5nLCBwZXJtcyApOworICAgICAgICAgICAgaWYgKCByYyA9PSBFT0YgKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgS01QX0FTU0VSVCggcmMgPT0gMyAmJiBLTVBfU1RSTEVOKCBwZXJtcyApID09IDQgKTsgLy8gTWFrZSBzdXJlIGFsbCBmaWVsZHMgYXJlIHJlYWQuCisKKyAgICAgICAgICAgIC8vIEVuZGluZyBhZGRyZXNzIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVnaW9uLCBidXQgYmVnaW5uaW5nIGlzLgorICAgICAgICAgICAgaWYgKCAoIGFkZHIgPj0gYmVnaW5uaW5nICkgJiYgKCBhZGRyIDwgZW5kaW5nICkgKSB7CisgICAgICAgICAgICAgICAgcGVybXNbIDIgXSA9IDA7ICAgIC8vIDN0aCBhbmQgNHRoIGNoYXJhY3RlciBkb2VzIG5vdCBtYXR0ZXIuCisgICAgICAgICAgICAgICAgaWYgKCBzdHJjbXAoIHBlcm1zLCAicnciICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWVtb3J5IHdlIGFyZSBsb29raW5nIGZvciBzaG91bGQgYmUgcmVhZGFibGUgYW5kIHdyaXRhYmxlLgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgfTsgLy8gZm9yZXZlcgorCisgICAgICAgIC8vIEZyZWUgcmVzb3VyY2VzLgorICAgICAgICBmY2xvc2UoIGZpbGUgKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG5hbWUgKTsKKworICAgICNlbGlmIEtNUF9PU19EQVJXSU4KKworICAgICAgICAvKgorICAgICAgICAgICAgT24gT1MgWCosIC9wcm9jIHBzZXVkbyBmaWxlc3lzdGVtIGlzIG5vdCBhdmFpbGFibGUuIFRyeSB0byByZWFkIG1lbW9yeSB1c2luZyB2bQorICAgICAgICAgICAgaW50ZXJmYWNlLgorICAgICAgICAqLworCisgICAgICAgIGludCAgICAgICBidWZmZXI7CisgICAgICAgIHZtX3NpemVfdCBjb3VudDsKKyAgICAgICAgcmMgPQorICAgICAgICAgICAgdm1fcmVhZF9vdmVyd3JpdGUoCisgICAgICAgICAgICAgICAgbWFjaF90YXNrX3NlbGYoKSwgICAgICAgICAgIC8vIFRhc2sgdG8gcmVhZCBtZW1vcnkgb2YuCisgICAgICAgICAgICAgICAgKHZtX2FkZHJlc3NfdCkoIGFkZHIgKSwgICAgIC8vIEFkZHJlc3MgdG8gcmVhZCBmcm9tLgorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KKyAgICAgICAgICAgICAgICAodm1fYWRkcmVzc190KSggJiBidWZmZXIgKSwgLy8gQWRkcmVzcyBvZiBidWZmZXIgdG8gc2F2ZSByZWFkIGJ5dGVzIGluLgorICAgICAgICAgICAgICAgICYgY291bnQgICAgICAgICAgICAgICAgICAgICAvLyBBZGRyZXNzIG9mIHZhciB0byBzYXZlIG51bWJlciBvZiByZWFkIGJ5dGVzIGluLgorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgLy8gTWVtb3J5IHN1Y2Nlc3NmdWxseSByZWFkLgorICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2VsaWYgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorCisgICAgICAgIC8vIEZJWE1FKEZyZWVCU0QsIE5ldEJTRCk6IEltcGxlbWVudCB0aGlzCisgICAgICAgIGZvdW5kID0gMTsKKworICAgICNlbHNlCisKKyAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorCisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gZm91bmQ7CisKK30gLy8gX19rbXBfaXNfYWRkcmVzc19tYXBwZWQKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKworCisjIGlmIEtNUF9PU19EQVJXSU4KKworLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJvdW5kZWQgdmFsdWUgb2YgdGhlIHN5c3RlbSBsb2FkIGF2ZXJhZ2UKKy8vIGR1cmluZyBnaXZlbiB0aW1lIGludGVydmFsIHdoaWNoIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mCisvLyBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgdmFyaWFibGUgKGRlZmF1bHQgaXMgNjAgc2VjLCBvdGhlciB2YWx1ZXMKKy8vIG1heSBiZSAzMDAgc2VjIG9yIDkwMCBzZWMpLgorLy8gSXQgcmV0dXJucyAtMSBpbiBjYXNlIG9mIGVycm9yLgoraW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkKK3sKKyAgICBkb3VibGUgYXZlcmFnZXNbM107CisgICAgaW50IHJldF9hdmcgPSAwOworCisgICAgaW50IHJlcyA9IGdldGxvYWRhdmcoIGF2ZXJhZ2VzLCAzICk7CisKKyAgICAvL0NoZWNrIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCB0byBkZXRlcm1pbmUgd2hpY2ggb2YgYXZlcmFnZXMgdG8gdXNlLgorICAgIC8vIGdldGxvYWRhdmcoKSBtYXkgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBsZXNzIHRoYW4gcmVxdWVzdGVkIHRoYXQgaXMKKyAgICAvLyBsZXNzIHRoYW4gMy4KKyAgICBpZiAoIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA8IDE4MCAmJiAoIHJlcyA+PSAxICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1swXTsvLyAxIG1pbgorICAgIH0gZWxzZSBpZiAoICggX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID49IDE4MAorICAgICAgICAgICAgICAgICAgJiYgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIDwgNjAwICkgJiYgKCByZXMgPj0gMiApICkgeworICAgICAgICByZXRfYXZnID0gYXZlcmFnZXNbMV07Ly8gNSBtaW4KKyAgICB9IGVsc2UgaWYgKCAoIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA+PSA2MDAgKSAmJiAoIHJlcyA9PSAzICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1syXTsvLyAxNSBtaW4KKyAgICB9IGVsc2Ugey8vIEVycm9yIG9jY3VycmVkCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0X2F2ZzsKK30KKworIyBlbHNlIC8vIExpbnV4KiBPUworCisvLyBUaGUgZnVjdGlvbiByZXR1cm5zIG51bWJlciBvZiBydW5uaW5nIChub3Qgc2xlZXBpbmcpIHRocmVhZHMsIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisvLyBFcnJvciBjb3VsZCBiZSByZXBvcnRlZCBpZiBMaW51eCogT1Mga2VybmVsIHRvbyBvbGQgKHdpdGhvdXQgIi9wcm9jIiBzdXBwb3J0KS4KKy8vIENvdW50aW5nIHJ1bm5pbmcgdGhyZWFkcyBzdG9wcyBpZiBtYXggcnVubmluZyB0aHJlYWRzIGVuY291bnRlcmVkLgoraW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkKK3sKKyAgICBzdGF0aWMgaW50IHBlcm1hbmVudF9lcnJvciA9IDA7CisKKyAgICBzdGF0aWMgaW50ICAgICBnbGJfcnVubmluZ190aHJlYWRzICAgICAgICAgID0gMDsgIC8qIFNhdmVkIGNvdW50IG9mIHRoZSBydW5uaW5nIHRocmVhZHMgZm9yIHRoZSB0aHJlYWQgYmFsYW5jZSBhbGdvcnRpaG0gKi8KKyAgICBzdGF0aWMgZG91YmxlICBnbGJfY2FsbF90aW1lID0gMDsgIC8qIFRocmVhZCBiYWxhbmNlIGFsZ29yaXRobSBjYWxsIHRpbWUgKi8KKworICAgIGludCBydW5uaW5nX3RocmVhZHMgPSAwOyAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLgorCisgICAgRElSICAqICAgICAgICAgIHByb2NfZGlyICAgPSBOVUxMOyAgICAvLyBIYW5kbGUgb2YgIi9wcm9jLyIgZGlyZWN0b3J5LgorICAgIHN0cnVjdCBkaXJlbnQgKiBwcm9jX2VudHJ5ID0gTlVMTDsKKworICAgIGttcF9zdHJfYnVmX3QgICB0YXNrX3BhdGg7ICAgICAgICAgICAgLy8gIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vIiBwYXRoLgorICAgIERJUiAgKiAgICAgICAgICB0YXNrX2RpciAgID0gTlVMTDsgICAgLy8gSGFuZGxlIG9mICIvcHJvYy88cGlkPi90YXNrLzx0aWQ+LyIgZGlyZWN0b3J5LgorICAgIHN0cnVjdCBkaXJlbnQgKiB0YXNrX2VudHJ5ID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgdGFza19wYXRoX2ZpeGVkX2xlbjsKKworICAgIGttcF9zdHJfYnVmX3QgICBzdGF0X3BhdGg7ICAgICAgICAgICAgLy8gIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vc3RhdCIgcGF0aC4KKyAgICBpbnQgICAgICAgICAgICAgc3RhdF9maWxlID0gLTE7CisgICAgaW50ICAgICAgICAgICAgIHN0YXRfcGF0aF9maXhlZF9sZW47CisKKyAgICBpbnQgdG90YWxfcHJvY2Vzc2VzID0gMDsgICAgICAgICAgICAgIC8vIFRvdGFsIG51bWJlciBvZiBwcm9jZXNzZXMgaW4gc3lzdGVtLgorICAgIGludCB0b3RhbF90aHJlYWRzICAgPSAwOyAgICAgICAgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHRocmVhZHMgaW4gc3lzdGVtLgorCisgICAgZG91YmxlIGNhbGxfdGltZSA9IDAuMDsKKworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiB0YXNrX3BhdGggKTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgc3RhdF9wYXRoICk7CisKKyAgICAgX19rbXBfZWxhcHNlZCggJiBjYWxsX3RpbWUgKTsKKworICAgIGlmICggZ2xiX2NhbGxfdGltZSAmJgorICAgICAgICAgICAgKCBjYWxsX3RpbWUgLSBnbGJfY2FsbF90aW1lIDwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICkgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IGdsYl9ydW5uaW5nX3RocmVhZHM7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIGdsYl9jYWxsX3RpbWUgPSBjYWxsX3RpbWU7CisKKyAgICAvLyBEbyBub3Qgc3BlbmQgdGltZSBvbiBzY2FubmluZyAiL3Byb2MvIiBpZiB3ZSBoYXZlIGEgcGVybWFuZW50IGVycm9yLgorICAgIGlmICggcGVybWFuZW50X2Vycm9yICkgeworICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfTsgLy8gaWYKKworICAgIGlmICggbWF4IDw9IDAgKSB7CisgICAgICAgIG1heCA9IElOVF9NQVg7CisgICAgfTsgLy8gaWYKKworICAgIC8vIE9wZW4gIi9wcm9jLyIgZGlyZWN0b3J5LgorICAgIHByb2NfZGlyID0gb3BlbmRpciggIi9wcm9jIiApOworICAgIGlmICggcHJvY19kaXIgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gQ2Fubm90IG9wZW4gIi9wcnJvYy8iLiBQcm9iYWJseSB0aGUga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgaXQuIFJldHVybiBhbiBlcnJvciBub3cgYW5kCisgICAgICAgIC8vIGluIHN1YnNlcXVlbnQgY2FsbHMuCisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICBwZXJtYW5lbnRfZXJyb3IgPSAxOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gSW5pdGlhbGl6ZSBmaXhlZCBwYXJ0IG9mIHRhc2tfcGF0aC4gVGhpcyBwYXJ0IHdpbGwgbm90IGNoYW5nZS4KKyAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiB0YXNrX3BhdGgsICIvcHJvYy8iLCA2ICk7CisgICAgdGFza19wYXRoX2ZpeGVkX2xlbiA9IHRhc2tfcGF0aC51c2VkOyAgICAvLyBSZW1lbWJlciBudW1iZXIgb2YgdXNlZCBjaGFyYWN0ZXJzLgorCisgICAgcHJvY19lbnRyeSA9IHJlYWRkaXIoIHByb2NfZGlyICk7CisgICAgd2hpbGUgKCBwcm9jX2VudHJ5ICE9IE5VTEwgKSB7CisgICAgICAgIC8vIFByb2MgZW50cnkgaXMgYSBkaXJlY3RvcnkgYW5kIG5hbWUgc3RhcnRzIHdpdGggYSBkaWdpdC4gQXNzdW1lIGl0IGlzIGEgcHJvY2VzcycKKyAgICAgICAgLy8gZGlyZWN0b3J5LgorICAgICAgICBpZiAoIHByb2NfZW50cnktPmRfdHlwZSA9PSBEVF9ESVIgJiYgaXNkaWdpdCggcHJvY19lbnRyeS0+ZF9uYW1lWyAwIF0gKSApIHsKKworICAgICAgICAgICAgKysgdG90YWxfcHJvY2Vzc2VzOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGluaXQgcHJvY2VzcyBpcyB0aGUgdmVyeSBmaXJzdCBpbiAiL3Byb2MiLCBzbyB3ZSBjYW4gcmVwbGFjZQorICAgICAgICAgICAgLy8gc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgd2l0aCBzaW1wbGVyIHRvdGFsX3Byb2Nlc3NlcyA9PSAxLgorICAgICAgICAgICAgLy8gV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHRoYXQgdG90YWxfcHJvY2Vzc2VzID09IDEgPT4gZF9uYW1lID09ICIxIiBpcyB0cnVlICh3aGVyZQorICAgICAgICAgICAgLy8gIj0+IiBpcyBpbXBsaWNhdGlvbikuIFNpbmNlIEMrKyBkb2VzIG5vdCBoYXZlID0+IG9wZXJhdG9yLCBsZXQgdXMgcmVwbGFjZSBpdCB3aXRoIGl0cworICAgICAgICAgICAgLy8gZXF1aXZhbGVudDogYSA9PiBiID09ICEgYSB8fCBiLgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdG90YWxfcHJvY2Vzc2VzICE9IDEgfHwgc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgKTsKKworICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRhc2tfcGF0aC4KKyAgICAgICAgICAgIHRhc2tfcGF0aC51c2VkID0gdGFza19wYXRoX2ZpeGVkX2xlbjsgICAgLy8gUmVzZXQgdGFza19wYXRoIHRvICIvcHJvYy8iLgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgdGFza19wYXRoLCBwcm9jX2VudHJ5LT5kX25hbWUsIEtNUF9TVFJMRU4oIHByb2NfZW50cnktPmRfbmFtZSApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiB0YXNrX3BhdGgsICIvdGFzayIsIDUgKTsKKworICAgICAgICAgICAgdGFza19kaXIgPSBvcGVuZGlyKCB0YXNrX3BhdGguc3RyICk7CisgICAgICAgICAgICBpZiAoIHRhc2tfZGlyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBjYW4gZmluaXNoIGJldHdlZW4gcmVhZGluZyAiL3Byb2MvIiBkaXJlY3RvcnkgZW50cnkgYW5kIG9wZW5pbmcgcHJvY2VzcycKKyAgICAgICAgICAgICAgICAvLyAidGFzay8iIGRpcmVjdG9yeS4gU28sIGluIGdlbmVyYWwgY2FzZSB3ZSBzaG91bGQgbm90IGNvbXBsYWluLCBidXQgaGF2ZSB0byBza2lwCisgICAgICAgICAgICAgICAgLy8gdGhpcyBwcm9jZXNzIGFuZCByZWFkIHRoZSBuZXh0IG9uZS4KKyAgICAgICAgICAgICAgICAvLyBCdXQgb24gc3lzdGVtcyB3aXRoIG5vICJ0YXNrLyIgc3VwcG9ydCB3ZSB3aWxsIHNwZW5kIGxvdCBvZiB0aW1lIHRvIHNjYW4gIi9wcm9jLyIKKyAgICAgICAgICAgICAgICAvLyB0cmVlIGFnYWluIGFuZCBhZ2FpbiB3aXRob3V0IGFueSBiZW5lZml0LiAiaW5pdCIgcHJvY2VzcyAoaXRzIHBpZCBpcyAxKSBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyBleGlzdCBhbHdheXMsIHNvLCBpZiB3ZSBjYW5ub3Qgb3BlbiAiL3Byb2MvMS90YXNrLyIgZGlyZWN0b3J5LCBpdCBtZWFucyAidGFzay8iCisgICAgICAgICAgICAgICAgLy8gaXMgbm90IHN1cHBvcnRlZCBieSBrZXJuZWwuIFJlcG9ydCBhbiBlcnJvciBub3cgYW5kIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICAgICAgaWYgKCBzdHJjbXAoIHByb2NfZW50cnktPmRfbmFtZSwgIjEiICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgICAgICAgICAgICAgIHBlcm1hbmVudF9lcnJvciA9IDE7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgZml4ZWQgcGFydCBvZiBzdGF0IGZpbGUgcGF0aC4KKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmIHN0YXRfcGF0aCApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHN0YXRfcGF0aCwgdGFza19wYXRoLnN0ciwgdGFza19wYXRoLnVzZWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBzdGF0X3BhdGgsICIvIiwgMSApOworICAgICAgICAgICAgICAgIHN0YXRfcGF0aF9maXhlZF9sZW4gPSBzdGF0X3BhdGgudXNlZDsKKworICAgICAgICAgICAgICAgIHRhc2tfZW50cnkgPSByZWFkZGlyKCB0YXNrX2RpciApOworICAgICAgICAgICAgICAgIHdoaWxlICggdGFza19lbnRyeSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBhIGRpcmVjdG9yeSBhbmQgbmFtZSBzdGFydHMgd2l0aCBhIGRpZ2l0LgorICAgICAgICAgICAgICAgICAgICBpZiAoIHByb2NfZW50cnktPmRfdHlwZSA9PSBEVF9ESVIgJiYgaXNkaWdpdCggdGFza19lbnRyeS0+ZF9uYW1lWyAwIF0gKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgKysgdG90YWxfdGhyZWFkczsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3J1Y3QgY29tcGxldGUgc3RhdCBmaWxlIHBhdGguIEVhc2llc3Qgd2F5IHdvdWxkIGJlOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIF9fa21wX3N0cl9idWZfcHJpbnQoICYgc3RhdF9wYXRoLCAiJXMvJXMvc3RhdCIsIHRhc2tfcGF0aC5zdHIsIHRhc2tfZW50cnktPmRfbmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHNlcmlhZSBvZiBfX2ttcF9zdHJfYnVmX2NhdCB3b3JrcyBhIGJpdCBmYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0X3BhdGgudXNlZCA9IHN0YXRfcGF0aF9maXhlZF9sZW47ICAgIC8vIFJlc2V0IHN0YXQgcGF0aCB0byBpdHMgZml4ZWQgcGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHN0YXRfcGF0aCwgdGFza19lbnRyeS0+ZF9uYW1lLCBLTVBfU1RSTEVOKCB0YXNrX2VudHJ5LT5kX25hbWUgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCAiL3N0YXQiLCA1ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IExvdy1sZXZlbCBBUEkgKG9wZW4vcmVhZC9jbG9zZSkgaXMgdXNlZC4gSGlnaC1sZXZlbCBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmb3Blbi9mY2xvc2UpICB3b3JrcyB+IDMwICUgc2xvd2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdF9maWxlID0gb3Blbiggc3RhdF9wYXRoLnN0ciwgT19SRE9OTFkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdF9maWxlID09IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCByZXBvcnQgYW4gZXJyb3IgYmVjYXVzZSB0YXNrICh0aHJlYWQpIGNhbiB0ZXJtaW5hdGUganVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZWFkaW5nIHRoaXMgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCBvZiAic3RhdCIgZmlsZSBsb29rcyBsaWtlOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDI4NSAocHJvZ3JhbSkgUyAuLi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIHNpbmdsZSBsaW5lIChpZiBwcm9ncmFtIG5hbWUgZG9lcyBub3QgaW5jbHVkZSBmYW5ueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKS4gRmlyc3QgbnVtYmVyIGlzIGEgdGhyZWFkIGlkLCB0aGVuIG5hbWUgb2YgZXhlY3V0YWJsZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgaW4gcGFyZXRoZXNlcywgdGhlbiBzdGF0ZSBvZiB0aGUgdGhyZWFkLiBXZSBuZWVkIGp1c3QgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvb2QgbmV3czogTGVuZ3RoIG9mIHByb2dyYW0gbmFtZSBpcyAxNSBjaGFyYWN0ZXJzIG1heC4gTG9uZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzIGFyZSB0cnVuY2F0ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGh1cywgd2UgbmVlZCByYXRoZXIgc2hvcnQgYnVmZmVyOiAxNSBjaGFycyBmb3IgcHJvZ3JhbSBuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBwYXJlbnRoZXNpcywgKyAzIHNwYWNlcyArIH43IGRpZ2l0cyBvZiBwaWQgPSAzNy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWQgbmV3czogUHJvZ3JhbSBuYW1lIG1heSBjb250YWluIHNwZWNpYWwgc3ltYm9scyBsaWtlIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nIHBhcmVudGhlc2lzLCBvciBldmVuIG5ldyBsaW5lLiBUaGlzIG1ha2VzIHBhcnNpbmcgInN0YXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgbm90IDEwMCAlIHJlbGlhYmxlLiBJbiBjYXNlIG9mIGZhbm55IHByb2dyYW0gbmFtZXMgcGFyc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZmFpbCAocmVwb3J0IGluY29ycmVjdCB0aHJlYWQgc3RhdGUpLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmcgInN0YXR1cyIgZmlsZSBsb29rcyBtb3JlIHByb21pc3NpbmcgKGR1ZSB0byBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzdHJ1Y3R1cmUgYW5kIGVzY2FwaW5nIHNwZWNpYWwgc3ltYm9scykgYnV0IHJlYWRpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNpbmcgb2YgInN0YXR1cyIgZmlsZSB3b3JrcyBzbG93ZXIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWyA2NSBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmVhZCggc3RhdF9maWxlLCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgLSAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsZW4gPj0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyWyBsZW4gXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIHNjYW5mOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3NjYW5mKCBidWZmZXIsICIlKmQgKCUqcykgJWMgIiwgJiBzdGF0ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyB2ZXJ5IG5pY2UsIGJ1dCBzZWFyY2hpbmcgZm9yIGEgY2xvc2luZyBwYXJlbnRoZXNpcyB3b3JrcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCBmYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBjbG9zZV9wYXJlbnQgPSBzdHJzdHIoIGJ1ZmZlciwgIikgIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNsb3NlX3BhcmVudCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzdGF0ZSA9ICogKCBjbG9zZV9wYXJlbnQgKyAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlID09ICdSJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArKyBydW5uaW5nX3RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPj0gbWF4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBzdGF0X2ZpbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0X2ZpbGUgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIHRhc2tfZW50cnkgPSByZWFkZGlyKCB0YXNrX2RpciApOworICAgICAgICAgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgY2xvc2VkaXIoIHRhc2tfZGlyICk7CisgICAgICAgICAgICAgICAgdGFza19kaXIgPSBOVUxMOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcHJvY19lbnRyeSA9IHJlYWRkaXIoIHByb2NfZGlyICk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vCisgICAgLy8gVGhlcmUgX21pZ2h0XyBiZSBhIHRpbWluZyBob2xlIHdoZXJlIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoaXMKKyAgICAvLyBjb2RlIGdldCBza2lwcGVkIGluIHRoZSBsb2FkIGJhbGFuY2UsIGFuZCBydW5uaW5nX3RocmVhZHMgaXMgMC4KKyAgICAvLyBBc3NlcnQgaW4gdGhlIGRlYnVnIGJ1aWxkcyBvbmx5ISEhCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBydW5uaW5nX3RocmVhZHMgPiAwICk7CisgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPD0gMCApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gMTsKKyAgICB9CisKKyAgICBmaW5pc2g6IC8vIENsZWFuIHVwIGFuZCBleGl0LgorICAgICAgICBpZiAoIHByb2NfZGlyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBjbG9zZWRpciggcHJvY19kaXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHRhc2tfcGF0aCApOworICAgICAgICBpZiAoIHRhc2tfZGlyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBjbG9zZWRpciggdGFza19kaXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHN0YXRfcGF0aCApOworICAgICAgICBpZiAoIHN0YXRfZmlsZSAhPSAtMSApIHsKKyAgICAgICAgICAgIGNsb3NlKCBzdGF0X2ZpbGUgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgPSBydW5uaW5nX3RocmVhZHM7CisKKyAgICByZXR1cm4gcnVubmluZ190aHJlYWRzOworCit9IC8vIF9fa21wX2dldF9sb2FkX2JhbGFuY2UKKworIyBlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisKKyNlbmRpZiAvLyBVU0VfTE9BRF9CQUxBTkNFCisKKyNpZiAhKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX01JQyB8fCAoS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX0FBUkNINjQpIHx8IEtNUF9BUkNIX1BQQzY0KQorCisvLyB3ZSByZWFsbHkgb25seSBuZWVkIHRoZSBjYXNlIHdpdGggMSBhcmd1bWVudCwgYmVjYXVzZSBDTEFORyBhbHdheXMgYnVpbGQKKy8vIGEgc3RydWN0IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgcmVmZXJlbmNlZCBpbiB0aGUgb3V0bGluZWQgZnVuY3Rpb24KK2ludAorX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAsIHZvaWQgKipleGl0X2ZyYW1lX3B0cgorI2VuZGlmCispCit7CisjaWYgT01QVF9TVVBQT1JUCisgICpleGl0X2ZyYW1lX3B0ciA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworI2VuZGlmCisKKyAgc3dpdGNoIChhcmdjKSB7CisgIGRlZmF1bHQ6CisgICAgZnByaW50ZihzdGRlcnIsICJUb28gbWFueSBhcmdzIHRvIG1pY3JvdGFzazogJWQhXG4iLCBhcmdjKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBleGl0KC0xKTsKKyAgY2FzZSAwOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQpOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdKTsKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdKTsKKyAgICBicmVhazsKKyAgY2FzZSAzOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0pOworICAgIGJyZWFrOworICBjYXNlIDQ6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdKTsKKyAgICBicmVhazsKKyAgY2FzZSA1OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdKTsKKyAgICBicmVhazsKKyAgY2FzZSA2OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdKTsKKyAgICBicmVhazsKKyAgY2FzZSA3OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0pOworICAgIGJyZWFrOworICBjYXNlIDg6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddKTsKKyAgICBicmVhazsKKyAgY2FzZSA5OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMDoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMToKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMjoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdLAorICAgICAgICAgICAgcF9hcmd2WzExXSk7CisgICAgYnJlYWs7CisgIGNhc2UgMTM6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0sIHBfYXJndls5XSwgcF9hcmd2WzEwXSwKKyAgICAgICAgICAgIHBfYXJndlsxMV0sIHBfYXJndlsxMl0pOworICAgIGJyZWFrOworICBjYXNlIDE0OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdLCBwX2FyZ3ZbMTJdLCBwX2FyZ3ZbMTNdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxNToKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdLAorICAgICAgICAgICAgcF9hcmd2WzExXSwgcF9hcmd2WzEyXSwgcF9hcmd2WzEzXSwgcF9hcmd2WzE0XSk7CisgICAgYnJlYWs7CisgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAqZXhpdF9mcmFtZV9wdHIgPSAwOworI2VuZGlmCisKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtIGIvcmMzL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfYXNtLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGY5YTM4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfYXNtLmFzbQpAQCAtMCwwICsxLDE0MDIgQEAKKzsgIHpfV2luZG93c19OVC01ODZfYXNtLmFzbTogIC0gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseQorOyAgICB3cml0dGVuIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IHJ1bm5pbmcgV2luZG93cyogT1MKKworOworOy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCis7Ly8KKzsvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCis7Ly8KKzsvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCis7Ly8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCis7Ly8KKzsvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworOworCisgICAgICAgIFRJVExFICAgel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtCisKKzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSUEtMzIgYXJjaGl0ZWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09CitpZmRlZiBfTV9JQTMyCisKKyAgICAgICAgLjU4NlAKKworaWYgQFZlcnNpb24gZ3QgNTEwCisgICAgICAgIC5tb2RlbCBIVUdFCitlbHNlCitfVEVYVCAgIFNFR01FTlQgUEFSQSBVU0UzMiBQVUJMSUMgJ0NPREUnCitfVEVYVCAgIEVORFMKK19EQVRBICAgU0VHTUVOVCBEV09SRCBVU0UzMiBQVUJMSUMgJ0RBVEEnCitfREFUQSAgIEVORFMKK0NPTlNUICAgU0VHTUVOVCBEV09SRCBVU0UzMiBQVUJMSUMgJ0NPTlNUJworQ09OU1QgICBFTkRTCitfQlNTICAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdCU1MnCitfQlNTICAgIEVORFMKKyQkU1lNQk9MUyAgICAgICBTRUdNRU5UIEJZVEUgVVNFMzIgJ0RFQlNZTScKKyQkU1lNQk9MUyAgICAgICBFTkRTCiskJFRZUEVTIFNFR01FTlQgQllURSBVU0UzMiAnREVCVFlQJworJCRUWVBFUyBFTkRTCitfVExTICAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdUTFMnCitfVExTICAgIEVORFMKK0ZMQVQgICAgR1JPVVAgX0RBVEEsIENPTlNULCBfQlNTCisgICAgICAgIEFTU1VNRSAgQ1M6IEZMQVQsIERTOiBGTEFULCBTUzogRkxBVAorZW5kaWYKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94ODZfcGF1c2UKKzsKKzsgdm9pZAorOyBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKQorOworCitQVUJMSUMgIF9fX2ttcF94ODZfcGF1c2UKK19wJCA9IDQKK19kJCA9IDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19fa21wX3g4Nl9wYXVzZSBQUk9DIE5FQVIKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIDs7IHBhdXNlCisgICAgICAgIHJldAorCitfX19rbXBfeDg2X3BhdXNlIEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94ODZfY3B1aWQKKzsKKzsgdm9pZAorOyBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHN0cnVjdCBrbXBfY3B1aWQgKnAgKTsKKzsKKworUFVCTElDICBfX19rbXBfeDg2X2NwdWlkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19tb2RlJCAgPSA4CitfbW9kZTIkID0gMTIKK19wJCAgICAgPSAxNgorX2VheCQgICA9IDAKK19lYngkICAgPSA0CitfZWN4JCAgID0gOAorX2VkeCQgICA9IDEyCisKK19fX2ttcF94ODZfY3B1aWQgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICAgIGVicAorICAgICAgICBtb3YgICAgICAgZWJwLCBlc3AKKworICAgICAgICBwdXNoICAgICAgZWRpCisgICAgICAgIHB1c2ggICAgICBlYngKKyAgICAgICAgcHVzaCAgICAgIGVjeAorICAgICAgICBwdXNoICAgICAgZWR4CisKKyAgICAgICAgbW92CSAgZWF4LCBEV09SRCBQVFIgX21vZGUkW2VicF0KKyAgICAgICAgbW92CSAgZWN4LCBEV09SRCBQVFIgX21vZGUyJFtlYnBdCisJY3B1aWQJCQkJCTsgUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworICAgICAgICBtb3YgICAgICAgZWRpLCBEV09SRCBQVFIgX3AkW2VicF0KKwltb3YgCSAgRFdPUkQgUFRSIF9lYXgkWyBlZGkgXSwgZWF4CisJbW92IAkgIERXT1JEIFBUUiBfZWJ4JFsgZWRpIF0sIGVieAorCW1vdiAJICBEV09SRCBQVFIgX2VjeCRbIGVkaSBdLCBlY3gKKwltb3YgCSAgRFdPUkQgUFRSIF9lZHgkWyBlZGkgXSwgZWR4CisKKyAgICAgICAgcG9wICAgICAgIGVkeAorICAgICAgICBwb3AgICAgICAgZWN4CisgICAgICAgIHBvcCAgICAgICBlYngKKyAgICAgICAgcG9wICAgICAgIGVkaQorCisgICAgICAgIG1vdiAgICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgICAgZWJwCisgICAgICAgIHJldAorCitfX19rbXBfeDg2X2NwdWlkIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3Rlc3RfdGhlbl9hZGQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3Rlc3RfdGhlbl9hZGQzMgorX3AkID0gNAorX2QkID0gOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX19rbXBfdGVzdF90aGVuX2FkZDMyIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2QkW2VzcF0KKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorbG9jayAgICB4YWRkICAgIERXT1JEIFBUUiBbZWN4XSwgZWF4CisgICAgICAgIHJldAorCitfX19rbXBfdGVzdF90aGVuX2FkZDMyIEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBhbCwgQllURSBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkbCwgQllURSBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbZWN4XSwgZGwKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGFsID09IFtlY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGF4LCBXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGR4LCBXT1JEIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIFdPUkQgUFRSIFtlY3hdLCBkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgYXggPT0gW2VjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIGVheCwgMSAgICAgICA7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBEV09SRCBQVFIgW2VjeF0sIGVkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgZWF4ID09IFtlY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDgKK19jdl9sb3ckID0gMTIKK19jdl9oaWdoJCA9IDE2Citfc3ZfbG93JCA9IDIwCitfc3ZfaGlnaCQgPSAyNAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgICAgZWJwCisgICAgICAgIG1vdiAgICAgICBlYnAsIGVzcAorICAgICAgICBwdXNoICAgICAgZWJ4CisgICAgICAgIHB1c2ggICAgICBlZGkKKyAgICAgICAgbW92ICAgICAgIGVkaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlZHgsIERXT1JEIFBUUiBfY3ZfaGlnaCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWJ4LCBEV09SRCBQVFIgX3N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3N2X2hpZ2gkW2VicF0KK2xvY2sgICAgY21weGNoZzhiIFFXT1JEIFBUUiBbZWRpXQorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgZWR4OmVheCA9PSBbZWRpXSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcG9wICAgICAgIGVkaQorICAgICAgICBwb3AgICAgICAgZWJ4CisgICAgICAgIG1vdiAgICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgICAgZWJwCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkOAorOworOyBrbXBfaW50OAorOyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfeGNoZ19maXhlZDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2QkID0gOAorCitfX19rbXBfeGNoZ19maXhlZDggUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBhbCwgIEJZVEUgUFRSIF9kJFtlc3BdCitsb2NrICAgIHhjaGcgICAgICBCWVRFIFBUUiBbZWN4XSwgYWwKKyAgICAgICAgcmV0CisKK19fX2ttcF94Y2hnX2ZpeGVkOCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworOworCitQVUJMSUMgIF9fX2ttcF94Y2hnX2ZpeGVkMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2QkID0gOAorCitfX19rbXBfeGNoZ19maXhlZDE2IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYXgsICBXT1JEIFBUUiAgX2QkW2VzcF0KK2xvY2sgICAgeGNoZyAgICAgIFdPUkQgUFRSIFtlY3hdLCBheAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfZml4ZWQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworOworCitQVUJMSUMgIF9fX2ttcF94Y2hnX2ZpeGVkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2QkID0gOAorCitfX19rbXBfeGNoZ19maXhlZDMyIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2QkW2VzcF0KK2xvY2sgICAgeGNoZyAgICAgIERXT1JEIFBUUiBbZWN4XSwgZWF4CisgICAgICAgIHJldAorCitfX19rbXBfeGNoZ19maXhlZDMyIEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19yZWFsMzIKKzsKKzsga21wX3JlYWwzMgorOyBfX2ttcF94Y2hnX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3hjaGdfcmVhbDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDgKK19kJCA9IDEyCitfb2xkX3ZhbHVlJCA9IC00CisKK19fX2ttcF94Y2hnX3JlYWwzMiBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgIGVicAorICAgICAgICBtb3YgICAgIGVicCwgZXNwCisgICAgICAgIHN1YiAgICAgZXNwLCA0CisgICAgICAgIHB1c2ggICAgZXNpCisgICAgICAgIG1vdiAgICAgZXNpLCBEV09SRCBQVFIgX3AkW2VicF0KKworICAgICAgICBmbGQgICAgIERXT1JEIFBUUiBbZXNpXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgbG9hZCA8YWRkcj4KKyAgICAgICAgZnN0ICAgICBEV09SRCBQVFIgX29sZF92YWx1ZSRbZWJwXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgc3RvcmUgaW50byBvbGRfdmFsdWUKKworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9kJFtlYnBdCisKK2xvY2sgICAgeGNoZyAgICBEV09SRCBQVFIgW2VzaV0sIGVheAorCisgICAgICAgIGZsZCAgICAgRFdPUkQgUFRSIF9vbGRfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IHJldHVybiBvbGRfdmFsdWUKKyAgICAgICAgcG9wICAgICBlc2kKKyAgICAgICAgbW92ICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfcmVhbDMyIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBhbCwgQllURSBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkbCwgQllURSBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbZWN4XSwgZGwKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGF4LCBXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGR4LCBXT1JEIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIFdPUkQgUFRSIFtlY3hdLCBkeAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBEV09SRCBQVFIgW2VjeF0sIGVkeAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0Cis7Cis7IGttcF9pbnQ2NAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfY3ZfbG93JCA9IDEyCitfY3ZfaGlnaCQgPSAxNgorX3N2X2xvdyQgPSAyMAorX3N2X2hpZ2gkID0gMjQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IFBST0MgTkVBUgorCisgICAgICAgIHB1c2ggICAgICBlYnAKKyAgICAgICAgbW92ICAgICAgIGVicCwgZXNwCisgICAgICAgIHB1c2ggICAgICBlYngKKyAgICAgICAgcHVzaCAgICAgIGVkaQorICAgICAgICBtb3YgICAgICAgZWRpLCBEV09SRCBQVFIgX3AkW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdl9sb3ckW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9jdl9oaWdoJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYngsIERXT1JEIFBUUiBfc3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfc3ZfaGlnaCRbZWJwXQorbG9jayAgICBjbXB4Y2hnOGIgUVdPUkQgUFRSIFtlZGldCisgICAgICAgIHBvcCAgICAgICBlZGkKKyAgICAgICAgcG9wICAgICAgIGVieAorICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICAgcDogICAgICA0KCVlc3ApCisKK1BVQkxJQyAgX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorCitfX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgZmxkY3cgICAgIFdPUkQgUFRSIFtlYXhdCisgICAgICAgIHJldAorCitfX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorOworOyB2b2lkCis7IF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICAgcDogICAgICA0KCVlc3ApCisKK1BVQkxJQyAgX19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKKworX19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBmc3RjdyAgICAgV09SRCBQVFIgW2VheF0KKyAgICAgICAgcmV0CisKK19fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCis7Cis7IHZvaWQKKzsgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworOworCitQVUJMSUMgIF9fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgUFJPQyBORUFSCisKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorCitfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2ludm9rZV9taWNyb3Rhc2sKKzsKKzsgdHlwZWRlZiB2b2lkICAoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7Cis7Cis7IGludAorOyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkKKzsKKworUFVCTElDICBfX19rbXBfaW52b2tlX21pY3JvdGFzaworX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcGtmbiQgPSA4CitfZ3RpZCQgPSAxMgorX3RpZCQgPSAxNgorX2FyZ2MkID0gMjAKK19hcmd2JCA9IDI0CitpZiBPTVBUX1NVUFBPUlQKK19leGl0X2ZyYW1lJCA9IDI4CitlbmRpZgorX2kkID0gLTgKK19zdGtfYWRqJCA9IC0xNgorX3ZwdHIkID0gLTEyCitfcXB0ciQgPSAtNAorCitfX19rbXBfaW52b2tlX21pY3JvdGFzayBQUk9DIE5FQVIKKzsgTGluZSAxMDIKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsIGVzcAorICAgICAgICBzdWIgICAgIGVzcCwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDAwMDAwMDEwSAorICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBwdXNoICAgIGVkaQoraWYgT01QVF9TVVBQT1JUCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2V4aXRfZnJhbWUkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgW2VheF0sIGVicAorZW5kaWYKKzsgTGluZSAxMTQKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfYXJnYyRbZWJwXQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfaSRbZWJwXSwgZWF4CisKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWxlYSAgICAgZWR4LCBEV09SRCBQVFIgW2VheCo0KzhdCisJbW92ICAgICBlY3gsIGVzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIGN1cnJlbnQgU1AgaW50byBFQ1gKKwltb3YJZWF4LGVkeAkJOyBTYXZlIHRoZSBzaXplIG9mIHRoZSBhcmdzIGluIGVheAorCXN1YgllY3gsZWR4CQk7IGVzcC0oKCNhcmdzKzIpKjQpIC0+IGVjeCAtLSB3aXRob3V0IG1vZHMsIHN0YWNrIHB0ciB3b3VsZCBiZSB0aGlzCisJbW92CWVkeCxlY3gJCTsgU2F2ZSB0byBlZHgKKwlhbmQJZWN4LC0xMjgJOyBNYXNrIG9mZiA3IGJpdHMKKwlzdWIJZWR4LGVjeAkJOyBBbW91bnQgdG8gc3VidHJhY3QgZnJvbSBlc3AKKwlzdWIJZXNwLGVkeAkJOyBQcmVwYXJlIHN0YWNrIHB0ci0tIE5vdyBpdCB3aWxsIGJlIGFsaWduZWQgb24gMTI4LWJ5dGUgYm91bmRhcnkgYXQgdGhlIGNhbGwKKworCWFkZAllZHgsZWF4CQk7IENhbGN1bGF0ZSB0b3RhbCBzaXplIG9mIHRoZSBzdGFjayBkZWNyZW1lbnQuCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9zdGtfYWRqJFtlYnBdLCBlZHgKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIGptcCAgICAgU0hPUlQgJEwyMjIzNworJEwyMjIzODoKKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBfaSRbZWJwXQorICAgICAgICBzdWIgICAgIGVjeCwgMQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfaSRbZWJwXSwgZWN4CiskTDIyMjM3OgorICAgICAgICBjbXAgICAgIERXT1JEIFBUUiBfaSRbZWJwXSwgMAorICAgICAgICBqbGUgICAgIFNIT1JUICRMMjIyMzkKKzsgTGluZSAxMTYKKyAgICAgICAgbW92ICAgICBlZHgsIERXT1JEIFBUUiBfaSRbZWJwXQorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9hcmd2JFtlYnBdCisgICAgICAgIG1vdiAgICAgZWN4LCBEV09SRCBQVFIgW2VheCtlZHgqNC00XQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfdnB0ciRbZWJwXSwgZWN4Cis7IExpbmUgMTIzCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX3ZwdHIkW2VicF0KKzsgTGluZSAxMjQKKyAgICAgICAgcHVzaCAgICBlYXgKKzsgTGluZSAxMjcKKyAgICAgICAgam1wICAgICBTSE9SVCAkTDIyMjM4CiskTDIyMjM5OgorOyBMaW5lIDEyOQorICAgICAgICBsZWEgICAgIGVkeCwgRFdPUkQgUFRSIF90aWQkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3ZwdHIkW2VicF0sIGVkeAorOyBMaW5lIDEzMAorICAgICAgICBsZWEgICAgIGVheCwgRFdPUkQgUFRSIF9ndGlkJFtlYnBdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9xcHRyJFtlYnBdLCBlYXgKKzsgTGluZSAxNDMKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfdnB0ciRbZWJwXQorOyBMaW5lIDE0NAorICAgICAgICBwdXNoICAgIGVheAorOyBMaW5lIDE0NQorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9xcHRyJFtlYnBdCis7IExpbmUgMTQ2CisgICAgICAgIHB1c2ggICAgZWF4Cis7IExpbmUgMTQ3CisgICAgICAgIGNhbGwgICAgRFdPUkQgUFRSIF9wa2ZuJFtlYnBdCis7IExpbmUgMTQ4CisgICAgICAgIGFkZCAgICAgZXNwLCBEV09SRCBQVFIgX3N0a19hZGokW2VicF0KKzsgTGluZSAxNTIKKyAgICAgICAgbW92ICAgICBlYXgsIDEKKzsgTGluZSAxNTMKKyAgICAgICAgcG9wICAgICBlZGkKKyAgICAgICAgcG9wICAgICBlc2kKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgbW92ICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgIGVicAorICAgICAgICByZXQgICAgIDAKK19fX2ttcF9pbnZva2VfbWljcm90YXNrIEVORFAKK19URVhUICAgRU5EUworCitlbmRpZgorCis7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbnRlbChSKSA2NCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpZmRlZiBfTV9BTUQ2NAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3g4Nl9jcHVpZAorOworOyB2b2lkCis7IF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgc3RydWN0IGttcF9jcHVpZCAqcCApOworOworOyBwYXJhbWV0ZXJzOgorOwltb2RlOgkJZWN4Cis7CW1vZGUyOgkJZWR4Cis7CWNwdWlkX2J1ZmZlcjogCXI4CisKK1BVQkxJQyAgX19rbXBfeDg2X2NwdWlkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfeDg2X2NwdWlkIFBST0MgRlJBTUUgO05FQVIKKworICAgICAgICBwdXNoICAgICAgcmJwCisgICAgICAgIC5wdXNocmVnICByYnAKKyAgICAgICAgbW92ICAgICAgIHJicCwgcnNwCisgICAgICAgIC5zZXRmcmFtZSByYnAsIDAKKyAgICAgICAgcHVzaCAgICAgIHJieAkJCQk7IGNhbGxlZS1zYXZlIHJlZ2lzdGVyCisgICAgICAgIC5wdXNocmVnICByYngKKyAgICAgICAgLkVORFBST0xPRworCisJbW92CSAgcjEwLCByOCAgICAgICAgICAgICAgICAgICAgICAgOyBwIHBhcmFtZXRlcgorICAgICAgICBtb3YJICBlYXgsIGVjeAkJCTsgbW9kZSBwYXJhbWV0ZXIKKyAgICAgICAgbW92CSAgZWN4LCBlZHggICAgICAgICAgICAgICAgICAgICAgOyBtb2RlMiBwYXJhbWV0ZXIKKwljcHVpZAkJCQkJOyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisJbW92IAkgIERXT1JEIFBUUiAwWyByMTAgXSwgZWF4CTsgc3RvcmUgcmVzdWx0cyBpbnRvIGJ1ZmZlcgorCW1vdiAJICBEV09SRCBQVFIgNFsgcjEwIF0sIGVieAorCW1vdiAJICBEV09SRCBQVFIgOFsgcjEwIF0sIGVjeAorCW1vdiAJICBEV09SRCBQVFIgMTJbIHIxMCBdLCBlZHgKKworICAgICAgICBwb3AgICAgICAgcmJ4CQkJCTsgY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgbW92ICAgICAgIHJzcCwgcmJwCisgICAgICAgIHBvcCAgICAgICByYnAKKyAgICAgICAgcmV0CisKK19fa21wX3g4Nl9jcHVpZCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWVkeAorOworOyByZXR1cm46IAllYXgKKworUFVCTElDICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfdGVzdF90aGVuX2FkZDMyIFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgZWR4Citsb2NrICAgIHhhZGQgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fa21wX3Rlc3RfdGhlbl9hZGQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOglyZHgKKzsKKzsgcmV0dXJuOiAJcmF4CisKK1BVQkxJQyAgX19rbXBfdGVzdF90aGVuX2FkZDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3Rlc3RfdGhlbl9hZGQ2NCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICByYXgsIHJkeAorbG9jayAgICB4YWRkICAgIFFXT1JEIFBUUiBbcmN4XSwgcmF4CisgICAgICAgIHJldAorCitfX2ttcF90ZXN0X3RoZW5fYWRkNjQgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBhbCwgZGwJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbcmN4XSwgZGwKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICAJOyBpZiBhbCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIAk7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgYXgsIGR4CTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgV09SRCBQVFIgW3JjeF0sIGR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgYXggPT0gW3JjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIHJheCwgMSAgICAgICAJOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgZWF4ID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgCTsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OglyZHgKKzsJc3Y6CXI4Cis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICByYXgsIHJkeAk7ICJjdiIKKwltb3YJICByZHgsIHI4CTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIHJheCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkOAorOworOyBrbXBfaW50OAorOyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWRsCis7Cis7IHJldHVybjogCWFsCisKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkOCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGFsLCAgZGwKK2xvY2sgICAgeGNoZyAgICAgIEJZVEUgUFRSIFtyY3hdLCBhbAorICAgICAgICByZXQKKworX19rbXBfeGNoZ19maXhlZDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZHgKKzsKKzsgcmV0dXJuOiAJYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkMTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgIGR4Citsb2NrICAgIHhjaGcgICAgICBXT1JEIFBUUiBbcmN4XSwgYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOgllZHgKKzsKKzsgcmV0dXJuOiAJZWF4CisKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfZml4ZWQzMiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICBlYXgsIGVkeAorbG9jayAgICB4Y2hnICAgIERXT1JEIFBUUiBbcmN4XSwgZWF4CisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX2ZpeGVkMzIgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDY0Cis7Cis7IGttcF9pbnQ2NAorOyBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CXJkeAorOworOyByZXR1cm46IAlyYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19maXhlZDY0IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIHJheCwgcmR4Citsb2NrICAgIHhjaGcgICAgUVdPUkQgUFRSIFtyY3hdLCByYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQ2NCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggUFJPQyA7TkVBUgorICAgICAgICBtb3YgICAgICAgYWwsIGRsCTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW3JjeF0sIGRsCisgICAgICAgICAgICAgICAgICAgICAgICA7IENvbXBhcmUgQUwgd2l0aCBbcmN4XS4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgZXhjaGFuZ2UgREwgd2l0aCBbcmN4XS4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIFtyY3hdIGludG8gQUwuCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgZHgJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbcmN4XSwgZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJcmR4Cis7CXN2OglyOAorOworOyByZXR1cm46CXJheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICByYXgsIHJkeAk7ICJjdiIKKwltb3YJICByZHgsIHI4CTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJYWwKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4IFBST0MgO05FQVIKKyRfX2ttcF9sb29wOgorICAgICAgICBtb3YgICAgICAgYWwsIGRsCTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW3JjeF0sIGRsCisgICAgICAgICAgICAgICAgICAgICAgICA7IENvbXBhcmUgQUwgd2l0aCBbcmN4XS4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgZXhjaGFuZ2UgREwgd2l0aCBbcmN4XS4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIFtyY3hdIGludG8gQUwuCisgICAgICAgIGp6ICAgICAJU0hPUlQgJF9fa21wX3N1Y2Nlc3MKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIAkJOyBwYXVzZQorCisJam1wCVNIT1JUICRfX2ttcF9sb29wCisKKyRfX2ttcF9zdWNjZXNzOgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfbG9vcDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsgICAgICAgZDoJeG1tMSAobG93ZXIgNCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA0IGJ5dGVzKQorCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDMyIFBST0MgO05FQVIKKworCW1vdmQJZWF4LCB4bW0xCQk7IGxvYWQgZAorCitsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKworCW1vdmQJeG1tMCwgZWF4CQk7IGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX3JlYWwzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDY0Cis7Cis7IGttcF9yZWFsNjQKKzsgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJeG1tMSAobG93ZXIgOCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA4IGJ5dGVzKQorCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDY0IFBST0MgO05FQVIKKworCW1vdmQJcmF4LCB4bW0xCQk7IGxvYWQgImQiCisKK2xvY2sgICAgeGNoZyAgICBRV09SRCBQVFIgW3JjeF0sIHJheAorCisJbW92ZAl4bW0wLCByYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfcmVhbDY0IEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CisKK1BVQkxJQyAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmbGRjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOworCitQVUJMSUMgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmc3RjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCkKKzsKKworUFVCTElDICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgUFJPQyA7TkVBUgorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKzsKKzsgdHlwZWRlZiB2b2lkICAoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7Cis7Cis7IGludAorOyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworOworOyAgICAgKCpwa2ZuKSAoICZndGlkLCAmdGlkLCBhcmd2WzBdLCAuLi4gKTsKKzsgICAgIHJldHVybiAxOworOyB9Cis7Cis7IG5vdGU6Cis7ICAgICAganVzdCBiZWZvcmUgY2FsbCB0byBwa2ZuIG11c3QgaGF2ZSByc3AgMTI4LWJ5dGUgYWxpZ25lZCBmb3IgY29tcGlsZXIKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICByY3g6ICAgcGtmbgkxNltyYnBdCis7ICAgICAgZWR4OiAgIGd0aWQJMjRbcmJwXQorOyAgICAgIHI4ZDogICB0aWQJMzJbcmJwXQorOyAgICAgIHI5ZDogICBhcmdjCTQwW3JicF0KKzsgICAgICBbc3RdOiAgcF9hcmd2CTQ4W3JicF0KKzsKKzsgcmVnIHRlbXBzOgorOyAgICAgIHJheDogICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorOyAgICAgIHJkeDogICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorOyAgICAgIHJjeDogICB1c2VkIGFzIGFyZ3VtZW50IGNvdW50ZXIgZm9yIHB1c2ggcGFybXMgbG9vcAorOyAgICAgIHIxMDogICB1c2VkIHRvIGhvbGQgcGtmbiBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50Cis7Cis7IHJldHVybjogICAgICBlYXggICAgKGFsd2F5cyAxL1RSVUUpCis7CisKKyRfcGtmbiAgID0gMTYKKyRfZ3RpZCAgID0gMjQKKyRfdGlkICAgID0gMzIKKyRfYXJnYyAgID0gNDAKKyRfcF9hcmd2ID0gNDgKK2lmIE9NUFRfU1VQUE9SVAorJF9leGl0X2ZyYW1lID0gNTYKK2VuZGlmCisKK1BVQkxJQyAgX19rbXBfaW52b2tlX21pY3JvdGFzaworX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2ludm9rZV9taWNyb3Rhc2sgUFJPQyBGUkFNRSA7TkVBUgorCW1vdglRV09SRCBQVFIgMTZbcnNwXSwgcmR4CTsgaG9tZSBndGlkIHBhcmFtZXRlcgorCW1vdiAJUVdPUkQgUFRSIDI0W3JzcF0sIHI4CTsgaG9tZSB0aWQgcGFyYW1ldGVyCisgICAgICAgIHB1c2ggICAgcmJwCQk7IHNhdmUgYmFzZSBwb2ludGVyCisgICAgICAgIC5wdXNocmVnIHJicAorCXN1Yglyc3AsIDAJCTsgbm8gZml4ZWQgYWxsb2NhdGlvbiBuZWNlc3NhcnkgLSBlbmQgcHJvbG9nCisKKyAgICAgICAgbGVhICAgICByYnAsIFFXT1JEIFBUUiBbcnNwXSAgIAk7IGVzdGFibGlzaCB0aGUgYmFzZSBwb2ludGVyCisgICAgICAgIC5zZXRmcmFtZSByYnAsIDAKKyAgICAgICAgLkVORFBST0xPRworaWYgT01QVF9TVVBQT1JUCisgICAgICAgIG1vdiAgICAgcmF4LCBRV09SRCBQVFIgJF9leGl0X2ZyYW1lW3JicF0KKyAgICAgICAgbW92ICAgICBRV09SRCBQVFIgW3JheF0sIHJicAorZW5kaWYKKwltb3YJcjEwLCByY3gJOyBzYXZlIHBrZm4gcG9pbnRlciBmb3IgbGF0ZXIKKworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIG1vdiAgICAgcmF4LCByOQkJOyByYXggPD0gYXJnYworICAgICAgICBjbXAgICAgIHJheCwgMgorICAgICAgICBqZ2UgICAgIFNIT1JUICRfa21wX2ludm9rZV9zdGFja19hbGlnbgorICAgICAgICBtb3YgICAgIHJheCwgMiAgICAgICAgICA7IHNldCA0IGhvbWVzIGlmIGxlc3MgdGhhbiAyIHBhcm1zCiskX2ttcF9pbnZva2Vfc3RhY2tfYWxpZ246CisJbGVhICAgICByZHgsIFFXT1JEIFBUUiBbcmF4KjgrMTZdIDsgcmF4IDw9IChhcmdjICsgMikgKiA4CisJbW92ICAgICByYXgsIHJzcCAgICAgICAgOyBTYXZlIGN1cnJlbnQgU1AgaW50byByYXgKKwlzdWIJcmF4LCByZHgJOyByc3AgLSAoKGFyZ2MrMikqOCkgLT4gcmF4CisJCQkJOyB3aXRob3V0IGFsaWduLCByc3Agd291bGQgYmUgdGhpcworCWFuZCAgICAgcmF4LCAtMTI4ICAgICAgIDsgTWFzayBvZmYgNyBiaXRzICgxMjgtYnl0ZSBhbGlnbikKKwlhZGQgICAgIHJheCwgcmR4ICAgICAgICA7IGFkZCBzcGFjZSBmb3IgcHVzaCdzIGluIGEgbG9vcCBiZWxvdworCW1vdiAgICAgcnNwLCByYXggICAgICAgIDsgUHJlcGFyZSB0aGUgc3RhY2sgcHRyCisJCQkJOyBOb3cgaXQgd2lsbCBhbGlnbiB0byAxMjgtYnl0ZSBhdCB0aGUgY2FsbAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAkJCTsgc2V0dXAgcGtmbiBwYXJhbWV0ZXIgc3RhY2sKKwltb3YJcmF4LCByOQkJOyByYXggPD0gYXJnYworCXNobAlyYXgsIDMJCTsgcmF4IDw9IGFyZ2MqOAorCW1vdglyZHgsIFFXT1JEIFBUUiAkX3BfYXJndltyYnBdCTsgcmR4IDw9IHBfYXJndgorCWFkZAlyZHgsIHJheAk7IHJkeCA8PSAmcF9hcmd2W2FyZ2NdCisJbW92CXJjeCwgcjkJCTsgcmN4IDw9IGFyZ2MKKwlqZWN4eglTSE9SVCAkX2ttcF9pbnZva2VfcGFzc19wYXJtcwk7IG5vdGhpbmcgdG8gcHVzaCBpZiBhcmdjPTAKKwljbXAJZWN4LCAxCQk7IGlmIGFyZ2M9MSBicmFuY2ggYWhlYWQKKwlqZQlTSE9SVCAkX2ttcF9pbnZva2Vfb25lX3Bhcm0KKwlzdWIJZWN4LCAyCQk7IGlmIGFyZ2M9MiBicmFuY2ggYWhlYWQsIHN1YnRyYWN0IHR3byBmcm9tCisJamUJU0hPUlQgJF9rbXBfaW52b2tlX3R3b19wYXJtcworCiskX2ttcF9pbnZva2VfcHVzaF9wYXJtczoJOyBwdXNoIGxhc3QgLSA1dGggcGFybXMgdG8gcGtmbiBvbiBzdGFjaworCXN1YglyZHgsIDgJCTsgZGVjcmVtZW50IHBfYXJndiBwb2ludGVyIHRvIHByZXZpb3VzIHBhcm0KKwltb3YgCXI4LCBRV09SRCBQVFIgW3JkeF0gOyByOCA8PSBwX2FyZ3ZbcmN4LTFdCisJcHVzaAlyOAkJOyBwdXNoIHBfYXJndltyY3gtMV0gb250byBzdGFjayAocmV2ZXJzZSBvcmRlcikKKwlzdWIJZWN4LCAxCisJamVjeHoJU0hPUlQgJF9rbXBfaW52b2tlX3R3b19wYXJtcworCWptcAlTSE9SVCAkX2ttcF9pbnZva2VfcHVzaF9wYXJtcworCiskX2ttcF9pbnZva2VfdHdvX3Bhcm1zOgorCXN1YglyZHgsIDgJCTsgcHV0IDR0aCBwYXJtIHRvIHBrZm4gaW4gcjkKKwltb3YJcjksIFFXT1JEIFBUUiBbcmR4XSA7IHI5IDw9IHBfYXJndlsxXQorCiskX2ttcF9pbnZva2Vfb25lX3Bhcm06CisgICAgICAgIHN1YglyZHgsIDgJCTsgcHV0IDNyZCBwYXJtIHRvIHBrZm4gaW4gcjgKKwltb3YJcjgsIFFXT1JEIFBUUiBbcmR4XSA7IHI4IDw9IHBfYXJndlswXQorCiskX2ttcF9pbnZva2VfcGFzc19wYXJtczoJOyBwdXQgMXN0ICYgMm5kIHBhcm1zIHRvIHBrZm4gaW4gcmVnaXN0ZXJzCisJbGVhCXJkeCwgUVdPUkQgUFRSICRfdGlkW3JicF0gIDsgcmR4IDw9ICZ0aWQgKDJuZCBwYXJtIHRvIHBrZm4pCisJbGVhCXJjeCwgUVdPUkQgUFRSICRfZ3RpZFtyYnBdIDsgcmN4IDw9ICZndGlkICgxc3QgcGFybSB0byBwa2ZuKQorICAgICAgICBzdWIgICAgIHJzcCwgMzIgICAgICAgICA7IGFkZCBzdGFjayBzcGFjZSBmb3IgZmlyc3QgZm91ciBwYXJtcworCW1vdglyYXgsIHIxMAk7IHJheCA8PSBwa2ZuCisJY2FsbAlyYXgJCTsgY2FsbCAoKnBrZm4pKCkKKwltb3YJcmF4LCAxCQk7IG1vdmUgMSBpbnRvIHJldHVybiByZWdpc3RlcjsKKworICAgICAgICBsZWEgICAgIHJzcCwgUVdPUkQgUFRSIFtyYnBdCTsgcmVzdG9yZSBzdGFjayBwb2ludGVyCisKKzsJYWRkCXJzcCwgMAkJOyBubyBmaXhlZCBhbGxvY2F0aW9uIG5lY2Vzc2FyeSAtIHN0YXJ0IGVwaWxvZworICAgICAgICBwb3AgICAgIHJicAkJOyByZXN0b3JlIGZyYW1lIHBvaW50ZXIKKyAgICAgICAgcmV0CitfX2ttcF9pbnZva2VfbWljcm90YXNrIEVORFAKK19URVhUICAgRU5EUworCitlbmRpZgorCitFTkQKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X3V0aWwuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2OTdkNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X3V0aWwuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogel9XaW5kb3dzX05ULTU4Nl91dGlsLmNwcCAtLSBwbGF0Zm9ybSBzcGVjaWZpYyByb3V0aW5lcy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCisjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisvKiBPbmx5IDMyLWJpdCAiYWRkLWV4Y2hhbmdlIiBpbnN0cnVjdGlvbiBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgY2F1c2VzIHVzIHRvCisgKiB1c2UgY29tcGFyZV9hbmRfc3RvcmUgZm9yIHRoZXNlIHJvdXRpbmVzCisgKi8KKwora21wX2ludDgKK19fa21wX3Rlc3RfdGhlbl9vcjgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICkKK3sKKyAgICBrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50OAorX19rbXBfdGVzdF90aGVuX2FuZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICkKK3sKKyAgICBrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisKKyAgICB3aGlsZSAoICEgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICkKK3sKKyAgICBrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQzMgorX19rbXBfdGVzdF90aGVuX2FuZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICkKK3sKKyAgICBrbXBfaW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfNCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworCisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ4CitfX2ttcF90ZXN0X3RoZW5fYWRkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworI2lmIEtNUF9BUkNIX1g4Ngora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorCisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYW5kNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorCisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVF91dGlsLmNwcCBiL3JjMy9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExZWRhYwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jcHAKQEAgLTAsMCArMSwxNzcyIEBACisvKgorICogel9XaW5kb3dzX05UX3V0aWwuY3BwIC0tIHBsYXRmb3JtIHNwZWNpZmljIHJvdXRpbmVzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX3dhaXRfcmVsZWFzZS5oIgorI2luY2x1ZGUgImttcF9hZmZpbml0eS5oIgorCisvKiBUaGlzIGNvZGUgaXMgcmVsYXRlZCB0byBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oKSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbgorICAgaXMgdXNlZCBpbiB0aGUgTG9hZCBiYWxhbmNlIGFsZ29yaXRobSBmb3IgT01QX0RZTkFNSUM9dHJ1ZSB0byBmaW5kIHRoZQorICAgbnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLiAqLworCisjaW5jbHVkZSA8bnRzdGF0dXMuaD4KKyNpbmNsdWRlIDxudHNlY2FwaS5oPiAgIC8vIFVOSUNPREVfU1RSSU5HCisKK2VudW0gU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTIHsKKyAgICBTeXN0ZW1Qcm9jZXNzSW5mb3JtYXRpb24gPSA1Cit9OyAvLyBTWVNURU1fSU5GT1JNQVRJT05fQ0xBU1MKKworc3RydWN0IENMSUVOVF9JRCB7CisgICAgSEFORExFIFVuaXF1ZVByb2Nlc3M7CisgICAgSEFORExFIFVuaXF1ZVRocmVhZDsKK307IC8vIHN0cnVjdCBDTElFTlRfSUQKKworZW51bSBUSFJFQURfU1RBVEUgeworICAgIFN0YXRlSW5pdGlhbGl6ZWQsCisgICAgU3RhdGVSZWFkeSwKKyAgICBTdGF0ZVJ1bm5pbmcsCisgICAgU3RhdGVTdGFuZGJ5LAorICAgIFN0YXRlVGVybWluYXRlZCwKKyAgICBTdGF0ZVdhaXQsCisgICAgU3RhdGVUcmFuc2l0aW9uLAorICAgIFN0YXRlVW5rbm93bgorfTsgLy8gZW51bSBUSFJFQURfU1RBVEUKKworc3RydWN0IFZNX0NPVU5URVJTIHsKKyAgICBTSVpFX1QgICAgICAgIFBlYWtWaXJ0dWFsU2l6ZTsKKyAgICBTSVpFX1QgICAgICAgIFZpcnR1YWxTaXplOworICAgIFVMT05HICAgICAgICAgUGFnZUZhdWx0Q291bnQ7CisgICAgU0laRV9UICAgICAgICBQZWFrV29ya2luZ1NldFNpemU7CisgICAgU0laRV9UICAgICAgICBXb3JraW5nU2V0U2l6ZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhUGVha1BhZ2VkUG9vbFVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUXVvdGFQYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFF1b3RhUGVha05vblBhZ2VkUG9vbFVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUXVvdGFOb25QYWdlZFBvb2xVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFBhZ2VmaWxlVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBQZWFrUGFnZWZpbGVVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFByaXZhdGVQYWdlQ291bnQ7Cit9OyAvLyBzdHJ1Y3QgVk1fQ09VTlRFUlMKKworc3RydWN0IFNZU1RFTV9USFJFQUQgeworICBMQVJHRV9JTlRFR0VSICAgS2VybmVsVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIFVzZXJUaW1lOworICBMQVJHRV9JTlRFR0VSICAgQ3JlYXRlVGltZTsKKyAgVUxPTkcgICAgICAgICAgIFdhaXRUaW1lOworICBMUFZPSUQgICAgICAgICAgU3RhcnRBZGRyZXNzOworICBDTElFTlRfSUQgICAgICAgQ2xpZW50SWQ7CisgIERXT1JEICAgICAgICAgICBQcmlvcml0eTsKKyAgTE9ORyAgICAgICAgICAgIEJhc2VQcmlvcml0eTsKKyAgVUxPTkcgICAgICAgICAgIENvbnRleHRTd2l0Y2hDb3VudDsKKyAgVEhSRUFEX1NUQVRFICAgIFN0YXRlOworICBVTE9ORyAgICAgICAgICAgV2FpdFJlYXNvbjsKK307IC8vIFNZU1RFTV9USFJFQUQKKworS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIEtlcm5lbFRpbWUgKSA9PSAwICk7CisjaWYgS01QX0FSQ0hfWDg2CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIFN0YXJ0QWRkcmVzcyApID09IDI4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIFN0YXRlICAgICAgICApID09IDUyICk7CisjZWxzZQorICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGFydEFkZHJlc3MgKSA9PSAzMiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fVEhSRUFELCBTdGF0ZSAgICAgICAgKSA9PSA2OCApOworI2VuZGlmCisKK3N0cnVjdCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiB7CisgIFVMT05HICAgICAgICAgICBOZXh0RW50cnlPZmZzZXQ7CisgIFVMT05HICAgICAgICAgICBOdW1iZXJPZlRocmVhZHM7CisgIExBUkdFX0lOVEVHRVIgICBSZXNlcnZlZFsgMyBdOworICBMQVJHRV9JTlRFR0VSICAgQ3JlYXRlVGltZTsKKyAgTEFSR0VfSU5URUdFUiAgIFVzZXJUaW1lOworICBMQVJHRV9JTlRFR0VSICAgS2VybmVsVGltZTsKKyAgVU5JQ09ERV9TVFJJTkcgIEltYWdlTmFtZTsKKyAgRFdPUkQgICAgICAgICAgIEJhc2VQcmlvcml0eTsKKyAgSEFORExFICAgICAgICAgIFByb2Nlc3NJZDsKKyAgSEFORExFICAgICAgICAgIFBhcmVudFByb2Nlc3NJZDsKKyAgVUxPTkcgICAgICAgICAgIEhhbmRsZUNvdW50OworICBVTE9ORyAgICAgICAgICAgUmVzZXJ2ZWQyWyAyIF07CisgIFZNX0NPVU5URVJTICAgICBWTUNvdW50ZXJzOworICBJT19DT1VOVEVSUyAgICAgSU9Db3VudGVyczsKKyAgU1lTVEVNX1RIUkVBRCAgIFRocmVhZHNbIDEgXTsKK307IC8vIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OCit0eXBlZGVmIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OICogUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OOworCitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIE5leHRFbnRyeU9mZnNldCApID09ICAwICk7CitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIENyZWF0ZVRpbWUgICAgICApID09IDMyICk7CitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEltYWdlTmFtZSAgICAgICApID09IDU2ICk7CisjaWYgS01QX0FSQ0hfWDg2CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBQcm9jZXNzSWQgICAgICAgKSA9PSAgNjggKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEhhbmRsZUNvdW50ICAgICApID09ICA3NiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVk1Db3VudGVycyAgICAgICkgPT0gIDg4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBJT0NvdW50ZXJzICAgICAgKSA9PSAxMzYgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFRocmVhZHMgICAgICAgICApID09IDE4NCApOworI2Vsc2UKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFByb2Nlc3NJZCAgICAgICApID09ICA4MCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgSGFuZGxlQ291bnQgICAgICkgPT0gIDk2ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBWTUNvdW50ZXJzICAgICAgKSA9PSAxMTIgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIElPQ291bnRlcnMgICAgICApID09IDIwOCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVGhyZWFkcyAgICAgICAgICkgPT0gMjU2ICk7CisjZW5kaWYKKwordHlwZWRlZiBOVFNUQVRVUyAoTlRBUEkgKk50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbl90KSggU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTLCBQVk9JRCwgVUxPTkcsIFBVTE9ORyApOworTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uX3QgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gTlVMTDsKKworSE1PRFVMRSBudGRsbCA9IE5VTEw7CisKKy8qIEVuZCBvZiBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oKS1yZWxhdGVkIGNvZGUgKi8KKworc3RhdGljIEhNT0RVTEUga2VybmVsMzIgPSBOVUxMOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIHR5cGVkZWYgdm9pZCAgICAoKiBzaWdfZnVuY190ICkoIGludCApOworICAgIHN0YXRpYyBzaWdfZnVuY190ICBfX2ttcF9zaWdobGRyc1sgTlNJRyBdOworICAgIHN0YXRpYyBpbnQgICAgICAgICBfX2ttcF9zaWdpbnN0YWxsZWRbIE5TSUcgXTsKKyNlbmRpZgorCisjaWYgS01QX1VTRV9NT05JVE9SCitzdGF0aWMgSEFORExFICAgX19rbXBfbW9uaXRvcl9ldjsKKyNlbmRpZgorc3RhdGljIGttcF9pbnQ2NCBfX2ttcF93aW4zMl90aW1lOworZG91YmxlIF9fa21wX3dpbjMyX3RpY2s7CisKK2ludCBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKK0NSSVRJQ0FMX1NFQ1RJT04gX19rbXBfd2luMzJfc2VjdGlvbjsKKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfaW5pdCgga21wX3dpbjMyX211dGV4X3QgKm14ICkKK3sKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCAmIG14LT5jcywgIkNyaXRpY2FsIFNlY3Rpb24iICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCit2b2lkCitfX2ttcF93aW4zMl9tdXRleF9kZXN0cm95KCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiggJiBteC0+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+dGgudGhfc2xlZXBfbG9jLCBOVUxMKTsKKworICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gd2FrZXVwIFQjJWQsIHJlc2V0IHNsZWVwIGJpdCBmb3IgZmxhZydzIGxvYyglcClcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIGZsYWctPmdldCgpICkgKTsKKworICAgIF9fa21wX3dpbjMyX2NvbmRfc2lnbmFsKCAgJnRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcgYWZ0ZXIgc2lnbmFsaW5nIHdha2UgdXAgZm9yIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkICkgKTsKK30KKwordm9pZCBfX2ttcF9yZXN1bWVfMzIoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3Jlc3VtZV82NChpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfcmVzdW1lX29uY29yZShpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfeWllbGQoIGludCBjb25kICkKK3sKKyAgICBpZiAoY29uZCkKKyAgICAgICAgU2xlZXAoMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBpbnQgZ3RpZCApCit7CisgICAgaWYoIF9fa21wX2luaXRfZ3RpZCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfc2V0X3NwZWNpZmljOiBUIyVkIGtleTolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKTsKKyAgICAgICAgaWYoICEgVGxzU2V0VmFsdWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksIChMUFZPSUQpKGd0aWQrMSkpICkKKyAgICAgICAgICAgIEtNUF9GQVRBTCggVExTU2V0VmFsdWVGYWlsZWQgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWM6IHJ1bnRpbWUgc2h1dGRvd24sIHJldHVybmluZ1xuIiApICk7CisgICAgfQorfQorCitpbnQKK19fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBpZiggIV9fa21wX2luaXRfZ3RpZCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBydW50aW1lIHNodXRkb3duLCByZXR1cm5pbmcgS01QX0dUSURfU0hVVERPV05cbiIgKSApOworICAgICAgICByZXR1cm4gS01QX0dUSURfU0hVVERPV047CisgICAgfQorICAgIGd0aWQgPSAoaW50KShrbXBfaW50cHRyX3QpVGxzR2V0VmFsdWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICBpZiAoIGd0aWQgPT0gMCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGd0aWQtLTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBrZXk6JWQgZ3RpZDolZFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCBndGlkICkpOworICAgIHJldHVybiBndGlkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZCggaW50IHByb2MgKQoreworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEZvcm0gdGhlIEdST1VQX0FGRklOSVRZIHN0cnVjdCBkaXJlY3RseSwgcmF0aGVyIHRoYW4gZmlsbGluZworICAgICAgICAvLyBvdXQgYSBiaXQgdmVjdG9yIGFuZCBjYWxsaW5nIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoKS4KKyAgICAgICAgLy8KKyAgICAgICAgR1JPVVBfQUZGSU5JVFkgZ2E7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKHByb2MgPj0gMCkgJiYgKHByb2MgPCAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzCisgICAgICAgICAgICogQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSkpKTsKKyAgICAgICAgZ2EuR3JvdXAgPSBwcm9jIC8gKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpOworICAgICAgICBnYS5NYXNrID0gKHVuc2lnbmVkIGxvbmcgbG9uZykxIDw8IChwcm9jICUgKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpKTsKKyAgICAgICAgZ2EuUmVzZXJ2ZWRbMF0gPSBnYS5SZXNlcnZlZFsxXSA9IGdhLlJlc2VydmVkWzJdID0gMDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCk7CisgICAgICAgIGlmIChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgJmdhLCBOVUxMKSA9PSAwKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsgLy8gQUM6IGNvbnRpbnVlIHNpbGVudGx5IGlmIG5vdCB2ZXJib3NlCisgICAgICAgICAgICAgICAga21wX21zZ190IGVycl9jb2RlID0gS01QX0VSUiggZXJyb3IgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2s7CisgICAgICAgIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0sobWFzayk7CisgICAgICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKyAgICAgICAgS01QX0NQVV9TRVQocHJvYywgbWFzayk7CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkobWFzaywgVFJVRSk7CisgICAgICAgIEtNUF9DUFVfRlJFRV9GUk9NX1NUQUNLKG1hc2spOworICAgIH0KK30KKwordm9pZAorX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGUoIGNvbnN0IGNoYXIgKmVudl92YXIgKQoreworICAgIC8vCisgICAgLy8gQWxsIHZlcnNpb25zIG9mIFdpbmRvd3MqIE9TIChzaW5jZSBXaW4gJzk1KSBzdXBwb3J0IFNldFRocmVhZEFmZmluaXR5TWFzaygpLgorICAgIC8vCisKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICBLTVBfQUZGSU5JVFlfRU5BQkxFKF9fa21wX251bV9wcm9jX2dyb3VwcypzaXplb2YoRFdPUkRfUFRSKSk7CisjZWxzZQorICAgIEtNUF9BRkZJTklUWV9FTkFCTEUoc2l6ZW9mKERXT1JEX1BUUikpOworI2VuZGlmCisKKyAgICBLQV9UUkFDRSggMTAsICgKKyAgICAgICAgIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAiV2luZG93cyogT1MgYWZmaW5pdHkgaW50ZXJmYWNlIGZ1bmN0aW9uYWwgKG1hc2sgc2l6ZSA9ICUiIEtNUF9TSVpFX1RfU1BFQyAiKS5cbiIsCisgICAgICAgIF9fa21wX2FmZmluX21hc2tfc2l6ZQorICAgICkgKTsKK30KKworZG91YmxlCitfX2ttcF9yZWFkX2NwdV90aW1lKCB2b2lkICkKK3sKKyAgICBGSUxFVElNRSAgICBDcmVhdGlvblRpbWUsIEV4aXRUaW1lLCBLZXJuZWxUaW1lLCBVc2VyVGltZTsKKyAgICBpbnQgICAgICAgICBzdGF0dXM7CisgICAgZG91YmxlICAgICAgY3B1X3RpbWU7CisKKyAgICBjcHVfdGltZSA9IDA7CisKKyAgICBzdGF0dXMgPSBHZXRQcm9jZXNzVGltZXMoIEdldEN1cnJlbnRQcm9jZXNzKCksICZDcmVhdGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXhpdFRpbWUsICZLZXJuZWxUaW1lLCAmVXNlclRpbWUgKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgZG91YmxlICBzZWMgPSAwOworCisgICAgICAgIHNlYyArPSBLZXJuZWxUaW1lLmR3SGlnaERhdGVUaW1lOworICAgICAgICBzZWMgKz0gVXNlclRpbWUuZHdIaWdoRGF0ZVRpbWU7CisKKyAgICAgICAgLyogU2hpZnQgbGVmdCBieSAzMiBiaXRzICovCisgICAgICAgIHNlYyAqPSAoZG91YmxlKSAoMSA8PCAxNikgKiAoZG91YmxlKSAoMSA8PCAxNik7CisKKyAgICAgICAgc2VjICs9IEtlcm5lbFRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICAgICAgc2VjICs9IFVzZXJUaW1lLmR3TG93RGF0ZVRpbWU7CisKKyAgICAgICAgY3B1X3RpbWUgKz0gKHNlYyAqIDEwMC4wKSAvIEtNUF9OU0VDX1BFUl9TRUM7CisgICAgfQorCisgICAgcmV0dXJuIGNwdV90aW1lOworfQorCitpbnQKK19fa21wX3JlYWRfc3lzdGVtX2luZm8oIHN0cnVjdCBrbXBfc3lzX2luZm8gKmluZm8gKQoreworICAgIGluZm8tPm1heHJzcyAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSB1dGlsaXplZCAoaW4ga2lsb2J5dGVzKSAgICAgKi8KKyAgICBpbmZvLT5taW5mbHQgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBwYWdlIGZhdWx0cyBzZXJ2aWNlZCB3aXRob3V0IGFueSBJL08gICAgICAgICovCisgICAgaW5mby0+bWFqZmx0ICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgdGhhdCByZXF1aXJlZCBJL08gICAgICAqLworICAgIGluZm8tPm5zd2FwICAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgInN3YXBwZWQiIG91dCBvZiBtZW1vcnkgKi8KKyAgICBpbmZvLT5pbmJsb2NrID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gaW5wdXQgICovCisgICAgaW5mby0+b3VibG9jayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIG91dHB1dCAqLworICAgIGluZm8tPm52Y3N3ICAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIHZvbHVudGFyaWx5ICAgICAgKi8KKyAgICBpbmZvLT5uaXZjc3cgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyBmb3JjZWQgICAgICAgICAgICovCisKKyAgICByZXR1cm4gMTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCit2b2lkCitfX2ttcF9ydW50aW1lX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIFNZU1RFTV9JTkZPIGluZm87CisgICAga21wX3N0cl9idWZfdCBwYXRoOworICAgIFVJTlQgcGF0aF9zaXplOworCisgICAgaWYgKCBfX2ttcF9pbml0X3J1bnRpbWUgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OworCisjaWYgS01QX0RZTkFNSUNfTElCCisgICAgLyogUGluIGR5bmFtaWMgbGlicmFyeSBmb3IgdGhlIGxpZmV0aW1lIG9mIGFwcGxpY2F0aW9uICovCisgICAgeworICAgICAgICAvLyBGaXJzdCwgdHVybiBvZmYgZXJyb3IgbWVzc2FnZSBib3hlcworICAgICAgICBVSU5UIGVycl9tb2RlID0gU2V0RXJyb3JNb2RlIChTRU1fRkFJTENSSVRJQ0FMRVJST1JTKTsKKyAgICAgICAgSE1PRFVMRSBoOworICAgICAgICBCT09MIHJldCA9IEdldE1vZHVsZUhhbmRsZUV4KCBHRVRfTU9EVUxFX0hBTkRMRV9FWF9GTEFHX0ZST01fQUREUkVTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxHRVRfTU9EVUxFX0hBTkRMRV9FWF9GTEFHX1BJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBDVFNUUikmX19rbXBfc2VyaWFsX2luaXRpYWxpemUsICZoKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVDIoaCAmJiByZXQsICJPcGVuTVAgUlRMIGNhbm5vdCBmaW5kIGl0c2VsZiBsb2FkZWQiKTsKKyAgICAgICAgU2V0RXJyb3JNb2RlIChlcnJfbW9kZSk7ICAgLy8gUmVzdG9yZSBlcnJvciBtb2RlCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IGR5bmFtaWMgbGlicmFyeSBwaW5uZWRcbiIpICk7CisgICAgfQorI2VuZGlmCisKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24gKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCggJiBfX2ttcF93aW4zMl9zZWN0aW9uLCAiQ3JpdGljYWwgU2VjdGlvbiIgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgX19rbXBfaW5pdGlhbGl6ZV9zeXN0ZW1fdGljaygpOworCisgICAgI2lmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorICAgICAgICBpZiAoICEgX19rbXBfY3B1aW5mby5pbml0aWFsaXplZCApIHsKKyAgICAgICAgICAgIF9fa21wX3F1ZXJ5X2NwdWlkKCAmIF9fa21wX2NwdWluZm8gKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgLyogU2V0IHVwIG1pbmltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gc3dpdGNoIHRvIFRMUyBndGlkICovCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmICEgZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKyAgICAgICAgLy8gV2luZG93cyogT1MsIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgICAvKgorICAgICAgICAgICAgTmV3IHRocmVhZCBtYXkgdXNlIHN0YWNrIHNwYWNlIHByZXZpb3VzbHkgdXNlZCBieSBhbm90aGVyIHRocmVhZCwgY3VycmVudGx5IHRlcm1pbmF0ZWQuCisgICAgICAgICAgICBPbiBXaW5kb3dzKiBPUywgaW4gY2FzZSBvZiBzdGF0aWMgbGlua2luZywgd2UgZG8gbm90IGtub3cgdGhlIG1vbWVudCBvZiB0aHJlYWQgdGVybWluYXRpb24sCisgICAgICAgICAgICBhbmQgb3VyIHN0cnVjdHVyZXMgKF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3QgYXJyYXlzKSBhcmUgc3RpbGwga2VlcCBpbmZvIGFib3V0IGRlYWQKKyAgICAgICAgICAgIHRocmVhZHMuIFRoaXMgbGVhZHMgdG8gcHJvYmxlbSBpbiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCgpIGZ1bmN0aW9uOiBpdCB3cm9uZ2x5CisgICAgICAgICAgICBmaW5kcyBndGlkIChieSBzZWFyY2hpbmcgdGhyb3VnaCBzdGFjayBhZGRyZXNzZXMgb2YgYWxsIGtub3duIHRocmVhZHMpIGZvciB1bnJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGZvcmVpZ24gdHJlYWQuCisKKyAgICAgICAgICAgIFNldHRpbmcgX19rbXBfdGxzX2d0aWRfbWluIHRvIDAgd29ya2Fyb3VuZHMgdGhpcyBwcm9ibGVtOiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCgpCisgICAgICAgICAgICBkb2VzIG5vdCBzZWFyY2ggdGhyb3VnaCBzdGFja3MsIGJ1dCBnZXQgZ3RpZCBmcm9tIFRMUyBpbW1lZGlhdGVseS4KKworICAgICAgICAgICAgLS1sbgorICAgICAgICAqLworICAgICAgICBfX2ttcF90bHNfZ3RpZF9taW4gPSAwOworICAgICNlbHNlCisgICAgICAgIF9fa21wX3Rsc19ndGlkX21pbiA9IEtNUF9UTFNfR1RJRF9NSU47CisgICAgI2VuZGlmCisKKyAgICAvKiBmb3IgdGhlIHN0YXRpYyBsaWJyYXJ5ICovCisgICAgaWYgKCAhX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApIHsKKyAgICAgICAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSA9IFRsc0FsbG9jKCk7CisgICAgICAgIGlmKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ID09IFRMU19PVVRfT0ZfSU5ERVhFUyApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggVExTT3V0T2ZJbmRleGVzICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vCisgICAgLy8gTG9hZCBudGRsbC5kbGwuCisgICAgLy8KKyAgICAvKgorICAgICAgICBTaW1wbGUKKyAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZSggIm50ZGxsLmRsIiApCisgICAgICAgIGlzIG5vdCBzdWl0YWJsZSBkdWUgdG8gc2VjdXJpdHkgaXNzdWUgKHNlZQorICAgICAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdGVjaG5ldC9zZWN1cml0eS9hZHZpc29yeS8yMjY5NjM3Lm1zcHgpLiBXZSBoYXZlIHRvIHNwZWNpZnkgZnVsbAorICAgICAgICBwYXRoIHRvIHRoZSBsaWJyYXJ5LgorICAgICovCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHBhdGggKTsKKyAgICBwYXRoX3NpemUgPSBHZXRTeXN0ZW1EaXJlY3RvcnkoIHBhdGguc3RyLCBwYXRoLnNpemUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwYXRoX3NpemUgPiAwICk7CisgICAgaWYgKCBwYXRoX3NpemUgPj0gcGF0aC5zaXplICkgeworICAgICAgICAvLworICAgICAgICAvLyBCdWZmZXIgaXMgdG9vIHNob3J0LiAgRXhwYW5kIHRoZSBidWZmZXIgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCAmIHBhdGgsIHBhdGhfc2l6ZSApOworICAgICAgICBwYXRoX3NpemUgPSBHZXRTeXN0ZW1EaXJlY3RvcnkoIHBhdGguc3RyLCBwYXRoLnNpemUgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcGF0aF9zaXplID4gMCApOworICAgIH07IC8vIGlmCisgICAgaWYgKCBwYXRoX3NpemUgPiAwICYmIHBhdGhfc2l6ZSA8IHBhdGguc2l6ZSApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm93IHdlIGhhdmUgc3lzdGVtIGRpcmVjdG9yeSBuYW1lIGluIHRoZSBidWZmZXIuCisgICAgICAgIC8vIEFwcGVuZCBiYWNrc2xhc2ggYW5kIG5hbWUgb2YgZGxsIHRvIGZvcm0gZnVsbCBwYXRoLAorICAgICAgICAvLworICAgICAgICBwYXRoLnVzZWQgPSBwYXRoX3NpemU7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgcGF0aCwgIlxcJXMiLCAibnRkbGwuZGxsIiApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdyBsb2FkIG50ZGxsIHVzaW5nIGZ1bGwgcGF0aC4KKyAgICAgICAgLy8KKyAgICAgICAgbnRkbGwgPSBHZXRNb2R1bGVIYW5kbGUoIHBhdGguc3RyICk7CisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggbnRkbGwgIT0gTlVMTCApOworICAgIGlmICggbnRkbGwgIT0gTlVMTCApIHsKKyAgICAgICAgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gKE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbl90KSBHZXRQcm9jQWRkcmVzcyggbnRkbGwsICJOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24iICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiAhPSBOVUxMICk7CisKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAvLworICAgIC8vIExvYWQga2VybmVsMzIuZGxsLgorICAgIC8vIFNhbWUgY2F2ZWF0IC0gbXVzdCB1c2UgZnVsbCBzeXN0ZW0gcGF0aCBuYW1lLgorICAgIC8vCisgICAgaWYgKCBwYXRoX3NpemUgPiAwICYmIHBhdGhfc2l6ZSA8IHBhdGguc2l6ZSApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVHJ1bmNhdGUgdGhlIGJ1ZmZlciBiYWNrIHRvIGp1c3QgdGhlIHN5c3RlbSBwYXRoIGxlbmd0aCwKKyAgICAgICAgLy8gZGlzY2FyZGluZyAiXFxudGRsbC5kbGwiLCBhbmQgcmVwbGFjaW5nIGl0IHdpdGggImtlcm5lbDMyLmRsbCIuCisgICAgICAgIC8vCisgICAgICAgIHBhdGgudXNlZCA9IHBhdGhfc2l6ZTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBwYXRoLCAiXFwlcyIsICJrZXJuZWwzMi5kbGwiICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTG9hZCBrZXJuZWwzMi5kbGwgdXNpbmcgZnVsbCBwYXRoLgorICAgICAgICAvLworICAgICAgICBrZXJuZWwzMiA9IEdldE1vZHVsZUhhbmRsZSggcGF0aC5zdHIgKTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZToga2VybmVsMzIuZGxsID0gJXNcbiIsIHBhdGguc3RyICkgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBMb2FkIHRoZSBmdW5jdGlvbiBwb2ludGVycyB0byBrZXJuZWwzMi5kbGwgcm91dGluZXMKKyAgICAgICAgLy8gdGhhdCBtYXkgb3IgbWF5IG5vdCBleGlzdCBvbiB0aGlzIHN5c3RlbS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBrZXJuZWwzMiAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgPSAoa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50X3QpIEdldFByb2NBZGRyZXNzKCBrZXJuZWwzMiwgIkdldEFjdGl2ZVByb2Nlc3NvckNvdW50IiApOworICAgICAgICAgICAgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCA9IChrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90KSBHZXRQcm9jQWRkcmVzcygga2VybmVsMzIsICJHZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50IiApOworICAgICAgICAgICAgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IChrbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KSBHZXRQcm9jQWRkcmVzcygga2VybmVsMzIsICJHZXRUaHJlYWRHcm91cEFmZmluaXR5IiApOworICAgICAgICAgICAgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IChrbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KSBHZXRQcm9jQWRkcmVzcygga2VybmVsMzIsICJTZXRUaHJlYWRHcm91cEFmZmluaXR5IiApOworCisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9ICVwXG4iLCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCApICk7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0gJXBcbiIsIF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgKSApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTpfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gJXBcbiIsIF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgKSApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9ICVwXG4iLCBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICkgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IHNpemVvZihrbXBfYWZmaW5fbWFza190KSA9ICVkXG4iLCBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkgKSApOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU2VlIGlmIGdyb3VwIGFmZmluaXR5IGlzIHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbS4KKyAgICAgICAgICAgIC8vIElmIHNvLCBjYWxjdWxhdGUgdGhlICNncm91cHMgYW5kICNwcm9jcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBHcm91cCBhZmZpbml0eSB3YXMgaW50cm9kdWNlZCB3aXRoIFdpbmRvd3MqIDcgT1MgYW5kCisgICAgICAgICAgICAvLyBXaW5kb3dzKiBTZXJ2ZXIgMjAwOCBSMiBPUy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICggX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgJiYgKCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwgKQorICAgICAgICAgICAgICAmJiAoIF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggKCBfX2ttcF9udW1fcHJvY19ncm91cHMKKyAgICAgICAgICAgICAgPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50KCkgKSA+IDEgKSApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBPUyBwcm9jcy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogJWQgcHJvY2Vzc29yIGdyb3VwcyBkZXRlY3RlZFxuIiwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzICkgKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3hwcm9jID0gMDsKKworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIERXT1JEIHNpemUgPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCggaSApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF94cHJvYyArPSBzaXplOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBwcm9jIGdyb3VwICVkIHNpemUgPSAlZFxuIiwgaSwgc2l6ZSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6ICVkIHByb2Nlc3NvciBncm91cHMgZGV0ZWN0ZWRcbiIsIF9fa21wX251bV9wcm9jX2dyb3VwcyApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBfX2ttcF9udW1fcHJvY19ncm91cHMgPD0gMSApIHsKKyAgICAgICAgR2V0U3lzdGVtSW5mbyggJiBpbmZvICk7CisgICAgICAgIF9fa21wX3hwcm9jID0gaW5mby5kd051bWJlck9mUHJvY2Vzc29yczsKKyAgICB9CisjZWxzZQorICAgIEdldFN5c3RlbUluZm8oICYgaW5mbyApOworICAgIF9fa21wX3hwcm9jID0gaW5mby5kd051bWJlck9mUHJvY2Vzc29yczsKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgIC8vCisgICAgLy8gSWYgdGhlIE9TIHNhaWQgdGhlcmUgd2VyZSAwIHByb2NzLCB0YWtlIGEgZ3Vlc3MgYW5kIHVzZSBhIHZhbHVlIG9mIDIuCisgICAgLy8gVGhpcyBpcyBkb25lIGZvciBMaW51eCogT1MsIGFsc28uICBEbyB3ZSBuZWVkIGVycm9yIC8gd2FybmluZz8KKyAgICAvLworICAgIGlmICggX19rbXBfeHByb2MgPD0gMCApIHsKKyAgICAgICAgX19rbXBfeHByb2MgPSAyOworICAgIH0KKworICAgIEtBX1RSQUNFKCA1LCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogdG90YWwgcHJvY2Vzc29ycyA9ICVkXG4iLCBfX2ttcF94cHJvYykgKTsKKworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBwYXRoICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2luaXRpYWxpemUoKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBUUlVFOworfSAvLyBfX2ttcF9ydW50aW1lX2luaXRpYWxpemUKKwordm9pZAorX19rbXBfcnVudGltZV9kZXN0cm95KCB2b2lkICkKK3sKKyAgICBpZiAoICEgX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9kZXN0cm95KCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLyogd2UgY2FuJ3QgRGVsZXRlQ3JpdGljYWxzZWN0aW9uKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24gKTsgKi8KKyAgICAvKiBkdWUgdG8gdGhlIEtYX1RSQUNFKCkgY29tbWFuZHMgKi8KKyAgICBLQV9UUkFDRSggNDAsICgiX19rbXBfcnVudGltZV9kZXN0cm95XG4iICkpOworCisgICAgaWYoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKSB7CisgICAgICAgIFRsc0ZyZWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICAgICAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSA9IDA7CisgICAgfQorCisgICAgX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKCk7CisgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24gKTsKKworICAgIG50ZGxsID0gTlVMTDsKKyAgICBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24gPSBOVUxMOworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisgICAga2VybmVsMzIgPSBOVUxMOworICAgIF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ID0gTlVMTDsKKyAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0gTlVMTDsKKyAgICBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gTlVMTDsKKyAgICBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gTlVMTDsKKyNlbmRpZiAvLyBLTVBfQVJDSF9YODZfNjQKKworICAgIF9fa21wX2luaXRfcnVudGltZSA9IEZBTFNFOworfQorCisKK3ZvaWQKK19fa21wX3Rlcm1pbmF0ZV90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBpZiggIXRoICkgcmV0dXJuOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3Rlcm1pbmF0ZV90aHJlYWQ6IGtpbGwgKCVkKVxuIiwgZ3RpZCApICk7CisKKyAgICBpZiAoVGVybWluYXRlVGhyZWFkKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIChEV09SRCkgLTEpID09IEZBTFNFKSB7CisgICAgICAgIC8qIEl0J3MgT0ssIHRoZSB0aHJlYWQgbWF5IGhhdmUgZXhpdGVkIGFscmVhZHkgKi8KKyAgICB9CisgICAgX19rbXBfZnJlZV9oYW5kbGUoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9jbGVhcl9zeXN0ZW1fdGltZSggdm9pZCApCit7CisgICAgQk9PTCBzdGF0dXM7CisgICAgTEFSR0VfSU5URUdFUiB0aW1lOworICAgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAmIHRpbWUgKTsKKyAgICBfX2ttcF93aW4zMl90aW1lID0gKGttcF9pbnQ2NCkgdGltZS5RdWFkUGFydDsKK30KKwordm9pZAorX19rbXBfaW5pdGlhbGl6ZV9zeXN0ZW1fdGljayggdm9pZCApCit7CisgICAgeworICBCT09MIHN0YXR1czsKKyAgTEFSR0VfSU5URUdFUiBmcmVxOworCisgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koICYgZnJlcSApOworICBpZiAoISBzdGF0dXMpIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgIlF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKSIgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworCisgIH0KKyAgZWxzZSB7CisgICAgICBfX2ttcF93aW4zMl90aWNrID0gKChkb3VibGUpIDEuMCkgLyAoZG91YmxlKSBmcmVxLlF1YWRQYXJ0OworICB9CisgICAgfQorfQorCisvKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIGZvciB0aGUgdXNlciAqLworCit2b2lkCitfX2ttcF9lbGFwc2VkKCBkb3VibGUgKnQgKQoreworICAgIEJPT0wgc3RhdHVzOworICAgIExBUkdFX0lOVEVHRVIgbm93OworICAgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAmIG5vdyApOworICAgICp0ID0gKChkb3VibGUpIG5vdy5RdWFkUGFydCkgKiBfX2ttcF93aW4zMl90aWNrOworfQorCisvKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgd2FsbCBjbG9jayB0aWNrIGZvciB0aGUgdXNlciAqLworCit2b2lkCitfX2ttcF9lbGFwc2VkX3RpY2soIGRvdWJsZSAqdCApCit7CisgICAgKnQgPSBfX2ttcF93aW4zMl90aWNrOworfQorCit2b2lkCitfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCBkb3VibGUgKmRlbHRhICkKK3sKKyAgICBpZiAoZGVsdGEgIT0gTlVMTCkgeworICAgICAgICBCT09MIHN0YXR1czsKKyAgICAgICAgTEFSR0VfSU5URUdFUiBub3c7CisKKyAgICAgICAgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgbm93ICk7CisKKyAgICAgICAgKmRlbHRhID0gKChkb3VibGUpICgoKGttcF9pbnQ2NCkgbm93LlF1YWRQYXJ0KSAtIF9fa21wX3dpbjMyX3RpbWUpKQorICAgICogX19rbXBfd2luMzJfdGljazsKKyAgICB9Cit9CisKKy8qIFJldHVybiB0aGUgY3VycmVudCB0aW1lIHN0YW1wIGluIG5zZWMgKi8KK2ttcF91aW50NjQKK19fa21wX25vd19uc2VjKCkKK3sKKyAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbm93KTsKKyAgICByZXR1cm4gMWU5ICogX19rbXBfd2luMzJfdGljayAqIG5vdy5RdWFkUGFydDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCAqIF9fc3RkY2FsbAorX19rbXBfbGF1bmNoX3dvcmtlciggdm9pZCAqYXJnICkKK3sKKyAgICB2b2xhdGlsZSB2b2lkICpzdGFja19kYXRhOworICAgIHZvaWQgKmV4aXRfdmFsOworICAgIHZvaWQgKnBhZGRpbmcgPSAwOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gKGttcF9pbmZvX3QgKikgYXJnOworICAgIGludCBndGlkOworCisgICAgZ3RpZCA9IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGd0aWQgKTsKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICNlcnJvciAiVGhpcyBkZWZpbmUgY2F1c2VzIHByb2JsZW1zIHdpdGggTG9hZExpYnJhcnkoKSArIGRlY2xzcGVjKHRocmVhZCkgIiBcCisgICAgICAgICJvbiBXaW5kb3dzKiBPUy4gIFNlZSBDUTUwNTY0LCB0ZXN0cyBrbXBfbG9hZF9saWJyYXJ5Ki5jIGFuZCB0aGlzIE1TRE4gIiBcCisgICAgICAgICJyZWZlcmVuY2U6IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTE4ODE2IgorICAgIC8vX19rbXBfZ3RpZCA9IGd0aWQ7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfdGhyZWFkX25hbWUoIGd0aWQgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKCBndGlkLCBGQUxTRSApOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIC8vCisgICAgLy8gU2V0IHRoZSBGUCBjb250cm9sIHJlZ3MgdG8gYmUgYSBjb3B5IG9mCisgICAgLy8gdGhlIHBhcmFsbGVsIGluaXRpYWxpemF0aW9uIHRocmVhZCdzLgorICAgIC8vCisgICAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgX19rbXBfbG9hZF9teGNzciggJl9fa21wX2luaXRfbXhjc3IgKTsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICBpZiAoIF9fa21wX3N0a29mZnNldCA+IDAgJiYgZ3RpZCA+IDAgKSB7CisgICAgICAgIHBhZGRpbmcgPSBLTVBfQUxMT0NBKCBndGlkICogX19rbXBfc3Rrb2Zmc2V0ICk7CisgICAgfQorCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyggJnRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyAgICB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIFRDV180KCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX2FsaXZlLCBUUlVFICk7CisKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPCAyICkgeyAvLyBjaGVjayBzdGFjayBvbmx5IGlmIGl0IGlzIHVzZWQgdG8gZ2V0IGd0aWQKKyAgICAgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICZzdGFja19kYXRhKTsKKyAgICAgICAgS01QX0FTU0VSVCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cgPT0gRkFMU0UgKTsKKyAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGhpc190aHIgKTsKKyAgICB9CisgICAgS01QX01CKCk7CisgICAgZXhpdF92YWwgPSBfX2ttcF9sYXVuY2hfdGhyZWFkKCB0aGlzX3RociApOworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcoICZ0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX2FsaXZlICk7CisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIEZBTFNFICk7CisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIGV4aXRfdmFsOworfQorCisjaWYgS01QX1VTRV9NT05JVE9SCisvKiBUaGUgbW9uaXRvciB0aHJlYWQgY29udHJvbHMgYWxsIG9mIHRoZSB0aHJlYWRzIGluIHRoZSBjb21wbGV4ICovCisKK3ZvaWQgKiBfX3N0ZGNhbGwKK19fa21wX2xhdW5jaF9tb25pdG9yKCB2b2lkICphcmcgKQoreworICAgIERXT1JEICAgICAgICB3YWl0X3N0YXR1czsKKyAgICBrbXBfdGhyZWFkX3QgbW9uaXRvcjsKKyAgICBpbnQgICAgICAgICAgc3RhdHVzOworICAgIGludCAgICAgICAgICBpbnRlcnZhbDsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IChrbXBfaW5mb190ICopIGFyZzsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9tb25pdG9yKTsKKyAgICBUQ1dfNCggX19rbXBfaW5pdF9tb25pdG9yLCAyICk7ICAgIC8vIEFDOiBTaWduYWwgdGhlIGxpYnJhcnkgdGhhdCBtb25pdG9yIGhhcyBzdGFydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoaWRlICIyIiBpbiBlbnVtIChsaWtlIHt0cnVlLGZhbHNlLHN0YXJ0ZWR9KQorICAgIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIFRSVUUgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogbGF1bmNoZWRcbiIgKSApOworCisgICAgbW9uaXRvciA9IEdldEN1cnJlbnRUaHJlYWQoKTsKKworICAgIC8qIHNldCB0aHJlYWQgcHJpb3JpdHkgKi8KKyAgICBzdGF0dXMgPSBTZXRUaHJlYWRQcmlvcml0eSggbW9uaXRvciwgVEhSRUFEX1BSSU9SSVRZX0hJR0hFU1QgKTsKKyAgICBpZiAoISBzdGF0dXMpIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFRocmVhZFByaW9yaXR5ICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvKiByZWdpc3RlciB1cyBhcyBtb25pdG9yICovCisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIEtNUF9HVElEX01PTklUT1IgKTsKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICNlcnJvciAiVGhpcyBkZWZpbmUgY2F1c2VzIHByb2JsZW1zIHdpdGggTG9hZExpYnJhcnkoKSArIGRlY2xzcGVjKHRocmVhZCkgIiBcCisgICAgICAgICJvbiBXaW5kb3dzKiBPUy4gIFNlZSBDUTUwNTY0LCB0ZXN0cyBrbXBfbG9hZF9saWJyYXJ5Ki5jIGFuZCB0aGlzIE1TRE4gIiBcCisgICAgICAgICJyZWZlcmVuY2U6IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTE4ODE2IgorICAgIC8vX19rbXBfZ3RpZCA9IEtNUF9HVElEX01PTklUT1I7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpOyAgICAvLyBJbnN0cnVjdCBJbnRlbChSKSBUaHJlYWRpbmcgVG9vbHMgdG8gaWdub3JlIG1vbml0b3IgdGhyZWFkLgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgaW50ZXJ2YWwgPSAoIDEwMDAgLyBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsgLyogaW4gbWlsbGlzZWNvbmRzICovCisKKyAgICB3aGlsZSAoISBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgICAgIC8qICBUaGlzIHRocmVhZCBtb25pdG9ycyB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSAqLworCisgICAgICAgIEtBX1RSQUNFKCAxNSwgKCAiX19rbXBfbGF1bmNoX21vbml0b3I6IHVwZGF0ZVxuIiApICk7CisKKyAgICAgICAgd2FpdF9zdGF0dXMgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBfX2ttcF9tb25pdG9yX2V2LCBpbnRlcnZhbCApOworCisgICAgICAgIGlmICh3YWl0X3N0YXR1cyA9PSBXQUlUX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwKKyAgICAgICAgICAgICAgVENSXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlICkgKyAxICk7CisgICAgICAgIH0KKworICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IGZpbmlzaGVkXG4iICkgKTsKKworICAgIHN0YXR1cyA9IFNldFRocmVhZFByaW9yaXR5KCBtb25pdG9yLCBUSFJFQURfUFJJT1JJVFlfTk9STUFMICk7CisgICAgaWYgKCEgc3RhdHVzKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRUaHJlYWRQcmlvcml0eSApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorCisgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgIT0gMCkgeworICAgICAgICAvKiBub3cgd2UgbmVlZCB0byB0ZXJtaW5hdGUgdGhlIHdvcmtlciB0aHJlYWRzICAgKi8KKyAgICAgICAgLyogdGhlIHZhbHVlIG9mIHRfYWJvcnQgaXMgdGhlIHNpZ25hbCB3ZSBjYXVnaHQgKi8KKworICAgICAgICBpbnQgZ3RpZDsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IHRlcm1pbmF0ZSBzaWc9JWRcbiIsIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KSApICk7CisKKyAgICAgICAgLyogdGVybWluYXRlIHRoZSBPcGVuTVAgd29ya2VyIHRocmVhZHMgKi8KKyAgICAgICAgLyogVE9ETyB0aGlzIGlzIG5vdCB2YWxpZCBmb3Igc2libGluZyB0aHJlYWRzISEKKyAgICAgICAgICogdGhlIHViZXIgbWFzdGVyIG1pZ2h0IG5vdCBiZSAwIGFueW1vcmUuLiAqLworICAgICAgICBmb3IgKGd0aWQgPSAxOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKytndGlkKQorICAgICAgICAgICAgX19rbXBfdGVybWluYXRlX3RocmVhZCggZ3RpZCApOworCisgICAgICAgIF9fa21wX2NsZWFudXAoKTsKKworICAgICAgICBTbGVlcCggMCApOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogcmFpc2Ugc2lnPSVkXG4iLCAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkgKSApOworCisgICAgICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID4gMCkgeworICAgICAgICAgICAgcmFpc2UoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRDV180KCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX2FsaXZlLCBGQUxTRSApOworCisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIGFyZzsKK30KKyNlbmRpZgorCit2b2lkCitfX2ttcF9jcmVhdGVfd29ya2VyKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplICkKK3sKKyAgICBrbXBfdGhyZWFkX3QgICBoYW5kbGU7CisgICAgRFdPUkQgICAgICAgICAgaWRUaHJlYWQ7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdHJ5IHRvIGNyZWF0ZSB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKworICAgIGlmICggS01QX1VCRVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgaW50ICAgICBzdGFja19kYXRhOworCisgICAgICAgIC8qIFRPRE86IEdldEN1cnJlbnRUaHJlYWQoKSByZXR1cm5zIGEgcHNldWRvLWhhbmRsZSB0aGF0IGlzIHVuc3VpdGFibGUgZm9yIG90aGVyIHRocmVhZHMgdG8gdXNlLgorICAgICAgICAgICBJcyBpdCBhcHByb3ByaWF0ZSB0byBqdXN0IHVzZSBHZXRDdXJyZW50VGhyZWFkPyAgV2hlbiBzaG91bGQgd2UgY2xvc2UgdGhpcyBoYW5kbGU/ICBXaGVuCisgICAgICAgICAgIHVucmVnaXN0ZXJpbmcgdGhlIHJvb3Q/CisgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEJPT0wgcmM7CisgICAgICAgICAgICByYyA9IER1cGxpY2F0ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50VGhyZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIHJjICk7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiIF9fa21wX2NyZWF0ZV93b3JrZXI6IFJPT1QgSGFuZGxlIGR1cGxpY2F0ZWQsIHRoID0gJXAsIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMgIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpIDwgMiApIHsgLy8gY2hlY2sgc3RhY2sgb25seSBpZiBpdCBpcyB1c2VkIHRvIGdldCBndGlkCisgICAgICAgICAgICAvKiB3ZSB3aWxsIGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgc3RhY2sgcmFuZ2UgaWYgZ3RpZF9tb2RlID09IDEgKi8KKyAgICAgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCAmc3RhY2tfZGF0YSk7CisgICAgICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgMCk7CisgICAgICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIFRSVUUpOworICAgICAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGggKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogU2V0IHN0YWNrIHNpemUgZm9yIHRoaXMgdGhyZWFkIG5vdy4gKi8KKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfd29ya2VyOiBzdGFja19zaXplID0gJSIgS01QX1NJWkVfVF9TUEVDCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzXG4iLCBzdGFja19zaXplICkgKTsKKworICAgICAgICBzdGFja19zaXplICs9IGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQ7CisKKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHN0YWNrX3NpemUpOworICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIEZBTFNFKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IChiZWZvcmUpIHN0YWNrX3NpemUgPSAlIgorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1NJWkVfVF9TUEVDCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzLCAmX19rbXBfbGF1bmNoX3dvcmtlciA9ICVwLCB0aCA9ICVwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJmlkVGhyZWFkID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpICYgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCAmaWRUaHJlYWQgKSApOworCisgICAgICAgIGhhbmRsZSA9IENyZWF0ZVRocmVhZCggTlVMTCwgKFNJWkVfVCkgc3RhY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSkgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKSB0aCwgU1RBQ0tfU0laRV9QQVJBTV9JU19BX1JFU0VSVkFUSU9OLCAmaWRUaHJlYWQgKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IChhZnRlcikgc3RhY2tfc2l6ZSA9ICUiCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsICZfX2ttcF9sYXVuY2hfd29ya2VyID0gJXAsIHRoID0gJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZFRocmVhZCA9ICV1LCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpICYgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCBpZFRocmVhZCwgaGFuZGxlICkgKTsKKworICAgICAgICBpZiAoIGhhbmRsZSA9PSAwICkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coIENhbnRDcmVhdGVUaHJlYWQgKSwgS01QX0VSUiggZXJyb3IgKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gaGFuZGxlOworICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IGRvbmUgY3JlYXRpbmcgdGhyZWFkICglZClcbiIsIGd0aWQgKSApOworfQorCitpbnQKK19fa21wX3N0aWxsX3J1bm5pbmcoa21wX2luZm9fdCAqdGgpIHsKKyAgICByZXR1cm4gKFdBSVRfVElNRU9VVCA9PSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIDApKTsKK30KKworI2lmIEtNUF9VU0VfTU9OSVRPUgordm9pZAorX19rbXBfY3JlYXRlX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBrbXBfdGhyZWFkX3QgICAgICAgIGhhbmRsZTsKKyAgICBEV09SRCAgICAgICAgICAgICAgIGlkVGhyZWFkOworICAgIGludCAgICAgICAgICAgICAgICAgaWRlYWwsIG5ld19pZGVhbDsKKworICAgIGlmKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBtb25pdG9yIHRocmVhZCBpbiBjYXNlIG9mIE1BWF9CTE9DS1RJTUUKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBza2lwcGluZyBtb25pdG9yIHRocmVhZCBiZWNhdXNlIG9mIE1BWCBibG9ja3RpbWVcbiIgKSApOworICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgID0gMDsgLy8gdGhpcyBtYWtlcyByZWFwX21vbml0b3Igbm8tb3AKKyAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IDA7CisgICAgICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDIgKTsgLy8gU2lnbmFsIHRvIHN0b3Agd2FpdGluZyBmb3IgbW9uaXRvciBjcmVhdGlvbgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogdHJ5IHRvIGNyZWF0ZSBtb25pdG9yXG4iICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgX19rbXBfbW9uaXRvcl9ldiA9IENyZWF0ZUV2ZW50KCBOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCApOworICAgIGlmICggX19rbXBfbW9uaXRvcl9ldiA9PSBOVUxMICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q3JlYXRlRXZlbnQgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH07IC8vIGlmCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoIF9fa21wX21vbml0b3JfZXYsICJFdmVudCIgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgID0gS01QX0dUSURfTU9OSVRPUjsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKworICAgIC8vIEZJWE1FIC0gb24gV2luZG93cyogT1MsIGlmIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IDAsIGZpZ3VyZSBvdXQgaG93CisgICAgLy8gdG8gYXV0b21hdGljYWxseSBleHBhbmQgc3RhY2tzaXplIGJhc2VkIG9uIENyZWF0ZVRocmVhZCBlcnJvciBjb2RlLgorICAgIGlmICggX19rbXBfbW9uaXRvcl9zdGtzaXplID09IDAgKSB7CisgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPCBfX2ttcF9zeXNfbWluX3N0a3NpemUgKSB7CisgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IF9fa21wX3N5c19taW5fc3Rrc2l6ZTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IHJlcXVlc3RlZCBzdGFja3NpemUgPSAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAoaW50KSBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSApOworCisgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAwICk7CisKKyAgICBoYW5kbGUgPSBDcmVhdGVUaHJlYWQoIE5VTEwsIChTSVpFX1QpIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKSBfX2ttcF9sYXVuY2hfbW9uaXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCBTVEFDS19TSVpFX1BBUkFNX0lTX0FfUkVTRVJWQVRJT04sICZpZFRocmVhZCApOworICAgIGlmIChoYW5kbGUgPT0gMCkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q3JlYXRlVGhyZWFkICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogbW9uaXRvciBjcmVhdGVkICVwXG4iLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7Cit9CisjZW5kaWYKKworLyoKKyAgQ2hlY2sgdG8gc2VlIGlmIHRocmVhZCBpcyBzdGlsbCBhbGl2ZS4KKworICBOT1RFOiAgVGhlIEV4aXRQcm9jZXNzKGNvZGUpIHN5c3RlbSBjYWxsIGNhdXNlcyBhbGwgdGhyZWFkcyB0byBUZXJtaW5hdGUKKyAgICAgICAgIHdpdGggYSBleGl0X3ZhbCA9IGNvZGUuICBCZWNhdXNlIG9mIHRoaXMgd2UgY2FuIG5vdCByZWx5IG9uCisgICAgICAgICBleGl0X3ZhbCBoYXZpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUuICBTbyB0aGlzIHJvdXRpbmUgbWF5CisgICAgICAgICByZXR1cm4gU1RJTExfQUxJVkUgaW4gZXhpdF92YWwgZXZlbiBhZnRlciB0aGUgdGhyZWFkIGlzIGRlYWQuCisqLworCitpbnQKK19fa21wX2lzX3RocmVhZF9hbGl2ZSgga21wX2luZm9fdCAqIHRoLCBEV09SRCAqZXhpdF92YWwgKQoreworICAgIERXT1JEIHJjOworICAgIHJjID0gR2V0RXhpdENvZGVUaHJlYWQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgZXhpdF92YWwgKTsKKyAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJHZXRFeGl0Q29kZVRocmVhZCgpIiApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gKCAqZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICk7Cit9CisKKwordm9pZAorX19rbXBfZXhpdF90aHJlYWQoCisgICAgaW50IGV4aXRfc3RhdHVzCispIHsKKyAgICBFeGl0VGhyZWFkKCBleGl0X3N0YXR1cyApOworfSAvLyBfX2ttcF9leGl0X3RocmVhZAorCisvKgorICAgIFRoaXMgaXMgYSBjb21tb24gcGFydCBmb3IgYm90aCBfX2ttcF9yZWFwX3dvcmtlcigpIGFuZCBfX2ttcF9yZWFwX21vbml0b3IoKS4KKyovCitzdGF0aWMgdm9pZAorX19rbXBfcmVhcF9jb21tb24oIGttcF9pbmZvX3QgKiB0aCApCit7CisgICAgRFdPUkQgZXhpdF92YWw7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhcF9jb21tb246IHRyeSB0byByZWFwICglZClcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworCisgICAgLyoKKyAgICAgICAgMjAwNi0xMC0xOToKKworICAgICAgICBUaGVyZSBhcmUgdHdvIG9wcG9zaXRlIHNpdHVhdGlvbnM6CisKKyAgICAgICAgICAgIDEuIFdpbmRvd3MqIE9TIGtlZXAgdGhyZWFkIGFsaXZlIGFmdGVyIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnIGFuZCBleGl0cyBmcm9tIHRocmVhZAorICAgICAgICAgICAgICAgZnVuY3Rpb24uIChGb3IgZXhhbXBsZSwgc2VlIEM3MDc3MC9RMzk0MjgxICJ1bmxvYWRpbmcgb2YgZGxsIGJhc2VkIG9uIE9NUCBpcyB2ZXJ5CisgICAgICAgICAgICAgICBzbG93Ii4pCisgICAgICAgICAgICAyLiBXaW5kb3dzKiBPUyBtYXkga2lsbCB0aHJlYWQgYmVmb3JlIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnLgorCisgICAgICAgIFJpZ2h0IHNvbHV0aW9uIHNlZW1zIHRvIGJlIHdhaXRpbmcgZm9yICplaXRoZXIqIHRocmVhZCB0ZXJtaW5hdGlvbiAqb3IqIGRzX2FsaXZlIHJlc2V0dGluZy4KKworICAgICovCisKKyAgICB7CisgICAgICAgIC8vIFRPRE86IFRoaXMgY29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gS01QX1dBSVRfWUlFTEQuIE5lZWQgdG8gZ2VuZXJhbGl6ZSBLTVBfV0FJVF9ZSUVMRCB0bworICAgICAgICAvLyBjb3ZlciB0aGlzIHVzYWdlIGFsc28uCisgICAgICAgIHZvaWQgKiBvYmogPSBOVUxMOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIHNwaW5zOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopICYgdGgtPnRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgICAgICBkbyB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgX19rbXBfaXNfdGhyZWFkX2FsaXZlKCB0aCwgJmV4aXRfdmFsICk7CisgICAgICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICAgICAgfSB3aGlsZSAoIGV4aXRfdmFsID09IFNUSUxMX0FDVElWRSAmJiBUQ1JfNCggdGgtPnRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKSApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBleGl0X3ZhbCA9PSBTVElMTF9BQ1RJVkUgKSB7CisgICAgICAgICAgICBLTVBfRlNZTkNfQ0FOQ0VMKCBvYmogKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKTsKKyAgICAgICAgfTsgLy8gaWYKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfQorCisgICAgX19rbXBfZnJlZV9oYW5kbGUoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApOworCisgICAgLyoKKyAgICAgKiBOT1RFOiAgVGhlIEV4aXRQcm9jZXNzKGNvZGUpIHN5c3RlbSBjYWxsIGNhdXNlcyBhbGwgdGhyZWFkcyB0byBUZXJtaW5hdGUKKyAgICAgKiAgICAgICAgd2l0aCBhIGV4aXRfdmFsID0gY29kZS4gIEJlY2F1c2Ugb2YgdGhpcyB3ZSBjYW4gbm90IHJlbHkgb24KKyAgICAgKiAgICAgICAgZXhpdF92YWwgaGF2aW5nIGFueSBwYXJ0aWN1bGFyIHZhbHVlLgorICAgICAqLworICAgIGlmICggZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICkgeworICAgICAgICBLQV9UUkFDRSggMSwgKCAiX19rbXBfcmVhcF9jb21tb246IHRocmVhZCBzdGlsbCBhY3RpdmUuXG4iICkgKTsKKyAgICB9IGVsc2UgaWYgKCAodm9pZCAqKSBleGl0X3ZhbCAhPSAodm9pZCAqKSB0aCkgeworICAgICAgICBLQV9UUkFDRSggMSwgKCAiX19rbXBfcmVhcF9jb21tb246IEV4aXRQcm9jZXNzIC8gVGVybWluYXRlVGhyZWFkIHVzZWQ/XG4iICkgKTsKKyAgICB9OyAvLyBpZgorCisgICAgS0FfVFJBQ0UoIDEwLAorICAgICAgICAoCisgICAgICAgICAgICAiX19rbXBfcmVhcF9jb21tb246IGRvbmUgcmVhcGluZyAoJWQpLCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkLAorICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkCisgICAgICAgICkKKyAgICApOworCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkICAgID0gMDsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgICAgICAgPSBLTVBfR1RJRF9ETkU7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCAgICAgID0gS01QX0dUSURfRE5FOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IDA7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKworI2lmIEtNUF9VU0VfTU9OSVRPUgordm9pZAorX19rbXBfcmVhcF9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50IHN0YXR1czsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IHRyeSB0byByZWFwICVwXG4iLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKKyAgICAvLyBJZiBtb25pdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIGl0cyB0aWQgYW5kIGd0aWQgc2hvdWxkIGJlIEtNUF9HVElEX01PTklUT1IuCisgICAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIDAsIGl0IG1lYW5zIHRoZSBtb25pdG9yIGRpZCBub3QgZXZlciBzdGFydC4KKyAgICAvLyBJZiBib3RoIHRpZCBhbmQgZ3RpZCBhcmUgS01QX0dUSURfRE5FLCB0aGUgbW9uaXRvciBoYXMgYmVlbiBzaHV0IGRvd24uCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID09IHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKTsKKyAgICBpZiAoIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgIT0gS01QX0dUSURfTU9OSVRPUiApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogbW9uaXRvciBkaWQgbm90IHN0YXJ0LCByZXR1cm5pbmdcbiIpICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBzdGF0dXMgPSBTZXRFdmVudCggX19rbXBfbW9uaXRvcl9ldiApOworICAgIGlmICggc3RhdHVzID09IEZBTFNFICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RXZlbnQgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX3JlYXBfbW9uaXRvcjogcmVhcGluZyB0aHJlYWQgKCVkKVxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisgICAgX19rbXBfcmVhcF9jb21tb24oIHRoICk7CisKKyAgICBfX2ttcF9mcmVlX2hhbmRsZSggX19rbXBfbW9uaXRvcl9ldiApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9CisjZW5kaWYKKwordm9pZAorX19rbXBfcmVhcF93b3JrZXIoIGttcF9pbmZvX3QgKiB0aCApCit7CisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFwX3dvcmtlcjogcmVhcGluZyB0aHJlYWQgKCVkKVxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisgICAgX19rbXBfcmVhcF9jb21tb24oIHRoICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKworCitzdGF0aWMgdm9pZAorX19rbXBfdGVhbV9oYW5kbGVyKCBpbnQgc2lnbm8gKQoreworICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9PSAwICkgeworICAgICAgICAvLyBTdGFnZSAxIHNpZ25hbCBoYW5kbGVyLCBsZXQncyBzaHV0IGRvd24gYWxsIG9mIHRoZSB0aHJlYWRzLgorICAgICAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZiApIHsKKyAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0LCBzaWdubyApOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFICk7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgfQorfSAvLyBfX2ttcF90ZWFtX2hhbmRsZXIKKworCisKK3N0YXRpYworc2lnX2Z1bmNfdCBfX2ttcF9zaWduYWwoIGludCBzaWdudW0sIHNpZ19mdW5jX3QgaGFuZGxlciApIHsKKyAgICBzaWdfZnVuY190IG9sZCA9IHNpZ25hbCggc2lnbnVtLCBoYW5kbGVyICk7CisgICAgaWYgKCBvbGQgPT0gU0lHX0VSUiApIHsKKyAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgIF9fa21wX21zZygga21wX21zX2ZhdGFsLCBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAic2lnbmFsIiApLCBLTVBfRVJSKCBlcnJvciApLCBfX2ttcF9tc2dfbnVsbCApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG9sZDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoCisgICAgaW50ICAgICAgICAgICBzaWcsCisgICAgc2lnX2Z1bmNfdCAgICBoYW5kbGVyLAorICAgIGludCAgICAgICAgICAgcGFyYWxsZWxfaW5pdAorKSB7CisgICAgc2lnX2Z1bmNfdCBvbGQ7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgS0JfVFJBQ0UoIDYwLCAoIl9fa21wX2luc3RhbGxfb25lX2hhbmRsZXI6IGNhbGxlZDogc2lnPSVkXG4iLCBzaWcgKSApOworICAgIGlmICggcGFyYWxsZWxfaW5pdCApIHsKKyAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIGhhbmRsZXIgKTsKKyAgICAgICAgLy8gU0lHX0RGTCBvbiBXaW5kb3dzKiBPUyBpbiBOVUxMIG9yIDAuCisgICAgICAgIGlmICggb2xkID09IF9fa21wX3NpZ2hsZHJzWyBzaWcgXSApIHsKKyAgICAgICAgICAgIF9fa21wX3NpZ2luc3RhbGxlZFsgc2lnIF0gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVzdG9yZS9rZWVwIHVzZXIncyBoYW5kbGVyIGlmIG9uZSBwcmV2aW91c2x5IGluc3RhbGxlZC4KKyAgICAgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBvbGQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTYXZlIGluaXRpYWwvc3lzdGVtIHNpZ25hbCBoYW5kbGVycyB0byBzZWUgaWYgdXNlciBoYW5kbGVycyBpbnN0YWxsZWQuCisgICAgICAgIC8vIDIwMDktMDktMjM6IEl0IGlzIGEgZGVhZCBjb2RlLiBPbiBXaW5kb3dzKiBPUyBfX2ttcF9pbnN0YWxsX3NpZ25hbHMgY2FsbGVkIG9uY2Ugd2l0aAorICAgICAgICAvLyBwYXJhbGxlbF9pbml0ID09IFRSVUUuCisgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBTSUdfREZMICk7CisgICAgICAgIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSA9IG9sZDsKKyAgICAgICAgX19rbXBfc2lnbmFsKCBzaWcsIG9sZCApOworICAgIH07IC8vIGlmCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9IC8vIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIKKworc3RhdGljIHZvaWQKK19fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggaW50IHNpZyApIHsKKyAgICBpZiAoIF9fa21wX3NpZ2luc3RhbGxlZFsgc2lnIF0gKSB7CisgICAgICAgIHNpZ19mdW5jX3Qgb2xkOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogY2FsbGVkOiBzaWc9JWRcbiIsIHNpZyApICk7CisgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBfX2ttcF9zaWdobGRyc1sgc2lnIF0gKTsKKyAgICAgICAgaWYgKCBvbGQgIT0gX19rbXBfdGVhbV9oYW5kbGVyICkgeworICAgICAgICAgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXI6IG9vcHMsIG5vdCBvdXIgaGFuZGxlciwgcmVzdG9yaW5nOiBzaWc9JWRcbiIsIHNpZyApICk7CisgICAgICAgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoIHNpZywgb2xkICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSA9IE5VTEw7CisgICAgICAgIF9fa21wX3NpZ2luc3RhbGxlZFsgc2lnIF0gPSAwOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcgorCisKK3ZvaWQKK19fa21wX2luc3RhbGxfc2lnbmFscyggaW50IHBhcmFsbGVsX2luaXQgKQoreworICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5zdGFsbF9zaWduYWxzOiBjYWxsZWRcbiIgKSApOworICAgIGlmICggISBfX2ttcF9oYW5kbGVfc2lnbmFscyApIHsKKyAgICAgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbnN0YWxsX3NpZ25hbHM6IEtNUF9IQU5ETEVfU0lHTkFMUyBpcyBmYWxzZSAtIGhhbmRsZXJzIG5vdCBpbnN0YWxsZWRcbiIgKSApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdJTlQsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdJTEwsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdBQlJULCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdGUEUsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdTRUdWLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdURVJNLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKK30gLy8gX19rbXBfaW5zdGFsbF9zaWduYWxzCisKKwordm9pZAorX19rbXBfcmVtb3ZlX3NpZ25hbHMoIHZvaWQgKQoreworICAgIGludCBzaWc7CisgICAgS0JfVFJBQ0UoIDEwLCAoIl9fa21wX3JlbW92ZV9zaWduYWxzOiBjYWxsZWRcbiIgKSApOworICAgIGZvciAoIHNpZyA9IDE7IHNpZyA8IE5TSUc7ICsrIHNpZyApIHsKKyAgICAgICAgX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBzaWcgKTsKKyAgICB9OyAvLyBmb3Igc2lnCit9IC8vIF9fa21wX3JlbW92ZV9zaWduYWxzCisKKworI2VuZGlmIC8vIEtNUF9IQU5ETEVfU0lHTkFMUworCisvKiBQdXQgdGhlIHRocmVhZCB0byBzbGVlcCBmb3IgYSB0aW1lIHBlcmlvZCAqLwordm9pZAorX19rbXBfdGhyZWFkX3NsZWVwKCBpbnQgbWlsbGlzICkKK3sKKyAgICBEV09SRCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBTbGVlcEV4KCAoRFdPUkQpIG1pbGxpcywgRkFMU0UgKTsKKyAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgIlNsZWVwRXgoKSIgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KK30KKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGFkZHJlc3MgaXMgbWFwcGVkIGludG8gdGhlIGN1cnJlbnQgYWRkcmVzcyBzcGFjZS4gKi8KK2ludAorX19rbXBfaXNfYWRkcmVzc19tYXBwZWQoIHZvaWQgKiBhZGRyICkKK3sKKyAgICBEV09SRCBzdGF0dXM7CisgICAgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIGxwQnVmZmVyOworICAgIFNJWkVfVCBkd0xlbmd0aDsKKworICAgIGR3TGVuZ3RoID0gc2l6ZW9mKE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTik7CisKKyAgICBzdGF0dXMgPSBWaXJ0dWFsUXVlcnkoIGFkZHIsICZscEJ1ZmZlciwgZHdMZW5ndGggKTsKKworICAgIHJldHVybiAhKCgoIGxwQnVmZmVyLlN0YXRlID09IE1FTV9SRVNFUlZFKSB8fCAoIGxwQnVmZmVyLlN0YXRlID09IE1FTV9GUkVFICkpIHx8CisgICAgICAgKCggbHBCdWZmZXIuUHJvdGVjdCA9PSBQQUdFX05PQUNDRVNTICkgfHwgKCBscEJ1ZmZlci5Qcm90ZWN0ID09IFBBR0VfRVhFQ1VURSApKSk7Cit9CisKK2ttcF91aW50NjQKK19fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKQoreworICAgIGttcF91aW50NjQgciA9IDA7CisKKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopICZyKTsKKyAgICByZXR1cm4gcjsKK30KKworLyogRnJlZSBoYW5kbGUgYW5kIGNoZWNrIHRoZSBlcnJvciBjb2RlICovCit2b2lkCitfX2ttcF9mcmVlX2hhbmRsZSgga21wX3RocmVhZF90IHRIYW5kbGUgKQoreworLyogY2FsbGVkIHdpdGggcGFyYW1ldGVyIHR5cGUgSEFORExFIGFsc28sIHRodXMgc3VwcG9zZSBrbXBfdGhyZWFkX3QgZGVmaW5lZCBhcyBIQU5ETEUgKi8KKyAgICBCT09MIHJjOworICAgIHJjID0gQ2xvc2VIYW5kbGUoIHRIYW5kbGUgKTsKKyAgICBpZiAoICFyYyApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudENsb3NlSGFuZGxlICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9Cit9CisKK2ludAorX19rbXBfZ2V0X2xvYWRfYmFsYW5jZSggaW50IG1heCApIHsKKworICAgIHN0YXRpYyBVTE9ORyBnbGJfYnVmZl9zaXplID0gMTAwICogMTAyNDsKKworICAgIHN0YXRpYyBpbnQgICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgID0gMDsgIC8qIFNhdmVkIGNvdW50IG9mIHRoZSBydW5uaW5nIHRocmVhZHMgZm9yIHRoZSB0aHJlYWQgYmFsYW5jZSBhbGdvcnRpaG0gKi8KKyAgICBzdGF0aWMgZG91YmxlICBnbGJfY2FsbF90aW1lICAgICAgICA9IDA7ICAvKiBUaHJlYWQgYmFsYW5jZSBhbGdvcml0aG0gY2FsbCB0aW1lICovCisKKyAgICBpbnQgcnVubmluZ190aHJlYWRzID0gMDsgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBydW5uaW5nIHRocmVhZHMgaW4gdGhlIHN5c3RlbS4KKyAgICBOVFNUQVRVUyAgc3RhdHVzICAgICAgICA9IDA7CisgICAgVUxPTkcgICAgIGJ1ZmZfc2l6ZSAgICAgPSAwOworICAgIFVMT05HICAgICBpbmZvX3NpemUgICAgID0gMDsKKyAgICB2b2lkICogICAgYnVmZmVyICAgICAgICA9IE5VTEw7CisgICAgUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OIHNwaSA9IE5VTEw7CisgICAgaW50IGZpcnN0X3RpbWUgICAgICAgICAgPSAxOworCisgICAgZG91YmxlIGNhbGxfdGltZSA9IDAuMDsgLy9zdGFydCwgZmluaXNoOworCisgICAgX19rbXBfZWxhcHNlZCggJiBjYWxsX3RpbWUgKTsKKworICAgIGlmICggZ2xiX2NhbGxfdGltZSAmJgorICAgICAgICAgICAgKCBjYWxsX3RpbWUgLSBnbGJfY2FsbF90aW1lIDwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICkgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IGdsYl9ydW5uaW5nX3RocmVhZHM7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgICBnbGJfY2FsbF90aW1lID0gY2FsbF90aW1lOworCisgICAgLy8gRG8gbm90IHNwZW5kIHRpbWUgb24gcnVubmluZyBhbGdvcml0aG0gaWYgd2UgaGF2ZSBhIHBlcm1hbmVudCBlcnJvci4KKyAgICBpZiAoIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9PSBOVUxMICkgeworICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfTsgLy8gaWYKKworICAgIGlmICggbWF4IDw9IDAgKSB7CisgICAgICAgIG1heCA9IElOVF9NQVg7CisgICAgfTsgLy8gaWYKKworICAgIGRvIHsKKworICAgICAgICBpZiAoIGZpcnN0X3RpbWUgKSB7CisgICAgICAgICAgICBidWZmX3NpemUgPSBnbGJfYnVmZl9zaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZl9zaXplID0gMiAqIGJ1ZmZfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlciA9IEtNUF9JTlRFUk5BTF9SRUFMTE9DKCBidWZmZXIsIGJ1ZmZfc2l6ZSApOworICAgICAgICBpZiAoIGJ1ZmZlciA9PSBOVUxMICkgeworICAgICAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3RhdHVzID0gTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uKCBTeXN0ZW1Qcm9jZXNzSW5mb3JtYXRpb24sIGJ1ZmZlciwgYnVmZl9zaXplLCAmIGluZm9fc2l6ZSApOworICAgICAgICBmaXJzdF90aW1lID0gMDsKKworICAgIH0gd2hpbGUgKCBzdGF0dXMgPT0gU1RBVFVTX0lORk9fTEVOR1RIX01JU01BVENIICk7CisgICAgZ2xiX2J1ZmZfc2l6ZSA9IGJ1ZmZfc2l6ZTsKKworICAgICNkZWZpbmUgQ0hFQ0soIGNvbmQgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY29uZCApOyAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAhICggY29uZCApICkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyAgICBDSEVDSyggYnVmZl9zaXplID49IGluZm9fc2l6ZSApOworICAgIHNwaSA9IFBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiggYnVmZmVyICk7CisgICAgZm9yICggOyA7ICkgeworICAgICAgICBwdHJkaWZmX3Qgb2Zmc2V0ID0gdWludHB0cl90KCBzcGkgKSAtIHVpbnRwdHJfdCggYnVmZmVyICk7CisgICAgICAgIENIRUNLKCAwIDw9IG9mZnNldCAmJiBvZmZzZXQgKyBzaXplb2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OICkgPCBpbmZvX3NpemUgKTsKKyAgICAgICAgSEFORExFIHBpZCA9IHNwaS0+UHJvY2Vzc0lkOworICAgICAgICBVTE9ORyBudW0gPSBzcGktPk51bWJlck9mVGhyZWFkczsKKyAgICAgICAgQ0hFQ0soIG51bSA+PSAxICk7CisgICAgICAgIHNpemVfdCBzcGlfc2l6ZSA9IHNpemVvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gKSArIHNpemVvZiggU1lTVEVNX1RIUkVBRCApICogKCBudW0gLSAxICk7CisgICAgICAgIENIRUNLKCBvZmZzZXQgKyBzcGlfc2l6ZSA8IGluZm9fc2l6ZSApOyAgICAgICAgICAvLyBNYWtlIHN1cmUgcHJvY2VzcyBpbmZvIHJlY29yZCBmaXRzIHRoZSBidWZmZXIuCisgICAgICAgIGlmICggc3BpLT5OZXh0RW50cnlPZmZzZXQgIT0gMCApIHsKKyAgICAgICAgICAgIENIRUNLKCBzcGlfc2l6ZSA8PSBzcGktPk5leHRFbnRyeU9mZnNldCApOyAgIC8vIEFuZCBkbyBub3Qgb3ZlcmxhcCB3aXRoIHRoZSBuZXh0IHJlY29yZC4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgLy8gcGlkID09IDAgY29ycmVzcG9uZHMgdG8gdGhlIFN5c3RlbSBJZGxlIFByb2Nlc3MuIEl0IGFsd2F5cyBoYXMgcnVubmluZyB0aHJlYWRzCisgICAgICAgIC8vIG9uIGFsbCBjb3Jlcy4gU28sIHdlIGRvbid0IGNvbnNpZGVyIHRoZSBydW5uaW5nIHRocmVhZHMgb2YgdGhpcyBwcm9jZXNzLgorICAgICAgICBpZiAoIHBpZCAhPSAwICkgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbnVtOyArKyBpICkgeworICAgICAgICAgICAgICAgIFRIUkVBRF9TVEFURSBzdGF0ZSA9IHNwaS0+VGhyZWFkc1sgaSBdLlN0YXRlOworICAgICAgICAgICAgICAgIC8vIENvdW50IHRocmVhZHMgdGhhdCBoYXZlIFJlYWR5IG9yIFJ1bm5pbmcgc3RhdGUuCisgICAgICAgICAgICAgICAgLy8gISEhIFRPRE86IFdoeSBjb21tZW50IGRvZXMgbm90IG1hdGNoIHRoZSBjb2RlPz8/CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PSBTdGF0ZVJ1bm5pbmcgKSB7CisgICAgICAgICAgICAgICAgICAgICsrIHJ1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBjb3VudGluZyBydW5uaW5nIHRocmVhZHMgaWYgdGhlIG51bWJlciBpcyBhbHJlYWR5IGdyZWF0ZXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb3JlcworICAgICAgICAgICAgICAgICAgICBpZiAoIHJ1bm5pbmdfdGhyZWFkcyA+PSBtYXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgIH0gLy8gaWYKKyAgICAgICAgaWYgKCBzcGktPk5leHRFbnRyeU9mZnNldCA9PSAwICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHNwaSA9IFBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiggdWludHB0cl90KCBzcGkgKSArIHNwaS0+TmV4dEVudHJ5T2Zmc2V0ICk7CisgICAgfTsgLy8gZm9yZXZlcgorCisgICAgI3VuZGVmIENIRUNLCisKKyAgICBmaW5pc2g6IC8vIENsZWFuIHVwIGFuZCBleGl0LgorCisgICAgICAgIGlmICggYnVmZmVyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggYnVmZmVyICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgZ2xiX3J1bm5pbmdfdGhyZWFkcyA9IHJ1bm5pbmdfdGhyZWFkczsKKworICAgICAgICByZXR1cm4gcnVubmluZ190aHJlYWRzOworCit9IC8vX19rbXBfZ2V0X2xvYWRfYmFsYW5jZSgpCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9yYzMvcnVudGltZS90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNjI4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTYgQEAKKyMgQ01ha2VMaXN0cy50eHQgZmlsZSBmb3IgdW5pdCB0ZXN0aW5nIE9wZW5NUCBMaWJyYXJ5CitpbmNsdWRlKEZpbmRQeXRob25JbnRlcnApCitpbmNsdWRlKENoZWNrVHlwZVNpemUpCitpbmNsdWRlKENoZWNrTGlicmFyeUV4aXN0cykKKworaWYoTk9UIFBZVEhPTklOVEVSUF9GT1VORCkKKyAgbGlib21wX3dhcm5pbmdfc2F5KCJDb3VsZCBub3QgZmluZCBQeXRob24uIikKKyAgbGlib21wX3dhcm5pbmdfc2F5KCJUaGUgY2hlY2stbGlib21wIHRhcmdldCB3aWxsIG5vdCBiZSBhdmFpbGFibGUhIikKKyAgcmV0dXJuKCkKK2VuZGlmKCkKKworIyBTb21lIHRlc3RzIHVzZSBtYXRoIGZ1bmN0aW9ucworY2hlY2tfbGlicmFyeV9leGlzdHMobSBzcXJ0ICIiIExJQk9NUF9IQVZFX0xJQk0pCisKK21hY3JvKHB5dGhvbml6ZV9ib29sIHZhcikKKyAgaWYgKCR7dmFyfSkKKyAgICBzZXQoJHt2YXJ9IFRydWUpCisgIGVsc2UoKQorICAgIHNldCgke3Zhcn0gRmFsc2UpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworcHl0aG9uaXplX2Jvb2woTElCT01QX1VTRV9IV0xPQykKK3B5dGhvbml6ZV9ib29sKExJQk9NUF9PTVBUX1NVUFBPUlQpCitweXRob25pemVfYm9vbChMSUJPTVBfT01QVF9CTEFNRSkKK3B5dGhvbml6ZV9ib29sKExJQk9NUF9PTVBUX1RSQUNFKQorcHl0aG9uaXplX2Jvb2woTElCT01QX0hBVkVfTElCTSkKKworc2V0KExJQk9NUF9URVNUX0NGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkV4dHJhIGNvbXBpbGVyIGZsYWdzIHRvIHNlbmQgdG8gdGhlIHRlc3QgY29tcGlsZXIiKQorCitpZigke0xJQk9NUF9TVEFOREFMT05FX0JVSUxEfSkKKyAgIyBNYWtlIHN1cmUgd2UgY2FuIHVzZSB0aGUgY29uc29sZSBwb29sIGZvciByZWNlbnQgY21ha2UgYW5kIG5pbmphID4gMS41CisgIGlmKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuMS4yMDE0MTExNykKKyAgICBzZXQoY21ha2VfM18yX1VTRVNfVEVSTUlOQUwpCisgIGVsc2UoKQorICAgIHNldChjbWFrZV8zXzJfVVNFU19URVJNSU5BTCBVU0VTX1RFUk1JTkFMKQorICBlbmRpZigpCisgIHNldChMSUJPTVBfVEVTVF9DT01QSUxFUiAke0NNQUtFX0NfQ09NUElMRVJ9IENBQ0hFIFNUUklORworICAgICJDb21waWxlciB0byB1c2UgZm9yIHRlc3RpbmcgT3Blbk1QIGxpYnJhcnkiKQorICBzZXQoTElCT01QX1RFU1RfT1BFTk1QX0ZMQUcgLWZvcGVubXAgQ0FDSEUgU1RSSU5HCisgICAgIk9wZW5NUCBjb21waWxlciBmbGFnIHRvIHVzZSBmb3IgdGVzdGluZyBPcGVuTVAgbGlicmFyeSIpCisgIGZpbmRfcHJvZ3JhbShMSUJPTVBfTExWTV9MSVRfRVhFQ1VUQUJMRQorICAgIE5BTUVTIGxsdm0tbGl0IGxpdC5weSBsaXQKKyAgICBQQVRIUyAke09QRU5NUF9MTFZNX1RPT0xTX0RJUn0pCisgIGlmKE5PVCBMSUJPTVBfTExWTV9MSVRfRVhFQ1VUQUJMRSkKKyAgICBsaWJvbXBfc2F5KCJDYW5ub3QgZmluZCBsbHZtLWxpdC4iKQorICAgIGxpYm9tcF9zYXkoIlBsZWFzZSBwdXQgbGx2bS1saXQgaW4geW91ciBQQVRILCBzZXQgTElCT01QX0xMVk1fTElUX0VYRUNVVEFCTEUgdG8gaXRzIGZ1bGwgcGF0aCBvciBwb2ludCBPUEVOTVBfTExWTV9UT09MU19ESVIgdG8gaXRzIGRpcmVjdG9yeSIpCisgICAgbGlib21wX3dhcm5pbmdfc2F5KCJUaGUgY2hlY2stbGlib21wIHRhcmdldCB3aWxsIG5vdCBiZSBhdmFpbGFibGUhIikKKyAgICByZXR1cm4oKQorICBlbmRpZigpCisgIGZpbmRfcHJvZ3JhbShGSUxFQ0hFQ0tfRVhFQ1VUQUJMRQorICAgIE5BTUVTIEZpbGVDaGVjaworICAgIFBBVEhTICR7T1BFTk1QX0xMVk1fVE9PTFNfRElSfSkKKyAgaWYgKE5PVCBGSUxFQ0hFQ0tfRVhFQ1VUQUJMRSkKKyAgICAjIHNldCB0byBlbXB0eSBzdHJpbmcgc28gdGhhdCBsaXQgY2FuIGRpc2FibGUgZGVwZW5kZW50IHRlc3RzCisgICAgc2V0KEZJTEVDSEVDS19FWEVDVVRBQkxFICIiKQorICBlbmRpZigpCisgICMgU2V0IGxpdCBhcmd1bWVudHMKKyAgIyBUaGUgLWogMSBsZXRzIHRoZSBhY3R1YWwgdGVzdHMgcnVuIHdpdGggdGhlIGVudGlyZSBtYWNoaW5lLgorICAjIFdlIGhhdmUgb25lIHRlc3QgdGhyZWFkIHRoYXQgc3Bhd25zIHRoZSB0ZXN0cyBzZXJpYWxseS4gIFRoaXMgYWxsb3dzCisgICMgRWFjaCB0ZXN0IHRvIHVzZSB0aGUgZW50aXJlIG1hY2hpbmUuCisgIHNldChMSUJPTVBfTElUX0FSR1NfREVGQVVMVCAiLXN2IC0tc2hvdy11bnN1cHBvcnRlZCAtLXNob3cteGZhaWwiKQorICBpZihNU1ZDIE9SIFhDT0RFKQorICAgIHNldChMSUJPTVBfTElUX0FSR1NfREVGQVVMVCAiJHtMSUJPTVBfTElUX0FSR1NfREVGQVVMVH0gLS1uby1wcm9ncmVzcy1iYXIiKQorICBlbmRpZigpCisgIHNldChMSUJPTVBfTElUX0FSR1MgIiR7TElCT01QX0xJVF9BUkdTX0RFRkFVTFR9IiBDQUNIRSBTVFJJTkcKKyAgICAiRGVmYXVsdCBvcHRpb25zIGZvciBsaXQiKQorICBzZXBhcmF0ZV9hcmd1bWVudHMoTElCT01QX0xJVF9BUkdTKQorICBhZGRfY3VzdG9tX3RhcmdldChjaGVjay1saWJvbXAKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7TElCT01QX0xMVk1fTElUX0VYRUNVVEFCTEV9ICR7TElCT01QX0xJVF9BUkdTfSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIG9tcAorICAgIENPTU1FTlQgIlJ1bm5pbmcgbGlib21wIHRlc3RzIgorICAgICR7Y21ha2VfM18yX1VTRVNfVEVSTUlOQUx9CisgICkKK2Vsc2UoKQorICAjIExMVk0gc291cmNlIHRyZWUgYnVpbGQsIHRlc3QganVzdC1idWlsdCBjbGFuZworICBpZihOT1QgTVNWQykKKyAgICBzZXQoTElCT01QX1RFU1RfQ09NUElMRVIgJHtMTFZNX1JVTlRJTUVfT1VUUFVUX0lOVERJUn0vY2xhbmcpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfVEVTVF9DT01QSUxFUiAke0xMVk1fUlVOVElNRV9PVVRQVVRfSU5URElSfS9jbGFuZy5leGUpCisgIGVuZGlmKCkKKyAgc2V0KExJQk9NUF9URVNUX09QRU5NUF9GTEFHIC1mb3Blbm1wPWxpYm9tcCkKKyAgc2V0KEZJTEVDSEVDS19FWEVDVVRBQkxFICR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9L0ZpbGVDaGVjaykKKyAgIyBVc2UgYWRkX2xpdF90ZXN0c3VpdGUoKSBmcm9tIExMVk0gQ01ha2UuCisgIGFkZF9saXRfdGVzdHN1aXRlKGNoZWNrLWxpYm9tcAorICAgICJSdW5uaW5nIGxpYm9tcCB0ZXN0cyIKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIGNsYW5nIGNsYW5nLWhlYWRlcnMgRmlsZUNoZWNrIG9tcAorICApCitlbmRpZigpCisKKyMgQ29uZmlndXJlIHRoZSBsaXQuc2l0ZS5jZmcuaW4gZmlsZQorc2V0KEFVVE9fR0VOX0NPTU1FTlQgIiMjIEF1dG9nZW5lcmF0ZWQgYnkgbGlib21wIGNvbmZpZ3VyYXRpb24uXG4jIERvIG5vdCBlZGl0ISIpCitjb25maWd1cmVfZmlsZShsaXQuc2l0ZS5jZmcuaW4gbGl0LnNpdGUuY2ZnIEBPTkxZKQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2FwaS9oYXNfb3Blbm1wLmMgYi9yYzMvcnVudGltZS90ZXN0L2FwaS9oYXNfb3Blbm1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5NWY1OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL2hhc19vcGVubXAuYwpAQCAtMCwwICsxLDIzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X2hhc19vcGVubXAoKQoreworICBpbnQgcnZhbHVlID0gMDsKKyNpZmRlZiBfT1BFTk1QCisgIHJ2YWx1ZSA9IDE7CisjZW5kaWYKKyAgcmV0dXJuIChydmFsdWUpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworICBpZighdGVzdF9oYXNfb3Blbm1wKCkpIHsKKyAgICBudW1fZmFpbGVkKys7CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2FwaS9rbXBfYWxpZ25lZF9tYWxsb2MuYyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL2ttcF9hbGlnbmVkX21hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDJmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L2FwaS9rbXBfYWxpZ25lZF9tYWxsb2MuYwpAQCAtMCwwICsxLDYyIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBhbGlnbm1lbnRzW10gPSB7NjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDQwOTZ9OworCit1bnNpZ25lZCBhbGlnbmVkX2J5KHVpbnQ2NF90IGFkZHIpIHsKKyAgICB1aW50NjRfdCBhbGlnbm1lbnQgPSAxOworICAgIHdoaWxlKChhZGRyICYgKGFsaWdubWVudC0xKSkgPT0gMCkgeworICAgICAgICBhbGlnbm1lbnQgPDw9IDE7CisgICAgfQorICAgIHJldHVybiAoYWxpZ25tZW50ID4+IDEpOworfQorCitpbnQgdGVzdF9rbXBfYWxpZ25lZF9tYWxsb2MoKQoreworICBpbnQgZXJyID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGVycikKKyAgeworICAgIGludCBpOworICAgIGludCogcHRyOworICAgIHVpbnQ2NF90IGFkZHI7CisgICAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKGFsaWdubWVudHMpL3NpemVvZihpbnQpOyBpKyspIHsKKyAgICAgIGludCBhbGlnbm1lbnQgPSBhbGlnbm1lbnRzW2ldOworICAgICAgLy8gYWxsb2NhdGUgNjQgYnl0ZXMgd2l0aCA2NC1ieXRlIGFsaWdubWVudAorICAgICAgLy8gYWxsb2NhdGUgMTI4IGJ5dGVzIHdpdGggMTI4LWJ5dGUgYWxpZ25tZW50LCBldGMuCisgICAgICBwdHIgPSAoaW50KilrbXBfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBhbGlnbm1lbnQpOworICAgICAgYWRkciA9ICh1aW50NjRfdClwdHI7CisgICAgICBpZihhZGRyICYgKGFsaWdubWVudC0xKSkgeworICAgICAgICBwcmludGYoInRocmVhZCAlZDogYWRkciA9ICVwIChhbGlnbmVkIHRvICV1IGJ5dGVzKSBidXQgZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgIiBhbGlnbm1lbnQgPSAlZFxuIiwgdGlkLCBwdHIsIGFsaWduZWRfYnkoYWRkciksIGFsaWdubWVudCk7CisgICAgICAgIGVyciA9IDE7CisgICAgICB9CisgICAgICBrbXBfZnJlZShwdHIpOworICAgIH0KKworICAgIHB0ciA9IGttcF9hbGlnbmVkX21hbGxvYygxMjgsIDEyNyk7CisgICAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgICBwcmludGYoInRocmVhZCAlZDoga21wX2FsaWduZWRfbWFsbG9jKCkgZGlkbid0IHJldHVybiBOVUxMIHdoZW4gIgorICAgICAgICAgICAgICJhbGlnbm1lbnQgd2FzIG5vdCBwb3dlciBvZiAyXG4iLCB0aWQpOworICAgICAgZXJyID0gMTsKKyAgICB9CisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgIHJldHVybiAhZXJyOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9rbXBfYWxpZ25lZF9tYWxsb2MoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvYXBpL2ttcF9zZXRfZGVmYXVsdHNfbG9ja19idWcuYyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL2ttcF9zZXRfZGVmYXVsdHNfbG9ja19idWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E3YWZiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9hcGkva21wX3NldF9kZWZhdWx0c19sb2NrX2J1Zy5jCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKy8qIFRoZSBidWcgb2NjdXJzIGlmIHRoZSBsb2NrIHRhYmxlIGlzIHJlYWxsb2NhdGVkIGFmdGVyCisgICBrbXBfc2V0X2RlZmF1bHRzKCkgaXMgY2FsbGVkLiAgSWYgdGhlIHRhYmxlIGlzIHJlYWxsb2NhdGVkLAorICAgdGhlbiB0aGUgbG9jayB3aWxsIG5vdCBwb2ludCB0byBhIHZhbGlkIGxvY2sgb2JqZWN0IGFmdGVyIHRoZQorICAga21wX3NldF9kZWZhdWx0cygpIGNhbGwuKi8KK29tcF9sb2NrX3QgbG9jazsKKworaW50IHRlc3Rfa21wX3NldF9kZWZhdWx0c19sb2NrX2J1ZygpCit7CisgIC8qIGNoZWNrcyB0aGF0IG9tcF9nZXRfbnVtX3RocmVhZHMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICB0aHJlYWRzICovCisgIGludCBudGhyZWFkc19saWI7CisgIGludCBudGhyZWFkcyA9IDA7CisKKyAgbnRocmVhZHNfbGliID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIG9tcF9zZXRfbG9jaygmbG9jayk7CisgICAgbnRocmVhZHMrKzsKKyAgICBvbXBfdW5zZXRfbG9jaygmbG9jayk7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgbnRocmVhZHNfbGliID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9ICAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGttcF9zZXRfZGVmYXVsdHMoIk9NUF9OVU1fVEhSRUFEUyIpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgb21wX3NldF9sb2NrKCZsb2NrKTsKKyAgICBudGhyZWFkcysrOworICAgIG9tcF91bnNldF9sb2NrKCZsb2NrKTsKKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICByZXR1cm4gKG50aHJlYWRzID09IDIqbnRocmVhZHNfbGliKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKyAgb21wX2luaXRfbG9jaygmbG9jayk7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X2ttcF9zZXRfZGVmYXVsdHNfbG9ja19idWcoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9sb2NrKCZsb2NrKTsKKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2FwaS9vbXBfZ2V0X251bV90aHJlYWRzLmMgYi9yYzMvcnVudGltZS90ZXN0L2FwaS9vbXBfZ2V0X251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmMjg2ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDM5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoKQoreworICAvKiBjaGVja3MgdGhhdCBvbXBfZ2V0X251bV90aHJlYWRzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKKyAgICAgdGhyZWFkcyAqLworICBpbnQgbnRocmVhZHNfbGliOworICBpbnQgbnRocmVhZHMgPSAwOworCisgIG50aHJlYWRzX2xpYiA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIG50aHJlYWRzKys7CisgICAgfSAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBudGhyZWFkc19saWIgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0gIC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgcmV0dXJuIChudGhyZWFkcyA9PSBudGhyZWFkc19saWIpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZ2V0X251bV90aHJlYWRzKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2FwaS9vbXBfZ2V0X3d0aWNrLmMgYi9yYzMvcnVudGltZS90ZXN0L2FwaS9vbXBfZ2V0X3d0aWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzNTIyNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpY2suYwpAQCAtMCwwICsxLDI0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9nZXRfd3RpY2soKQoreworICBkb3VibGUgdGljazsKKyAgdGljayA9IC0xLjsKKyAgdGljayA9IG9tcF9nZXRfd3RpY2sgKCk7CisgIHJldHVybiAoKHRpY2sgPiAwLjApICYmICh0aWNrIDwgMC4wMSkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZ2V0X3d0aWNrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2FwaS9vbXBfZ2V0X3d0aW1lLmMgYi9yYzMvcnVudGltZS90ZXN0L2FwaS9vbXBfZ2V0X3d0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwOTQ0MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpbWUuYwpAQCAtMCwwICsxLDMzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF9nZXRfd3RpbWUoKQoreworICBkb3VibGUgc3RhcnQ7CisgIGRvdWJsZSBlbmQ7CisgIGRvdWJsZSBtZWFzdXJlZF90aW1lOworICBkb3VibGUgd2FpdF90aW1lID0gNS4wOworICBzdGFydCA9IDA7CisgIGVuZCA9IDA7CisgIHN0YXJ0ID0gb21wX2dldF93dGltZSgpOworICBteV9zbGVlcCAod2FpdF90aW1lKTsKKyAgZW5kID0gb21wX2dldF93dGltZSgpOworICBtZWFzdXJlZF90aW1lID0gZW5kLXN0YXJ0OworICByZXR1cm4gKChtZWFzdXJlZF90aW1lID4gMC45NyAqIHdhaXRfdGltZSkgJiYgKG1lYXN1cmVkX3RpbWUgPCAxLjAzICogd2FpdF90aW1lKSkgOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZ2V0X3d0aW1lKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2FwaS9vbXBfaW5fcGFyYWxsZWwuYyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9pbl9wYXJhbGxlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTMxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L2FwaS9vbXBfaW5fcGFyYWxsZWwuYwpAQCAtMCwwICsxLDM5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qCisgKiBDaGVja3MgdGhhdCBmYWxzZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24KKyAqIGFuZCB0cnVlIGlzIHJldHVybmVkIHdoZW4gY2FsbGVkIHdpdGhpbiBwYXJhbGxlbCByZWdpb24uCisgKi8KK2ludCB0ZXN0X29tcF9pbl9wYXJhbGxlbCgpCit7CisgIGludCBzZXJpYWw7CisgIGludCBpc3BhcmFsbGVsOworCisgIHNlcmlhbCA9IDE7CisgIGlzcGFyYWxsZWwgPSAwOworICBzZXJpYWwgPSBvbXBfaW5fcGFyYWxsZWwoKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgaXNwYXJhbGxlbCA9IG9tcF9pbl9wYXJhbGxlbCgpOworICAgIH0KKyAgfQorICByZXR1cm4gKCEoc2VyaWFsKSAmJiBpc3BhcmFsbGVsKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2luX3BhcmFsbGVsKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2F0b21pYy9vbXBfYXRvbWljLmMgYi9yYzMvcnVudGltZS90ZXN0L2F0b21pYy9vbXBfYXRvbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NkZDMwZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvYXRvbWljL29tcF9hdG9taWMuYwpAQCAtMCwwICsxLDM2NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwICAvKiAxMCEgKi8KKworaW50IHRlc3Rfb21wX2F0b21pYygpCit7CisgIGludCBzdW07CisgIGludCBkaWZmOworICBkb3VibGUgZHN1bSA9IDA7CisgIGRvdWJsZSBkdCA9IDAuNTsgIC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IHg7CisgIGludCAqbG9naWNzOworICBpbnQgYml0X2FuZCA9IDE7CisgIGludCBiaXRfb3IgPSAwOworICBpbnQgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgaW50IGo7CisgIGludCBrbm93bl9zdW07CisgIGludCBrbm93bl9kaWZmOworICBpbnQga25vd25fcHJvZHVjdDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBsb2dpY19hbmQgPSAxOworICBpbnQgbG9naWNfb3IgPSAwOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yID0gMS5FLTk7CisgIGRvdWJsZSBkcHQsIGRpdjsKKyAgaW50IGxvZ2ljc0FycmF5W0xPT1BDT1VOVF07CisgIGxvZ2ljcyA9IGxvZ2ljc0FycmF5OworCisgIHN1bSA9IDA7CisgIGRpZmYgPSAwOworICBwcm9kdWN0ID0gMTsKKworICAvLyBzdW0gb2YgaW50ZWdlcnMgdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBzdW0gKz0gaTsKKyAgICB9CisKKyAgfQorICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIGlmIChrbm93bl9zdW0gIT0gc3VtKQorICB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsCisgICAgICBzdW0sIGtub3duX3N1bSk7CisgICAgcmVzdWx0Kys7CisgIH0KKworICAvLyBkaWZmZXJlbmNlIG9mIGludGVnZXJzIHRlc3QKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBkaWZmIC09IGk7CisgICAgfQorICB9CisgIGtub3duX2RpZmYgPSAoKExPT1BDT1VOVCAtIDEpICogTE9PUENPVU5UKSAvIDIgKiAtMTsKKyAgaWYgKGRpZmYgIT0ga25vd25fZGlmZikKKyAgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIiwKKyAgICAgIGRpZmYpOworICAgIHJlc3VsdCsrOworICB9CisKKyAgLy8gc3VtIG9mIGRvdWJsZXMgdGVzdAorICBkc3VtID0gMDsKKyAgZHB0ID0gMTsKKyAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikgeworICAgIGRwdCAqPSBkdDsKKyAgfQorICBka25vd25fc3VtID0gKDEgLSBkcHQpIC8gKDEgLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgZHN1bSArPSBwb3cgKGR0LCBpKTsKKyAgICB9CisgIH0KKyAgaWYgKGRzdW0gIT0gZGtub3duX3N1bSAmJiAoZmFicyAoZHN1bSAtIGRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IpKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZjogJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0gLSBka25vd25fc3VtKTsKKyAgICByZXN1bHQrKzsKKyAgfQorCisgIC8vIGRpZmZlcmVuY2Ugb2YgZG91YmxlcyB0ZXN0CisgIGRwdCA9IDE7CisgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opIHsKKyAgICBkcHQgKj0gZHQ7CisgIH0KKyAgZGRpZmYgPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgZGRpZmYgLT0gcG93IChkdCwgaSk7CisgICAgfQorICB9CisgIGlmIChmYWJzIChkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIiwKKyAgICAgIGRkaWZmKTsKKyAgICByZXN1bHQrKzsKKyAgfQorCisgIC8vIHByb2R1Y3Qgb2YgaW50ZWdlcnMgdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgcHJvZHVjdCAqPSBpOworICAgIH0KKyAgfQorICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgaWYgKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBwcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIiwKKyAgICAgIHByb2R1Y3QsIGtub3duX3Byb2R1Y3QpOworICAgIHJlc3VsdCsrOworICB9CisKKyAgLy8gZGl2aXNpb24gb2YgaW50ZWdlcnMgdGVzdAorICBwcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBwcm9kdWN0IC89IGk7CisgICAgfQorICB9CisgIGlmIChwcm9kdWN0ICE9IDEpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAiRXJyb3IgaW4gcHJvZHVjdCBkaXZpc2lvbiB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mIDFcbiIsCisgICAgICBwcm9kdWN0KTsKKyAgICByZXN1bHQrKzsKKyAgfQorCisgIC8vIGRpdmlzaW9uIG9mIGRvdWJsZXMgdGVzdAorICBkaXYgPSA1LjBFKzU7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBkaXYgLz0gaTsKKyAgICB9CisgIH0KKyAgaWYgKGZhYnMoZGl2LTAuMTM3Nzg3KSA+PSAxLjBFLTQgKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gZGl2aXNpb24gd2l0aCBkb3VibGU6IFJlc3VsdCB3YXMgJWYiCisgICAgICAiIGluc3RlYWQgb2YgMC4xMzc3ODdcbiIsIGRpdik7CisgIH0KKworICAvLyArKyB0ZXN0CisgIHggPSAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHgrKzsKKyAgICB9CisgIH0KKyAgaWYgKHggIT0gTE9PUENPVU5UKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gKytcbiIpOworICB9CisKKyAgLy8gLS0gdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHgtLTsKKyAgICB9CisgIH0KKyAgaWYgKHggIT0gMCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIC0tXG4iKTsKKyAgfQorCisgIC8vIGJpdC1hbmQgdGVzdCBwYXJ0IDEKKyAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgbG9naWNzW2pdID0gMTsKKyAgfQorICBiaXRfYW5kID0gMTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgYml0X2FuZCAmPSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmICghYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKyAgfQorCisgIC8vIGJpdC1hbmQgdGVzdCBwYXJ0IDIKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgYml0X2FuZCAmPSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmIChiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworICB9CisKKyAgLy8gYml0LW9yIHRlc3QgcGFydCAxCisgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykgeworICAgIGxvZ2ljc1tqXSA9IDA7CisgIH0KKyAgYml0X29yID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBiaXRfb3IgfD0gbG9naWNzW2ldOworICAgIH0KKyAgfQorICBpZiAoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICAvLyBiaXQtb3IgdGVzdCBwYXJ0IDIKKyAgYml0X29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworCisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGJpdF9vciB8PSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmICghYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvLyBiaXQteG9yIHRlc3QgcGFydCAxCisgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykgeworICAgIGxvZ2ljc1tqXSA9IDA7CisgIH0KKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgIH0KKyAgfQorICBpZiAoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICAvLyBiaXQteG9yIHRlc3QgcGFydCAyCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgZXhjbHVzaXZfYml0X29yIF49IGxvZ2ljc1tpXTsKKyAgICB9CisKKyAgfQorICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLy8gbGVmdCBzaGlmdCB0ZXN0CisgIHggPSAxOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgeCA8PD0gMTsKKyAgICB9CisKKyAgfQorICBpZiAoIHggIT0gMTAyNCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIDw8XG4iKTsKKyAgICB4ID0gMTAyNDsKKyAgfQorCisgIC8vIHJpZ2h0IHNoaWZ0IHRlc3QKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHggPj49IDE7CisgICAgfQorICB9CisgIGlmICh4ICE9IDEpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiA+PlxuIik7CisgIH0KKworICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30gLy8gdGVzdF9vbXBfYXRvbWljKCkKKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2F0b21pYygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9iYXJyaWVyL29tcF9iYXJyaWVyLmMgYi9yYzMvcnVudGltZS90ZXN0L2JhcnJpZXIvb21wX2JhcnJpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZiMDYwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9iYXJyaWVyL29tcF9iYXJyaWVyLmMKQEAgLTAsMCArMSw0NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfYmFycmllcigpCit7CisgIGludCByZXN1bHQxOworICBpbnQgcmVzdWx0MjsKKyAgcmVzdWx0MSA9IDA7CisgIHJlc3VsdDIgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgcmFuazsKKyAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgIGlmIChyYW5rID09MSkgeworICAgICAgbXlfc2xlZXAoKChkb3VibGUpU0xFRVBUSU1FKS9SRVBFVElUSU9OUyk7IC8vIGdpdmUgMSBzZWMgdG8gd2hvbGUgdGVzdAorICAgICAgcmVzdWx0MiA9IDM7CisgICAgfQorICAgICNwcmFnbWEgb21wIGJhcnJpZXIKKyAgICBpZiAocmFuayA9PSAyKSB7CisgICAgICByZXN1bHQxID0gcmVzdWx0MjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChyZXN1bHQxID09IDMpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisjaWZkZWYgX09QRU5NUAorICBvbXBfc2V0X2R5bmFtaWMoMCk7IC8vIHByZXZlbnQgcnVudGltZSB0byBjaGFuZ2UgbnVtYmVyIG9mIHRocmVhZHMKKyAgb21wX3NldF9udW1fdGhyZWFkcyg0KTsgLy8gdGhlIHRlc3QgZXhwZWN0cyBhdCBsZWFzdCAzIHRocmVhZHMKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9iYXJyaWVyKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvY3JpdGljYWwvb21wX2NyaXRpY2FsLmMgYi9yYzMvcnVudGltZS90ZXN0L2NyaXRpY2FsL29tcF9jcml0aWNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwN2RiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L2NyaXRpY2FsL29tcF9jcml0aWNhbC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX2NyaXRpY2FsKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW09MDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBteXN1bT0wOworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisgICAgICBteXN1bSA9IG15c3VtICsgaTsKKworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgc3VtID0gbXlzdW0gK3N1bTsKKyAgfQorICBrbm93bl9zdW0gPSA5OTkgKiAxMDAwIC8gMjsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2NyaXRpY2FsKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2Vudi9rbXBfc2V0X2Rpc3BhdGNoX2J1Zi5jIGIvcmMzL3J1bnRpbWUvdGVzdC9lbnYva21wX3NldF9kaXNwYXRjaF9idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWViN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9lbnYva21wX3NldF9kaXNwYXRjaF9idWYuYwpAQCAtMCwwICsxLDc2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZSAmJiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9MCAlbGlib21wLXJ1bgorLy8gUlVOOiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9MSAlbGlib21wLXJ1biAmJiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9MyAlbGlib21wLXJ1bgorLy8gUlVOOiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9NCAlbGlib21wLXJ1biAmJiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9NyAlbGlib21wLXJ1bgorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgLURNWV9TQ0hFRFVMRT1ndWlkZWQgJiYgZW52IEtNUF9ESVNQX05VTV9CVUZGRVJTPTEgJWxpYm9tcC1ydW4KKy8vIFJVTjogZW52IEtNUF9ESVNQX05VTV9CVUZGRVJTPTMgJWxpYm9tcC1ydW4gJiYgZW52IEtNUF9ESVNQX05VTV9CVUZGRVJTPTQgJWxpYm9tcC1ydW4KKy8vIFJVTjogZW52IEtNUF9ESVNQX05VTV9CVUZGRVJTPTcgJWxpYm9tcC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBJTkNSIDcKKyNkZWZpbmUgTVlfTUFYIDIwMAorI2RlZmluZSBNWV9NSU4gLTIwMAorI2RlZmluZSBOVU1fTE9PUFMgMTAwCisjaWZuZGVmIE1ZX1NDSEVEVUxFCisjIGRlZmluZSBNWV9TQ0hFRFVMRSBkeW5hbWljCisjZW5kaWYKKworaW50IGEsIGIsIGFfa25vd25fdmFsdWUsIGJfa25vd25fdmFsdWU7CisKK2ludCB0ZXN0X2ttcF9zZXRfZGlzcF9udW1fYnVmZmVycygpCit7CisgIGludCBzdWNjZXNzID0gMTsKKyAgYSA9IDA7CisgIGIgPSAwOworICAvLyBydW4gbWFueSBzbWFsbCBkeW5hbWljIGxvb3BzIHRvIHN0cmVzcyB0aGUgZGlzcGF0Y2ggYnVmZmVyIHN5c3RlbQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGksajsKKyAgICBmb3IgKGogPSAwOyBqIDwgTlVNX0xPT1BTOyBqKyspIHsKKyAgICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShNWV9TQ0hFRFVMRSkgbm93YWl0CisgICAgICBmb3IgKGkgPSBNWV9NSU47IGkgPCBNWV9NQVg7IGkrPUlOQ1IpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICAgIGErKzsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShNWV9TQ0hFRFVMRSkgbm93YWl0CisgICAgICBmb3IgKGkgPSBNWV9NQVg7IGkgPj0gTVlfTUlOOyBpLT1JTkNSKSB7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICBiKys7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIGRldGVjdCBmYWlsdXJlCisgIGlmIChhICE9IGFfa25vd25fdmFsdWUgfHwgYiAhPSBiX2tub3duX3ZhbHVlKSB7CisgICAgc3VjY2VzcyA9IDA7CisgICAgcHJpbnRmKCJhID0gJWQgKHNob3VsZCBiZSAlZCksIGIgPSAlZCAoc2hvdWxkIGJlICVkKVxuIiwgYSwgYV9rbm93bl92YWx1ZSwKKyAgICAgICAgICAgYiwgYl9rbm93bl92YWx1ZSk7CisgIH0KKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgaW50IGksajsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICAvLyBmaWd1cmUgb3V0IHRoZSBrbm93biB2YWx1ZXMgdG8gY29tcGFyZSB3aXRoIGNhbGN1bGF0ZWQgcmVzdWx0CisgIGFfa25vd25fdmFsdWUgPSAwOworICBiX2tub3duX3ZhbHVlID0gMDsKKworICBmb3IgKGogPSAwOyBqIDwgTlVNX0xPT1BTOyBqKyspIHsKKyAgICBmb3IgKGkgPSBNWV9NSU47IGkgPCBNWV9NQVg7IGkrPUlOQ1IpCisgICAgICBhX2tub3duX3ZhbHVlKys7CisgICAgZm9yIChpID0gTVlfTUFYOyBpID49IE1ZX01JTjsgaS09SU5DUikKKyAgICAgIGJfa25vd25fdmFsdWUrKzsKKyAgfQorCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9rbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvZW52L29tcF93YWl0X3BvbGljeS5jIGIvcmMzL3J1bnRpbWUvdGVzdC9lbnYvb21wX3dhaXRfcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2MGNlNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvZW52L29tcF93YWl0X3BvbGljeS5jCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlICYmIGVudiBPTVBfV0FJVF9QT0xJQ1k9YWN0aXZlICVsaWJvbXAtcnVuIGFjdGl2ZQorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgJiYgZW52IE9NUF9XQUlUX1BPTElDWT1wYXNzaXZlICVsaWJvbXAtcnVuIHBhc3NpdmUKKy8vCisvLyBPTVBfV0FJVF9QT0xJQ1k9YWN0aXZlIHNob3VsZCBpbXBseSBibG9ja3RpbWUgPT0gSU5UX01BWAorLy8gaS5lLiwgdGhyZWFkcyBzcGluLXdhaXQgZm9yZXZlcgorLy8gT01QX1dBSVRfUE9MSUNZPXBhc3NpdmUgc2hvdWxkIGltcGx5IGJsb2NrdGltZSA9PSAwCisvLyBpLmUuLCB0aHJlYWRzIGltbWVkaWF0ZWx5IHNsZWVwCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3ZvaWQgdXNhZ2UoKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogb21wX3dhaXRfcG9saWN5IGFjdGl2ZXxwYXNzaXZlXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICBpbnQgYmxvY2t0aW1lLCByZXR2YWw9MTsKKyAgY29uc3QgY2hhciogZW52X3Zhcl92YWx1ZTsKKworICBpZiAoYXJnYyAhPSAyKSB7CisgICAgdXNhZ2UoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGJsb2NrdGltZSA9IGttcF9nZXRfYmxvY2t0aW1lKCk7CisKKyAgZW52X3Zhcl92YWx1ZSA9IGFyZ3ZbMV07CisgIGlmICghc3RyY21wKGVudl92YXJfdmFsdWUsICJhY3RpdmUiKSkgeworICAgIHJldHZhbCA9IChibG9ja3RpbWUgIT0gSU5UX01BWCk7CisgIH0gZWxzZSBpZiAoIXN0cmNtcChlbnZfdmFyX3ZhbHVlLCAicGFzc2l2ZSIpKSB7CisgICAgcmV0dmFsID0gKGJsb2NrdGltZSAhPSAwKTsKKyAgfSBlbHNlIHsKKyAgICB1c2FnZSgpOworICAgIHJldHZhbCA9IDE7CisgIH0KKworICByZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9mbHVzaC9vbXBfZmx1c2guYyBiL3JjMy9ydW50aW1lL3Rlc3QvZmx1c2gvb21wX2ZsdXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkM2NkZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvZmx1c2gvb21wX2ZsdXNoLmMKQEAgLTAsMCArMSw0NSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfZmx1c2goKQoreworICBpbnQgcmVzdWx0MTsKKyAgaW50IHJlc3VsdDI7CisgIGludCBkdW1teTsKKworICByZXN1bHQxID0gMDsKKyAgcmVzdWx0MiA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCByYW5rOworICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgI3ByYWdtYSBvbXAgYmFycmllcgorICAgIGlmIChyYW5rID09IDEpIHsKKyAgICAgIHJlc3VsdDIgPSAzOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2ggKHJlc3VsdDIpCisgICAgICBkdW1teSA9IHJlc3VsdDI7CisgICAgfQorICAgIGlmIChyYW5rID09IDApIHsKKyAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0MikKKyAgICAgIHJlc3VsdDEgPSByZXN1bHQyOworICAgIH0KKyAgfSAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIHJldHVybiAoKHJlc3VsdDEgPT0gcmVzdWx0MikgJiYgKHJlc3VsdDIgPT0gZHVtbXkpICYmIChyZXN1bHQyID09IDMpKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IgKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mbHVzaCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9saXQuY2ZnIGIvcmMzL3J1bnRpbWUvdGVzdC9saXQuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMThkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L2xpdC5jZmcKQEAgLTAsMCArMSwxMDUgQEAKKyMgLSotIFB5dGhvbiAtKi0gdmltOiBzZXQgZnQ9cHl0aG9uIHRzPTQgc3c9NCBleHBhbmR0YWIgdHc9Nzk6CisjIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlICdsaXQnIHRlc3QgcnVubmVyLgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBsaXQuZm9ybWF0cworCisjIFRlbGwgcHlsaW50IHRoYXQgd2Uga25vdyBjb25maWcgYW5kIGxpdF9jb25maWcgZXhpc3Qgc29tZXdoZXJlLgoraWYgJ1BZTElOVF9JTVBPUlQnIGluIG9zLmVudmlyb246CisgICAgY29uZmlnID0gb2JqZWN0KCkKKyAgICBsaXRfY29uZmlnID0gb2JqZWN0KCkKKworZGVmIGFwcGVuZF9keW5hbWljX2xpYnJhcnlfcGF0aChwYXRoKToKKyAgICBpZiBjb25maWcub3BlcmF0aW5nX3N5c3RlbSA9PSAnV2luZG93cyc6CisgICAgICAgIG5hbWUgPSAnUEFUSCcKKyAgICAgICAgc2VwID0gJzsnCisgICAgZWxpZiBjb25maWcub3BlcmF0aW5nX3N5c3RlbSA9PSAnRGFyd2luJzoKKyAgICAgICAgbmFtZSA9ICdEWUxEX0xJQlJBUllfUEFUSCcKKyAgICAgICAgc2VwID0gJzonCisgICAgZWxzZToKKyAgICAgICAgbmFtZSA9ICdMRF9MSUJSQVJZX1BBVEgnCisgICAgICAgIHNlcCA9ICc6JworICAgIGlmIG5hbWUgaW4gY29uZmlnLmVudmlyb25tZW50OgorICAgICAgICBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0gPSBwYXRoICsgc2VwICsgY29uZmlnLmVudmlyb25tZW50W25hbWVdCisgICAgZWxzZToKKyAgICAgICAgY29uZmlnLmVudmlyb25tZW50W25hbWVdID0gcGF0aAorCisjIG5hbWU6IFRoZSBuYW1lIG9mIHRoaXMgdGVzdCBzdWl0ZS4KK2NvbmZpZy5uYW1lID0gJ2xpYm9tcCcKKworIyBzdWZmaXhlczogQSBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyB0byB0cmVhdCBhcyB0ZXN0IGZpbGVzLgorY29uZmlnLnN1ZmZpeGVzID0gWycuYyddCisKKyMgdGVzdF9zb3VyY2Vfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBhcmUgbG9jYXRlZC4KK2NvbmZpZy50ZXN0X3NvdXJjZV9yb290ID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorCisjIHRlc3RfZXhlY19yb290OiBUaGUgcm9vdCBvYmplY3QgZGlyZWN0b3J5IHdoZXJlIG91dHB1dCBpcyBwbGFjZWQKK2NvbmZpZy50ZXN0X2V4ZWNfcm9vdCA9IGNvbmZpZy5saWJvbXBfb2JqX3Jvb3QKKworIyB0ZXN0IGZvcm1hdAorY29uZmlnLnRlc3RfZm9ybWF0ID0gbGl0LmZvcm1hdHMuU2hUZXN0KCkKKworIyBjb21waWxlciBmbGFncworY29uZmlnLnRlc3RfY2ZsYWdzID0gY29uZmlnLnRlc3Rfb3Blbm1wX2ZsYWcgKyBcCisgICAgIiAtSSAiICsgY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgKyBcCisgICAgIiAtSSAiICsgY29uZmlnLm9tcF9oZWFkZXJfZGlyZWN0b3J5ICsgXAorICAgICIgLUwgIiArIGNvbmZpZy5saWJyYXJ5X2RpciArIFwKKyAgICAiICIgKyBjb25maWcudGVzdF9leHRyYV9jZmxhZ3MKKworIyBleHRyYSBsaWJyYXJpZXMKK2xpYnMgPSAiIgoraWYgY29uZmlnLmhhc19saWJtOgorICAgIGxpYnMgKz0gIiAtbG0iCisKKyMgQWxsb3cgWEZBSUwgdG8gd29yaworY29uZmlnLnRhcmdldF90cmlwbGUgPSBbIF0KK2lmIHJlLnNlYXJjaCgnZ2NjJywgY29uZmlnLnRlc3RfY29tcGlsZXIpIGlzIG5vdCBOb25lOgorICAgIGNvbmZpZy5hdmFpbGFibGVfZmVhdHVyZXMuYWRkKCdnY2MnKQorCisjIFNldHVwIGVudmlyb25tZW50IHRvIGZpbmQgZHluYW1pYyBsaWJyYXJ5IGF0IHJ1bnRpbWUKK2FwcGVuZF9keW5hbWljX2xpYnJhcnlfcGF0aChjb25maWcubGlicmFyeV9kaXIpCitpZiBjb25maWcudXNpbmdfaHdsb2M6CisgICAgYXBwZW5kX2R5bmFtaWNfbGlicmFyeV9wYXRoKGNvbmZpZy5od2xvY19saWJyYXJ5X2RpcikKKworIyBScGF0aCBtb2RpZmljYXRpb25zIGZvciBEYXJ3aW4KK2lmIGNvbmZpZy5vcGVyYXRpbmdfc3lzdGVtID09ICdEYXJ3aW4nOgorICAgIGNvbmZpZy50ZXN0X2NmbGFncyArPSAiIC1XbCwtcnBhdGgsIiArIGNvbmZpZy5saWJyYXJ5X2RpcgorICAgIGlmIGNvbmZpZy51c2luZ19od2xvYzoKKyAgICAgICAgY29uZmlnLnRlc3RfY2ZsYWdzICs9ICIgLVdsLC1ycGF0aCwiICsgY29uZmlnLmh3bG9jX2xpYnJhcnlfZGlyCisKKyMgRmluZCB0aGUgU0RLIG9uIERhcndpbgoraWYgY29uZmlnLm9wZXJhdGluZ19zeXN0ZW0gPT0gJ0Rhcndpbic6CisgIGNtZCA9IHN1YnByb2Nlc3MuUG9wZW4oWyd4Y3J1bicsICctLXNob3ctc2RrLXBhdGgnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICBvdXQsIGVyciA9IGNtZC5jb21tdW5pY2F0ZSgpCisgIG91dCA9IG91dC5zdHJpcCgpCisgIHJlcyA9IGNtZC53YWl0KCkKKyAgaWYgcmVzID09IDAgYW5kIG91dDoKKyAgICBjb25maWcudGVzdF9jZmxhZ3MgKz0gIiAtaXN5c3Jvb3QgIiArIG91dAorCisjIERpc2FibGUgT01QVCB0ZXN0cyBpZiBGaWxlQ2hlY2sgd2FzIG5vdCBmb3VuZAoraWYgY29uZmlnLmhhc19vbXB0IGFuZCBjb25maWcudGVzdF9maWxlY2hlY2sgPT0gIiI6CisgICAgbGl0X2NvbmZpZy5ub3RlKCJOb3QgdGVzdGluZyBPTVBUIGJlY2F1c2UgRmlsZUNoZWNrIHdhcyBub3QgZm91bmQiKQorICAgIGNvbmZpZy5oYXNfb21wdCA9IEZhbHNlCisKK2lmIGNvbmZpZy5oYXNfb21wdDoKKyAgICBjb25maWcuYXZhaWxhYmxlX2ZlYXR1cmVzLmFkZCgib21wdCIpCisgICAgIyBmb3IgY2FsbGJhY2suaAorICAgIGNvbmZpZy50ZXN0X2NmbGFncyArPSAiIC1JICIgKyBjb25maWcudGVzdF9zb3VyY2Vfcm9vdCArICIvb21wdCIKKworIyBzdWJzdGl0dXRpb25zCitpZiBjb25maWcuaGFzX29tcHQ6CisgICAgY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiRmlsZUNoZWNrIiwgY29uZmlnLnRlc3RfZmlsZWNoZWNrKSkKKyAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlc29ydC10aHJlYWRzIiwgInNvcnQgLS1udW1lcmljLXNvcnQgLS1zdGFibGUiKSkKKworY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWxpYm9tcC1jb21waWxlLWFuZC1ydW4iLCBcCisgICAgIiVsaWJvbXAtY29tcGlsZSAmJiAlbGlib21wLXJ1biIpKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWxpYm9tcC1jb21waWxlIiwgXAorICAgICIlY2xhbmcgJWNmbGFncyAlcyAtbyAldCIgKyBsaWJzKSkKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVsaWJvbXAtcnVuIiwgIiV0IikpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlY2xhbmciLCBjb25maWcudGVzdF9jb21waWxlcikpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlb3Blbm1wX2ZsYWciLCBjb25maWcudGVzdF9vcGVubXBfZmxhZykpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlY2ZsYWdzIiwgY29uZmlnLnRlc3RfY2ZsYWdzKSkKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9saXQuc2l0ZS5jZmcuaW4gYi9yYzMvcnVudGltZS90ZXN0L2xpdC5zaXRlLmNmZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDgxMzJlCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9saXQuc2l0ZS5jZmcuaW4KQEAgLTAsMCArMSwxOCBAQAorQEFVVE9fR0VOX0NPTU1FTlRACisKK2NvbmZpZy50ZXN0X2NvbXBpbGVyID0gIkBMSUJPTVBfVEVTVF9DT01QSUxFUkAiCitjb25maWcudGVzdF9maWxlY2hlY2sgPSAiQEZJTEVDSEVDS19FWEVDVVRBQkxFQCIKK2NvbmZpZy50ZXN0X29wZW5tcF9mbGFnID0gIkBMSUJPTVBfVEVTVF9PUEVOTVBfRkxBR0AiCitjb25maWcudGVzdF9leHRyYV9jZmxhZ3MgPSAiQExJQk9NUF9URVNUX0NGTEFHU0AiCitjb25maWcubGlib21wX29ial9yb290ID0gIkBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAIgorY29uZmlnLmxpYnJhcnlfZGlyID0gIkBMSUJPTVBfTElCUkFSWV9ESVJAIgorY29uZmlnLm9tcF9oZWFkZXJfZGlyZWN0b3J5ID0gIkBMSUJPTVBfQklOQVJZX0RJUkAvc3JjIgorY29uZmlnLm9wZXJhdGluZ19zeXN0ZW0gPSAiQENNQUtFX1NZU1RFTV9OQU1FQCIKK2NvbmZpZy5od2xvY19saWJyYXJ5X2RpciA9ICJATElCT01QX0hXTE9DX0xJQlJBUllfRElSQCIKK2NvbmZpZy51c2luZ19od2xvYyA9IEBMSUJPTVBfVVNFX0hXTE9DQAorY29uZmlnLmhhc19vbXB0ID0gQExJQk9NUF9PTVBUX1NVUFBPUlRAIGFuZCBATElCT01QX09NUFRfQkxBTUVAIGFuZCBATElCT01QX09NUFRfVFJBQ0VACitjb25maWcuaGFzX2xpYm0gPSBATElCT01QX0hBVkVfTElCTUAKKworIyBMZXQgdGhlIG1haW4gY29uZmlnIGRvIHRoZSByZWFsIHdvcmsuCitsaXRfY29uZmlnLmxvYWRfY29uZmlnKGNvbmZpZywgIkBMSUJPTVBfQkFTRV9ESVJAL3Rlc3QvbGl0LmNmZyIpCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvbG9jay9vbXBfbG9jay5jIGIvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwMWYyNwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvbG9jay9vbXBfbG9jay5jCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKy8vIFJVTjogZW52IEtNUF9MT0NLX0tJTkQ9dGFzIEtNUF9TUElOX0JBQ0tPRkZfUEFSQU1TPTIwNDgsMjAwICVsaWJvbXAtcnVuCisvLyBSVU46IGVudiBLTVBfTE9DS19LSU5EPWZ1dGV4ICVsaWJvbXAtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9sb2NrX3QgbGNrOworCitpbnQgdGVzdF9vbXBfbG9jaygpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgIGludCBpOworCisgIG9tcF9pbml0X2xvY2soJmxjayk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgb21wX3NldF9sb2NrKCZsY2spOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfaXRlcmF0aW9ucysrOworICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgb21wX3Vuc2V0X2xvY2soJmxjayk7CisgICAgfQorICB9CisgIG9tcF9kZXN0cm95X2xvY2soJmxjayk7CisKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfbG9jaygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9uZXN0X2xvY2suYyBiL3JjMy9ydW50aW1lL3Rlc3QvbG9jay9vbXBfbmVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkN2M2YQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvbG9jay9vbXBfbmVzdF9sb2NrLmMKQEAgLTAsMCArMSw0NSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbmVzdF9sb2NrX3QgbGNrOworCitpbnQgdGVzdF9vbXBfbmVzdF9sb2NrKCkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgaW50IGk7CisKKyAgb21wX2luaXRfbmVzdF9sb2NrKCZsY2spOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKQorICB7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIG9tcF9zZXRfbmVzdF9sb2NrKCZsY2spOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfaXRlcmF0aW9ucysrOworICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgb21wX3Vuc2V0X25lc3RfbG9jaygmbGNrKTsKKyAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKCZsY2spOworCisgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX25lc3RfbG9jaygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X2xvY2suYyBiL3JjMy9ydW50aW1lL3Rlc3QvbG9jay9vbXBfdGVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxMjA1NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvbG9jay9vbXBfdGVzdF9sb2NrLmMKQEAgLTAsMCArMSw0NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorLy8gUlVOOiBlbnYgS01QX0xPQ0tfS0lORD10YXMgJWxpYm9tcC1ydW4KKy8vIFJVTjogZW52IEtNUF9MT0NLX0tJTkQ9ZnV0ZXggJWxpYm9tcC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisKK2ludCB0ZXN0X29tcF90ZXN0X2xvY2soKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKworICBvbXBfaW5pdF9sb2NrICgmbGNrKTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykKKyAgeworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgd2hpbGUgKCFvbXBfdGVzdF9sb2NrICgmbGNrKSkKKyAgICAgIHt9OworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfaXRlcmF0aW9ucysrOworICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgb21wX3Vuc2V0X2xvY2sgKCZsY2spOworICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9sb2NrKCZsY2spOworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90ZXN0X2xvY2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvbG9jay9vbXBfdGVzdF9uZXN0X2xvY2suYyBiL3JjMy9ydW50aW1lL3Rlc3QvbG9jay9vbXBfdGVzdF9uZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmE2ZmQyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIG9tcF9uZXN0X2xvY2tfdCBsY2s7CisKK2ludCB0ZXN0X29tcF90ZXN0X25lc3RfbG9jaygpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgIGludCBpOworCisgIG9tcF9pbml0X25lc3RfbG9jayAoJmxjayk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworICAgICAgLypvbXBfc2V0X2xvY2soJmxjayk7Ki8KKyAgICAgIHdoaWxlKCFvbXBfdGVzdF9uZXN0X2xvY2sgKCZsY2spKQorICAgICAge307CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICBvbXBfdW5zZXRfbmVzdF9sb2NrICgmbGNrKTsKKyAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICgmbGNrKTsKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGVzdF9uZXN0X2xvY2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvbWFzdGVyL29tcF9tYXN0ZXIuYyBiL3JjMy9ydW50aW1lL3Rlc3QvbWFzdGVyL29tcF9tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2M3ZjllCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlci5jCkBAIC0wLDAgKzEsMzggQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX21hc3RlcigpCit7CisgIGludCBudGhyZWFkczsKKyAgaW50IGV4ZWN1dGluZ190aHJlYWQ7CisKKyAgbnRocmVhZHMgPSAwOworICBleGVjdXRpbmdfdGhyZWFkID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIG1hc3RlcgorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIG50aHJlYWRzKys7CisgICAgICB9CisgICAgICBleGVjdXRpbmdfdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICByZXR1cm4gKChudGhyZWFkcyA9PSAxKSAmJiAoZXhlY3V0aW5nX3RocmVhZCA9PSAwKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9tYXN0ZXIoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvbWFzdGVyL29tcF9tYXN0ZXJfMy5jIGIvcmMzL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlcl8zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5ZmRmOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvbWFzdGVyL29tcF9tYXN0ZXJfMy5jCkBAIC0wLDAgKzEsNDQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX21hc3Rlcl8zKCkKK3sKKyAgaW50IG50aHJlYWRzOworICBpbnQgZXhlY3V0aW5nX3RocmVhZDsKKyAgaW50IHRpZF9yZXN1bHQgPSAwOyAvKiBjb3VudHMgdXAgdGhlIG51bWJlciBvZiB3cm9uZyB0aHJlYWQgbm8uIGZvcgorICAgICAgICAgICAgICAgdGhlIG1hc3RlciB0aHJlYWQuIChNdXN0IGJlIDApICovCisgIG50aHJlYWRzID0gMDsKKyAgZXhlY3V0aW5nX3RocmVhZCA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBtYXN0ZXIKKyAgICB7CisgICAgICBpbnQgdGlkID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICBpZiAodGlkICE9IDApIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeyB0aWRfcmVzdWx0Kys7IH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIG50aHJlYWRzKys7CisgICAgICB9CisgICAgICBleGVjdXRpbmdfdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgIH0gLyogZW5kIG9mIG1hc3RlciovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8KKyAgcmV0dXJuICgobnRocmVhZHMgPT0gMSkgJiYgKGV4ZWN1dGluZ190aHJlYWQgPT0gMCkgJiYgKHRpZF9yZXN1bHQgPT0gMCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfbWFzdGVyXzMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvbWlzY19idWdzL21hbnktbWljcm90YXNrLWFyZ3MuYyBiL3JjMy9ydW50aW1lL3Rlc3QvbWlzY19idWdzL21hbnktbWljcm90YXNrLWFyZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ0NTE1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9taXNjX2J1Z3MvbWFueS1taWNyb3Rhc2stYXJncy5jCkBAIC0wLDAgKzEsMzkgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbigpCit7CisKKyAgaW50IGk7CisgIGludCBpMSA9IDA7CisgIGludCBpMiA9IDE7CisgIGludCBpMyA9IDI7CisgIGludCBpNCA9IDM7CisgIGludCBpNSA9IDQ7CisgIGludCBpNiA9IDY7CisgIGludCBpNyA9IDc7CisgIGludCBpOCA9IDg7CisgIGludCBpOSA9IDk7CisgIGludCBpMTAgPSAxMDsKKyAgaW50IGkxMSA9IDExOworICBpbnQgaTEyID0gMTI7CisgIGludCBpMTMgPSAxMzsKKyAgaW50IGkxNCA9IDE0OworICBpbnQgaTE1ID0gMTU7CisgIGludCBpMTYgPSAxNjsKKyAKKyAgaW50IHIgPSAwOyAKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZShpMSwgaTIsIGkzLCBpNCwgaTUsIGk2LCBpNywgaTgsIGk5LCBpMTAsIGkxMSwgaTEyLCBpMTMsIGkxNCwgaTE1LCBpMTYpIHJlZHVjdGlvbigrOnIpCisgIGZvciAoaSA9IDA7IGkgPCBpMTY7IGkrKykgeworICAgIHIgKz0gaSArIGkxICsgaTIgKyBpMyArIGk0ICsgaTUgKyBpNiArIGk3ICsgaTggKyBpOSArIGkxMCArIGkxMSArIGkxMiArIGkxMyArIGkxNCArIGkxNSArIGkxNjsKKyAgfQorCisgIGludCByZiA9IDIyMTY7CisgIGlmIChyICE9IHJmKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJyIHNob3VsZCBiZSAlZCBidXQgaW5zdGVhZCBlcXVhbHMgJWRcbiIsIHJmLCByKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L21pc2NfYnVncy9vbXBfZm9yZWlnbl90aHJlYWRfdGVhbV9yZXVzZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC9taXNjX2J1Z3Mvb21wX2ZvcmVpZ25fdGhyZWFkX3RlYW1fcmV1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDcwZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9taXNjX2J1Z3Mvb21wX2ZvcmVpZ25fdGhyZWFkX3RlYW1fcmV1c2UuYwpAQCAtMCwwICsxLDgxIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZSAtbHB0aHJlYWQgJiYgJWxpYm9tcC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBOVU1fVEhSRUFEUyAxMAorCisvKgorIEFmdGVyIGhvdCB0ZWFtcyB3ZXJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgdGhlIGxpYnJhcnkgc3RhcnRlZCB1c2luZyBsZXZlbHMKKyBrZXB0IGluIHRoZSB0ZWFtIHN0cnVjdHVyZS4gIFRoZSBsZXZlbHMgYXJlIGJyb2tlbiBpbiBjYXNlIGZvcmVpZ24gdGhyZWFkCisgZXhpdHMgYW5kIHB1dHMgaXRzIHRlYW0gaW50byB0aGUgcG9vbCB3aGljaCBpcyB0aGVuIHJlLXVzZWQgYnkgYW5vdGhlciBmb3JlaWduCisgdGhyZWFkLiBUaGUgYnJva2VuIGJlaGF2aW9yIG9ic2VydmVkIGlzIHdoZW4gcHJpbnRpbmcgdGhlIGxldmVscyBmb3IgZWFjaAorIG5ldyB0ZWFtLCBvbmUgZ2V0cyAxLCAyLCAxLCAyLCAxLCAyLCBldGMuICBUaGlzIG1ha2VzIHRoZSBsaWJyYXJ5IGJlbGlldmUgdGhhdAorIGV2ZXJ5IG90aGVyIHRlYW0gaXMgbmVzdGVkIHdoaWNoIGlzIGluY29ycmVjdC4gIFdoYXQgaXMgd2FudGVkIGlzIGZvciB0aGUKKyBsZXZlbHMgdG8gYmUgMSwgMSwgMSwgZXRjLgorKi8KKworaW50IGEgPSAwOworaW50IGxldmVsOworCit0eXBlZGVmIHN0cnVjdCB0aHJlYWRfYXJnX3QgeworICBpbnQgaXRlcmF0aW9uczsKK30gdGhyZWFkX2FyZ190OworCit2b2lkKiB0aHJlYWRfZnVuY3Rpb24odm9pZCogYXJnKSB7CisgIGludCBpOworICB0aHJlYWRfYXJnX3QqIHRhcmcgPSAodGhyZWFkX2FyZ190Kilhcmc7CisgIGludCBpdGVyYXRpb25zID0gdGFyZy0+aXRlcmF0aW9uczsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICB7CisgICAgLy8gbGV2ZWwgc2hvdWxkIGFsd2F5cyBiZSAxCisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgbGV2ZWwgPSBvbXBfZ2V0X2xldmVsKCk7CisKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IoaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgYSsrOworICAgIH0KKyAgfQorfQorCitpbnQgdGVzdF9vbXBfdGVhbV9yZXVzZSgpCit7CisgIGludCBpOworICBpbnQgc3VjY2VzcyA9IDE7CisgIHB0aHJlYWRfdCB0aHJlYWRbTlVNX1RIUkVBRFNdOworICB0aHJlYWRfYXJnX3QgdGhyZWFkX2FyZ1tOVU1fVEhSRUFEU107CisgIC8vIGxhdW5jaCBOVU1fVEhSRUFEUyB0aHJlYWRzLCBvbmUgYXQgYSB0aW1lIHRvIHBlcmZvcm0gdGhyZWFkX2Z1bmN0aW9uKCkKKyAgZm9yKGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgeworICAgIHRocmVhZF9hcmdbaV0uaXRlcmF0aW9ucyA9IGkgKyAxOworICAgIHB0aHJlYWRfY3JlYXRlKHRocmVhZCtpLCBOVUxMLCB0aHJlYWRfZnVuY3Rpb24sIHRocmVhZF9hcmcraSk7CisgICAgcHRocmVhZF9qb2luKCoodGhyZWFkK2kpLCBOVUxMKTsKKyAgICAvLyBsZXZlbCByZWFkIGluIHRocmVhZF9mdW5jdGlvbigpJ3MgcGFyYWxsZWwgcmVnaW9uIHNob3VsZCBiZSAxCisgICAgaWYobGV2ZWwgIT0gMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogZm9yIHB0aHJlYWQgJWQgbGV2ZWwgc2hvdWxkIGJlIDEgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAiaW5zdGVhZCBlcXVhbHMgJWRcbiIsIGksIGxldmVsKTsKKyAgICAgIHN1Y2Nlc3MgPSAwOworICAgIH0KKyAgfQorICAvLyBtYWtlIHN1cmUgdGhlIGZvciBsb29wIHdvcmtzCisgIGludCBrbm93bl9zdW0gPSAoTlVNX1RIUkVBRFMgKiAoTlVNX1RIUkVBRFMrMSkpIC8gMjsKKyAgaWYoYSAhPSBrbm93bl9zdW0pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImEgc2hvdWxkIGJlICVkIGJ1dCBpbnN0ZWFkIGVxdWFscyAlZFxuIiwga25vd25fc3VtLCBhKTsKKyAgICBzdWNjZXNzID0gMDsKKyAgfQorICByZXR1cm4gc3VjY2VzczsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgYSA9IDA7CisgICAgaWYoIXRlc3Rfb21wX3RlYW1fcmV1c2UoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wX215X3NsZWVwLmggYi9yYzMvcnVudGltZS90ZXN0L29tcF9teV9zbGVlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOGQ5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcF9teV9zbGVlcC5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgTVlfU0xFRVBfSAorI2RlZmluZSBNWV9TTEVFUF9ICisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIGhhdmUgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIGJldHRlciByZXNvbHV0aW9uIGFuZAorICogIHdoaWNoIG9ubHkgc3RvcHMgb25lIHRocmVhZC4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorLy8gV2luZG93cyB2ZXJzaW9uIG9mIG15X3NsZWVwKCkgZnVuY3Rpb24KK3N0YXRpYyB2b2lkIG15X3NsZWVwKGRvdWJsZSBzbGVlcHRpbWUpIHsKKyAgRFdPUkQgbXMgPSAoRFdPUkQpIChzbGVlcHRpbWUgKiAxMDAwLjApOworICBTbGVlcChtcyk7Cit9CisKKworI2Vsc2UgLy8gX1dJTjMyCisKKy8vIFVuaWNlcyB2ZXJzaW9uIG9mIG15X3NsZWVwKCkgZnVuY3Rpb24KK3N0YXRpYyB2b2lkIG15X3NsZWVwKGRvdWJsZSBzbGVlcHRpbWUpIHsKKyAgc3RydWN0IHRpbWVzcGVjIHRzOworICB0cy50dl9zZWMgPSAodGltZV90KXNsZWVwdGltZTsKKyAgdHMudHZfbnNlYyA9IChsb25nKSgoc2xlZXB0aW1lIC0gKGRvdWJsZSl0cy50dl9zZWMpICogMUU5KTsKKyAgbmFub3NsZWVwKCZ0cywgTlVMTCk7Cit9CisKKyNlbmRpZiAvLyBfV0lOMzIKKworI2VuZGlmIC8vIE1ZX1NMRUVQX0gKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wX3Rlc3RzdWl0ZS5oIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXBfdGVzdHN1aXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmNTQ3MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wX3Rlc3RzdWl0ZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIEdsb2JhbCBoZWFkZXJmaWxlIG9mIHRoZSBPcGVuTVAgVGVzdHN1aXRlICovCisKKyNpZm5kZWYgT01QX1RFU1RTVUlURV9ICisjZGVmaW5lIE9NUF9URVNUU1VJVEVfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9PUENPVU5UIDEwMDAgLyogTnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gc2xpdCBhbW9uZ3N0IHRocmVhZHMgKi8KKyNkZWZpbmUgUkVQRVRJVElPTlMgMTAgLyogTnVtYmVyIG9mIHRpbWVzIHRvIHJ1biBlYWNoIHRlc3QgKi8KKworLyogZm9sbG93aW5nIHRpbWVzIGFyZSBpbiBzZWNvbmRzICovCisjZGVmaW5lIFNMRUVQVElNRSAxCisKKy8qIERlZmluaXRpb25zIGZvciB0YXNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE5VTV9UQVNLUyAyNQorI2RlZmluZSBNQVhfVEFTS1NfUEVSX1RIUkVBRCA1CisKKyNpZmRlZiAgX1dJTjMyCisvLyBXaW5kb3dzIHZlcnNpb25zIG9mIHB0aHJlYWRfY3JlYXRlKCkgYW5kIHB0aHJlYWRfam9pbigpCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KK3R5cGVkZWYgSEFORExFIHB0aHJlYWRfdDsKKworLy8gZW5jYXBzdWxhdGVzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHB0aHJlYWQtY2FsbGFibGUgZnVuY3Rpb24KK3N0cnVjdCB0aHJlYWRfZnVuY19pbmZvX3QgeworICB2b2lkKiAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQqKTsKKyAgdm9pZCogYXJnOworfTsKKworLy8gY2FsbCB0aGUgdm9pZCogc3RhcnRfcm91dGluZSh2b2lkKik7CitzdGF0aWMgRFdPUkQgX190aHJlYWRfZnVuY193cmFwcGVyKExQVk9JRCBscFBhcmFtZXRlcikgeworICBzdHJ1Y3QgdGhyZWFkX2Z1bmNfaW5mb190KiBmdW5jdGlvbl9pbmZvcm1hdGlvbjsKKyAgZnVuY3Rpb25faW5mb3JtYXRpb24gPSAoc3RydWN0IHRocmVhZF9mdW5jX2luZm9fdCopbHBQYXJhbWV0ZXI7CisgIGZ1bmN0aW9uX2luZm9ybWF0aW9uLT5zdGFydF9yb3V0aW5lKGZ1bmN0aW9uX2luZm9ybWF0aW9uLT5hcmcpOworICBmcmVlKGZ1bmN0aW9uX2luZm9ybWF0aW9uKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGF0dHIgaXMgaWdub3JlZAorc3RhdGljIGludCBwdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QgKnRocmVhZCwgdm9pZCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKCpzdGFydF9yb3V0aW5lKSAodm9pZCAqKSwgdm9pZCAqYXJnKSB7CisgIHB0aHJlYWRfdCBwdGhyZWFkOworICBzdHJ1Y3QgdGhyZWFkX2Z1bmNfaW5mb190KiBpbmZvOworICBpbmZvID0gKHN0cnVjdCB0aHJlYWRfZnVuY19pbmZvX3QqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRocmVhZF9mdW5jX2luZm9fdCkpOworICBpbmZvLT5zdGFydF9yb3V0aW5lID0gc3RhcnRfcm91dGluZTsKKyAgaW5mby0+YXJnID0gYXJnOworICBwdGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIF9fdGhyZWFkX2Z1bmNfd3JhcHBlciwgaW5mbywgMCwgTlVMTCk7CisgIGlmIChwdGhyZWFkID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNyZWF0ZVRocmVhZCgpIGZhaWxlZDogRXJyb3IgIyV1LlxuIiwgR2V0TGFzdEVycm9yKCkpOworICAgIGV4aXQoMSk7CisgIH0KKyAgKnRocmVhZCA9IHB0aHJlYWQ7CisgIHJldHVybiAwOworfQorLy8gcmV0dmFsIGlzIGlnbm9yZWQgZm9yIG5vdworc3RhdGljIGludCBwdGhyZWFkX2pvaW4ocHRocmVhZF90IHRocmVhZCwgdm9pZCAqKnJldHZhbCkgeworICBpbnQgcmM7CisgIHJjID0gV2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWQsIElORklOSVRFKTsKKyAgaWYgKHJjID09IFdBSVRfRkFJTEVEKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJXYWl0Rm9yU2luZ2xlT2JqZWN0KCkgZmFpbGVkOiBFcnJvciAjJXUuXG4iLAorICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOworICAgIGV4aXQoMSk7CisgIH0KKyAgcmMgPSBDbG9zZUhhbmRsZSh0aHJlYWQpOworICBpZiAocmMgPT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ2xvc2VIYW5kbGUoKSBmYWlsZWQ6IEVycm9yICMldS5cbiIsIEdldExhc3RFcnJvcigpKTsKKyAgICBleGl0KDEpOworICB9CisgIHJldHVybiAwOworfQorI2Vsc2UKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L2NhbGxiYWNrLmggYi9yYzMvcnVudGltZS90ZXN0L29tcHQvY2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQ4OTY2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L2NhbGxiYWNrLmgKQEAgLTAsMCArMSwxMTkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8b21wdC5oPgorCitzdGF0aWMgb21wdF9nZXRfdGFza19pZF90IG9tcHRfZ2V0X3Rhc2tfaWQ7CitzdGF0aWMgb21wdF9nZXRfdGFza19mcmFtZV90IG9tcHRfZ2V0X3Rhc2tfZnJhbWU7CitzdGF0aWMgb21wdF9nZXRfdGhyZWFkX2lkX3Qgb21wdF9nZXRfdGhyZWFkX2lkOworc3RhdGljIG9tcHRfZ2V0X3BhcmFsbGVsX2lkX3Qgb21wdF9nZXRfcGFyYWxsZWxfaWQ7CisKK3N0YXRpYyB2b2lkIHByaW50X2lkcyhpbnQgbGV2ZWwpCit7CisgIG9tcHRfZnJhbWVfdCogZnJhbWUgPSBvbXB0X2dldF90YXNrX2ZyYW1lKGxldmVsKTsKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogbGV2ZWwgJWQ6IHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCB0YXNrX2lkPSUiIFBSSXU2NCAiLCBleGl0X2ZyYW1lPSVwLCByZWVudGVyX2ZyYW1lPSVwXG4iLCBvbXB0X2dldF90aHJlYWRfaWQoKSwgbGV2ZWwsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkKGxldmVsKSwgb21wdF9nZXRfdGFza19pZChsZXZlbCksIGZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUsIGZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUpOworfQorCisjZGVmaW5lIHByaW50X2ZyYW1lKGxldmVsKVwKK2RvIHtcCisgIHByaW50ZigiJSIgUFJJdTY0ICI6IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKCVkKT0lcFxuIiwgb21wdF9nZXRfdGhyZWFkX2lkKCksIGxldmVsLCBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcyhsZXZlbCkpO1wKK30gd2hpbGUoMCkKKworCitzdGF0aWMgdm9pZAorb25fb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luKAorICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgIG9tcHRfdGFza19pZF90IHRhc2tfaWQpCit7CisgIHByaW50ZigiJSIgUFJJdTY0ICI6IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHRhc2tfaWQ9JSIgUFJJdTY0ICJcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgdGFza19pZCk7CisgIHByaW50X2lkcygwKTsKK30KKworc3RhdGljIHZvaWQKK29uX29tcHRfZXZlbnRfYmFycmllcl9lbmQoCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCkKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHRhc2tfaWQ9JSIgUFJJdTY0ICJcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgdGFza19pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9vbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4oCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCkKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD0lIiBQUkl1NjQgIiwgdGFza19pZD0lIiBQUkl1NjQgIlxuIiwgb21wdF9nZXRfdGhyZWFkX2lkKCksIHBhcmFsbGVsX2lkLCB0YXNrX2lkKTsKK30KKworc3RhdGljIHZvaWQKK29uX29tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQoCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCkKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHRhc2tfaWQ9JSIgUFJJdTY0ICJcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgdGFza19pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9vbXB0X2V2ZW50X2xvb3BfYmVnaW4oCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsCisgIHZvaWQgKndvcmtzaGFyZV9mdW5jdGlvbikKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9sb29wX2JlZ2luOiBwYXJhbGxlbF9pZD0lIiBQUkl1NjQgIiwgcGFyZW50X3Rhc2tfaWQ9JSIgUFJJdTY0ICIsIHdvcmtzaGFyZV9mdW5jdGlvbj0lcFxuIiwgb21wdF9nZXRfdGhyZWFkX2lkKCksIHBhcmFsbGVsX2lkLCBwYXJlbnRfdGFza19pZCwgd29ya3NoYXJlX2Z1bmN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK29uX29tcHRfZXZlbnRfbG9vcF9lbmQoCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCkKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9sb29wX2VuZDogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHRhc2tfaWQ9JSIgUFJJdTY0ICJcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgdGFza19pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9vbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKAorICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwKKyAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwKKyAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLAorICB1aW50MzJfdCByZXF1ZXN0ZWRfdGVhbV9zaXplLAorICB2b2lkICpwYXJhbGxlbF9mdW5jdGlvbiwKKyAgb21wdF9pbnZva2VyX3QgaW52b2tlcikKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9JSIgUFJJdTY0ICIsIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9JXAsIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9JXAsIHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCByZXF1ZXN0ZWRfdGVhbV9zaXplPSUiIFBSSXUzMiAiLCBwYXJhbGxlbF9mdW5jdGlvbj0lcCwgaW52b2tlcj0lZFxuIiwgb21wdF9nZXRfdGhyZWFkX2lkKCksIHBhcmVudF90YXNrX2lkLCBwYXJlbnRfdGFza19mcmFtZS0+ZXhpdF9ydW50aW1lX2ZyYW1lLCBwYXJlbnRfdGFza19mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lLCBwYXJhbGxlbF9pZCwgcmVxdWVzdGVkX3RlYW1fc2l6ZSwgcGFyYWxsZWxfZnVuY3Rpb24sIGludm9rZXIpOworfQorCitzdGF0aWMgdm9pZAorb25fb21wdF9ldmVudF9wYXJhbGxlbF9lbmQoCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCwKKyAgb21wdF9pbnZva2VyX3QgaW52b2tlcikKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCB0YXNrX2lkPSUiIFBSSXU2NCAiLCBpbnZva2VyPSVkXG4iLCBvbXB0X2dldF90aHJlYWRfaWQoKSwgcGFyYWxsZWxfaWQsIHRhc2tfaWQsIGludm9rZXIpOworfQorCisKK3ZvaWQgb21wdF9pbml0aWFsaXplKAorICBvbXB0X2Z1bmN0aW9uX2xvb2t1cF90IGxvb2t1cCwKKyAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICB1bnNpZ25lZCBpbnQgb21wdF92ZXJzaW9uKQoreworICBvbXB0X3NldF9jYWxsYmFja190IG9tcHRfc2V0X2NhbGxiYWNrID0gKG9tcHRfc2V0X2NhbGxiYWNrX3QpIGxvb2t1cCgib21wdF9zZXRfY2FsbGJhY2siKTsKKyAgb21wdF9nZXRfdGFza19pZCA9IChvbXB0X2dldF90YXNrX2lkX3QpIGxvb2t1cCgib21wdF9nZXRfdGFza19pZCIpOworICBvbXB0X2dldF90YXNrX2ZyYW1lID0gKG9tcHRfZ2V0X3Rhc2tfZnJhbWVfdCkgbG9va3VwKCJvbXB0X2dldF90YXNrX2ZyYW1lIik7CisgIG9tcHRfZ2V0X3RocmVhZF9pZCA9IChvbXB0X2dldF90aHJlYWRfaWRfdCkgbG9va3VwKCJvbXB0X2dldF90aHJlYWRfaWQiKTsKKyAgb21wdF9nZXRfcGFyYWxsZWxfaWQgPSAob21wdF9nZXRfcGFyYWxsZWxfaWRfdCkgbG9va3VwKCJvbXB0X2dldF9wYXJhbGxlbF9pZCIpOworCisgIG9tcHRfc2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbiwgKG9tcHRfY2FsbGJhY2tfdCkgJm9uX29tcHRfZXZlbnRfYmFycmllcl9iZWdpbik7CisgIG9tcHRfc2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9lbmQsIChvbXB0X2NhbGxiYWNrX3QpICZvbl9vbXB0X2V2ZW50X2JhcnJpZXJfZW5kKTsKKyAgb21wdF9zZXRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luLCAob21wdF9jYWxsYmFja190KSAmb25fb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKTsKKyAgb21wdF9zZXRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCwgKG9tcHRfY2FsbGJhY2tfdCkgJm9uX29tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQpOworICBvbXB0X3NldF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4sIChvbXB0X2NhbGxiYWNrX3QpICZvbl9vbXB0X2V2ZW50X2xvb3BfYmVnaW4pOworICBvbXB0X3NldF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfZW5kLCAob21wdF9jYWxsYmFja190KSAmb25fb21wdF9ldmVudF9sb29wX2VuZCk7CisgIG9tcHRfc2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4sIChvbXB0X2NhbGxiYWNrX3QpICZvbl9vbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKTsKKyAgb21wdF9zZXRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQsIChvbXB0X2NhbGxiYWNrX3QpICZvbl9vbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCk7CisgIHByaW50ZigiMDogTlVMTF9QT0lOVEVSPSVwXG4iLCBOVUxMKTsKK30KKworb21wdF9pbml0aWFsaXplX3Qgb21wdF90b29sKCkKK3sKKyAgcmV0dXJuICZvbXB0X2luaXRpYWxpemU7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbmVzdGVkLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbmVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3YjY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9uZXN0ZWQuYwpAQCAtMCwwICsxLDI2NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VEhSRUFEUyAlcworLy8gUkVRVUlSRVM6IG9tcHQKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgPG9tcC5oPgorCitpbnQgbWFpbigpCit7CisgIG9tcF9zZXRfbmVzdGVkKDEpOworICBwcmludF9mcmFtZSgwKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICB7CisgICAgcHJpbnRfZnJhbWUoMSk7CisgICAgcHJpbnRfaWRzKDApOworICAgIHByaW50X2lkcygxKTsKKyAgICBwcmludF9mcmFtZSgwKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICAgIHsKKyAgICAgIHByaW50X2ZyYW1lKDEpOworICAgICAgcHJpbnRfaWRzKDApOworICAgICAgcHJpbnRfaWRzKDEpOworICAgICAgcHJpbnRfaWRzKDIpOworICAgICAgcHJpbnRfZnJhbWUoMCk7CisgICAgICAjcHJhZ21hIG9tcCBiYXJyaWVyCisgICAgICBwcmludF9pZHMoMCk7CisgICAgfQorICAgIHByaW50X2lkcygwKTsKKyAgfQorCisgIC8vIENIRUNLOiAwOiBOVUxMX1BPSU5URVI9W1tOVUxMOi4qJF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTlVMTF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSOi4rXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBOb3RlIHRoYXQgd2UgY2Fubm90IGVuc3VyZSB0aGF0IHRoZSB3b3JrZXIgdGhyZWFkcyBoYXZlIGFscmVhZHkgY2FsbGVkIGJhcnJpZXJfZW5kIGFuZCBpbXBsaWNpdF90YXNrX2VuZCBiZWZvcmUgcGFyYWxsZWxfZW5kIQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisKKworICAvLyBUSFJFQURTOiB7e159fTA6IE5VTExfUE9JTlRFUj1bW05VTEw6LiokXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk9W1tNQUlOX1JFRU5URVI6MHhbMC1mXStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbUEFSRU5UX1RBU0tfSUQ6WzAtOV0rXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tOVUxMXV0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9W1tNQUlOX1JFRU5URVJdXSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSOi4rXV0KKworICAvLyBuZXN0ZWQgcGFyYWxsZWwgbWFzdGVycworICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpPVtbRVhJVDoweFswLWZdK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbRVhJVF1dLCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tOVUxMXV0sIHJlZW50ZXJfZnJhbWU9W1tNQUlOX1JFRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApPVtbUkVFTlRFUjoweFswLWZdK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tFWElUXV0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9W1tSRUVOVEVSXV0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPVtbTkVTVEVEX1BBUkFMTEVMX0ZVTkNUSU9OOjB4WzAtZl0rXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpPVtbTkVTVEVEX0VYSVQ6MHhbMC1mXStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05VTExdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW1JFRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbTUFJTl9SRUVOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKT1bW05FU1RFRF9SRUVOVEVSOjB4WzAtZl0rXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBleHBsaWNpdCBiYXJyaWVyCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05FU1RFRF9SRUVOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05VTExdXQorICAvLyBpbXBsaWNpdCBiYXJyaWVyCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tFWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gaW1wbGljaXQgYmFycmllcgorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD17ezB4WzAtZl0rfX0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9e3sweFswLWZdK319LCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9e3sweFswLWZdK319LCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PXt7MHhbMC1mXSt9fSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPVtbTkVTVEVEX1BBUkFMTEVMX0ZVTkNUSU9OXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gbmVzdGVkIHBhcmFsbGVsIHdvcmtlciB0aHJlYWRzCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL25lc3RlZF9sd3QuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9uZXN0ZWRfbHd0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyODgxNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9uZXN0ZWRfbHd0LmMKQEAgLTAsMCArMSwyOTkgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVRIUkVBRFMgJXMKKy8vIFJFUVVJUkVTOiBvbXB0CisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlIDxvbXAuaD4KKworaW50IG1haW4oKQoreworICBvbXBfc2V0X25lc3RlZCgxKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICB7CisgICAgcHJpbnRfaWRzKDApOworICAgIHByaW50X2lkcygxKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcygxKQorICAgIHsKKyAgICAgIHByaW50X2lkcygwKTsKKyAgICAgIHByaW50X2lkcygxKTsKKyAgICAgIHByaW50X2lkcygyKTsKKyAgICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKDQpCisgICAgICB7CisgICAgICAgIHByaW50X2lkcygwKTsKKyAgICAgICAgcHJpbnRfaWRzKDEpOworICAgICAgICBwcmludF9pZHMoMik7CisgICAgICAgIHByaW50X2lkcygzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDSEVDSzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRDpbMC05XStdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD1bW05VTExdXSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUjouK11dCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBlbnN1cmUgdGhhdCB0aGUgd29ya2VyIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGNhbGxlZCBiYXJyaWVyX2VuZCBhbmQgaW1wbGljaXRfdGFza19lbmQgYmVmb3JlIHBhcmFsbGVsX2VuZCEKKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorCisKKyAgLy8gVEhSRUFEUzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTlVMTF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbVEFTS19GUkFNRV9FTlRFUjoweFswLWZdK11dLCBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPTB4e3tbMC1mXSt9fSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVI6LitdXQorCisgIC8vIG5lc3RlZCBwYXJhbGxlbCBtYXN0ZXJzCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX1RBU0tfRlJBTUVfRVhJVDoweFswLWZdK11dLCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tOVUxMXV0sIHJlZW50ZXJfZnJhbWU9W1tUQVNLX0ZSQU1FX0VOVEVSXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbTkVTVEVEX1RBU0tfRlJBTUVfRU5URVI6MHhbMC1mXStdXSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9MSwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT046MHhbMC1mXStdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRVhJVDoweFswLWZdK11dLCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCByZWVudGVyX2ZyYW1lPVtbTkVTVEVEX1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbVEFTS19GUkFNRV9FTlRFUl1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbTkVTVEVEX05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSOjB4WzAtZl0rXV0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfRlVOQ1RJT046MHhbMC1mXStdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVQ6MHhbMC1mXStdXSwgcmVlbnRlcl9mcmFtZT1bW05VTExdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUjoweFswLWZdK11dLCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT0xLCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tOVUxMXV0sIHJlZW50ZXJfZnJhbWU9W1tUQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbTkVTVEVEX05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSOjB4WzAtZl0rXV0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVQ6MHhbMC1mXStdXSwgcmVlbnRlcl9mcmFtZT1bW05VTExdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUjoweFswLWZdK11dLCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT0xLCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tOVUxMXV0sIHJlZW50ZXJfZnJhbWU9W1tUQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbTkVTVEVEX05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSOjB4WzAtZl0rXV0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVQ6MHhbMC1mXStdXSwgcmVlbnRlcl9mcmFtZT1bW05VTExdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUjoweFswLWZdK11dLCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT0xLCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tOVUxMXV0sIHJlZW50ZXJfZnJhbWU9W1tUQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbTkVTVEVEX05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSOjB4WzAtZl0rXV0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIG5lc3RlZCBwYXJhbGxlbCB3b3JrZXIgdGhyZWFkcworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL25lc3RlZF9zZXJpYWxpemVkLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbmVzdGVkX3NlcmlhbGl6ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMzMjNmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL25lc3RlZF9zZXJpYWxpemVkLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVRIUkVBRFMgJXMKKy8vIFJFUVVJUkVTOiBvbXB0CisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlIDxvbXAuaD4KKworaW50IG1haW4oKQoreworICBvbXBfc2V0X25lc3RlZCgwKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICB7CisgICAgcHJpbnRfaWRzKDApOworICAgIHByaW50X2lkcygxKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICAgIHsKKyAgICAgIHByaW50X2lkcygwKTsKKyAgICAgIHByaW50X2lkcygxKTsKKyAgICAgIHByaW50X2lkcygyKTsKKyAgICB9CisgIH0KKworICAvLyBDSEVDSzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRDpbMC05XStdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD1bW05VTExdXSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUjouK11dCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBlbnN1cmUgdGhhdCB0aGUgd29ya2VyIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGNhbGxlZCBiYXJyaWVyX2VuZCBhbmQgaW1wbGljaXRfdGFza19lbmQgYmVmb3JlIHBhcmFsbGVsX2VuZCEKKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorCisKKyAgLy8gVEhSRUFEUzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTlVMTF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSOi4rXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9e3sweFswLWZdK319LCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT046MHhbMC1mXStdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD17ezB4WzAtZl0rfX0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9e3sweFswLWZdK319LCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PXt7MHhbMC1mXSt9fSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPVtbTkVTVEVEX1BBUkFMTEVMX0ZVTkNUSU9OXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9e3sweFswLWZdK319LCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbm9ybWFsLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbm9ybWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmNTdlNwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9ub3JtYWwuYwpAQCAtMCwwICsxLDcwIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1USFJFQURTICVzCisvLyBSRVFVSVJFUzogb21wdAorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisKK2ludCBtYWluKCkKK3sKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgeworICAgIHByaW50X2lkcygwKTsKKyAgICBwcmludF9pZHMoMSk7CisgIH0KKworICAvLyBDSEVDSzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRDpbMC05XStdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD1bW05VTExdXSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUjouK11dCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBlbnN1cmUgdGhhdCB0aGUgd29ya2VyIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGNhbGxlZCBiYXJyaWVyX2VuZCBhbmQgaW1wbGljaXRfdGFza19lbmQgYmVmb3JlIHBhcmFsbGVsX2VuZCEKKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorCisKKyAgLy8gVEhSRUFEUzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTlVMTF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9e3suKn19CisKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9zZXJpYWxpemVkLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvc2VyaWFsaXplZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjY0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvc2VyaWFsaXplZC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCBGaWxlQ2hlY2sgJXMKKy8vIFJFUVVJUkVTOiBvbXB0CisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKworaW50IG1haW4oKQoreworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcygxKQorICB7CisgICAgcHJpbnRfaWRzKDApOworICAgIHByaW50X2lkcygxKTsKKyAgfQorCisgIC8vIENIRUNLOiAwOiBOVUxMX1BPSU5URVI9W1tOVUxMOi4qJF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTlVMTF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT0xLCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSOi4rXV0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2F1dG8uYyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYXV0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDI2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2F1dG8uYwpAQCAtMCwwICsxLDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrICVTL2Jhc2UuaAorLy8gUkVRVUlSRVM6IG9tcHQKKy8vIEdDQyBkb2Vzbid0IGNhbGwgcnVudGltZSBmb3IgYXV0byA9IHN0YXRpYyBzY2hlZHVsZQorLy8gWEZBSUw6IGdjYworCisjZGVmaW5lIFNDSEVEVUxFIGF1dG8KKyNpbmNsdWRlICJiYXNlLmgiCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2F1dG9fc2VyaWFsaXplZC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9hdXRvX3NlcmlhbGl6ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzU2MTY2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9hdXRvX3NlcmlhbGl6ZWQuYwpAQCAtMCwwICsxLDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrICVTL2Jhc2Vfc2VyaWFsaXplZC5oCisvLyBSRVFVSVJFUzogb21wdAorLy8gR0NDIGRvZXNuJ3QgY2FsbCBydW50aW1lIGZvciBhdXRvID0gc3RhdGljIHNjaGVkdWxlCisvLyBYRkFJTDogZ2NjCisKKyNkZWZpbmUgU0NIRURVTEUgYXV0bworI2luY2x1ZGUgImJhc2Vfc2VyaWFsaXplZC5oIgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9iYXNlLmggYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzk4ODc5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9iYXNlLmgKQEAgLTAsMCArMSwzNiBAQAorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSA8b21wLmg+CisKK2ludCBtYWluKCkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIG51bV90aHJlYWRzKDQpIHNjaGVkdWxlKFNDSEVEVUxFKQorICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgIH0KKworICAvLyBDSEVDSzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9e3tbMC05XSt9fSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD1bW05VTExdXSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPXt7Lip9fQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHdvcmtzaGFyZV9mdW5jdGlvbj0weHt7WzAtZl0rfX0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9sb29wX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9sb29wX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCB3b3Jrc2hhcmVfZnVuY3Rpb249MHh7e1swLWZdK319CisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfbG9vcF9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfbG9vcF9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCBwYXJlbnRfdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgd29ya3NoYXJlX2Z1bmN0aW9uPTB4e3tbMC1mXSt9fQorICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHdvcmtzaGFyZV9mdW5jdGlvbj0weHt7WzAtZl0rfX0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9sb29wX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9iYXNlX3NlcmlhbGl6ZWQuaCBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYmFzZV9zZXJpYWxpemVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4YjIyNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYmFzZV9zZXJpYWxpemVkLmgKQEAgLTAsMCArMSwyMSBAQAorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSA8b21wLmg+CisKK2ludCBtYWluKCkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIG51bV90aHJlYWRzKDEpIHNjaGVkdWxlKFNDSEVEVUxFKQorICBmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKSB7CisgIH0KKworICAvLyBDSEVDSzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRDpbMC05XStdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD1bW05VTExdXSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9MSwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPXt7Lit9fQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHdvcmtzaGFyZV9mdW5jdGlvbj0weHt7WzAtZl0rfX0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9sb29wX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9keW5hbWljLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2R5bmFtaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTVhZTEwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9keW5hbWljLmMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlLmgKKy8vIFJFUVVJUkVTOiBvbXB0CisKKyNkZWZpbmUgU0NIRURVTEUgZHluYW1pYworI2luY2x1ZGUgImJhc2UuaCIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvZHluYW1pY19zZXJpYWxpemVkLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2R5bmFtaWNfc2VyaWFsaXplZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODA5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2R5bmFtaWNfc2VyaWFsaXplZC5jCkBAIC0wLDAgKzEsNSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgJVMvYmFzZV9zZXJpYWxpemVkLmgKKy8vIFJFUVVJUkVTOiBvbXB0CisKKyNkZWZpbmUgU0NIRURVTEUgZHluYW1pYworI2luY2x1ZGUgImJhc2Vfc2VyaWFsaXplZC5oIgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ndWlkZWQuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvZ3VpZGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiZmY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvZ3VpZGVkLmMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlLmgKKy8vIFJFUVVJUkVTOiBvbXB0CisKKyNkZWZpbmUgU0NIRURVTEUgZ3VpZGVkCisjaW5jbHVkZSAiYmFzZS5oIgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ndWlkZWRfc2VyaWFsaXplZC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ndWlkZWRfc2VyaWFsaXplZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTA5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2d1aWRlZF9zZXJpYWxpemVkLmMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlX3NlcmlhbGl6ZWQuaAorLy8gUkVRVUlSRVM6IG9tcHQKKworI2RlZmluZSBTQ0hFRFVMRSBndWlkZWQKKyNpbmNsdWRlICJiYXNlX3NlcmlhbGl6ZWQuaCIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvcnVudGltZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ydW50aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmMTYwZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvcnVudGltZS5jCkBAIC0wLDAgKzEsNSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgJVMvYmFzZS5oCisvLyBSRVFVSVJFUzogb21wdAorCisjZGVmaW5lIFNDSEVEVUxFIHJ1bnRpbWUKKyNpbmNsdWRlICJiYXNlLmgiCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3J1bnRpbWVfc2VyaWFsaXplZC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ydW50aW1lX3NlcmlhbGl6ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFkNjdkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ydW50aW1lX3NlcmlhbGl6ZWQuYwpAQCAtMCwwICsxLDUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrICVTL2Jhc2Vfc2VyaWFsaXplZC5oCisvLyBSRVFVSVJFUzogb21wdAorCisjZGVmaW5lIFNDSEVEVUxFIHJ1bnRpbWUKKyNpbmNsdWRlICJiYXNlX3NlcmlhbGl6ZWQuaCIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3Ivc3RhdGljLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3N0YXRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTkwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3N0YXRpYy5jCkBAIC0wLDAgKzEsNyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgJVMvYmFzZS5oCisvLyBSRVFVSVJFUzogb21wdAorLy8gR0NDIGRvZXNuJ3QgY2FsbCBydW50aW1lIGZvciBzdGF0aWMgc2NoZWR1bGUKKy8vIFhGQUlMOiBnY2MKKworI2RlZmluZSBTQ0hFRFVMRSBzdGF0aWMKKyNpbmNsdWRlICJiYXNlLmgiCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3N0YXRpY19zZXJpYWxpemVkLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3N0YXRpY19zZXJpYWxpemVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2MGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3Ivc3RhdGljX3NlcmlhbGl6ZWQuYwpAQCAtMCwwICsxLDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrICVTL2Jhc2Vfc2VyaWFsaXplZC5oCisvLyBSRVFVSVJFUzogb21wdAorLy8gR0NDIGRvZXNuJ3QgY2FsbCBydW50aW1lIGZvciBzdGF0aWMgc2NoZWR1bGUKKy8vIFhGQUlMOiBnY2MKKworI2RlZmluZSBTQ0hFRFVMRSBzdGF0aWMKKyNpbmNsdWRlICJiYXNlX3NlcmlhbGl6ZWQuaCIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX25lc3RlZC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfbmVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczZTA3MgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX25lc3RlZC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyoKKyAqIFRlc3QgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIG5lc3RlZCBwYXJhbGxlbGlzbQorICogQnkgQ2h1bmh1YSBMaWFvLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24KKyAqIE9jdC4gMjAwNQorICovCitpbnQgdGVzdF9vbXBfbmVzdGVkKCkKK3sKKyAgaW50IGNvdW50ZXIgPSAwOworI2lmZGVmIF9PUEVOTVAKKyAgb21wX3NldF9uZXN0ZWQoMSk7CisjZW5kaWYKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQoY291bnRlcikKKyAgeworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgY291bnRlcisrOworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIGNvdW50ZXItLTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChjb3VudGVyICE9IDApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfbmVzdGVkKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9jb3B5aW4uYyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2NvcHlpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGY5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9jb3B5aW4uYwpAQCAtMCwwICsxLDQ3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbigpCit7CisgIGludCBzdW0sIG51bV90aHJlYWRzOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDA7CisgIHN1bTEgPSA3OworICBudW1fdGhyZWFkcyA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgY29weWluKHN1bTEpCisgIHsKKyAgICAvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgIHN1bTEgPSBzdW0xICsgaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgbnVtX3RocmVhZHMrKzsKKyAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMgYi9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4ZTA5ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2RlZmF1bHQuYwpAQCAtMCwwICsxLDQzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9kZWZhdWx0KCkKK3sKKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBteXN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID0wOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQoc2hhcmVkKSBwcml2YXRlKGkpIHByaXZhdGUobXlzdW0pCisgIHsKKyAgICBteXN1bSA9IDA7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgbXlzdW0gPSBteXN1bSArIGk7CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgbXlzdW07CisgICAgfSAgIC8qIGVuZCBvZiBjcml0aWNhbCAqLworICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJLTk9XTl9TVU0gPSAlZDsgU1VNID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZGVmYXVsdCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmVlNzZjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvL3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZSgpCit7CisgIGludCBzdW0sIG51bV90aHJlYWRzLHN1bTE7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0gMDsKKyAgc3VtMT03OworICBudW1fdGhyZWFkcyA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKHN1bTEpCisgIHsKKyAgICAvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgIHN1bTEgPSBzdW0xICsgaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgbnVtX3RocmVhZHMrKzsKKyAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9pZi5jIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJmM2NkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfaWYuYwpAQCAtMCwwICsxLDQwIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9pZigpCit7CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworICBpbnQgbXlzdW07CisgIGludCBjb250cm9sPTE7CisKKyAgc3VtID0wOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIGlmKGNvbnRyb2w9PTApCisgIHsKKyAgICBteXN1bSA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgbXlzdW0gPSBteXN1bSArIGk7CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgbXlzdW07CisgICAgfQorICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9pZigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmMWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMoKQoreworICBpbnQgbnVtX2ZhaWxlZDsKKyAgaW50IHRocmVhZHM7CisgIGludCBudGhyZWFkczsKKyAgaW50IG1heF90aHJlYWRzID0gMDsKKworICBudW1fZmFpbGVkID0gMDsKKworICAvKiBmaXJzdCB3ZSBjaGVjayBob3cgbWFueSB0aHJlYWRzIGFyZSBhdmFpbGFibGUgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIG1hc3RlcgorICAgIG1heF90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgfQorCisgIC8qIHdlIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmcm9tIG9uZSB0byBtYXhpbXVtOiovCisgIGZvcih0aHJlYWRzID0gMTsgdGhyZWFkcyA8PSBtYXhfdGhyZWFkczsgdGhyZWFkcysrKSB7CisgICAgbnRocmVhZHMgPSAwOworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHJlZHVjdGlvbigrOm51bV9mYWlsZWQpIG51bV90aHJlYWRzKHRocmVhZHMpCisgICAgeworICAgICAgbnVtX2ZhaWxlZCA9IG51bV9mYWlsZWQgKyAhKHRocmVhZHMgPT0gb21wX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgbnRocmVhZHMgKz0gMTsKKyAgICB9CisgICAgbnVtX2ZhaWxlZCA9IG51bV9mYWlsZWQgKyAhKG50aHJlYWRzID09IHRocmVhZHMpOworICB9CisgIHJldHVybiAoIW51bV9mYWlsZWQpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3ByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhlODA2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9wcml2YXRlKCkKK3sKKyAgaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPSAwOworICBudW1fdGhyZWFkcyA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShzdW0xKQorICB7CisgICAgaW50IGk7CisgICAgc3VtMSA9IDc7CisgICAgLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICBzdW0xID0gc3VtMSArIGk7CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgIG51bV90aHJlYWRzKys7CisgICAgfQorICB9CisgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDA5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI1NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAgIC8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAgIC8qIDEwISAqLworCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgZG91YmxlIGRzdW07CisgIGRvdWJsZSBka25vd25fc3VtOworICBkb3VibGUgZHQ9MC41OyAvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgIGRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisgIGludCBkaWZmOworICBkb3VibGUgZGRpZmY7CisgIGludCBwcm9kdWN0OworICBpbnQga25vd25fcHJvZHVjdDsKKyAgaW50IGxvZ2ljX2FuZDsKKyAgaW50IGxvZ2ljX29yOworICBpbnQgYml0X2FuZDsKKyAgaW50IGJpdF9vcjsKKyAgaW50IGV4Y2x1c2l2X2JpdF9vcjsKKyAgaW50IGxvZ2ljc1tMT09QQ09VTlRdOworICBpbnQgaTsKKyAgZG91YmxlIGRwdDsKKyAgaW50IHJlc3VsdDsKKworICBzdW0gPTA7CisgIGRzdW09MDsKKyAgcHJvZHVjdD0xOworICBsb2dpY19hbmQ9MTsKKyAgbG9naWNfb3I9MDsKKyAgYml0X2FuZD0xOworICBiaXRfb3I9MDsKKyAgZXhjbHVzaXZfYml0X29yPTA7CisgIHJlc3VsdD0wOworICBkdCA9IDEuLzMuOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisKKyAgLyogVGVzdHMgZm9yIGludGVnZXJzICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6c3VtKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKSB7CisgICAgc3VtPXN1bStpOworICB9CisKKyAgaWYoa25vd25fc3VtIT1zdW0pIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixzdW0sa25vd25fc3VtKTsKKyAgfQorCisgIGRpZmYgPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGlmZikKKyAgZm9yIChpPTE7aTw9TE9PUENPVU5UOysraSkgeworICAgIGRpZmY9ZGlmZi1pOworICB9CisKKyAgaWYoZGlmZiAhPSAwKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKyAgZHN1bT0wOworICBkcHQ9MTsKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigrOmRzdW0pCisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgfQorCisgIGlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworICB9CisKKyAgZHB0PTE7CisKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIGRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGRpZmYpCisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgIH0KKyAgaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAgLyogVGVzdHMgZm9yIHByb2R1Y3Qgb2YgaW50ZWdlcnMgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKjpwcm9kdWN0KQorICBmb3IoaT0xO2k8PU1BWF9GQUNUT1I7aSsrKSB7CisgICAgcHJvZHVjdCAqPSBpOworICB9CisKKyAga25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisgIGlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgIH0KKworICAvKiBUZXN0cyBmb3IgbG9naWNhbCBhbmQgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxLlxuIik7CisgIH0KKworICBsb2dpY19hbmQgPSAxOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBsb2dpY2FsIG9yICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKyAgfQorICBpZihsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKyAgfQorICBsb2dpY19vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKyAgfQorICBpZighbG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyLlxuIik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSBhbmQgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICB9CisgIGlmKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisgIH0KKworICBiaXRfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgfQorICBpZihiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyLlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2Ugb3IgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorICBiaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICB9CisgIGlmKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2UgeG9yICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgfQorICBpZihleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBleGNsdXNpdl9iaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3NoYXJlZC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfc2hhcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0NmNhNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZCgpCit7CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSBzaGFyZWQoc3VtKQorICB7CisKKyAgICBpbnQgbXlzdW0gPSAwOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIG15c3VtID0gbXlzdW0gKyBpOworICAgIH0KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIG15c3VtOworICAgIH0KKworCisgIH0KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9zaGFyZWQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9idWdfbmVzdGVkX3Byb3h5X3Rhc2suYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9idWdfbmVzdGVkX3Byb3h5X3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTk0NzIxCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL2J1Z19uZXN0ZWRfcHJveHlfdGFzay5jCkBAIC0wLDAgKzEsMTMxIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZSAtbHB0aHJlYWQgJiYgJWxpYm9tcC1ydW4KKy8vIFRoZSBydW50aW1lIGN1cnJlbnRseSBkb2VzIG5vdCBnZXQgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmcm9tIEdDQy4KKy8vIFVOU1VQUE9SVEVEOiBnY2MKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisvKgorIFdpdGggdGFzayBkZXBlbmRlbmNpZXMgb25lIGNhbiBnZW5lcmF0ZSBwcm94eSB0YXNrcyBmcm9tIGFuIGV4cGxpY2l0IHRhc2sKKyBiZWluZyBleGVjdXRlZCBieSBhIHNlcmlhbCB0YXNrIHRlYW0uIFRoZSBPcGVuTVAgcnVudGltZSBsaWJyYXJ5IGRpZG4ndAorIGV4cGVjdCB0aGF0IGFuZCB0cmllcyB0byBmcmVlIHRoZSBleHBsaWNpdCB0YXNrIHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGUKKyBwcm94eSB0YXNrIHN0aWxsIHdvcmtpbmcgaW4gYmFja2dyb3VuZC4gSXQgdGhlcmVmb3JlIGhhcyBpbmNvbXBsZXRlIGNoaWxkcmVuCisgd2hpY2ggdHJpZ2dlcnMgYSBkZWJ1Z2dpbmcgYXNzZXJ0aW9uLgorKi8KKworLy8gQ29tcGlsZXItZ2VuZXJhdGVkIGNvZGUgKGVtdWxhdGlvbikKK3R5cGVkZWYgbG9uZyBrbXBfaW50cHRyX3Q7Cit0eXBlZGVmIGludCBrbXBfaW50MzI7CisKK3R5cGVkZWYgY2hhciBib29sOworCit0eXBlZGVmIHN0cnVjdCBpZGVudCB7CisgICAga21wX2ludDMyIHJlc2VydmVkXzE7ICAgLyoqPCAgbWlnaHQgYmUgdXNlZCBpbiBGb3J0cmFuOyBzZWUgYWJvdmUgICovCisgICAga21wX2ludDMyIGZsYWdzOyAgICAgICAgLyoqPCAgYWxzbyBmLmZsYWdzOyBLTVBfSURFTlRfeHh4IGZsYWdzOyBLTVBfSURFTlRfS01QQyBpZGVudGlmaWVzIHRoaXMgdW5pb24gbWVtYmVyICAqLworICAgIGttcF9pbnQzMiByZXNlcnZlZF8yOyAgIC8qKjwgIG5vdCByZWFsbHkgdXNlZCBpbiBGb3J0cmFuIGFueSBtb3JlOyBzZWUgYWJvdmUgKi8KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJ1dCBjdXJyZW50bHkgdXNlZCBmb3Igc3RvcmluZyByZWdpb24tc3BlY2lmaWMgSVRUICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uICovCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIGttcF9pbnQzMiByZXNlcnZlZF8zOyAgIC8qKjwgc291cmNlWzRdIGluIEZvcnRyYW4sIGRvIG5vdCB1c2UgZm9yIEMrKyAgKi8KKyAgICBjaGFyIGNvbnN0ICpwc291cmNlOyAgICAvKio8IFN0cmluZyBkZXNjcmliaW5nIHRoZSBzb3VyY2UgbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHN0cmluZyBpcyBjb21wb3NlZCBvZiBzZW1pLWNvbG9uIHNlcGFyYXRlZCBmaWVsZHMgd2hpY2ggZGVzY3JpYmUgdGhlIHNvdXJjZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBhbmQgYSBwYWlyIG9mIGxpbmUgbnVtYmVycyB0aGF0IGRlbGltaXQgdGhlIGNvbnN0cnVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gaWRlbnRfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGVuZF9pbmZvIHsKKyAgICAga21wX2ludHB0cl90ICAgICAgICAgICAgICAgYmFzZV9hZGRyOworICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgIHN0cnVjdCB7CisgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgIGluOjE7CisgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgIG91dDoxOworICAgICB9IGZsYWdzOworfSBrbXBfZGVwZW5kX2luZm9fdDsKKworc3RydWN0IGttcF90YXNrOwordHlwZWRlZiBrbXBfaW50MzIgKCoga21wX3JvdXRpbmVfZW50cnlfdCkoIGttcF9pbnQzMiwgc3RydWN0IGttcF90YXNrICogKTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2sgeyAgICAgICAgICAgICAgICAgICAvKiBHRUg6IFNob3VsZG4ndCB0aGlzIGJlIGFsaWduZWQgc29tZWhvdz8gKi8KKyAgICB2b2lkICogICAgICAgICAgICAgIHNoYXJlZHM7ICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIGJsb2NrIG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzICAgKi8KKyAgICBrbXBfcm91dGluZV9lbnRyeV90IHJvdXRpbmU7ICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIHJvdXRpbmUgdG8gY2FsbCBmb3IgZXhlY3V0aW5nIHRhc2sgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgIHBhcnRfaWQ7ICAgICAgICAgICAgLyoqPCBwYXJ0IGlkIGZvciB0aGUgdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30ga21wX3Rhc2tfdDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgora21wX2ludDMyICBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0gICggaWRlbnRfdCAqICk7CitrbXBfdGFza190KgorX19rbXBjX29tcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAga21wX3JvdXRpbmVfZW50cnlfdCB0YXNrX2VudHJ5ICk7Cit2b2lkIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZF9vb28gKCBrbXBfdGFza190ICpwdGFzayApOwora21wX2ludDMyIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMgKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICk7CitrbXBfaW50MzIKK19fa21wY19vbXBfdGFzayggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzayApOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwordm9pZCAqdGFyZ2V0KHZvaWQgKnRhc2spCit7CisgICAgbXlfc2xlZXAoIDAuMSApOworICAgIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZF9vb28oKGttcF90YXNrX3QqKSB0YXNrKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworcHRocmVhZF90IHRhcmdldF90aHJlYWQ7CisKKy8vIFVzZXIncyBjb2RlCitpbnQgdGFza19lbnRyeShrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaykKK3sKKyAgICBwdGhyZWFkX2NyZWF0ZSgmdGFyZ2V0X3RocmVhZCwgTlVMTCwgJnRhcmdldCwgdGFzayk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgICBpbnQgZGVwOworCisjcHJhZ21hIG9tcCB0YXNrZ3JvdXAKK3sKKy8qCisgKiAgQ29ycmVzcG9uZHMgdG86CisgICAgI3ByYWdtYSBvbXAgdGFyZ2V0IG5vd2FpdCBkZXBlbmQob3V0OiBkZXApCisgICAgeworICAgICAgICBteV9zbGVlcCggMC4xICk7CisgICAgfQorKi8KKyAgICBrbXBfZGVwZW5kX2luZm9fdCBkZXBfaW5mbzsKKyAgICBkZXBfaW5mby5iYXNlX2FkZHIgPSAobG9uZykgJmRlcDsKKyAgICBkZXBfaW5mby5sZW4gPSBzaXplb2YoaW50KTsKKyAgICAvLyBvdXQgPSBpbm91dCBwZXIgc3BlYyBhbmQgcnVudGltZSBleHBlY3RzIHRoaXMKKyAgICBkZXBfaW5mby5mbGFncy5pbiA9IDE7CisgICAgZGVwX2luZm8uZmxhZ3Mub3V0ID0gMTsKKworICAgIGttcF9pbnQzMiBndGlkID0gX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKE5VTEwpOworICAgIGttcF90YXNrX3QgKnByb3h5X3Rhc2sgPSBfX2ttcGNfb21wX3Rhc2tfYWxsb2MoTlVMTCxndGlkLDE3LHNpemVvZihrbXBfdGFza190KSwwLCZ0YXNrX2VudHJ5KTsKKyAgICBfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKE5VTEwsZ3RpZCxwcm94eV90YXNrLDEsJmRlcF9pbmZvLDAsTlVMTCk7CisKKyAgICAjcHJhZ21hIG9tcCB0YXNrIGRlcGVuZChpbjogZGVwKQorICAgIHsKKy8qCisgKiAgICAgIENvcnJlc3BvbmRzIHRvOgorICAgICAgICAjcHJhZ21hIG9tcCB0YXJnZXQgbm93YWl0IGRlcGVuZChvdXQ6IGRlcCkKKyAgICAgICAgeworICAgICAgICAgICAgbXlfc2xlZXAoIDAuMSApOworICAgICAgICB9CisqLworICAgICAgICBrbXBfdGFza190ICpuZXN0ZWRfcHJveHlfdGFzayA9IF9fa21wY19vbXBfdGFza19hbGxvYyhOVUxMLGd0aWQsMTcsc2l6ZW9mKGttcF90YXNrX3QpLDAsJnRhc2tfZW50cnkpOworICAgICAgICBfX2ttcGNfb21wX3Rhc2soTlVMTCxndGlkLG5lc3RlZF9wcm94eV90YXNrKTsKKyAgICB9Cit9CisKKyAgICAvLyBvbmx5IGNoZWNrIHRoYXQgaXQgZGlkbid0IGNyYXNoCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvYnVnX3Byb3h5X3Rhc2tfZGVwX3dhaXRpbmcuYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9idWdfcHJveHlfdGFza19kZXBfd2FpdGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZGQ4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvYnVnX3Byb3h5X3Rhc2tfZGVwX3dhaXRpbmcuYwpAQCAtMCwwICsxLDEzNCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgLWxwdGhyZWFkICYmICVsaWJvbXAtcnVuCisvLyBUaGUgcnVudGltZSBjdXJyZW50bHkgZG9lcyBub3QgZ2V0IGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZnJvbSBHQ0MuCisvLyBVTlNVUFBPUlRFRDogZ2NjCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworLyoKKyBBbiBleHBsaWNpdCB0YXNrIGNhbiBoYXZlIGEgZGVwZW5kZW5jeSBvbiBhIHRhcmdldCB0YXNrLiBJZiBpdCBpcyBub3QKKyBkaXJlY3RseSBzYXRpc2ZpZWQsIHRoZSBydW50aW1lIHNob3VsZCBub3Qgd2FpdCBidXQgcmVzdW1lIGV4ZWN1dGlvbi4KKyovCisKKy8vIENvbXBpbGVyLWdlbmVyYXRlZCBjb2RlIChlbXVsYXRpb24pCit0eXBlZGVmIGxvbmcga21wX2ludHB0cl90OwordHlwZWRlZiBpbnQga21wX2ludDMyOworCit0eXBlZGVmIGNoYXIgYm9vbDsKKwordHlwZWRlZiBzdHJ1Y3QgaWRlbnQgeworICAgIGttcF9pbnQzMiByZXNlcnZlZF8xOyAgIC8qKjwgIG1pZ2h0IGJlIHVzZWQgaW4gRm9ydHJhbjsgc2VlIGFib3ZlICAqLworICAgIGttcF9pbnQzMiBmbGFnczsgICAgICAgIC8qKjwgIGFsc28gZi5mbGFnczsgS01QX0lERU5UX3h4eCBmbGFnczsgS01QX0lERU5UX0tNUEMgaWRlbnRpZmllcyB0aGlzIHVuaW9uIG1lbWJlciAgKi8KKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMjsgICAvKio8ICBub3QgcmVhbGx5IHVzZWQgaW4gRm9ydHJhbiBhbnkgbW9yZTsgc2VlIGFib3ZlICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBidXQgY3VycmVudGx5IHVzZWQgZm9yIHN0b3JpbmcgcmVnaW9uLXNwZWNpZmljIElUVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMzsgICAvKio8IHNvdXJjZVs0XSBpbiBGb3J0cmFuLCBkbyBub3QgdXNlIGZvciBDKysgICovCisgICAgY2hhciBjb25zdCAqcHNvdXJjZTsgICAgLyoqPCBTdHJpbmcgZGVzY3JpYmluZyB0aGUgc291cmNlIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdHJpbmcgaXMgY29tcG9zZWQgb2Ygc2VtaS1jb2xvbiBzZXBhcmF0ZWQgZmllbGRzIHdoaWNoIGRlc2NyaWJlIHRoZSBzb3VyY2UgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24gYW5kIGEgcGFpciBvZiBsaW5lIG51bWJlcnMgdGhhdCBkZWxpbWl0IHRoZSBjb25zdHJ1Y3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IGlkZW50X3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9kZXBlbmRfaW5mbyB7CisgICAgIGttcF9pbnRwdHJfdCAgICAgICAgICAgICAgIGJhc2VfYWRkcjsKKyAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgbGVuOworICAgICBzdHJ1Y3QgeworICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICBpbjoxOworICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICBvdXQ6MTsKKyAgICAgfSBmbGFnczsKK30ga21wX2RlcGVuZF9pbmZvX3Q7CisKK3N0cnVjdCBrbXBfdGFzazsKK3R5cGVkZWYga21wX2ludDMyICgqIGttcF9yb3V0aW5lX2VudHJ5X3QpKCBrbXBfaW50MzIsIHN0cnVjdCBrbXBfdGFzayAqICk7CisKK3R5cGVkZWYgc3RydWN0IGttcF90YXNrIHsgICAgICAgICAgICAgICAgICAgLyogR0VIOiBTaG91bGRuJ3QgdGhpcyBiZSBhbGlnbmVkIHNvbWVob3c/ICovCisgICAgdm9pZCAqICAgICAgICAgICAgICBzaGFyZWRzOyAgICAgICAgICAgIC8qKjwgcG9pbnRlciB0byBibG9jayBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFycyAgICovCisgICAga21wX3JvdXRpbmVfZW50cnlfdCByb3V0aW5lOyAgICAgICAgICAgIC8qKjwgcG9pbnRlciB0byByb3V0aW5lIHRvIGNhbGwgZm9yIGV4ZWN1dGluZyB0YXNrICovCisgICAga21wX2ludDMyICAgICAgICAgICBwYXJ0X2lkOyAgICAgICAgICAgIC8qKjwgcGFydCBpZCBmb3IgdGhlIHRhc2sgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IGttcF90YXNrX3Q7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2ttcF9pbnQzMiAgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtICAoIGlkZW50X3QgKiApOwora21wX3Rhc2tfdCoKK19fa21wY19vbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApOwordm9pZCBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWRfb29vICgga21wX3Rhc2tfdCAqcHRhc2sgKTsKK2ttcF9pbnQzMiBfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzICggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApOwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2soIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2sgKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK3ZvaWQgKnRhcmdldCh2b2lkICp0YXNrKQoreworICAgIG15X3NsZWVwKCAwLjEgKTsKKyAgICBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWRfb29vKChrbXBfdGFza190KikgdGFzayk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3B0aHJlYWRfdCB0YXJnZXRfdGhyZWFkOworCisvLyBVc2VyJ3MgY29kZQoraW50IHRhc2tfZW50cnkoa21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2spCit7CisgICAgcHRocmVhZF9jcmVhdGUoJnRhcmdldF90aHJlYWQsIE5VTEwsICZ0YXJnZXQsIHRhc2spOworICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbigpCit7CisgICAgaW50IGRlcDsKKworLyoKKyAqICBDb3JyZXNwb25kcyB0bzoKKyAgICAjcHJhZ21hIG9tcCB0YXJnZXQgbm93YWl0IGRlcGVuZChvdXQ6IGRlcCkKKyAgICB7CisgICAgICAgIG15X3NsZWVwKCAwLjEgKTsKKyAgICB9CisqLworICAgIGttcF9kZXBlbmRfaW5mb190IGRlcF9pbmZvOworICAgIGRlcF9pbmZvLmJhc2VfYWRkciA9IChsb25nKSAmZGVwOworICAgIGRlcF9pbmZvLmxlbiA9IHNpemVvZihpbnQpOworICAgIC8vIG91dCA9IGlub3V0IHBlciBzcGVjIGFuZCBydW50aW1lIGV4cGVjdHMgdGhpcworICAgIGRlcF9pbmZvLmZsYWdzLmluID0gMTsKKyAgICBkZXBfaW5mby5mbGFncy5vdXQgPSAxOworCisgICAga21wX2ludDMyIGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oTlVMTCk7CisgICAga21wX3Rhc2tfdCAqcHJveHlfdGFzayA9IF9fa21wY19vbXBfdGFza19hbGxvYyhOVUxMLGd0aWQsMTcsc2l6ZW9mKGttcF90YXNrX3QpLDAsJnRhc2tfZW50cnkpOworICAgIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMoTlVMTCxndGlkLHByb3h5X3Rhc2ssMSwmZGVwX2luZm8sMCxOVUxMKTsKKworICAgIGludCBmaXJzdF90YXNrX2ZpbmlzaGVkID0gMDsKKyAgICAjcHJhZ21hIG9tcCB0YXNrIHNoYXJlZChmaXJzdF90YXNrX2ZpbmlzaGVkKSBkZXBlbmQoaW5vdXQ6IGRlcCkKKyAgICB7CisgICAgICAgIGZpcnN0X3Rhc2tfZmluaXNoZWQgPSAxOworICAgIH0KKworICAgIGludCBzZWNvbmRfdGFza19maW5pc2hlZCA9IDA7CisgICAgI3ByYWdtYSBvbXAgdGFzayBzaGFyZWQoc2Vjb25kX3Rhc2tfZmluaXNoZWQpIGRlcGVuZChpbjogZGVwKQorICAgIHsKKyAgICAgICAgc2Vjb25kX3Rhc2tfZmluaXNoZWQgPSAxOworICAgIH0KKworICAgIC8vIGNoZWNrIHRoYXQgZXhlY3V0aW9uIGhhcyBiZWVuIHJlc3VtZWQgYW5kIHRoZSBydW50aW1lIGhhcyBub3Qgd2FpdGVkCisgICAgLy8gZm9yIHRoZSBkZXBlbmRlbmNpZXMgdG8gYmUgc2F0aXNmaWVkLgorICAgIGludCBlcnJvciA9IChmaXJzdF90YXNrX2ZpbmlzaGVkID09IDEpOworICAgIGVycm9yICs9IChzZWNvbmRfdGFza19maW5pc2hlZCA9PSAxKTsKKworICAgICNwcmFnbWEgb21wIHRhc2t3YWl0CisKKyAgICAvLyBieSBub3cgYWxsIHRhc2tzIHNob3VsZCBoYXZlIGZpbmlzaGVkCisgICAgZXJyb3IgKz0gKGZpcnN0X3Rhc2tfZmluaXNoZWQgIT0gMSk7CisgICAgZXJyb3IgKz0gKHNlY29uZF90YXNrX2ZpbmlzaGVkICE9IDEpOworCisgICAgcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL2J1Z19zZXJpYWxfdGFza2dyb3VwLmMgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvYnVnX3NlcmlhbF90YXNrZ3JvdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTBiYzkwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL2J1Z19zZXJpYWxfdGFza2dyb3VwLmMKQEAgLTAsMCArMSwxNiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorCisvKgorIEdDQyBmYWlsZWQgdGhpcyB0ZXN0IGJlY2F1c2UgX19rbXBfZ2V0X2d0aWQoKSBpbnN0ZWFkIG9mIF9fa21wX2VudHJ5X2d0aWQoKQorIHdhcyBjYWxsZWQgaW4geGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfU1RBUlQpKHZvaWQpLgorIF9fa21wX2VudHJ5X2d0aWQoKSB3aWxsIGluaXRpYWxpemUgdGhlIHJ1bnRpbWUgaWYgbm90IHlldCBkb25lIHdoaWNoIGRvZXMgbm90CisgaGFwcGVuIHdpdGggX19rbXBfZ2V0X2d0aWQoKS4KKyAqLworCitpbnQgbWFpbigpCit7CisgICAgI3ByYWdtYSBvbXAgdGFza2dyb3VwCisgICAgeyB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9rbXBfdGFza2xvb3AuYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9rbXBfdGFza2xvb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjMxOGJkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL2ttcF90YXNrbG9vcC5jCkBAIC0wLDAgKzEsMTU4IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBOIDQKKyNkZWZpbmUgR1JBSU4gMTAKKyNkZWZpbmUgU1RSSURFIDMKKworLy8gZ2xvYmFscworaW50IHRoX2NvdW50ZXJbTl07CitpbnQgY291bnRlcjsKKworCisvLyBDb21waWxlci1nZW5lcmF0ZWQgY29kZSAoZW11bGF0aW9uKQordHlwZWRlZiBzdHJ1Y3QgaWRlbnQgeworICAgIHZvaWQqIGR1bW15OworfSBpZGVudF90OworCit0eXBlZGVmIHN0cnVjdCBzaGFyIHsKKyAgICBpbnQoKnB0aF9jb3VudGVyKVtOXTsKKyAgICBpbnQgKnBjb3VudGVyOworICAgIGludCAqcGo7Cit9ICpwc2hhcmVkczsKKwordHlwZWRlZiBzdHJ1Y3QgdGFzayB7CisgICAgcHNoYXJlZHMgc2hhcmVkczsKKyAgICBpbnQoKiByb3V0aW5lKShpbnQsc3RydWN0IHRhc2sqKTsKKyAgICBpbnQgcGFydF9pZDsKKy8vIHByaXZhdGVzOgorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBsYjsgLy8gbGlicmFyeSBhbHdheXMgdXNlcyBVTE9ORworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1YjsKKyAgICBpbnQgc3Q7CisgICAgaW50IGxhc3Q7CisgICAgaW50IGk7CisgICAgaW50IGo7CisgICAgaW50IHRoOworfSAqcHRhc2ssIGttcF90YXNrX3Q7CisKK3R5cGVkZWYgaW50KCogdGFza19lbnRyeV90KSggaW50LCBwdGFzayApOworCit2b2lkCitfX3Rhc2tfZHVwX2VudHJ5KHB0YXNrIHRhc2tfZHN0LCBwdGFzayB0YXNrX3NyYywgaW50IGxhc3Rwcml2KQoreworLy8gc2V0dXAgbGFzdHByaXZhdGUgZmxhZworICAgIHRhc2tfZHN0LT5sYXN0ID0gbGFzdHByaXY7CisvLyBjb3VsZCBiZSBjb25zdHJ1Y3RvciBjYWxscyBoZXJlLi4uCit9CisKKworLy8gT3Blbk1QIFJUTCBpbnRlcmZhY2VzCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBrbXBfdWludDY0OwordHlwZWRlZiBsb25nIGxvbmcga21wX2ludDY0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCit2b2lkCitfX2ttcGNfdGFza2xvb3AoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywgaW50IGlmX3ZhbCwKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpsYiwga21wX3VpbnQ2NCAqdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICBpbnQgbm9ncm91cCwgaW50IHNjaGVkLCBrbXBfaW50NjQgZ3JhaW5zaXplLCB2b2lkICp0YXNrX2R1cCApOworcHRhc2sKK19fa21wY19vbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICB0YXNrX2VudHJ5X3QgdGFza19lbnRyeSApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQodm9pZCAqaWRfcmVmLCBpbnQgZ3RpZCwgaW50ICogbGhzLCBpbnQgcmhzKTsKK2ludCAgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKHZvaWQgKmlkX3JlZik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKy8vIFVzZXIncyBjb2RlCitpbnQgdGFza19lbnRyeShpbnQgZ3RpZCwgcHRhc2sgdGFzaykKK3sKKyAgICBwc2hhcmVkcyBwc2hhciA9IHRhc2stPnNoYXJlZHM7CisgICAgZm9yKCB0YXNrLT5pID0gdGFzay0+bGI7IHRhc2stPmkgPD0gKGludCl0YXNrLT51YjsgdGFzay0+aSArPSB0YXNrLT5zdCApIHsKKyAgICAgICAgdGFzay0+dGggPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkKE5VTEwsZ3RpZCxwc2hhci0+cGNvdW50ZXIsMSk7CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZChOVUxMLGd0aWQsJigoKnBzaGFyLT5wdGhfY291bnRlcilbdGFzay0+dGhdKSwxKTsKKyAgICAgICAgdGFzay0+aiA9IHRhc2stPmk7CisgICAgfQorICAgIG15X3NsZWVwKCAwLjEgKTsgLy8gc2xlZXAgMTAwIG1zIGluIG9yZGVyIHRvIGFsbG93IG90aGVyIHRocmVhZHMgdG8gc3RlYWwgdGFza3MKKyAgICBpZiggdGFzay0+bGFzdCApIHsKKyAgICAgICAgKihwc2hhci0+cGopID0gdGFzay0+ajsgLy8gbGFzdHByaXZhdGUKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgICBpbnQgaSwgaiwgZ3RpZCA9IF9fa21wY19nbG9iYWxfdGhyZWFkX251bShOVUxMKTsKKyAgICBwdGFzayB0YXNrOworICAgIHBzaGFyZWRzIHBzaDsKKyAgICBvbXBfc2V0X2R5bmFtaWMoMCk7CisgICAgY291bnRlciA9IDA7CisgICAgZm9yKCBpPTA7IGk8TjsgKytpICkKKyAgICAgICAgdGhfY291bnRlcltpXSA9IDA7CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoTikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBtYXN0ZXIKKyAgICAgIHsKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oTlVMTCk7CisvKgorICogIFRoaXMgaXMgd2hhdCB0aGUgT3Blbk1QIHJ1bnRpbWUgY2FsbHMgY29ycmVzcG9uZCB0bzoKKyAgICAjcHJhZ21hIG9tcCB0YXNrbG9vcCBudW1fdGFza3MoTikgbGFzdHByaXZhdGUoaikKKyAgICBmb3IoIGk9MDsgaTxOKkdSQUlOKlNUUklERS0xOyBpKz1TVFJJREUgKQorICAgIHsKKyAgICAgICAgaW50IHRoID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgICAgIHRoX2NvdW50ZXJbdGhdKys7CisgICAgICAgIGogPSBpOworICAgIH0KKyovCisgICAgdGFzayA9IF9fa21wY19vbXBfdGFza19hbGxvYyhOVUxMLGd0aWQsMSxzaXplb2Yoc3RydWN0IHRhc2spLHNpemVvZihzdHJ1Y3Qgc2hhciksJnRhc2tfZW50cnkpOworICAgIHBzaCA9IHRhc2stPnNoYXJlZHM7CisgICAgcHNoLT5wdGhfY291bnRlciA9ICZ0aF9jb3VudGVyOworICAgIHBzaC0+cGNvdW50ZXIgPSAmY291bnRlcjsKKyAgICBwc2gtPnBqID0gJmo7CisgICAgdGFzay0+bGIgPSAwOworICAgIHRhc2stPnViID0gTipHUkFJTipTVFJJREUtMjsKKyAgICB0YXNrLT5zdCA9IFNUUklERTsKKworICAgIF9fa21wY190YXNrbG9vcCgKKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgLy8gbG9jYXRpb24KKyAgICAgICAgZ3RpZCwgICAgICAgICAgICAgLy8gZ3RpZAorICAgICAgICB0YXNrLCAgICAgICAgICAgICAvLyB0YXNrIHN0cnVjdHVyZQorICAgICAgICAxLCAgICAgICAgICAgICAgICAvLyBpZiBjbGF1c2UgdmFsdWUKKyAgICAgICAgJnRhc2stPmxiLCAgICAgICAgLy8gbG93ZXIgYm91bmQKKyAgICAgICAgJnRhc2stPnViLCAgICAgICAgLy8gdXBwZXIgYm91bmQKKyAgICAgICAgU1RSSURFLCAgICAgICAgICAgLy8gbG9vcCBpbmNyZW1lbnQKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gMSBpZiBub2dyb3VwIHNwZWNpZmllZAorICAgICAgICAyLCAgICAgICAgICAgICAgICAvLyBzY2hlZHVsZSB0eXBlOiAwLW5vbmUsIDEtZ3JhaW5zaXplLCAyLW51bV90YXNrcworICAgICAgICBOLCAgICAgICAgICAgICAgICAvLyBzY2hlZHVsZSB2YWx1ZSAoaWdub3JlZCBmb3IgdHlwZSAwKQorICAgICAgICAodm9pZCopJl9fdGFza19kdXBfZW50cnkgLy8gdGFza3MgZHVwbGljYXRpb24gcm91dGluZQorICAgICAgICApOworICAgICAgfSAvLyBlbmQgbWFzdGVyCisgICAgfSAvLyBlbmQgcGFyYWxsZWwKKy8vIGNoZWNrIHJlc3VsdHMKKyAgICBpZiggaiAhPSBOKkdSQUlOKlNUUklERS1TVFJJREUgKSB7CisgICAgICAgIHByaW50ZigiRXJyb3IgaW4gbGFzdHByaXZhdGUsICVkICE9ICVkXG4iLGosTipHUkFJTipTVFJJREUtU1RSSURFKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCBjb3VudGVyICE9IE4qR1JBSU4gKSB7CisgICAgICAgIHByaW50ZigiRXJyb3IsIGNvdW50ZXIgJWQgIT0gJWRcbiIsY291bnRlcixOKkdSQUlOKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGZvciggaT0wOyBpPE47ICsraSApIHsKKyAgICAgICAgaWYoIHRoX2NvdW50ZXJbaV0gJSBHUkFJTiApIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3IsIHRoX2NvdW50ZXJbJWRdID0gJWRcbiIsaSx0aF9jb3VudGVyW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIHByaW50ZigicGFzc2VkXG4iKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9uZXN0ZWRfcGFyYWxsZWxfdGFza2luZy5jIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL25lc3RlZF9wYXJhbGxlbF90YXNraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3NGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9uZXN0ZWRfcGFyYWxsZWxfdGFza2luZy5jCkBAIC0wLDAgKzEsMzIgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKgorICogVGhpcyB0ZXN0IHdvdWxkIGhhbmcgd2hlbiBsZXZlbCBpbnN0ZWFkIG9mIGFjdGl2ZSBsZXZlbAorICogdXNlZCB0byBwdXNoIHRhc2sgc3RhdGUuCisgKi8KKworaW50IG1haW4oKQoreworICAvLyBJZiBudW1fdGhyZWFkcyBpcyBjaGFuZ2VkIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDEsIHRoZW4gdGhlIHRlc3QgcGFzc2VzCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKDEpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHByaW50ZigiSGVsbG8gV29ybGQgZnJvbSB0aHJlYWQgJWRcbiIsIG9tcF9nZXRfdGhyZWFkX251bSgpKTsKKyAgfQorCisgIHByaW50Zigib21wX251bV90aHJlYWRzOiAlZFxuIiwgb21wX2dldF9tYXhfdGhyZWFkcygpKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgbWFzdGVyCisgICAgI3ByYWdtYSBvbXAgdGFzayBkZWZhdWx0KG5vbmUpCisgICAgeworICAgICAgcHJpbnRmKCIlZCBpcyBleGVjdXRpbmcgdGhpcyB0YXNrXG4iLCBvbXBfZ2V0X3RocmVhZF9udW0oKSk7CisgICAgfQorICB9CisKKyAgcHJpbnRmKCJwYXNzXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvbmVzdGVkX3Rhc2tfY3JlYXRpb24uYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9uZXN0ZWRfdGFza19jcmVhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YzI1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvbmVzdGVkX3Rhc2tfY3JlYXRpb24uYwpAQCAtMCwwICsxLDM1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworLyoKKyAqIFRoaXMgdGVzdCBjcmVhdGVzIHRhc2tzIHRoYXQgdGhlbXNlbHZlcyBjcmVhdGUgYSBuZXcgdGFzay4KKyAqIFRoZSBydW50aW1lIGhhcyB0byB0YWtlIGNhcmUgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHkgZnJlZWQuCisgKi8KKworaW50IG1haW4oKQoreworICAjcHJhZ21hIG9tcCB0YXNrCisgIHsKKyAgICAjcHJhZ21hIG9tcCB0YXNrCisgICAgeworICAgICAgbXlfc2xlZXAoIDAuMSApOworICAgIH0KKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKDIpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAjcHJhZ21hIG9tcCB0YXNrCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgdGFzaworICAgICAgeworICAgICAgICBteV9zbGVlcCggMC4xICk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpbnRmKCJwYXNzXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2suYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzRhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2suYwpAQCAtMCwwICsxLDUyIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+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+IDEpCisgICAgICAgIGV4cGVjdGVkX2NodW5rX3NpemUgPSBjICogb3BlbndvcmsgLyB0aHJlYWRzOworI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJThkXHQlOGRcdCVsZlxuIiwgY2h1bmtzaXplc1tpXSwKKyAgICAgICAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSwgYyAqIGNodW5rc2l6ZXNbaV0vZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisjZW5kaWYKKyAgICAgIC8qIGNoZWNrIGlmIGNodW5rc2l6ZSBpcyBpbnNpZGUgdGhlIHJvdW5kaW5nIGVycm9ycyAqLworICAgICAgaWYgKGFicyAoY2h1bmtzaXplc1tpXSAtIGV4cGVjdGVkX2NodW5rX3NpemUpID49IDIpIHsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyNpZm5kZWYgVkVSQk9TRQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNodW5rc2l6ZSBkaWZmZXJlZCBmcm9tIGV4cGVjdGVkICIKKyAgICAgICAgICAidmFsdWU6ICVkIGluc3RlYWQgb2YgJWRcbiIsIGNodW5rc2l6ZXNbaV0sCisgICAgICAgICAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgICB9IC8qIGVuZCBpZiAqLworCisjaWZuZGVmIFZFUkJPU0UKKyAgICAgIGlmIChleHBlY3RlZF9jaHVua19zaXplIC0gY2h1bmtzaXplc1tpXSA8IDApCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2h1bmtzaXplIGRpZCBub3QgZGVjcmVhc2U6ICVkIgorICAgICAgICAgICIgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSxleHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCisgICAgICAvKiBjYWxjdWxhdGluZyB0aGUgcmVtYWluaW5nIGFtb3VudCBvZiB3b3JrICovCisgICAgICBvcGVud29yayAtPSBjaHVua3NpemVzW2ldOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9ydW50aW1lLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX3J1bnRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTU3ZmMzCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9ydW50aW1lLmMKQEAgLTAsMCArMSw4MiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1zdGF0aWMgJWxpYm9tcC1ydW4gMSAwCisvLyBSVU46IGVudiBPTVBfU0NIRURVTEU9c3RhdGljLDEwICVsaWJvbXAtcnVuIDEgMTAKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1keW5hbWljICVsaWJvbXAtcnVuIDIgMQorLy8gUlVOOiBlbnYgT01QX1NDSEVEVUxFPWR5bmFtaWMsMTEgJWxpYm9tcC1ydW4gMiAxMQorLy8gUlVOOiBlbnYgT01QX1NDSEVEVUxFPWd1aWRlZCAlbGlib21wLXJ1biAzIDEKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1ndWlkZWQsMTIgJWxpYm9tcC1ydW4gMyAxMgorLy8gUlVOOiBlbnYgT01QX1NDSEVEVUxFPWF1dG8gJWxpYm9tcC1ydW4gNCAxCisvLyBSVU46IGVudiBPTVBfU0NIRURVTEU9dHJhcGV6b2lkYWwgJWxpYm9tcC1ydW4gMTAxIDEKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT10cmFwZXpvaWRhbCwxMyAlbGlib21wLXJ1biAxMDEgMTMKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1zdGF0aWNfc3RlYWwgJWxpYm9tcC1ydW4gMTAyIDEKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1zdGF0aWNfc3RlYWwsMTQgJWxpYm9tcC1ydW4gMTAyIDE0CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtOworY2hhciogY29ycmVjdF9raW5kX3N0cmluZzsKK29tcF9zY2hlZF90IGNvcnJlY3Rfa2luZDsKK2ludCBjb3JyZWN0X2NodW5rX3NpemU7CisKK2ludCB0ZXN0X29tcF9mb3JfcnVudGltZSgpCit7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGludCBjaHVua19zaXplOworICBpbnQgZXJyb3I7CisgIG9tcF9zY2hlZF90IGtpbmQ7CisKKyAgc3VtID0gMDsKKyAgZXJyb3IgPSAwOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIG9tcF9nZXRfc2NoZWR1bGUoJmtpbmQsICZjaHVua19zaXplKTsKKworICBwcmludGYoIm9tcF9nZXRfc2NoZWR1bGUoKSByZXR1cm5zOiBTY2hlZHVsZSA9ICVkLCBDaHVuayBTaXplID0gJWRcbiIsCisgICAgICAgICBraW5kLCBjaHVua19zaXplKTsKKyAgaWYgKGtpbmQgIT0gY29ycmVjdF9raW5kKSB7CisgICAgcHJpbnRmKCJraW5kKCVkKSAhPSBjb3JyZWN0X2tpbmQoJWQpXG4iLCBraW5kLCBjb3JyZWN0X2tpbmQpOworICAgIGVycm9yID0gMTsKKyAgfQorICBpZiAoY2h1bmtfc2l6ZSAhPSBjb3JyZWN0X2NodW5rX3NpemUpIHsKKyAgICBwcmludGYoImNodW5rX3NpemUoJWQpICE9IGNvcnJlY3RfY2h1bmtfc2l6ZSglZClcbiIsIGNodW5rX3NpemUsCisgICAgICAgICAgIGNvcnJlY3RfY2h1bmtfc2l6ZSk7CisgICAgZXJyb3IgPSAxOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShydW50aW1lKQorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtKz1pOworICAgIH0KKyAgfQorICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworICAgIHByaW50ZigiS25vd24gU3VtID0gJWQsIENhbGN1bGF0ZWQgU3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgICBlcnJvciA9IDE7CisgIH0KKyAgcmV0dXJuICFlcnJvcjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKyAgaWYgKGFyZ2MgIT0gMykgeworICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIHNjaGVkdWxlX2tpbmQgY2h1bmtfc2l6ZVxuIiwgYXJndlswXSk7CisgICAgZnByaW50ZihzdGRlcnIsICIgIFJ1biB3aXRoIGVudmlyYWJsZSBPTVBfU0NIRURVTEU9a2luZFssY2h1bmtfc2l6ZV1cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGNvcnJlY3Rfa2luZCA9IGF0b2koYXJndlsxXSk7CisgIGNvcnJlY3RfY2h1bmtfc2l6ZSA9IGF0b2koYXJndlsyXSk7CisKKyAgZm9yIChpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZiAoIXRlc3Rfb21wX2Zvcl9ydW50aW1lKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDZhNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYwpAQCAtMCwwICsxLDE1NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYygpCit7CisgIGludCB0aHJlYWRzOworICBpbnQgaSxsYXN0dGlkOworICBpbnQgKiB0aWRzOworICBpbnQgbm90b3V0OworICBpbnQgbWF4aXRlcjsKKyAgaW50IGNodW5rX3NpemU7CisgIGludCBjb3VudGVyID0gMDsKKyAgaW50IHRtcF9jb3VudD0xOworICBpbnQgbGFzdHRocmVhZHNzdGFydHRpZCA9IC0xOworICBpbnQgcmVzdWx0ID0gMTsKKworICBjaHVua19zaXplID0gNzsKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG5vdG91dCA9IDE7CisgIG1heGl0ZXIgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzLGNvdW50ZXIpCisgIHsgIC8qIGJlZ2luIG9mIHBhcmFsbGVsKi8KKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9ICAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGlmICh0aHJlYWRzIDwgMikgeworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMoMik7CisgICAgdGhyZWFkcyA9IDI7CisgIH0KKyAgZnByaW50ZiAoc3RkZXJyLCJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAlZFxuVXNpbmcgYSBzcGVjaWZpZWQiCisgICAgIiBjaHVua3NpemUgb2YgJWRcbiIsIENGU01BWF9TSVpFLCBjaHVua19zaXplKTsKKyAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsgIC8qIHNldHRpbmcgZW5kZmxhZyAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgeyAvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgIGRvdWJsZSBjb3VudDsKKyAgICBpbnQgdGlkOworICAgIGludCBqOworCisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisgICAgI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCBzY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSkKKyAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKSB7CisgICAgICBjb3VudCA9IDAuOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKyAgICAgIGlmIChqID4gbWF4aXRlcikgeworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgbWF4aXRlciA9IGo7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qcHJpbnRmICgidGhyZWFkICVkIHNsZWVwaW5nXG4iLCB0aWQpOyovCisgICAgICB3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkgeworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgIGNvdW50ICs9IFNMRUVQVElNRTsKKyAgICAgICAgcHJpbnRmKCIuIik7CisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgaWYgKGNvdW50ID4gMC4pIHByaW50ZigiIHdhaXRlZCAlbGYgc1xuIiwgY291bnQpOworI2VuZGlmCisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworICAgICAgdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisgICAgICBwcmludGYoIiVkIGZpbmlzaGVkIGJ5ICVkXG4iLGosdGlkKTsKKyNlbmRpZgorICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIG5vdG91dCA9IDA7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyoqKiogYW5hbHlzaW5nIHRoZSBkYXRhIGluIGFycmF5IHRpZHMgKioqKi8KKworICBsYXN0dGlkID0gdGlkc1swXTsKKyAgdG1wX2NvdW50ID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZTTUFYX1NJWkUgKyAxOyArK2kpIHsKKyAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgaWYgKHRpZHNbaV0gPT0gbGFzdHRpZCkgeworICAgICAgdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLiBXaGVuIGZpbmRpbmcKKyAgICAgKiB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4KKyAgICAgKi8KKyAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisgICAgICAvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKyAgICAgIGlmICh0bXBfY291bnQgPT0gY2h1bmtfc2l6ZSkgeworICAgICAgICB0bXBfY291bnQgPSAxOworICAgICAgICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9LXG4iKTsKKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSWYgdGhlIGNodW5rIHNpemUgd2FzIHdyb25nLCBjaGVjayBpZiB0aGUgZW5kIHdhcyByZWFjaGVkICovCisgICAgICAgIGlmICh0aWRzW2ldID09IC0xKSB7CisgICAgICAgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLAorICAgICAgICAgICAgICB0bXBfY291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGgiCisgICAgICAgICAgICAgICIgbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIgorICAgICAgICAgICAgIiB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogRm91bmQgdGhyZWFkIHdpdGggbnVtYmVyICVkIChzaG91bGQgYmUiCisgICAgICAgICIgaW5iZXR3ZWVuIDAgYW5kICVkKS4iLCB0aWRzW2ldLCB0aHJlYWRzIC0gMSk7CisgICAgICByZXN1bHQgPSAwOworICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyZjI3YQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYwpAQCAtMCwwICsxLDIwMiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisjZGVmaW5lIFZFUkJPU0UgMAorCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKCkKK3sKKyAgaW50IHRocmVhZHM7CisgIGludCBpLGxhc3R0aWQ7CisKKyAgaW50ICogdGlkczsKKyAgaW50ICogdGlkczI7CisgIGludCBub3RvdXQ7CisgIGludCBtYXhpdGVyOworICBpbnQgY2h1bmtfc2l6ZTsKKworICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7ICAvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfSAgLyogZW5kIG9mIHNpbmdsZSAqLworICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAvKiBFbnN1cmUgdGhhdCBhdCBsZWFzdCB0d28gdGhyZWFkcyBhcmUgY3JlYXRlZCAqLworICBpZiAodGhyZWFkcyA8IDIpIHsKKyAgICBvbXBfc2V0X251bV90aHJlYWRzKDIpOworICAgIHRocmVhZHMgPSAyOworICB9CisgIGZwcmludGYgKHN0ZGVyciwiVXNpbmcgYW4gaW50ZXJuYWwgY291bnQgb2YgJWRcblVzaW5nIGEiCisgICAgIiBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7ICAvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgeyAgLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICBkb3VibGUgY291bnQ7CisgICAgaW50IHRpZDsKKyAgICBpbnQgajsKKworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworICAgICNwcmFnbWEgb21wIGZvciBub3dhaXQgc2NoZWR1bGUoc3RhdGljLGNodW5rX3NpemUpCisgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikgeworICAgICAgY291bnQgPSAwLjsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICBpZiAoaiA+IG1heGl0ZXIpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIG1heGl0ZXIgPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworICAgICAgd2hpbGUgKG5vdG91dCAmJiAoY291bnQgPCBNQVhfVElNRSkgJiYgKG1heGl0ZXIgPT0gaikpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICBjb3VudCArPSBTTEVFUFRJTUU7CisgICAgICAgIHByaW50ZigiLiIpOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorICAgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgYXdha2VcbiIsIHRpZCk7Ki8KKyAgICAgIHRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorICAgICAgcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICB9IC8qIGVuZCBvZiBvbXAgcGFyYWxsZWwgZm9yICovCisKKyAgICBub3RvdXQgPSAwOworICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgbGFzdHRpZCA9IHRpZHNbMF07CisgIHRtcF9jb3VudCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IENGU01BWF9TSVpFICsgMTsgKytpKSB7CisgICAgLyogSWYgdGhlIHdvcmsgIHdhcyBkb25lIGJ5IHRoZSBzYW1lIHRocmVhZAorICAgICAgIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgaWYgKHRpZHNbaV0gPT0gbGFzdHRpZCkgeworICAgICAgdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLgorICAgICAqIFdoZW4gZmluZGluZyB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4KKyAgICAgKi8KKyAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisgICAgICAvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKyAgICAgIGlmICh0bXBfY291bnQgPT0gY2h1bmtfc2l6ZSkgeworICAgICAgICB0bXBfY291bnQgPSAxOworICAgICAgICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9LXG4iKTsKKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSWYgdGhlIGNodW5rIHNpemUgd2FzIHdyb25nLCBjaGVjayBpZiB0aGUgZW5kIHdhcyByZWFjaGVkICovCisgICAgICAgIGlmICh0aWRzW2ldID09IC0xKSB7CisgICAgICAgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLAorICAgICAgICAgICAgICB0bXBfY291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGgiCisgICAgICAgICAgICAgICIgbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIgorICAgICAgICAgICAgIiB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogRm91bmQgdGhyZWFkIHdpdGggbnVtYmVyICVkIChzaG91bGQgYmUiCisgICAgICAgICIgaW5iZXR3ZWVuIDAgYW5kICVkKS4iLCB0aWRzW2ldLCB0aHJlYWRzIC0gMSk7CisgICAgICByZXN1bHQgPSAwOworICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgfQorCisgIC8qIE5vdyB3ZSBjaGVjayBpZiBzZXZlcmFsIGxvb3AgcmVnaW9ucyBpbiBvbmUgcGFyYWxsZWwgcmVnaW9uIGhhdmUgdGhlCisgICAqIHNhbWUgbG9naWNhbCBhc3NpZ25lbWVudCBvZiBjaHVua3MgdG8gdGhyZWFkcy4gV2UgdXNlIHRoZSBub3dhaXQKKyAgICogY2xhdXNlIHRvIGluY3JlYXNlIHRoZSBwcm9iYWJpbGl0eSB0byBnZXQgYW4gZXJyb3IuICovCisKKyAgLyogRmlyc3Qgd2UgYWxsb2NhdGUgc29tZSBtb3JlIG1lbW1vcnkgKi8KKyAgZnJlZSAodGlkcyk7CisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKyAgdGlkczIgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgeworICAgICAgaW50IG47CisgICAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSBub3dhaXQKKyAgICAgIGZvciAobiA9IDA7IG4gPCBMT09QQ09VTlQ7IG4rKykgeworICAgICAgICBpZiAoTE9PUENPVU5UID09IG4gKyAxICkKKyAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworCisgICAgICAgIHRpZHNbbl0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgaW50IG07CisgICAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSBub3dhaXQKKyAgICAgIGZvciAobSA9IDE7IG0gPD0gTE9PUENPVU5UOyBtKyspIHsKKyAgICAgICAgdGlkczJbbS0xXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgaWYgKHRpZHNbaV0gIT0gdGlkczJbaV0pIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJDaHVuayBuby4gJWQgd2FzIGFzc2lnbmVkIG9uY2UgdG8gdGhyZWFkICVkIGFuZCIKKyAgICAgICIgbGF0ZXIgdG8gdGhyZWFkICVkLlxuIiwgaSwgdGlkc1tpXSx0aWRzMltpXSk7CisgICAgcmVzdWx0ID0gMDsKKyAgfQorCisgIGZyZWUgKHRpZHMpOworICBmcmVlICh0aWRzMik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yIChpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjNiZjdkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDM1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bSA7CisgIGludCBpMjsKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtPTA7CisgIGkyPTM7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgcHJpdmF0ZShpKSBmaXJzdHByaXZhdGUoaTIpCisgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICBzdW0gPSBzdW0gKyAoaSArIGkyKTsKKyAgfQorCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiArIGkyICogTE9PUENPVU5UOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX2Zpc3Rwcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2lmLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmZTQ5OAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfaWYuYwpAQCAtMCwwICsxLDQyIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2lmKCkKK3sKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IG51bV90aHJlYWRzOworICBpbnQgc3VtLCBzdW0yOworICBpbnQgaTsKKyAgaW50IGNvbnRyb2w7CisKKyAgY29udHJvbCA9IDA7CisgIG51bV90aHJlYWRzPTA7CisgIHN1bSA9IDA7CisgIHN1bTIgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBwcml2YXRlKGkpIGlmIChjb250cm9sPT0xKQorICBmb3IgKGk9MDsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgIG51bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworICAgIHN1bSA9IHN1bSArIGk7CisgIH0KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIGZwcmludGYoc3RkZXJyLCAiTnVtYmVyIG9mIHRocmVhZHMgZGV0ZXJtaW5lZCBieSIKKyAgICAiIG9tcF9nZXRfbnVtX3RocmVhZHM6ICVkXG4iLCBudW1fdGhyZWFkcyk7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSAmJiBudW1fdGhyZWFkcyA9PSAxKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3JfaWYoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTNjZmIyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBpOworICBpbnQgaTA7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0wOworICBpMCA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIFwKKyAgICBzY2hlZHVsZShzdGF0aWMsNykgcHJpdmF0ZShpKSBsYXN0cHJpdmF0ZShpMCkKKyAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgIHN1bSA9IHN1bSArIGk7CisgICAgaTAgPSBpOworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCBmb3IgKi8KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZSAqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZWY0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYwpAQCAtMCwwICsxLDY0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgbGFzdF9pID0gMDsKKworaW50IGk7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGkpCisKKy8qIFZhcmlhYmxlIGlpIGlzIHVzZWQgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBhIHRocmVhZHByaXZhdGUgdmFyaWFibGUgdXNlZCBhcyBhIGxvb3AKKyAqIGluZGV4LiBTZWUgdGVzdCBvbXBfdGhyZWFkcHJpdmF0ZV9mb3IuCisgKi8KK3N0YXRpYyBpbnQgaWk7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGlpKQorCisvKiEKKyAgVXRpbGl0eSBmdW5jdGlvbjogcmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgbGFyZ2VyIHRoYW4KKyAgdGhlIGFyZ3VtZW50IG9mIHRoZSBsYXN0IGNhbGwgb2YgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBjaGVja19pX2lzbGFyZ2VyMihpbnQgaSkKK3sKKyAgaW50IGlzbGFyZ2VyOworICBpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKyAgbGFzdF9pID0gaTsKKyAgcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZCgpCit7CisgIGludCBzdW07CisgIGludCBpc19sYXJnZXI7CisgIGludCBrbm93bl9zdW07CisgIGludCBpOworCisgIHN1bSA9IDA7CisgIGlzX2xhcmdlciA9IDE7CisgIGxhc3RfaSA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSBvcmRlcmVkCisgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykgeworICAgIGlpID0gaTsKKyAgICAjcHJhZ21hIG9tcCBvcmRlcmVkCisgICAgeworICAgICAgaXNfbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcjIgKGlpKSAmJiBpc19sYXJnZXI7CisgICAgICBzdW0gID0gc3VtICsgaWk7CisgICAgfQorICB9CisgIGtub3duX3N1bSA9ICg5OSAqIDEwMCkgLyAyOworICBmcHJpbnRmIChzdGRlcnIsIiBrbm93bl9zdW0gPSAlZCAsIHN1bSA9ICVkIFxuIiwga25vd25fc3VtLCBzdW0pOworICBmcHJpbnRmIChzdGRlcnIsIiBpc19sYXJnZXIgPSAlZFxuIiwgaXNfbGFyZ2VyKTsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXI7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjMxZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKQEAgLTAsMCArMSw1MCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyohIFV0aWxpdHkgZnVuY3Rpb24gdG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrICh2b2lkKQoreworICBpbnQgaTsKKyAgZG91YmxlIHN1bSA9IDA7CisgIGZvcihpID0gMDsgaSA8IDEwMDA7IGkrKyl7CisgICAgc3VtICs9IHNxcnQgKGkpOworICB9Cit9CisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBpOworICBpbnQgaTI7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0wOworICBpMj0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHNjaGVkdWxlKHN0YXRpYywxKSBwcml2YXRlKGkpIHByaXZhdGUoaTIpCisgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisgIHsKKyAgICBpMiA9IGk7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICBkb19zb21lX3dvcmsgKCk7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICBzdW0gPSBzdW0gKyBpMjsKKyAgfSAvKmVuZCBvZiBmb3IqLworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOGQ3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsMjY2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAgICAgLyogZHReRE9VQkxFX0RJR0lUUyAqLworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMCAgLyogMTAhICovCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgZG91YmxlIGRzdW07CisgIGRvdWJsZSBka25vd25fc3VtOworICBkb3VibGUgZHQ9MC41OyAgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworICBpbnQgZGlmZjsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IGtub3duX3Byb2R1Y3Q7CisgIGludCBsb2dpY19hbmQ7CisgIGludCBsb2dpY19vcjsKKyAgaW50IGJpdF9hbmQ7CisgIGludCBiaXRfb3I7CisgIGludCBleGNsdXNpdl9iaXRfb3I7CisgIGludCBsb2dpY3NbTE9PUENPVU5UXTsKKyAgaW50IGk7CisgIGRvdWJsZSBkcHQ7CisgIGludCByZXN1bHQ7CisKKyAgc3VtID0wOworICBkc3VtPTA7CisgIGR0ID0gMS4vMy47CisgIHJlc3VsdCA9IDA7CisgIHByb2R1Y3QgPSAxOworICBsb2dpY19hbmQ9MTsKKyAgbG9naWNfb3I9MDsKKyAgYml0X2FuZD0xOworICBiaXRfb3I9MDsKKyAgZXhjbHVzaXZfYml0X29yPTA7CisKKyAgLyogVGVzdHMgZm9yIGludGVnZXJzICovCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpzdW0pCisgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspIHsKKyAgICBzdW09c3VtK2k7CisgIH0KKyAgaWYoa25vd25fc3VtIT1zdW0pIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWRcbiIsc3VtLGtub3duX3N1bSk7CisgIH0KKworICBkaWZmID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRpZmYpCisgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDsrK2kpIHsKKyAgICBkaWZmPWRpZmYtaTsKKyAgfQorICBpZihkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKyAgZHN1bT0wOworICBkcHQ9MTsKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigrOmRzdW0pCisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgfQorICBpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYiCisgICAgICAiIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgIH0KKworICBkcHQ9MTsKKworICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHB0Kj1kdDsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkZGlmZikKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgfQorICBpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGludGVnZXJzICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCo6cHJvZHVjdCkKKyAgZm9yKGk9MTtpPD1NQVhfRkFDVE9SO2krKykgeworICAgIHByb2R1Y3QgKj0gaTsKKyAgfQorICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgIH0KKworICAvKiBUZXN0cyBmb3IgbG9naWMgQU5EICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgfQorICBpZighbG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEuXG4iKTsKKyAgfQorCisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBsb2dpYyBPUiAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMS5cbiIpOworICB9CisgIGxvZ2ljX29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKyAgfQorICBpZighbG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyLlxuIik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSBBTkQgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbigmOmJpdF9hbmQpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgfQorICBpZighYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMS5cbiIpOworICB9CisKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBiaXR3aXNlIE9SICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorICBiaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKHw6Yml0X29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgfQorICBpZighYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2UgWE9SICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODBmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDU0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPTc7CisgIHN1bTA9MTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlKHN1bTApCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGtub3duX3N1bT0xMSozKzc7CisgIHJldHVybiAoa25vd25fc3VtPT1zdW0pOworfSAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9maXJzdHByaXZhdGUqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjc3NWVjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDcxIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBzdW0wOworICBpbnQgaTsKKyAgaW50IGkwOworICBpbnQga25vd25fc3VtOworICBzdW0gPTA7CisgIHN1bTAgPSAwOworICBpMCA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSxzdW0wKSBsYXN0cHJpdmF0ZShpMCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBzdW0wPTA7CisgICAgICBmb3IgKGk9MTtpPDQwMDtpKyspIHsKKyAgICAgICAgc3VtMD1zdW0wK2k7CisgICAgICAgIGkwPWk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgc3VtMD0wOworICAgICAgZm9yKGk9NDAwO2k8NzAwO2krKykgeworICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICAgaTA9aTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBzdW0wPTA7CisgICAgICBmb3IoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICAgaTA9aTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICB9CisKKyAga25vd25fc3VtPSg5OTkqMTAwMCkvMjsKKyAgcmV0dXJuICgoa25vd25fc3VtPT1zdW0pICYmIChpMD09OTk5KSApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGFiMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0gNzsKKyAgc3VtMD0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoc3VtMCwgaSkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBzdW0wPTA7CisgICAgICBmb3IgKGk9MTtpPDQwMDtpKyspCisgICAgICAgIHN1bTA9c3VtMCtpOworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvcihpPTQwMDtpPDcwMDtpKyspCisgICAgICAgIHN1bTA9c3VtMCtpOworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7aSsrKQorICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICB9CisKKyAga25vd25fc3VtPSg5OTkqMTAwMCkvMis3OworICByZXR1cm4gKGtub3duX3N1bT09c3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fcHJpdmF0ZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNDk4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDUwOCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbigpCit7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGRvdWJsZSBkcHQ7CisgIGRvdWJsZSBkc3VtOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIGR0PTAuNTsgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS01OworICBpbnQgZGlmZjsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IGtub3duX3Byb2R1Y3Q7CisgIGludCBsb2dpY19hbmQ7CisgIGludCBiaXRfYW5kOworICBpbnQgbG9naWNfb3I7CisgIGludCBiaXRfb3I7CisgIGludCBleGNsdXNpdl9iaXRfb3I7CisgIGludCBsb2dpY3NbMTAwMF07CisgIGludCBpOworICBpbnQgcmVzdWx0OworCisgIHN1bSA9IDc7CisgIGRzdW09MDsKKyAgcHJvZHVjdCA9MTsKKyAgZHB0ID0gMTsKKyAgbG9naWNfYW5kPTE7CisgIGJpdF9hbmQ9MTsKKyAgbG9naWNfb3I9MDsKKyAgYml0X29yPTA7CisgIGV4Y2x1c2l2X2JpdF9vcj0wOworICByZXN1bHQgPTA7CisgIC8qICBpbnQgbXlfaXNsYXJnZXI7Ki8KKyAgLyppbnQgaXNfbGFyZ2VyPTE7Ki8KKworICAvLyBUZXN0IHN1bW1hdGlvbiBvZiBpbnRlZ2VycworICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpzdW0pCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIHN1bT1zdW0raTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgIHN1bT1zdW0raTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBzdW09c3VtK2k7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGtub3duX3N1bSE9c3VtKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkLlxuIixzdW0sIGtub3duX3N1bSk7CisgIH0KKworICAvLyBUZXN0IGRpZmZlcmVuY2VzIG9mIGludGVnZXJzCisgIGRpZmYgPSAoOTk5KjEwMDApLzI7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGlmZikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgZGlmZj1kaWZmLWk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoZGlmZiAhPSAwKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKyAgfQorCisgIC8vIFRlc3Qgc3VtbWF0aW9uIG9mIGRvdWJsZXMKKyAgZm9yIChpPTA7aTwyMDsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpkc3VtKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0wO2k8NjsrK2kpIHsKKyAgICAgICAgZHN1bSArPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xMjtpPDIwOysraSkgeworICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIgorICAgICAgIiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsCisgICAgICBkc3VtLCBka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworICB9CisKKyAgLy8gVGVzdCBkaWZmZXJlbmNlcyBvZiBkb3VibGVzCisgIGRwdD0xOworICBmb3IgKGk9MDtpPDIwOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIGRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGRpZmYpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTA7aTw2OysraSkgeworICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTI7aTwyMDsrK2kpIHsKKyAgICAgICAgZGRpZmYgLT0gcG93KGR0LGkpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAgLy8gVGVzdCBwcm9kdWN0IG9mIGludGVnZXJzCisgIGtub3duX3Byb2R1Y3QgPSAzNjI4ODAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigqOnByb2R1Y3QpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MTtpPDM7aSsrKSB7CisgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTM7aTw3O2krKykgeworICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03O2k8MTE7aSsrKSB7CisgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICB9CisKKyAgLy8gVGVzdCBsb2dpY2FsIEFORAorICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKyAgfQorICBsb2dpY19hbmQgPSAxOworICBsb2dpY3NbNTAxXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMiIpOworICB9CisKKyAgLy8gVGVzdCBsb2dpY2FsIE9SCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBsb2dpY19vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLy8gVGVzdCBiaXR3aXNlIEFORAorICBmb3IoaT0wO2k8MTAwMDsrK2kpIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1s1MDFdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyIik7CisgIH0KKworICAvLyBUZXN0IGJpdHdpc2UgT1IKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisgIGJpdF9vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvLyBUZXN0IGJpdHdpc2UgWE9SCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjY0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtMCA9IDExOworICBzdW0gPSA3OworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZShzdW0wKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAga25vd25fc3VtID0gMTEgKiAzICsgNzsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiYmVhOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDc2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKCkKK3sKKyAgaW50IGkwID0gLTE7CisgIGludCBzdW0gPSAwOworICBpbnQgaTsKKyAgaW50IHN1bTAgPSAwOworICBpbnQga25vd25fc3VtOworCisgIGkwID0gLTE7CisgIHN1bSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIGxhc3Rwcml2YXRlKGkwKSBwcml2YXRlKGksc3VtMCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICAgaTAgPSBpOworICAgICAgICB9CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0gLyogZW5kIG9mIHNlY3Rpb24gKi8KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIGZvcihpID0gNDAwOyBpIDwgNzAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICAgaTAgPSBpOworICAgICAgICB9CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIGZvcihpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAgIGkwID0gaTsKKyAgICAgICAgfQorICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfSAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9IC8qIGVuZCBvZiBzZWN0aW9uICovCisgICAgfSAvKiBlbmQgb2Ygc2VjdGlvbnMqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDI7CisgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSA5OTkpICk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX3ByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMmEzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9zZWN0aW9uX3ByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0gNzsKKyAgc3VtMCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoc3VtMCxpKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0MDA7IGkrKykKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSA0MDA7IGkgPCA3MDA7IGkrKykKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSA3MDA7IGkgPCAxMDAwOyBpKyspCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gLyplbmQgb2Ygc2VjdGlvbnMqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNzsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fcHJpdmF0ZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uX3ByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX25vd2FpdC5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmZjI1NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX25vd2FpdC5jCkBAIC0wLDAgKzEsMTA0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qCisgKiBUaGlzIHRlc3Qgd2lsbCBoYW5nIGlmIHRoZSBub3dhaXQgaXMgbm90IHdvcmtpbmcgcHJvcGVybHkKKyAqCisgKiBJdCByZWxpZXMgb24gYSB0aHJlYWQgc2tpcHBpbmcgdG8gdGhlIHNlY29uZCBzZWN0aW9ucyBjb25zdHJ1Y3QgdG8KKyAqIHJlbGVhc2UgdGhlIHRocmVhZHMgaW4gdGhlIGZpcnN0IHNlY3Rpb25zIGNvbnN0cnVjdAorICoKKyAqIEFsc28sIHNpbmNlIHNjaGVkdWxpbmcgb2Ygc2VjdGlvbnMgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCwgaXQgaXMKKyAqIG5lY2Vzc2FyeSB0byBoYXZlIGFsbCBmb3VyIHNlY3Rpb25zIGluIHRoZSBzZWNvbmQgc2VjdGlvbnMgY29uc3RydWN0CisgKiByZWxlYXNlIHRoZSB0aHJlYWRzIHNpbmNlIHdlIGNhbid0IGd1YXJhbnRlZSB3aGljaCBzZWN0aW9uIGEgc2luZ2xlIHRocmVhZAorICogd2lsbCBleGVjdXRlLgorICovCit2b2xhdGlsZSBpbnQgcmVsZWFzZTsKK3ZvbGF0aWxlIGludCBjb3VudDsKKwordm9pZCB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KGludCByYW5rKQoreworICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCBuciAlZCBlbnRlcnMgZmlyc3Qgc2VjdGlvbiIKKyAgICAiIGFuZCB3YWl0cy5cbiIsIHJhbmspOworICB3aGlsZSAocmVsZWFzZSA9PSAwKTsKKyAgI3ByYWdtYSBvbXAgYXRvbWljCisgIGNvdW50Kys7Cit9CisKK3ZvaWQgcmVsZWFzZV9hbmRfaW5jcmVtZW50KGludCByYW5rKQoreworICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCBuciAlZCBzZXRzIHJlbGVhc2UgdG8gMVxuIiwgcmFuayk7CisgIHJlbGVhc2UgPSAxOworICAjcHJhZ21hIG9tcCBmbHVzaChyZWxlYXNlKQorICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgY291bnQrKzsKK30KKworaW50IHRlc3Rfb21wX3NlY3Rpb25zX25vd2FpdCgpCit7CisgIHJlbGVhc2UgPSAwOworICBjb3VudCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgeworICAgIGludCByYW5rOworICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgbm93YWl0CisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCBuciAlZCBlbnRlcnMgZmlyc3Qgc2VjdGlvbnMgYW5kIGdvZXMgIgorICAgICAgICAgICJpbW1lZGlhdGVseSB0byBuZXh0IHNlY3Rpb25zIGNvbnN0cnVjdCB0byByZWxlYXNlLlxuIiwgcmFuayk7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICBjb3VudCsrOworICAgICAgfQorICAgIH0KKyAgICAvKiBCZWdpbiBvZiBzZWNvbmQgc2VjdGlvbnMgZW52aXJvbm1lbnQgKi8KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucworICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgcmVsZWFzZV9hbmRfaW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICByZWxlYXNlX2FuZF9pbmNyZW1lbnQocmFuayk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHJlbGVhc2VfYW5kX2luY3JlbWVudChyYW5rKTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgcmVsZWFzZV9hbmRfaW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBDaGVjayB0byBtYWtlIHN1cmUgYWxsIGVpZ2h0IHNlY3Rpb25zIHdlcmUgZXhlY3V0ZWQKKyAgcmV0dXJuIChjb3VudD09OCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkYjVlYwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNTQzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgZG91YmxlIGRwdCxkc3VtOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIGR0PTAuNTsgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworICBpbnQgZGlmZjsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IGtub3duX3Byb2R1Y3Q7CisgIGludCBsb2dpY19hbmQ7CisgIGludCBiaXRfYW5kOworICBpbnQgbG9naWNfb3I7CisgIGludCBiaXRfb3I7CisgIGludCBleGNsdXNpdl9iaXRfb3I7CisgIGludCBsb2dpY3NbMTAwMF07CisgIGludCBpOworICBpbnQgcmVzdWx0OworICAvKiBpbnQgbXlfaXNsYXJnZXI7ICovCisgIC8qaW50IGlzX2xhcmdlcj0xOyovCisgIHN1bSA9NzsKKyAgZHB0ID0xOworICBkc3VtPTA7CisgIHByb2R1Y3QgPTE7CisgIGxvZ2ljX2FuZD0xOworICBiaXRfYW5kPTE7CisgIGxvZ2ljX29yPTA7CisgIGJpdF9vcj0wOworICBleGNsdXNpdl9iaXRfb3I9MDsKKyAgcmVzdWx0ID0gMDsKKyAgZHQgPSAxLi8zLjsKKworICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6c3VtKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgc3VtPXN1bStpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgc3VtPXN1bStpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICAgIHN1bT1zdW0raTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihrbm93bl9zdW0hPXN1bSkgeworICAgICsrcmVzdWx0OworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuIiwgc3VtLGtub3duX3N1bSk7CisgIH0KKworICBkaWZmID0gKDk5OSoxMDAwKS8yOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkaWZmKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgZGlmZj1kaWZmLWk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworICB9CisKKyAgZm9yIChpPTA7aTwyMDsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6ZHN1bSkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0wO2k8NjsrK2kpIHsKKyAgICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICAgIGRzdW0gKz0gcG93KGR0LGkpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0xMjtpPDIwOysraSkgeworICAgICAgICAgIGRzdW0gKz0gcG93KGR0LGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgfQorCisgIGRwdD0xOworICBmb3IgKGk9MDtpPDIwOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIGRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRkaWZmKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTA7aTw2OysraSkgeworICAgICAgICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTI7aTwyMDsrK2kpIHsKKyAgICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZihmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisgIH0KKworICBrbm93bl9wcm9kdWN0ID0gMzYyODgwMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCo6cHJvZHVjdCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTE7aTwzO2krKykgeworICAgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zO2k8NztpKyspIHsKKyAgICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NztpPDExO2krKykgeworICAgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgIH0KKworICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMVxuIik7CisgIH0KKworICBsb2dpY19hbmQgPSAxOworICBsb2dpY3NbNTAxXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworICB9CisKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIlxuRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGxvZ2ljX29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgZm9yKGk9MDtpPDEwMDA7KytpKSB7CisgICAgbG9naWNzW2ldPTE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZighYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisgIH0KKworICBiaXRfYW5kID0gMTsKKyAgbG9naWNzWzUwMV09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHw6Yml0X29yKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKyAgYml0X29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2MzU3OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGUuYwpAQCAtMCwwICsxLDQ0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9zaW5nbGUoKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgIGludCByZXN1bHQ7CisgIGludCBucl9pdGVyYXRpb25zOworICBpbnQgaTsKKworICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIHJlc3VsdCA9IDA7CisgIG5yX2l0ZXJhdGlvbnMgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgeworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICB7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIG5yX2l0ZXJhdGlvbnMrKzsKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zaW5nbGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGVfY29weXByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGVfY29weXByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjVjZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKyNkZWZpbmUgREVCVUdfVEVTVCAwCisKK2ludCBqOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShqKQorCitpbnQgdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKCkKK3sKKyAgaW50IHJlc3VsdDsKKyAgaW50IG5yX2l0ZXJhdGlvbnM7CisKKyAgcmVzdWx0ID0gMDsKKyAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworI2lmIERFQlVHX1RFU1QKKyAgICAgICAgIGludCB0aHJlYWQ7CisgICAgICAgICB0aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisjZW5kaWYKKyAgICAgICNwcmFnbWEgb21wIHNpbmdsZSBjb3B5cHJpdmF0ZShqKQorICAgICAgeworICAgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICAgIGogPSBpOworI2lmIERFQlVHX1RFU1QKKyAgICAgICAgcHJpbnRmICgidGhyZWFkICVkIGFzc2lnbnMsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOworI2VuZGlmCisgICAgICB9CisjaWYgREVCVUdfVEVTVAorICAgICAgI3ByYWdtYSBvbXAgYmFycmllcgorI2VuZGlmCisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworI2lmIERFQlVHX1RFU1QKKyAgICAgICAgcHJpbnRmICgidGhyZWFkID0gJWQsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOworI2VuZGlmCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGogLSBpOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgYmFycmllcgorICAgIH0gLyogZW5kIG9mIGZvciAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zaW5nbGVfY29weXByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGVfbm93YWl0LmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjg5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX25vd2FpdC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyoKKyAqIFRoaXMgdGVzdCB3aWxsIGhhbmcgaWYgdGhlIG5vd2FpdCBpcyBub3Qgd29ya2luZyBwcm9wZXJseQorICoKKyAqIEl0IHJlbGllcyBvbiBhIG9uZSB0aHJlYWQgc2tpcHBpbmcgdG8gdGhlIGxhc3Qgc2luZ2xlIGNvbnN0cnVjdCB0bworICogcmVsZWFzZSB0aGUgdGhyZWFkcyBpbiB0aGUgZmlyc3QgdGhyZWUgc2luZ2xlIGNvbnN0cnVjdHMKKyAqLwordm9sYXRpbGUgaW50IHJlbGVhc2U7Cit2b2xhdGlsZSBpbnQgY291bnQ7CisKK3ZvaWQgd2FpdF9mb3JfcmVsZWFzZV90aGVuX2luY3JlbWVudChpbnQgcmFuaykKK3sKKyAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgZW50ZXJzIGZpcnN0IHNlY3Rpb24iCisgICAgIiBhbmQgd2FpdHMuXG4iLCByYW5rKTsKKyAgd2hpbGUgKHJlbGVhc2UgPT0gMCk7CisgICNwcmFnbWEgb21wIGF0b21pYworICBjb3VudCsrOworfQorCit2b2lkIHJlbGVhc2VfYW5kX2luY3JlbWVudChpbnQgcmFuaykKK3sKKyAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgc2V0cyByZWxlYXNlIHRvIDFcbiIsIHJhbmspOworICByZWxlYXNlID0gMTsKKyAgI3ByYWdtYSBvbXAgYXRvbWljCisgIGNvdW50Kys7Cit9CisKK2ludCB0ZXN0X29tcF9zaW5nbGVfbm93YWl0KCkKK3sKKyAgcmVsZWFzZSA9IDA7CisgIGNvdW50ID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICB7CisgICAgaW50IHJhbms7CisgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0CisgICAgeworICAgICAgd2FpdF9mb3JfcmVsZWFzZV90aGVuX2luY3JlbWVudChyYW5rKTsKKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlIG5vd2FpdAorICAgIHsKKyAgICAgIHdhaXRfZm9yX3JlbGVhc2VfdGhlbl9pbmNyZW1lbnQocmFuayk7CisgICAgfQorICAgICNwcmFnbWEgb21wIHNpbmdsZSBub3dhaXQKKyAgICB7CisgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgIH0KKworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHJlbGVhc2VfYW5kX2luY3JlbWVudChyYW5rKTsKKyAgICB9CisgIH0KKyAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIGFsbCBmb3VyIHNpbmdsZXMgd2VyZSBleGVjdXRlZAorICByZXR1cm4gKGNvdW50PT00KTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZV9ub3dhaXQqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2luZ2xlX25vd2FpdCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9wcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjdmOGRlCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9wcml2YXRlLmMKQEAgLTAsMCArMSw1NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgbXlpdCA9IDA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15aXQpCitpbnQgbXlyZXN1bHQgPSAwOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteXJlc3VsdCkKKworaW50IHRlc3Rfb21wX3NpbmdsZV9wcml2YXRlKCkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworICBpbnQgcmVzdWx0OworICBpbnQgbnJfaXRlcmF0aW9uczsKKyAgaW50IGk7CisKKyAgbXlpdCA9IDA7CisgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgbnJfaXRlcmF0aW9ucyA9IDA7CisgIHJlc3VsdCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICB7CisgICAgbXlyZXN1bHQgPSAwOworICAgIG15aXQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlIHByaXZhdGUobnJfdGhyZWFkc19pbl9zaW5nbGUpIG5vd2FpdAorICAgICAgeworICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIG15aXQrKzsKKyAgICAgICAgbXlyZXN1bHQgPSBteXJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHJlc3VsdCArPSBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgICAgIG5yX2l0ZXJhdGlvbnMgKz0gbXlpdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlIHByaXZhdGUgKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NpbmdsZV9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90b29scy9jaGVjay1kZXBlbmRzLnBsIGIvcmMzL3J1bnRpbWUvdG9vbHMvY2hlY2stZGVwZW5kcy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40N2U3ZTVhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdG9vbHMvY2hlY2stZGVwZW5kcy5wbApAQCAtMCwwICsxLDUwNiBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNSI7CitteSAkdGFyZ2V0X29zOworbXkgJHRhcmdldF9hcmNoOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91cHV0IHBhcnNlIGVycm9yLgorIyAgICAgJHRvb2wgLS0gTmFtZSBvZiB0b29sLgorIyAgICAgQGJ1bGsgLS0gT3V0cHV0IG9mIHRoZSB0b29sLgorIyAgICAgJG4gICAgLS0gTnVtYmVyIG9mIGxpbmUgY2F1c2VkIHBhcnNlIGVycm9yLgorc3ViIHBhcnNlX2Vycm9yKCRcQCQpIHsKKyAgICBteSAoICR0b29sLCAkYnVsaywgJG4gKSA9IEBfOworICAgIG15IEBidWxrOworICAgIGZvciAoIG15ICRpID0gMDsgJGkgPCBAJGJ1bGs7ICsrICRpICkgeworICAgICAgICBwdXNoKCBAYnVsaywgKCAkaSA9PSAkbiA/ICI+Pj4gIiA6ICIgICAgIiApIC4gJGJ1bGstPlsgJGkgXSApOworICAgIH07ICMgZm9yICRpCisgICAgcnVudGltZV9lcnJvciggIkZhaWwgdG8gcGFyc2UgJHRvb2wgb3V0cHV0OiIsIEBidWxrLCAiKGVvZikiICk7Cit9OyAjIHN1YiBwYXJzZV9lcnJvcgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGludXgqIE9TIHZlcnNpb24gb2YgZ2V0X2RlcHMoKSBwYXJzZXMgb3V0cHV0IG9mIGxkZDoKKyMKKyMgJCBsZGQgbGlibmFtZS5zbworIyAgIGxpYmMuc28uNiA9PiAvbGliNjQvbGliYy5zby42ICgweDAwMDAyYjYwZmVkZDgwMDApCisjICAgbGliZGwuc28uMiA9PiAvbGliNjQvbGliZGwuc28uMiAoMHgwMDAwMmI2MGZmMTJiMDAwKQorIyAgIGxpYnB0aHJlYWQuc28uMCA9PiAvbGliNjQvbGlicHRocmVhZC5zby4wICgweDAwMDAyYjYwZmYzMmYwMDApCisjICAgL2xpYjY0L2xkLWxpbnV4LXg4Ni02NC5zby4yICgweDAwMDAwMDM4Nzk0MDAwMDApCisjCisjIE5vdGU6IGxkZCBwcmludGQgYWxsIHRoZSBkZXBlbmRlbmNpZXMsIGRpcmVjdCBhbmQgaW5kaXJlY3QuIChGb3IgZXhhbXBsZSwgaWYgc3BlY2lmaWVkIGxpYnJhcnkKKyMgcmVxdWlyZXMgbGliZGwuc28sIGFuZCBsaWJkbC5zbyByZXF1aXJlcyAvbGliL2xkLWxpbnV4LnNvLCBsZGQgcHJpbnRzIGJvdGggbGliZGwuc28gYW5kCisjIC9saWIvbGQtbGludXguc28pLiBJZiB5b3UgZG8gbm90IHdhbnQgaW5kaXJlY3QgZGVwZW5kZW5jaWVzLCBsb29rIGF0IHJlYWRlbGYgdG9vbC4KKyMKK3N1YiBnZXRfZGVwc19sZGQoJCkgeworCisgICAgbXkgJGxpYiA9IHNoaWZ0ICggQF8gKTsKKyAgICBteSAkdG9vbCA9ICJsZGQiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgZXhlY3V0ZSggWyAkdG9vbCwgJGxpYiBdLCAtc3Rkb3V0ID0+IFxAYnVsayApOworICAgIGRlYnVnKCBAYnVsaywgIihlb2YpIiApOworCisgICAgZm9yZWFjaCBteSAkaSAoIDAgLi4gQGJ1bGsgLSAxICkgeworICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICBpZiAoICRsaW5lICF+IG17XlxzKig/OihbX2EtejAtOS4rLS9dKilccys9PlxzKyk/KFtfYS16MC05ListL10qKVxzK1woMHhbMC05YS16XSpcKSR9aSApIHsKKyAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgJGRlcCA9ICggZGVmaW5lZCggJDEgKSA/ICQxIDogJDIgKTsKKyAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICB9OyAjIGZvcmVhY2ggJGkKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfbGRkCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBbm90aGVyIExpbnV4KiBPUyB2ZXJzaW9uIG9mIGdldF9kZXBzKCkgcGFyc2VzIG91dHB1dCBvZiByZWFkZWxmOgorIworIyAkIHJlYWRlbGYgLWQgZXhwb3J0cy9saW5fMzJlL2xpYi9saWJvbXAuc28KKyMKKyMgRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweDg3MDA4IGNvbnRhaW5zIDI0IGVudHJpZXM6CisjICAgVGFnICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUvVmFsdWUKKyMgIDB4MDAwMDAwMDAwMDAwMDAwMSAoTkVFREVEKSAgICAgICAgICAgICBTaGFyZWQgbGlicmFyeTogW2xpYmMuc28uNl0KKyMgIDB4MDAwMDAwMDAwMDAwMDAwMSAoTkVFREVEKSAgICAgICAgICAgICBTaGFyZWQgbGlicmFyeTogW2xpYmRsLnNvLjJdCisjICAweDAwMDAwMDAwMDAwMDAwMDEgKE5FRURFRCkgICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsaWJwdGhyZWFkLnNvLjBdCisjICAweDAwMDAwMDAwMDAwMDAwMGUgKFNPTkFNRSkgICAgICAgICAgICAgTGlicmFyeSBzb25hbWU6IFtsaWJvbXAuc29dCisjICAweDAwMDAwMDAwMDAwMDAwMGQgKEZJTkkpICAgICAgICAgICAgICAgMHg1MWNhYQorIyAgMHgwMDAwMDAwMDAwMDAwMDA0IChIQVNIKSAgICAgICAgICAgICAgIDB4MTU4CisjICAweDAwMDAwMDAwMDAwMDAwMDUgKFNUUlRBQikgICAgICAgICAgICAgMHg5MzUwCisjICAuLi4KKyMKKyMgTm90ZTogSW4gY29udHJhc3QgdG8gbGRkLCByZWFkbGVmIHNob3dzIG9ubHkgZGlyZWN0IGRlcGVuZGVuY2llcy4KKyMKK3N1YiBnZXRfZGVwc19yZWFkZWxmKCQpIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQgKCBAXyApOworICAgIG15ICR0b29sOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgaWYoJHRhcmdldF9hcmNoIGVxICJtaWMiKSB7CisgICAgICAgICR0b29sID0gIng4Nl82NC1rMW9tLWxpbnV4LXJlYWRlbGYiOworICAgIH0gZWxzZSB7CisgICAgICAgICR0b29sID0gInJlYWRlbGYiOworICAgIH0KKworICAgICMgRm9yY2UgdGhlIHJlYWRlbGYgY2FsbCB0byBiZSBpbiBFbmdsaXNoLiBGb3IgZXhhbXBsZSwgd2hlbiByZWFkZWxmCisgICAgIyBpcyBjYWxsZWQgb24gYSBmcmVuY2ggbG9jYWxpemF0aW9uLCBpdCB3aWxsIGZpbmQgIkxpYnJhaXJpZSBwYXJ0YWdlZXMiCisgICAgIyBpbnN0ZWFkIG9mIHNoYXJlZCBsaWJyYXJ5CisgICAgJEVOVnsgTEFORyB9ID0gIkMiOworCisgICAgZXhlY3V0ZSggWyAkdG9vbCwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICBkZWJ1ZyggQGJ1bGssICIoZW9mKSIgKTsKKworICAgIG15ICRpID0gMDsKKyAgICAjIFBhcnNlIGhlYWRlci4KKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICBpZiAoICRpID09IEBidWxrIC0gMSBhbmQgJGJ1bGtbICRpIF0gPX4gbXteVGhlcmUgaXMgbm8gZHluYW1pYyBzZWN0aW9uIGluIHRoaXMgZmlsZVwuXHMqJH0gKSB7CisgICAgICAgICMgVGhpcyBpcyBub3QgZHluYW1pYyBleGVjdXRhYmxlID0+IG5vIGRlcGVuZGVuY2llcy4KKyAgICAgICAgcmV0dXJuIEBkZXBzOworICAgIH07ICMgaWYKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XkR5bmFtaWMgKD86c2VnbWVudHxzZWN0aW9uKSBhdCBvZmZzZXQgMHhbMC05YS1mXSsgY29udGFpbnMgXGQrIGVudHJpZXM6XHMqJH0gKQorICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqVGFnXHMrVHlwZVxzK05hbWUvVmFsdWVccyokfSApCisgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgKysgJGk7CisgICAgIyBQYXJzZSBib2R5LgorICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBte15ccyoweFswLTlhLWZdK1xzK1woKFtfQS1aMC05XSspXClccysoLiopXHMqJH1pICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICR0eXBlLCAkdmFsdWUgKSA9ICggJDEsICQyICk7CisgICAgICAgIGlmICggJHR5cGUgZXEgIk5FRURFRCIgKSB7CisgICAgICAgICAgICBpZiAoICR2YWx1ZSAhfiBte1xBU2hhcmVkIGxpYnJhcnk6IFxbKC4qKVxdXHp9ICkgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBteSAkZGVwID0gJDE7CisgICAgICAgICAgICBwdXNoKCBAZGVwcywgJGRlcCApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICsrICRpOworICAgIH07ICMgZm9yZWFjaCAkaQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19yZWFkZWxmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPUyBYKiB2ZXJzaW9uIG9mIGdldF9kZXBzKCkgcGFyc2VzIG91dHB1dCBvZiBvdG9vbDoKKyMKKyMgJCBvdG9vbCAtTCBsaWJuYW1lLmR5bGliCisjIGV4cG9ydHMvbWFjXzMyL2xpYi50aGluL2xpYm9tcC5keWxpYjoKKyMgICAgICAgIGxpYm9tcC5keWxpYiAoY29tcGF0aWJpbGl0eSB2ZXJzaW9uIDUuMC4wLCBjdXJyZW50IHZlcnNpb24gNS4wLjApCisjICAgICAgICAvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYiAoY29tcGF0aWJpbGl0eSB2ZXJzaW9uIDEuMC4wLCBjdXJyZW50IHZlcnNpb24gODguMS4zKQorIworc3ViIGdldF9kZXBzX290b29sKCQpIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQgKCBAXyApOworICAgIG15ICRuYW1lID0gZ2V0X2ZpbGUoICRmaWxlICk7CisgICAgbXkgJHRvb2wgPSAib3Rvb2wiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgaWYgKCAkdGFyZ2V0X2FyY2ggZXEgIjMyZSIgKSB7CisgICAgICAgICMgT24gb2xkZXIgKFRpZ2VyKSBzeXN0ZW1zIG90b29sIGRvZXMgbm90IHJlY29nbml6ZSA2NC1iaXQgYmluYXJpZXMsIHNvIHRyeSB0byBsb2NhdGUKKyAgICAgICAgIyBvdG9vbDY0LgorICAgICAgICBteSAkcGF0aCA9IHdoaWNoKCAib3Rvb2w2NCIgKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHBhdGggKSApIHsKKyAgICAgICAgICAgICR0b29sID0gIm90b29sNjQiOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgZXhlY3V0ZSggWyAkdG9vbCwgIi1MIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICBkZWJ1ZyggQGJ1bGssICIoZW9mKSIgKTsKKworICAgIG15ICRpID0gMDsKKyAgICAjIFBhcnNlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIGxpbmVzIHNlcGFyYXRlbHkuCisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15cUSRmaWxlXEU6JH0gKQorICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICsrICRpOworICAgIGlmICggJG5hbWUgPX4gbXtcLmR5bGliXHp9ICkgeworICAgICAgICAjIEFkZGVkICJAcnBhdGgvIiBlbmFibGVzIGR5bmFtaWMgbG9hZCBvZiB0aGUgbGlicmFyeSBkZXNpZ25hdGVkIGF0IGxpbmsgdGltZS4KKyAgICAgICAgJG5hbWUgPSAnQHJwYXRoLycgLiAkbmFtZTsKKyAgICAgICAgIyBJbiBjYXNlIG9mIGR5bmFtaWMgbGlicmFyeSBvdG9vbCBwcmludCB0aGUgbGlicmFyeSBpdHNlbGYgYXMgYSBkZXBlbmRlbnQgbGlicmFyeS4KKyAgICAgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccytcUSRuYW1lXEVccytcKGNvbXBhdGliaWxpdHkgdmVyc2lvbi4qXCkkfSApCisgICAgICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICArKyAkaTsKKyAgICB9OyAjIGlmCisKKyAgICAjIFRoZW4gcGFyc2UgdGhlIHJlc3QuCisgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICBpZiAoICRsaW5lICF+IG0vXlxzKiguKilccytcKGNvbXBhdGliaWxpdHkgdmVyc2lvblxzLipcKSQvICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICRkZXAgKSA9ICggJDEgKTsKKyAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICAgICAgKysgJGk7CisgICAgfTsgIyB3aGlsZQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19vdG9vbAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2luZG93cyogT1MgdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2YgbGluazoKKyMKKyMgPiBsaW5rIC1kdW1wIC1kZXBlbmRlbnRzIGxpYm5hbWUuZGxsCisjIE1pY3Jvc29mdCAoUikgQ09GRi9QRSBEdW1wZXIgVmVyc2lvbiA4LjAwLjQwMzEwLjM5CisjIENvcHlyaWdodCAoQykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRHVtcCBvZiBmaWxlIFM6XFByb2plY3RzLk9NUFx1c2Vyc1xvbWFseXNoZVxvbXBcbGlib21wXGV4cG9ydHNcd2luXzY0XGxpYlxsaWJvbXBtZC5kbGwKKyMgRmlsZSBUeXBlOiBETEwKKyMgICBJbWFnZSBoYXMgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXM6CisjICAgICBLRVJORUwzMi5kbGwKKyMgICBTdW1tYXJ5CisjICAgICAgICAgQzAwMCAuZGF0YQorIyAgICAgICAgIDYwMDAgLnBkYXRhCisjICAgICAgICAxODAwMCAucmRhdGEKKyMgICAgICAgIC4uLgorIworIyA+IGxpbmsgLWR1bXAgLWRpcmVjdGl2ZXMgbGlibmFtZS5saWIKKyMgTWljcm9zb2Z0IChSKSBDT0ZGL1BFIER1bXBlciBWZXJzaW9uIDguMDAuNDAzMTAuMzkKKyMgQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBEdW1wIG9mIGZpbGUgUzpcUHJvamVjdHMuT01QXHVzZXJzXG9tYWx5c2hlXG9tcFxsaWJvbXBcZXhwb3J0c1x3aW5fMzJlXGxpYlxsaWJpbXA1bXQubGliCisjIEZpbGUgVHlwZTogTElCUkFSWQorIyAgIExpbmtlciBEaXJlY3RpdmVzCisjICAgLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAtZGVmYXVsdGxpYjoidXVpZC5saWIiCisjICAgLWRlZmF1bHRsaWI6InV1aWQubGliIgorIyAgIC4uLi4uCisjICAgU3VtbWFyeQorIyAgICAgICAzMjUwIC5ic3MKKyMgICAgICAgM0ZCQyAuZGF0YQorIyAgICAgICAgIDM0IC5kYXRhMQorIyAgICAgICAuLi4uCitzdWIgZ2V0X2RlcHNfbGluaygkKSB7CisKKyAgICBteSAoICRsaWIgKSA9IEBfOworICAgIG15ICR0b29sID0gImxpbmsiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgbXkgJGV4dCA9IGxjKCBnZXRfZXh0KCAkbGliICkgKTsKKyAgICBpZiAoICRleHQgIX4gbXtcQVwuKD86bGlifGRsbHxleGUpXHp9aSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIkluY29ycmVjdCBmaWxlIGlzIHNwZWNpZmllZDogYCRsaWInOyBvbmx5IGBsaWInLCBgZGxsJyBvciBgZXhlJyBmaWxlIGV4cGVjdGVkIiApOworICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoCisgICAgICAgIFsgJHRvb2wsICIvZHVtcCIsICggJGV4dCBlcSAiLmxpYiIgPyAiL2RpcmVjdGl2ZXMiIDogIi9kZXBlbmRlbnRzIiApLCAkbGliIF0sCisgICAgICAgIC1zdGRvdXQgPT4gXEBidWxrCisgICAgKTsKKworICAgIGRlYnVnKCBAYnVsaywgIihlb2YpIiApOworCisgICAgbXkgJGkgPSAwOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteTWljcm9zb2Z0IFwoUlwpIENPRkZcL1BFIER1bXBlciBWZXJzaW9uLiokfSApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteQ29weXJpZ2h0IFwoQ1wpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvblwuLiokfSApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteRHVtcCBvZiBmaWxlXHNcUSRsaWJcRSR9ICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteRmlsZSBUeXBlOlxzKC4qKSR9ICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworCisgICAgaWYgKCAkZXh0IGVxICIubGliIiApIHsKKworICAgICAgICBteSAlZGVwczsKKyAgICAgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypbLS9dZGVmYXVsdGxpYlw6KC4qKVxzKiR9aSApIHsKKyAgICAgICAgICAgICAgICBteSAkZGVwID0gJDE7CisgICAgICAgICAgICAgICAgIyBOb3JtYWxpemUgbGlicmFyeSBuYW1lOgorICAgICAgICAgICAgICAgICRkZXAgPSBsYyggJDEgKTsgICAgICAgICAgICAgICMgQ29udmVydCB0byBsb3dlciBjYXNlLgorICAgICAgICAgICAgICAgICRkZXAgPX4gc3tcQSIoLiopIlx6fXskMX07ICAgICMgRHJvcCBzdXJyb3VuZGluZyBxdW90ZXMgKGlmIGFueSkuCisgICAgICAgICAgICAgICAgJGRlcCA9fiBze1wubGliXHp9e307ICAgICAgICAgIyBEcm9wIC5saWIgc3VmZml4IChpZiBhbnkpLgorICAgICAgICAgICAgICAgICRkZXBzeyAkZGVwIH0gPSAxOworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKkxpbmtlciBEaXJlY3RpdmVzXHMqJH0gKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqLStccyokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyovYWx0ZXJuYXRlbmFtZVw6LiokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyovRkFJTElGTUlTTUFUQ0hcOi4qJH0gKSB7CisgICAgICAgICAgICAgICAgIyBUaGlzIGRpcmVjdGl2ZSBpcyBwcm9kdWNlZCBvbmx5IGJ5IF9NU0NfVkVSPTE2MDAKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypTdW1tYXJ5XHMqJH0gKSB7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICsrICRpOworICAgICAgICB9ICMgd2hpbGUKKyAgICAgICAgQGRlcHMgPSBrZXlzKCAlZGVwcyApOworCisgICAgfSBlbHNlIHsKKworICAgICAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XHMqSW1hZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzXDokfSApCisgICAgICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICArKyAkaTsKKyAgICAgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgICAgICAjIElnbm9yZSBlbXB0eSBsaW5lcy4KKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooLipcLmRsbCkkfWkgKSB7CisgICAgICAgICAgICAgICAgbXkgJGRlcCA9IGxjKCAkMSApOworICAgICAgICAgICAgICAgIHB1c2goIEBkZXBzLCAkZGVwICk7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqU3VtbWFyeSR9ICkgeworICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICArKyAkaTsKKyAgICAgICAgfTsgIyB3aGlsZQorCisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19saW5rCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWluLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KK215ICRleHBlY3RlZDsKK215ICRiYXJlOworR2V0b3B0OjpMb25nOjpDb25maWd1cmUoICJwZXJtdXRlIiApOworZ2V0X29wdGlvbnMoCisgICAgIm9zPXMiICAgICAgID0+IFwkdGFyZ2V0X29zLAorICAgICJhcmNoPXMiICAgICA9PiBcJHRhcmdldF9hcmNoLAorICAgICJiYXJlIiAgICAgICA9PiBcJGJhcmUsCisgICAgImV4cGVjdGVkPXMiID0+IFwkZXhwZWN0ZWQsCispOworbXkgQGV4cGVjdGVkOworaWYgKCBkZWZpbmVkKCAkZXhwZWN0ZWQgKSApIHsKKyAgICBpZiAoICRleHBlY3RlZCBuZSAibm9uZSIgKSB7CisgICAgICAgIEBleHBlY3RlZCA9IHNvcnQoIHNwbGl0KCAiLCIsICRleHBlY3RlZCApICk7CisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgICAgIEBleHBlY3RlZCA9IG1hcCggbGMoICRfICksIEBleHBlY3RlZCApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorfTsgIyBpZgoraWYgKCBAQVJHViA8IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlNwZWNpZnkgYSBsaWJyYXJ5IG5hbWUgdG8gY2hlY2sgZm9yIGRlcGVuZGVuY2llcyIgKTsKK307ICMgaWYKK2lmICggQEFSR1YgPiAxICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJUb28gbWFueSBhcmd1bWVudHMiICk7Cit9OyAjIGlmCitteSAkbGliID0gc2hpZnQoIEBBUkdWICk7CitpZiAoIG5vdCAtZSAkbGliICl7CisgICAgcnVudGltZV9lcnJvciggIlNwZWNpZmllZCBmaWxlIGRvZXMgbm90IGV4aXN0OiBcIiRsaWJcIiIgKTsKK307ICMgaWYKKworIyBTZWxlY3QgYXBwcm9wcmlhdGUgZ2V0X2RlcHMgaW1wbGVtZW50YXRpb24uCitpZiAoIDAgKSB7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibGluIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX3JlYWRlbGY7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX290b29sOworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgKmdldF9kZXBzID0gXCpnZXRfZGVwc19saW5rOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworIyBEbyB0aGUgd29yay4KK215IEBkZXBzID0gc29ydCggZ2V0X2RlcHMoICRsaWIgKSApOworaWYgKCAkYmFyZSApIHsKKyAgICBwcmludCggbWFwKCAiJF9cbiIsIEBkZXBzICkgKTsKK30gZWxzZSB7CisgICAgaW5mbyggIkRlcGVuZGVuY2llczoiLCBAZGVwcyA/IG1hcCggIiAgICAkXyIsIEBkZXBzICkgOiAiKG5vbmUpIiApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZXhwZWN0ZWQgKSApIHsKKyAgICBteSAlZGVwcyA9IG1hcCggKCAkXyA9PiAxICksIEBkZXBzICk7CisgICAgZm9yZWFjaCBteSAkZGVwICggQGV4cGVjdGVkICkgeworICAgICAgICBkZWxldGUoICRkZXBzeyAkZGVwIH0gKTsKKyAgICB9OyAjIGZvcmVhY2gKKyAgICBteSBAdW5leHBlY3RlZCA9IHNvcnQoIGtleXMoICVkZXBzICkgKTsKKyAgICBpZiAoIEB1bmV4cGVjdGVkICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiVW5leHBlY3RlZCBkZXBlbmRlbmNpZXM6IiwgbWFwKCAiICAgICRfIiwgQHVuZXhwZWN0ZWQgKSApOworICAgIH07ICMgaWYKK307ICMgaWYKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay1kZXBlbmRzLnBsPiAtLSBDaGVjayBkZXBlbmRlbmNpZXMgZm9yIGEgc3BlY2lmaWVkIGxpYnJhcnkuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGNoZWNrLWRlcGVuZHMucGw+IEk8T1BUSU9OUz4uLi4gSTxsaWJyYXJ5PgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworQzxjaGVjay1kZXBlbmRzLnBsPiBmaW5kcyBkaXJlY3QgZGVwZW5kZW5jaWVzIGZvciBhIHNwZWNpZmllZCBsaWJyYXJ5LiBMaXN0IG9mIGFjdHVhbCBkZXBlbmRlbmNpZXMKK2lzIHNvcnRlZCBhbHBoYWJldGljYWxseSBhbmQgcHJpbnRlZC4gSWYgbGlzdCBvZiBleHBlY3RlZCBkZXBlbmRlbmNpZXMgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0cworY2hlY2tzIHRoZSBsaWJyYXJ5IGhhcyBvbmx5IGFsbG93ZWQgZGVwZW5kZW5jaWVzLiBJbiBjYXNlIG9mIG5vdCBleHBlY3RlZCBkZXBuZGVuY2llcyB0aGUgc2NyaXB0Citpc3N1ZXMgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdHMgd2l0aCBub24temVybyBjb2RlLgorCitMaW51eCogT1MgYW5kIE9TIFgqOiBUaGUgc2NyaXB0IGZpbmRzIGRlcGVuZGVuY2llcyBvbmx5IGZvciBkeW1hbWljIGxpYnJhcmllcy4gV2luZG93cyogT1M6IFRoZSBzY3JpcHQKK2ZpbmRzIGRlcGVuZGVuY2llcyBmb3IgZWl0aGVyIHN0YXRpYyBvciBkeW1hbWljIGxpYnJhcmllcy4KKworVGhlIHNjcmlwdCB1c2VzIGV4dGVybmFsIHRvb2xzLiBPbiBMaW51eCogT1MsIGl0IHJ1bnMgRjxyZWFkZWxmPiwgb24gT1MgWCogLS0gRjxvdG9vbD4gKG9yIEY8b3Rvb2w2ND4pLAorb24gV2luZG93cyogT1MgLS0gRjxsaW5rPi4KKworT24gV2luZG93cyogT1MgZGVwZW5kZW5jaWVzIGFyZSBwcmludGVkIGluIGxvd2VyIGNhc2UsIGNhc2Ugb2YgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzIGlnbm9yZWQuCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1iYXJlPgorCitEbyBub3QgdXNlIGZhbmN5IGZvcm1hdHRpbmc7IHByb2R1Y2UgcGxhaW4sIGJhcmUgb3V0cHV0OiBqdXN0IGEgbGlzdCBvZiBsaWJyYXJpZXMsCithIGxpYnJhcnkgcGVyIGxpbmUuCisKKz1pdGVtIEI8LS1leHBlY3RlZD0+STxsaXN0PgorCitJPGxpc3Q+IGlzIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cGVjdGVkIGRlcGVuZGVuY2llcyAob3IgQzxub25lPikuCitJZiBDPC0tZXhwZWN0ZWQ+IG9wdGlvbiBzcGVjaWZpZWQsIEM8Y2hlY2stZGVwZW5kcy5wbD4gY2hlY2tzIHRoZSBzcGVjaWZpZWQgbGlicmFyeQoraGFzIG9ubHkgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzLgorCis9aXRlbSBCPC0tb3M9Pkk8c3RyPgorCitTcGVjaWZ5IHRhcmdldCBPUyAodG9vbCB0byB1c2UpIG1hbnVhbGx5LgorVXNlZnVsIGZvciBjcm9zcy1idWlsZCwgd2hlbiBob3N0IE9TIGlzIG5vdCB0aGUgc2FtZSBhcyB0YXJnZXQgT1MuCitJPHN0cj4gc2hvdWxkIGJlIGVpdGhlciBDPGxpbj4sIEM8bWFjPiwgb3IgQzx3aW4+LgorCis9YmFjaworCis9aGVhZDIgU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGRvY3VtZW50YXRpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworRG8gbm90IG91dHB1dCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGxpYnJhcnk+CisKK0EgbmFtZSBvZiBsaWJyYXJ5IHRvIGZpbmQgb3IgY2hlY2sgZGVwZW5kZW5jaWVzLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworSnVzdCBwcmludCBsaWJyYXJ5IGRlcGVuZGVuY2llcyAoV2luZG93cyogT1MpOgorCisgICAgPiBjaGVjay1kZXBlbmRzLnBsIGV4cG9ydHMvd2luXzMyL2xpYi9saWJvbXBtZC5kbGwKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgRGVwZW5kZW5jaWVzOgorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSAgICAga2VybmVsMzIuZGxsCisKK1ByaW50IGxpYnJhcnkgZGVwZW5kZW5jaWVzLCB1c2UgYmFyZSBvdXRwdXQgKExpbnV4KiBPUyk6CisKKyAgICAkIGNoZWNrLWRlcGVuZHMucGwgLS1iYXJlIGV4cG9ydHMvbGluXzMyZS9saWIvbGlib21wX2RiLnNvCisgICAgbGliYy5zby42CisgICAgbGliZGwuc28uMgorICAgIGxpYnB0aHJlYWQuc28uMAorCitDaGVjayB0aGUgbGlicmFyeSBkb2VzIG5vdCBoYXZlIGFueSBkZXBlbmRlbmNpZXMgKE9TIFgqKToKKworICAgICQgY2hlY2stZGVwZW5kcy5wbCAtLWV4cGVjdGVkPW5vbmUgZXhwb3J0cy9tYWNfMzIvbGliL2xpYm9tcC5keWxpYgorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSBEZXBlbmRlbmNpZXM6CisgICAgY2hlY2stZGVwZW5kcy5wbDogKGkpICAgICAvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYgorICAgIGNoZWNrLWRlcGVuZHMucGw6ICh4KSBVbmV4cGVjdGVkIGRlcGVuZGVuY2llczoKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoeCkgICAgIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliCisgICAgJCBlY2hvICQ/CisgICAgMgorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90b29scy9jaGVjay1leGVjc3RhY2sucGwgYi9yYzMvcnVudGltZS90b29scy9jaGVjay1leGVjc3RhY2sucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2YyNDc0MgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rvb2xzL2NoZWNrLWV4ZWNzdGFjay5wbApAQCAtMCwwICsxLDE0NiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDAyIjsKK215ICR0YXJnZXRfYXJjaDsKKworc3ViIGV4ZWNzdGFjaygkKSB7CisgICAgbXkgKCAkZmlsZSApID0gQF87CisgICAgbXkgQG91dHB1dDsKKyAgICBteSBAc3RhY2s7CisgICAgbXkgJHRvb2w7CisgICAgaWYoJHRhcmdldF9hcmNoIGVxICJtaWMiKSB7CisgICAgICAgICR0b29sID0gIng4Nl82NC1rMW9tLWxpbnV4LXJlYWRlbGYiOworICAgIH0gZWxzZSB7CisgICAgICAgICR0b29sID0gInJlYWRlbGYiOworICAgIH0KKyAgICBleGVjdXRlKCBbICR0b29sLCAiLWwiLCAiLVciLCAkZmlsZSBdLCAtc3Rkb3V0ID0+IFxAb3V0cHV0ICk7CisgICAgQHN0YWNrID0gZ3JlcCggJF8gPX4gbXtcQVxzKig/OkdOVV8pP1NUQUNLXHMrfSwgQG91dHB1dCApOworICAgIGlmICggbm90IEBzdGFjayApIHsKKyAgICAgICAgIyBJbnRlcnByZXQgbWlzc2VkICJTVEFDSyIgbGluZSBhcyBlcnJvci4KKyAgICAgICAgcnVudGltZV9lcnJvciggIiRmaWxlOiBObyBzdGFjayBzZWdtZW50IGZvdW5kOyBsb29rcyBsaWtlIHN0YWNrIHdvdWxkIGJlIGV4ZWN1dGFibGUuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIEBzdGFjayA+IDEgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkZmlsZTogTW9yZSB0aGFuIG9uZSBzdGFjayBzZWdtZW50IGZvdW5kLiIsICJyZWFkZWxmIG91dHB1dDoiLCBAb3V0cHV0LCAiKGVvZikiICk7CisgICAgfTsgIyBpZgorICAgICMgVHlwaWNhbCBzdGFjayBsaW5lcyBhcmU6CisgICAgIyBMaW51eCogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlOgorICAgICMgICAgR05VX1NUQUNLICAgICAgMHgwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAgMHgwMDAwMCBSV0UgMHg0CisgICAgIyBMaW51eCogT1MgSW50ZWwoUikgNjQ6CisgICAgIyAgICBHTlVfU1RBQ0sgICAgICAweDAwMDAwMCAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwIDB4MDAwMDAwIFJXRSAweDgKKyAgICBpZiAoICRzdGFja1sgMCBdICF+IG17XEFccyooPzpHTlVfKT9TVEFDSyg/OlxzKzB4WzAtOWEtZl0rKXs1fVxzKyhbUiBdW1cgXVtFIF0pXHMrMHhbMC05YS1mXStccypcen0gKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkZmlsZTogQ2Fubm90IHBhcnNlIHN0YWNrIHNlZ21lbnQgbGluZToiLCAiPj4+ICRzdGFja1sgMCBdIiApOworICAgIH07ICMgaWYKKyAgICBteSAkYXR0cnMgPSAkMTsKKyAgICBpZiAoICRhdHRycyA9fiBte0V9ICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IFN0YWNrIGlzIGV4ZWN1dGFibGUiICk7CisgICAgfTsgIyBpZgorfTsgIyBzdWIgZXhlY3N0YWNrCisKK2dldF9vcHRpb25zKAorICAgICJhcmNoPXMiID0+IFwkdGFyZ2V0X2FyY2gsCispOworCitmb3JlYWNoIG15ICRmaWxlICggQEFSR1YgKSB7CisgICAgZXhlY3N0YWNrKCAkZmlsZSApOworfTsgIyBmb3JlYWNoICRmaWxlCisKK2V4aXQoIDAgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Y2hlY2stZXhlY3N0YWNrLnBsPiAtLSBDaGVjayB3aGV0aGVyIHN0YWNrIGlzIGV4ZWN1dGFibGUsIGlzc3VlIGFuIGVycm9yIGlmIHNvLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxjaGVjay1leGVjc3RhY2sucGw+IEk8b3B0aWlvbj4uLi4gSTxmaWxlPi4uLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCBjaGVja3Mgd2hldGhlciBzdGFjayBvZiBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlLCBhbmQgaXNzdWVzIGVycm9yIGlmIHN0YWNrIGlzCitleGVjdXRhYmxlLiBJZiBzdGFjayBpcyBub3QgZXhlY3V0YWJsZSwgdGhlIHNjcmlwdCBleGl0cyBzaWxlbnRseSB3aXRoIHplcm8gZXhpdCBjb2RlLgorCitUaGUgc2NyaXB0IHJ1bnMgQzxyZWFkZWxmPiB1dGlsaXR5IHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlLiBTbywgdGhlCitzY3JpcHQgZmFpbHMgaWYgQzxyZWFkZWxmPiBpcyBub3QgYXZhaWxhYmxlLiBFZmZlY3RpdmVseSBpdCBtZWFucyB0aGUgc2NyaXB0IHdvcmtzIG9ubHkgb24gTGludXgqIE9TCisoYW5kLCBwcm9iYWJseSwgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlKS4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgcHJvZ3JhbSB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIGV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCB0byBjaGVjay4gTXVsdGlwbGUgZmlsZXMgbWF5IGJlIHNwZWNpZmllZC4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKK0NoZWNrIGxpYm9tcC5zbyBsaWJyYXJ5OgorCisgICAgJCBjaGVjay1leGVjc3RhY2sucGwgbGlib21wLnNvCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rvb2xzL2NoZWNrLWluc3RydWN0aW9uLXNldC5wbCBiL3JjMy9ydW50aW1lL3Rvb2xzL2NoZWNrLWluc3RydWN0aW9uLXNldC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNTA1ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdG9vbHMvY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCkBAIC0wLDAgKzEsMzIxIEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDQiOworbXkgJHRhcmdldF9vczsKK215ICR0YXJnZXRfYXJjaDsKK215ICR0YXJnZXRfbWljX2FyY2g7CisKK215ICRoZXggPSBxcntbMC05YS1mXX1pOyAgICAjIGhleCBkaWdpdC4KKworIyBtaWMtc3BlY2lmaWMgZGV0YWlscy4KKworc3ViIGJhZF9taWNfZm10KCQpIHsKKyAgICAjIEJlZm9yZSB3ZSBhbGxvd2VkIGJvdGggZWxmNjQteDg2LTY0LWZyZWVic2QgYW5kIGVsZi1sMW9tLWZyZWVic2QuCisgICAgIyBOb3cgdGhlIGZpcnN0IG9uZSBpcyBvYnNvbGV0ZSwgb25seSBlbGY2NC1sMW9tLWZyZWVic2QgaXMgYWxsb3dlZC4KKyAgICBteSAoICRmbXQgKSA9IEBfOworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggIiR0YXJnZXRfbWljX2FyY2giIGVxICJrbmYiICkgeworCSAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmNjQtbDFvbT9cen07CisgICAgfSBlbHNpZiAoICIkdGFyZ2V0X21pY19hcmNoIiBlcSAia25jIiApIHsKKwkgICAgcmV0dXJuICRmbXQgIX4gbXtcQWVsZjY0LWsxb20/XHp9OworCX0gZWxzZSB7CisJICAgIHJldHVybiAxOworCX07Cit9OyAjIHN1YiBiYWRfbWljX2ZtdAorCisjIFVuZGVzaXJlZCBpbnN0cnVjdGlvbnMgZm9yIG1pYzogYWxsIHg4NyBhbmQgc29tZSBvdGhlci4KKyMgQUM6IFNpbmNlIGNvbXBpbGVyIDIwMTAtMDYtMzAgeDg3IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLCByZW1vdmVkIHRoZSBjaGVjayBvZiB4ODcuCitteSAkbWljX2JhZF9yZTsKK3N1YiBiYWRfbWljX2luc3RyKCQkKSB7CisgICAgbXkgKCAkaW5zdHIsICRhcmdzICkgPSBAXzsKKyAgICBpZiAoICIkdGFyZ2V0X21pY19hcmNoIiBlcSAia25jIiApIHsKKwkjIHdvcmthcm91bmQgb2YgYmFkIGNvZGUgZ2VuZXJhdGlvbiBvbiBLTkYgTGludXgqIE9TOgorCXJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJG1pY19iYWRfcmUgKTsKKyAgICB9IGVsc2UgeworCXJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJG1pY19iYWRfcmUgb3IgZGVmaW5lZCggJGFyZ3MgKSBhbmQgJGFyZ3MgPX4gbXt4bW19aSApOworICAgIH0KK307ICMgc3ViIGJhZF9taWNfaW5zdHIKKworIyBsaW5fMzItc3BlY2lmaWMgZGV0YWlscy4KKworc3ViIGJhZF9pYTMyX2ZtdCgkKSB7CisgICAgbXkgKCAkZm10ICkgPSBAXzsKKyAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmMzItaTM4Nlx6fTsKK307ICMgc3ViIGJhZF9pYTMyX2ZtdAorCitteSBAc3NlMiA9CisgICAgcXd7CisgICAgICAgIG1vdmFwZCBtb3Z1cGQgbW92aHBkIG1vdmxwZCBtb3Ztc2twZCBtb3ZzZAorICAgICAgICBhZGRwZCBhZGRzZCBzdWJwZCBzdWJzZCBtdWxwZCBtdWxzZCBkaXZwZCBkaXZzZCBzcXJ0cGQgc3FydHNkIG1heHBkIG1heHNkIG1pbnBkIG1pbnNkCisgICAgICAgIGFuZHBkIGFuZG5wZCBvcnBkIHhvcnBkCisgICAgICAgIGNtcHBkIGNtcHNkIGNvbWlzZCB1Y29taXNkCisgICAgICAgIHNodWZwZCB1bnBja2hwZCB1bnBja2xwZAorICAgICAgICBjdnRwZDJwaSBjdnR0cGQycGkgY3Z0cGkycGQgY3Z0cGQyZHEgY3Z0dHBkMmRxIGN2dGRxMnBkIGN2dHBzMnBkIGN2dHBkMnBzIGN2dHNzMnNkIGN2dHNkMnNzCisgICAgICAgIGN2dHNkMnNpIGN2dHRzZDJzaSBjdnRzaTJzZCBjdnRkcTJwcyBjdnRwczJkcSBjdnR0cHMyZHEgbW92ZHFhIG1vdmRxdSBtb3ZxMmRxIG1vdmRxMnEKKyAgICAgICAgcG11bHVkcSBwYWRkcSBwc3VicSBwc2h1Zmx3IHBzaHVmaHcgcHNodWZkIHBzbGxkcSBwc3JsZHEgcHVucGNraHFkcSBwdW5wY2tscWRxIGNsZmx1c2gKKyAgICAgICAgbGZlbmNlIG1mZW5jZSBtYXNrbW92ZHF1IG1vdm50cGQgbW92bnRkcSBtb3ZudGkKKyAgICB9OworbXkgQHNzZTMgPQorICAgIHF3eworICAgICAgICBmaXN0dHAgbGRkcXUgYWRkc3VicHMgYWRkc3VicGQgaGFkZHBzIGhzdWJwcyBoYWRkcGQgaHN1YnBkIG1vdnNoZHVwIG1vdnNsZHVwIG1vdmRkdXAgbW9uaXRvcgorICAgICAgICBtd2FpdAorICAgIH07CitteSBAc3NzZTMgPQorICAgIHF3eworICAgICAgICBwaGFkZHcgcGhhZGRzdyBwaGFkZGQgcGhzdWJ3IHBoc3Vic3cgcGhzdWJkIHBhYnNiIHBhYnN3IHBhYnNkIHBtYWRkdWJzdyBwbXVsaHJzdyBwc2h1ZmIKKyAgICAgICAgcHNpZ25iIHBzaWdudyBwc2lnbmQgcGFsaWducgorICAgIH07CitteSBAc3NlNCA9CisgICAgKAorICAgICAgICAjIFNTRTQuMQorICAgICAgICBxd3sKKyAgICAgICAgICAgIHBtdWxsZCBwbXVsZHEgZHBwZCBkcHBzIG1vdm50ZHFhIGJsZW5kcGQgYmxlbmRwcyBibGVuZHZwZCBibGVuZHZwcyBwYmxlbmR2YiBwYmxlbmR3IHBtaW51dworICAgICAgICAgICAgcG1pbnVkIHBtaW5zYiBwbWluc2QgcG1heHV3IHBtYXh1ZCBwbWF4c2IgcG1heHNkIHJvdW5kcHMgcm91bmRwZCByb3VuZHNzIHJvdW5kc2QgZXh0cmFjdHBzCisgICAgICAgICAgICBpbnNlcnRwcyBwaW5zcmIgcGluc3JkIHBpbnNycSBwZXh0cmIgcGV4dHJ3IHBleHRyZCBwZXh0cnEgcG1vdnN4YncgcG1vdnp4YncgcG1vdnN4YmQKKyAgICAgICAgICAgIHBtb3Z6eGJkIHBtb3ZzeHdkIHBtb3Z6eHdkIHBtb3ZzeGJxIHBtb3Z6eGJxIHBtb3ZzeHdxIHBtb3Z6eHdxIHBtb3ZzeGRxIHBtb3Z6eGRxIG1wc2FkYncKKyAgICAgICAgICAgIHBobWlucG9zdXcgcHRlc3QgcGNtcGVxcSBwYWNrdXNkdworICAgICAgICB9LAorICAgICAgICAjIFNTRTQuMgorICAgICAgICBxd3sKKyAgICAgICAgICAgIHBjbXBlc3RyaSBwY21wZXN0cm0gcGNtcGlzdHJpIHBjbXBpc3RybSBwY21wZ3RxIGNyYzMyIHBvcGNudAorICAgICAgICB9CisgICAgKTsKKworIyBVbmRlc2lyZWQgaW5zdHJ1Y3Rpb25zIGZvciBJQS0zMiBhcmNoaXRlY3R1cmU6IFBlbnRpdW0gNCAoU1NFMikgYW5kIG5ld2VyLgorIyBUT0RPOiBJdCB3b3VsZCBiZSBtdWNoIG1vcmUgcmVsaWFibGUgdG8gbGlzdCAqYWxsb3dlZCogaW5zdHJ1Y3Rpb25zIHJhdGhlciB0aGFuIGxpc3QgdW5kZXNpcmVkCisjIGluc3RydWN0aW9ucy4gSW4gc3VjaCBhIGNhc2UgdGhlIGxpc3Qgd2lsbCBiZSBzdGFibGUgYW5kIG5vdCByZXF1aXJlIHVwZGF0ZSB3aGVuIFNTRTUgaXMgcmVsZWFzZWQuCitteSBAaWEzMl9iYWRfbGlzdCA9ICggQHNzZTIsIEBzc2UzLCBAc3NzZTMsIEBzc2U0ICk7CisKK215ICRpYTMyX2JhZF9yZSA9IHFye0B7WyAiXig/OiIgLiBqb2luKCAifCIsIEBpYTMyX2JhZF9saXN0ICkgLiAiKSIgXX19aTsKKworc3ViIGJhZF9pYTMyX2luc3RyKCQkKSB7CisgICAgbXkgKCAkaW5zdHIsICRhcmdzICkgPSBAXzsKKyAgICByZXR1cm4gKCBkZWZpbmVkKCAkaW5zdHIgKSBhbmQgJGluc3RyID1+ICRpYTMyX2JhZF9yZSApOworfTsgIyBzdWIgYmFkX2lhMzJfaW5zdHIKKworc3ViIGNoZWNrX2ZpbGUoJDskJCkgeworCisgICAgbXkgKCAkZmlsZSwgJHNob3dfaW5zdHJ1Y3Rpb25zLCAkbWF4X2luc3RydWN0aW9ucyApID0gQF87CisgICAgbXkgQGJ1bGs7CisKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbWF4X2luc3RydWN0aW9ucyApICkgeworICAgICAgICAkbWF4X2luc3RydWN0aW9ucyA9IDEwMDsKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKCBbICJ4ODZfNjQtazFvbS1saW51eC1vYmpkdW1wIiwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKworICAgIG15ICRuID0gMDsKKyAgICBteSAkZXJyb3JzID0gMDsKKyAgICBteSAkY3VycmVudF9mdW5jICA9ICIiOyAgICAjIE5hbWUgb2YgY3VycmVudCBmdWN0aW9uLgorICAgIG15ICRyZXBvcnRlZF9mdW5jID0gIiI7ICAgICMgbmFtZSBvZiBsYXN0IHJlcG9ydGVkIGZ1bmN0aW9uLgorICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgKysgJG47CisgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiR9ICkgeworICAgICAgICAgICAgIyBFbXB0eSBsaW5lLgorICAgICAgICAgICAgIyBJZ25vcmUuCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15JbiBhcmNoaXZlICguKj8pOlxzKiR9ICkgeworICAgICAgICAgICAgIyBJbiBhcmNoaXZlIGxpYm9tcC5hOgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteKD86Lio/KTpccypmaWxlIGZvcm1hdCAoLio/KVxzKiR9ICkgeworICAgICAgICAgICAgIyBsaWJvbXAuc286ICAgICBmaWxlIGZvcm1hdCBlbGY2NC14ODYtNjQtZnJlZWJzZAorICAgICAgICAgICAgIyBrbXBfZnRuX2NkZWNsLm86ICAgICBmaWxlIGZvcm1hdCBlbGY2NC14ODYtNjQKKyAgICAgICAgICAgIG15ICRmbXQgPSAkMTsKKyAgICAgICAgICAgIGlmICggYmFkX2ZtdCggJGZtdCApICkgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJJbnZhbGlkIGZpbGUgZm9ybWF0OiAkZm10LiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XkRpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gKC4qPyk6XHMqJH0gKSB7CisgICAgICAgICAgICAjIERpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnBsdDoKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XiRoZXgrIDwoW14+XSspPjpccyokfSApIHsKKyAgICAgICAgICAgICMgMDAwMDAwMDAwMDAxN2U5OCA8X19rbXBfc3RyX2Zvcm1hdEBwbHQtMHgxMD46CisgICAgICAgICAgICAkY3VycmVudF9mdW5jID0gJDE7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypcLnszfVxzKiR9ICkgeworICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqKCRoZXgrKTpccysoJGhleCRoZXgoPzogJGhleCRoZXgpKilccysoPzpsb2NrXHMrfHJleFsuYS16XSpccyspPyhbXiBdKykoPzpccysoW14jXSs/KSk/XHMqKD86I3wkKX0gKSB7CisgICAgICAgICAgICAjICAgMTdlOTg6ICAgICAgIGZmIDM1IGZhIDdkIDI2IDAwICAgICAgIHB1c2hxICAweDI2N2RmYSglcmlwKSAgICAgICAgIyAyN2ZjOTggPF9HTE9CQUxfT0ZGU0VUX1RBQkxFPgorICAgICAgICAgICAgbXkgKCAkYWRkciwgJGR1bXAsICRpbnN0ciwgJGFyZ3MgKSA9ICggJDEsICQyLCAkMywgJDQgKTsKKyAgICAgICAgICAgICMgQ2hlY2sgdGhpcyBpcyBub3QgYSBiYWQgaW5zdHJ1Y3Rpb24gYW5kIHhtbSByZWdpc3RlcnMgYXJlIG5vdCB1c2VkLgorICAgICAgICAgICAgaWYgKCBiYWRfaW5zdHIoICRpbnN0ciwgJGFyZ3MgKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICRlcnJvcnMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIkludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kIGluIGAkZmlsZSc6IiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICBpZiAoICRjdXJyZW50X2Z1bmMgbmUgJHJlcG9ydGVkX2Z1bmMgKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICIgICAgJGN1cnJlbnRfZnVuYyIgKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlcG9ydGVkX2Z1bmMgPSAkY3VycmVudF9mdW5jOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICArKyAkZXJyb3JzOworICAgICAgICAgICAgICAgIGlmICggJHNob3dfaW5zdHJ1Y3Rpb25zICkgeworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiICAgICAgICAkbGluZSIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgaWYgKCAkZXJyb3JzID49ICRtYXhfaW5zdHJ1Y3Rpb25zICkgeworICAgICAgICAgICAgICAgICAgICBpbmZvKCAiJGVycm9ycyBpbnZhbGlkIGluc3RydWN0aW9ucyBmb3VuZDsgc2Nhbm5pbmcgc3RvcHBlZC4iICk7CisgICAgICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkVycm9yIHBhcnNpbmcgb2JqZHVtcCBvdXRwdXQgbGluZSAkbjpcbj4+Pj4gJGxpbmVcbiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkbGluZQorCisgICAgcmV0dXJuICRlcnJvcnM7CisKK307ICMgc3ViIGNoZWNrX2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KK215ICRtYXhfaW5zdHJ1Y3Rpb25zOworbXkgJHNob3dfaW5zdHJ1Y3Rpb25zOworZ2V0X29wdGlvbnMoCisgICAgIm9zPXMiICAgICAgICAgICAgICAgPT4gXCR0YXJnZXRfb3MsCisgICAgImFyY2g9cyIgICAgICAgICAgICAgPT4gXCR0YXJnZXRfYXJjaCwKKyAgICAibWljLWFyY2g9cyIgICAgICAgICA9PiBcJHRhcmdldF9taWNfYXJjaCwKKyAgICAibWF4LWluc3RydWN0aW9ucz1pIiA9PiBcJG1heF9pbnN0cnVjdGlvbnMsCisgICAgInNob3ctaW5zdHJ1Y3Rpb25zISIgPT4gXCRzaG93X2luc3RydWN0aW9ucywKKyk7CitteSAkdGFyZ2V0X3BsYXRmb3JtID0gJHRhcmdldF9vcyAuICJfIiAuICR0YXJnZXRfYXJjaDsKK2lmICggIiR0YXJnZXRfb3MiIGVxICJsaW4iIGFuZCAiJHRhcmdldF9taWNfYXJjaCIgZXEgImtuZiIgKSB7CisgICAgJG1pY19iYWRfcmUgPSBxcnteKD86cGF1c2V8W3NsbV1mZW5jZXxzY2F0dGVyfGdhdGhlcnxjbXB4Y2hnMTZifGNsZXZpY3RbMTJdKX1pOworfSBlbHNlIHsKKyAgICAkbWljX2JhZF9yZSA9IHFye14oPzpwYXVzZXxbc2xtXWZlbmNlfHNjYXR0ZXJ8Z2F0aGVyfGNtb3Z8Y21weGNoZzE2YnxjbGV2aWN0WzEyXSl9aTsKK307CitpZiAoIDAgKSB7Cit9IGVsc2lmICggJHRhcmdldF9wbGF0Zm9ybSBlcSAibGluX21pYyIgKSB7CisgICAgKmJhZF9pbnN0ciA9IFwqYmFkX21pY19pbnN0cjsKKyAgICAqYmFkX2ZtdCAgID0gXCpiYWRfbWljX2ZtdDsKK30gZWxzaWYgKCAkdGFyZ2V0X3BsYXRmb3JtIGVxICJsaW5fMzIiICkgeworICAgICpiYWRfaW5zdHIgPSBcKmJhZF9pYTMyX2luc3RyOworICAgICpiYWRfZm10ICAgPSBcKmJhZF9pYTMyX2ZtdDsKK30gZWxzZSB7CisgICAgcnVudGltZV9lcnJvciggIk9ubHkgd29ya3Mgb24gbGluXzMyIGFuZCBsaW5fbWljIHBsYXRmb3Jtcy4iICk7Cit9OyAjIGlmCisKKyMgRG8gdGhlIHdvcmsuCitteSAkcmMgPSAwOworaWYgKCBub3QgQEFSR1YgKSB7CisgICAgaW5mbyggIk5vIGFyZ3VtZW50cyBzcGVjaWZpZWQgLS0gbm90aGluZyB0byBkby4iICk7Cit9IGVsc2UgeworICAgIGZvcmVhY2ggbXkgJGFyZyAoIEBBUkdWICkgeworICAgICAgICBteSAkZXJycyA9IGNoZWNrX2ZpbGUoICRhcmcsICRzaG93X2luc3RydWN0aW9ucywgJG1heF9pbnN0cnVjdGlvbnMgKTsKKyAgICAgICAgaWYgKCAkZXJycyA+IDAgKSB7CisgICAgICAgICAgICAkcmMgPSAzOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRhcmcKK307ICMgaWYKKworZXhpdCggJHJjICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGNoZWNrLWluc3RydWN0aW9uLXNldC5wbD4gLS0gTWFrZSBzdXJlIGJpbmFyeSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdW5kZXNpcmVkIGluc3RydWN0aW9ucy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Y2hlY2staW5zdHJ1Y3Rpb25zLnBsPiBJPG9wdGlvbj4uLi4gSTxmaWxlPi4uLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tYXJjaGl0ZWN0dXJlPT5JPGFyY2g+CisKK1NwZWNpZnkgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwtLW1heC1pbnN0cnVjdGlvbnM9Pkk8bnVtYmVyPgorCitTdG9wIHNjYW5uaW5nIGlmIEk8bnVtYmVyPiBpbnZhbGlkIGluc3RydWN0aW9ucyBmb3VuZC4gMTAwIGJ5IGRlZmF1bHQuCisKKz1pdGVtIEI8LS1vcz0+STxvcz4KKworU3BlY2lmeSB0YXJnZXQgT1MuCisKKz1pdGVtIEI8LS0+W0I8bm8tPl1CPHNob3ctaW5zdHJ1Y3Rpb25zPgorCitTaG93IGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kIGluIHRoZSBmaWxlLiBCdSBkZWZhdWx0LCBpbnN0cnVjdGlvbnMgYXJlIG5vdCBzaG93bi4KKworPWl0ZW0gU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgcHJvZ3JhbSB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworRmlsZSAob2JqZWN0IGZpbGUgb3IgbGlicmFyeSwgZWl0aGVyIHN0YXRpYyBvciBkeW5hbWljKSB0byBjaGVjay4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBzY3JpcHQgcnVucyBGPG9iamR1bXA+IHV0aWxpdHkgdG8gZ2V0IGRpc2Fzc2VtYmxlciBsaXN0aW5nIGFuZCBjaGVja3MgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbgordW53YW50ZWQgaW5zdHJ1Y3Rpb25zLgorCitDdXJyZW50bHkgdGhlIHNjcmlwdCB3b3JrcyBvbmx5IGZvcjoKKworPW92ZXIKKworPWl0ZW0gQzxsaW5fbWljPgorCitJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgdGFyZ2V0IE9TLiBVbmRlc2lyZWQgdW5zdHJ1Y3Rpb25zIGFyZTogYWxsIHg4NyBpbnN0cnVjdGlvbnMgYW5kIHNvbWUgb3RoZXJzLgorCis9aXRlbSBDPGxpbl8zMj4KKworVW5kZXNpcmVkIGluc3RydWN0aW9ucyBhcmUgaW5zdHJ1Y3Rpb25zIG5vdCB2YWxpZCBmb3IgUGVudGl1bSAzIHByb2Nlc3NvciAoU1NFMiBhbmQgbmV3ZXIpLgorCis9YmFjaworCis9Y3V0CisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rvb2xzL2dlbmVyYXRlLWRlZi5wbCBiL3JjMy9ydW50aW1lL3Rvb2xzL2dlbmVyYXRlLWRlZi5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzJiMGYzCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdG9vbHMvZ2VuZXJhdGUtZGVmLnBsCkBAIC0wLDAgKzEsMzIxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBTb21lIHByYWdtYXMuCit1c2Ugc3RyaWN0OyAgICAgICAgICAjIFJlc3RyaWN0IHVuc2FmZSBjb25zdHJ1Y3RzLgordXNlIHdhcm5pbmdzOyAgICAgICAgIyBFbmFibGUgYWxsIHdhcm5pbmdzLgorCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDQiOworCisjCisjIFN1YnJvdXRpbmVzLgorIworCitzdWIgcGFyc2VfaW5wdXQoJFwlKSB7CisKKyAgICBteSAoICRpbnB1dCwgJGRlZnMgKSA9IEBfOworICAgIG15IEBidWxrID0gcmVhZF9maWxlKCAkaW5wdXQgKTsKKyAgICBteSAlZW50cmllczsKKyAgICBteSAlb3JkaW5hbHM7CisgICAgbXkgQGRpcnM7CisgICAgbXkgJHZhbHVlID0gMTsKKworICAgIG15ICRlcnJvciA9CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAoICRtc2csICRsLCAkbGluZSApID0gQF87CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGZpbGUgXCIkaW5wdXRcIiBsaW5lICRsOlxuIiAuCisgICAgICAgICAgICAgICAgIiAgICAkbGluZSIgLgorICAgICAgICAgICAgICAgICggJG1zZyA/ICRtc2cgLiAiXG4iIDogKCkgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgIyBzdWIKKworICAgIG15ICRuID0gMDsgICAgIyBMaW5lIG51bWJlci4KKyAgICBmb3JlYWNoIG15ICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgICsrICRuOworICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICAjIEVtcHR5IGxpbmUgb3IgY29tbWVudC4gU2tpcCBpdC4KKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiV9ICkgeworICAgICAgICAgICAgIyBBIGRpcmVjdGl2ZS4KKyAgICAgICAgICAgIGlmICggMCAgKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJVxzKmlmKG4pP2RlZlxzKyhbQS1aYS16MC05X10rKVxzKig/OiN8XG4pfSApIHsKKyAgICAgICAgICAgICAgICBteSAoICRuZWdhdGlvbiwgJG5hbWUgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICAgICAgbXkgJGRpciA9IHsgbiA9PiAkbiwgbGluZSA9PiAkbGluZSwgbmFtZSA9PiAkbmFtZSwgdmFsdWUgPT4gJHZhbHVlIH07CisgICAgICAgICAgICAgICAgcHVzaCggQGRpcnMsICRkaXIgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAoICR2YWx1ZSBhbmQgKCAkbmVnYXRpb24geG9yICRkZWZzLT57ICRuYW1lIH0gKSApOworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiVccyplbmRpZlxzKig/OiN8XG4pfSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCBAZGlycyApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcnBoYW4gJWVuZGlmIGRpcmVjdGl2ZS4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgbXkgJGRpciA9IHBvcCggQGRpcnMgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAkZGlyLT57IHZhbHVlIH07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAiQmFkIGRpcmVjdGl2ZS4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKigtKT9ccyooW0EtWmEtejAtOV9dKykoPzpccysoXGQrfERBVEEpKT9ccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICBteSAoICRvYnNvbGV0ZSwgJGVudHJ5LCAkb3JkaW5hbCApID0gKCAkMSwgJDIsICQzICk7CisgICAgICAgICAgICBpZiAoICR2YWx1ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGV4aXN0cyggJGVudHJpZXN7ICRlbnRyeSB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiRW50cnkgXCIkZW50cnlcIiBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZC4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgJGVudHJpZXN7ICRlbnRyeSB9ID0geyBvcmRpbmFsID0+ICRvcmRpbmFsLCBvYnNvbGV0ZSA9PiBkZWZpbmVkKCAkb2Jzb2xldGUgKSB9OworICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9yZGluYWwgKSBhbmQgJG9yZGluYWwgbmUgIkRBVEEiICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICRvcmRpbmFsID49IDEwMDAgYW5kICRlbnRyeSA9fiBte1xBW29rXW1wX30gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9yZGluYWwgb2YgdXNlci1jYWxsYWJsZSBlbnRyeSBtdXN0IGJlIDwgMTAwMCIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggJG9yZGluYWwgPj0gMTAwMCBhbmQgJG9yZGluYWwgPCAyMDAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcmRpbmFscyBiZXR3ZWVuIDEwMDAgYW5kIDE5OTkgYXJlIHJlc2VydmVkLiIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggZXhpc3RzKCAkb3JkaW5hbHN7ICRvcmRpbmFsIH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3JkaW5hbCAkb3JkaW5hbCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAgICAgJG9yZGluYWxzeyAkb3JkaW5hbCB9ID0gJGVudHJ5OworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAiIiwgJG4sICRsaW5lICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIGlmICggQGRpcnMgKSB7CisgICAgICAgIG15ICRkaXIgPSBwb3AoIEBkaXJzICk7CisgICAgICAgICRlcnJvci0+KCAiVW50ZXJtaW5hdGVkICVpZiBkaXJlY2l2ZS4iLCAkZGlyLT57IG4gfSwgJGRpci0+eyBsaW5lIH0gKTsKKyAgICB9OyAjIHdoaWxlCisKKyAgICByZXR1cm4gJWVudHJpZXM7CisKK307ICMgc3ViIHBhcnNlX2lucHV0CisKK3N1YiBwcm9jZXNzKFwlKSB7CisKKyAgICBteSAoICRlbnRyaWVzICkgPSBAXzsKKworICAgIGZvcmVhY2ggbXkgJGVudHJ5ICgga2V5cyggJSRlbnRyaWVzICkgKSB7CisgICAgICAgIGlmICggbm90ICRlbnRyaWVzLT57ICRlbnRyeSB9LT57IG9ic29sZXRlIH0gKSB7CisgICAgICAgICAgICBteSAkb3JkaW5hbCA9ICRlbnRyaWVzLT57ICRlbnRyeSB9LT57IG9yZGluYWwgfTsKKyAgICAgICAgICAgIGlmICggJGVudHJ5ID1+IG17XEFbb2tdbXBffSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkb3JkaW5hbCApIG9yICRvcmRpbmFsIGVxICJEQVRBIiApIHsKKyAgICAgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZW50cnkgXCIkZW50cnlcIjogb3JkaW5hbCBudW1iZXIgaXMgbm90IHNwZWNpZmllZC4iCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRlbnRyaWVzLT57IHVjKCAkZW50cnkgKSB9ID0geyBvcmRpbmFsID0+IDEwMDAgKyAkb3JkaW5hbCB9OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisKKyAgICByZXR1cm4gJSRlbnRyaWVzOworCit9OyAjIHN1YiBwcm9jZXNzCisKK3N1YiBnZW5lcmF0ZV9vdXRwdXQoXCUkKSB7CisKKyAgICBteSAoICRlbnRyaWVzLCAkb3V0cHV0ICkgPSBAXzsKKyAgICBteSAkYnVsazsKKworICAgICRidWxrID0gIkVYUE9SVFNcbiI7CisgICAgZm9yZWFjaCBteSAkZW50cnkgKCBzb3J0KCBrZXlzKCAlJGVudHJpZXMgKSApICkgeworICAgICAgICBpZiAoIG5vdCAkZW50cmllcy0+eyAkZW50cnkgfS0+eyBvYnNvbGV0ZSB9ICkgeworICAgICAgICAgICAgJGJ1bGsgLj0gc3ByaW50ZiggIiAgICAlLTQwcyAiLCAkZW50cnkgKTsKKyAgICAgICAgICAgIG15ICRvcmRpbmFsID0gJGVudHJpZXMtPnsgJGVudHJ5IH0tPnsgb3JkaW5hbCB9OworICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkb3JkaW5hbCApICkgeworICAgICAgICAgICAgICAgIGlmICggJG9yZGluYWwgZXEgIkRBVEEiICkgeworICAgICAgICAgICAgICAgICAgICAkYnVsayAuPSAiREFUQSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGJ1bGsgLj0gIlxAIiAuICRvcmRpbmFsOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICRidWxrIC49ICJcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKyAgICBpZiAoIGRlZmluZWQoICRvdXRwdXQgKSApIHsKKyAgICAgICAgd3JpdGVfZmlsZSggJG91dHB1dCwgXCRidWxrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQoICRidWxrICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBnZW5lcmF0ZV9vdXB1dAorCisjCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KKyMKKworbXkgJGlucHV0OyAgICMgVGhlIG5hbWUgb2YgaW5wdXQgZmlsZS4KK215ICRvdXRwdXQ7ICAjIFRoZSBuYW1lIG9mIG91dHB1dCBmaWxlLgorbXkgJWRlZnM7CisKK2dldF9vcHRpb25zKAorICAgICJvdXRwdXQ9cyIgICAgPT4gXCRvdXRwdXQsCisgICAgIkR8ZGVmaW5lPXMiICA9PgorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgKCAkb3B0X25hbWUsICRvcHRfdmFsdWUgKSA9IEBfOworICAgICAgICAgICAgbXkgKCAkZGVmX25hbWUsICRkZWZfdmFsdWUgKTsKKyAgICAgICAgICAgIGlmICggJG9wdF92YWx1ZSA9fiBte1xBKC4qPyk9KC4qKVx6fSApIHsKKyAgICAgICAgICAgICAgICAoICRkZWZfbmFtZSwgJGRlZl92YWx1ZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKCAkZGVmX25hbWUsICRkZWZfdmFsdWUgKSA9ICggJG9wdF92YWx1ZSwgMSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgJGRlZnN7ICRkZWZfbmFtZSB9ID0gJGRlZl92YWx1ZTsKKyAgICAgICAgfSwKKyk7CisKK2lmICggQEFSR1YgPT0gMCApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiTm90IGVub3VnaCBhcmd1bWVudHMuIiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IGFyZ3VtZW50cy4iICk7Cit9OyAjIGlmCiskaW5wdXQgPSBzaGlmdCggQEFSR1YgKTsKKworIworIyBXb3JrLgorIworCitteSAlZGF0YSA9IHBhcnNlX2lucHV0KCAkaW5wdXQsICVkZWZzICk7CislZGF0YSA9IHByb2Nlc3MoICVkYXRhICk7CitnZW5lcmF0ZV9vdXRwdXQoICVkYXRhLCAkb3V0cHV0ICk7CitleGl0KCAwICk7CisKK19fRU5EX18KKworIworIyBFbWJlZGRlZCBkb2N1bWVudGF0aW9uLgorIworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Z2VuZXJhdGUtZGVmLnBsPiAtLSBHZW5lcmF0ZSBkZWYgZmlsZSBmb3IgT3Blbk1QIFJUTC4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Z2VuZXJhdGUtZGVmLnBsPiBJPE9QVElPTj4uLi4gSTxmaWxlPgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tZGVmaW5lPT5JPG5hbWU+Wz1JPHZhbHVlPl0KKworPWl0ZW0gQjwtRD4gSTxuYW1lPls9STx2YWx1ZT5dCisKK0RlZmluZSBzcGVjaWZpZWQgbmFtZS4gSWYgSTx2YWx1ZT4gaXMgb21pdHRlZCwgSTxuYW1lPiBpcyBkZWZpbmVkIHRvIDEuIElmIEk8dmFsdWU+IGlzIDAgb3IgZW1wdHksCituYW1lIGlzIEI8bm90PiBkZWZpbmVkLgorCis9aXRlbSBCPC0tb3V0cHV0PT5JPGZpbGU+CisKKz1pdGVtIEI8LW8+IEk8ZmlsZT4KKworU3BlY2lmeSBvdXRwdXQgZmlsZSBuYW1lLiBJZiBvcHRpb24gaXMgbm90IHByZXNlbnQsIHJlc3VsdCBpcyBwcmludGVkIHRvIHN0ZG91dC4KKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworRG8gcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgaW5wdXQgZmlsZS4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBzY3JpcHQgcmVhZHMgaW5wdXQgZmlsZSwgcHJvY2VzcyBjb25kaXRpb25hbCBkaXJlY3RpdmVzLCBjaGVja3MgY29udGVudCBmb3IgY29uc2lzdGVuY3ksIGFuZAorZ2VuZXJhdGVzIG91cHRwdXQgZmlsZSBzdWl0YWJsZSBmb3IgbGlua2VyLgorCis9aGVhZDIgSW5wdXQgRmlsZSBGb3JtYXQKKworPW92ZXIKKworPWl0ZW0gQ29tbWVudHMKKworICAgICMgSXQncyBhIGNvbW1lbnQuCisKK0NvbW1lbnRzIHN0YXJ0IHdpdGggQzwjPiBzeW1ib2wgYW5kIGNvbnRpbnVlIHRvIHRoZSBlbmQgb2YgbGluZS4KKworPWl0ZW0gQ29uZGl0aW9uYWwgRGlyZWN0aXZlcworCisgICAgJWlmZGVmIG5hbWUKKyAgICAlaWZuZGVmIG5hbWUKKyAgICAlZW5kaWYKKworQSBwYXJ0IG9mIGZpbGUgc3Vycm91bmRlZCBieSBDPCVpZmRlZiBJPG5hbWU+PiBhbmQgQzwlZW5kaWY+IGRpcmVjdGl2ZXMgaXMgYSBjb25kaXRpb25hbCBwYXJ0IC0tIGl0CitoYXMgZWZmZWN0IG9ubHkgaWYgSTxuYW1lPiBpcyBkZWZpbmVkIGluIHRoZSBjb21tYW4gbGluZSBieSBCPC0tZGVmaW5lPiBvcHRpb24uIEM8JWlmbmRlZj4gaXMgYQorbmVnYXRlZCB2ZXJzaW9uIG9mIEM8JWlmZGVmPiAtLSBjb25kaXRpb25hbCBwYXJ0IGhhcyBhbiBlZmZlY3Qgb25seSBpZiBJPG5hbWU+IGlzIEI8bm90PiBkZWZpbmVkLgorCitDb25kaXRpb25hbCBwYXJ0cyBtYXkgYmUgbmVzdGVkLgorCis9aXRlbSBFeHBvcnQgRGVmaW5pdGlvbnMKKworICAgIHN5bWJvbAorICAgIHN5bWJvbCBvcmRpbmFsCisgICAgc3ltYm9sIERBVEEKKworU3ltYm9scyBzdGFydGluZyB3aXRoIEM8b21wXz4gb3IgQzxrbXBfPiBtdXN0IGhhdmUgb3JkaW5hbCBzcGVjaWZpZWQuIFRoZXkgYXJlIHN1YmplY3RzIGZvciBzcGVjaWFsCitwcm9jZXNzaW5nOiBlYWNoIHN5bWJvbCBnZW5lcmF0ZXMgdHdvIG91dHB1dCBsaW5lczogb3JpZ2luYWwgb25lIGFuZCB1cHBlciBjYXNlIHZlcnNpb24uIFRoZSBvcmRpbmFsCitudW1iZXIgb2YgdGhlIHNlY29uZCBpcyBvcmlnaW5hbCBvcmRpbmFsIGluY3JlYXNlZCBieSAxMDAwLgorCis9aXRlbSBPYnNvbGV0ZSBTeW1ib2xzCisKKyAgICAtIHN5bWJvbAorICAgIC0gc3ltYm9sIG9yZGluYWwKKyAgICAtIHN5bWJvbCBEQVRBCisKK09ic29sZXRlIHN5bWJvbHMgbG9vayBsaWtlIGV4cG9ydCBkZWZpbml0aW9ucyBwcmVmaXhlZCB3aXRoIG1pbnVzIHNpZ24uIE9ic29sZXRlIHN5bWJvbHMgZG8gbm90CithZmZlY3QgdGhlIG91dHB1dCwgYnV0IG9ic29sZXRlIHN5bWJvbHMgYW5kIHRoZWlyIG9yZGluYWxzIGNhbm5vdCBiZSAocmUpdXNlZCBpbiBleHBvcnQgZGVmaW5pdGlvbnMuCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCisgICAgJCBnZW5lcmF0ZS1kZWYucGwgLUQgc3R1YiAtRCBVU0VfVENIRUNLPTAgLW8gbGliZ3VpZGUuZGVmIGRsbGV4cG9ydAorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90b29scy9saWIvQnVpbGQucG0gYi9yYzMvcnVudGltZS90b29scy9saWIvQnVpbGQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2NzE1NgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rvb2xzL2xpYi9CdWlsZC5wbQpAQCAtMCwwICsxLDI2NCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworcGFja2FnZSBCdWlsZDsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEN3ZCBxd3t9OworCit1c2UgTGliT01QOwordXNlIHRvb2xzOwordXNlIFVuYW1lOwordXNlIFBsYXRmb3JtICI6dmFycyI7CisKK215ICRob3N0ID0gVW5hbWU6Omhvc3RfbmFtZSgpOworbXkgJHJvb3QgPSAkRU5WeyBMSUJPTVBfV09SSyAgICB9OworbXkgJHRtcCAgPSAkRU5WeyBMSUJPTVBfVE1QICAgICB9OworbXkgJG91dCAgPSAkRU5WeyBMSUJPTVBfRVhQT1JUUyB9OworCitteSBAam9iczsKK291ciAkc3RhcnQgPSB0aW1lKCk7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSGVscGVyIGZ1bmN0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyB0c3RyIC0tIFRpbWUgc3RyaW5nLiBSZXR1cm5zIHN0cmluZyAieXl5eS1kZC1tbSBoaDptbTpzcyBVVEMiLgorc3ViIHRzdHIoOyQpIHsKKyAgICBteSAoICR0aW1lICkgPSBAXzsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdGltZSApICkgeworICAgICAgICAkdGltZSA9IHRpbWUoKTsKKyAgICB9OyAjIGlmCisgICAgbXkgKCAkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciApID0gZ210aW1lKCAkdGltZSApOworICAgICRtb250aCArPSAxOworICAgICR5ZWFyICArPSAxOTAwOworICAgIG15ICRzdHIgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgVVRDIiwgJHllYXIsICRtb250aCwgJGRheSwgJGhvdXIsICRtaW4sICRzZWMgKTsKKyAgICByZXR1cm4gJHN0cjsKK307ICMgc3ViIHRzdHIKKworIyBkc3RyIC0tIER1cmF0aW9uIHN0cmluZy4gUmV0dXJucyBzdHJpbmcgImhoOm1tOnNzIi4KK3N1YiBkc3RyKCQpIHsKKyAgICAjIEdldCB0aW1lIGluIHNlY29uZHMgYW5kIGZvcm1hdCBpdCBhcyB0aW1lIGluIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLgorICAgIG15ICggJHNlYyApID0gQF87CisgICAgbXkgKCAkaCwgJG0sICRzICk7CisgICAgJGggICA9IGludCggJHNlYyAvIDM2MDAgKTsKKyAgICAkc2VjID0gJHNlYyAtICRoICogMzYwMDsKKyAgICAkbSAgID0gaW50KCAkc2VjIC8gNjAgKTsKKyAgICAkc2VjID0gJHNlYyAtICRtICogNjA7CisgICAgJHMgICA9IGludCggJHNlYyApOworICAgICRzZWMgPSAkc2VjIC0gJHM7CisgICAgcmV0dXJuIHNwcmludGYoICIlMDJkOiUwMmQ6JTAyZCIsICRoLCAkbSwgJHMgKTsKK307ICMgc3ViIGRzdHIKKworIyByc3RyIC0tIFJlc3VsdCBzdHJpbmcuCitzdWIgcnN0cigkKSB7CisgICAgbXkgKCAkcmMgKSA9IEBfOworICAgIHJldHVybiAoICRyYyA9PSAwID8gIisrKyBTdWNjZXNzICsrKyIgOiAiLS0tIEZhaWx1cmUgLS0tIiApOworfTsgIyBzdWIgcnN0cgorCitzdWIgc2hvcnRlcigkOyQpIHsKKyAgICAjIFJldHVybiBzaG9ydGVyIHZhcmlhbnQgb2YgcGF0aCAtLSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUuCisgICAgbXkgKCAkcGF0aCwgJGJhc2UgKSA9IEBfOworICAgIG15ICRhYnMgPSBhYnNfcGF0aCggJHBhdGggKTsKKyAgICBteSAkcmVsID0gcmVsX3BhdGgoICRwYXRoLCAkYmFzZSApOworICAgIGlmICggJHJlbCBlcSAiIiApIHsKKyAgICAgICAgJHJlbCA9ICIuIjsKKyAgICB9OyAjIGlmCisgICAgJHBhdGggPSAoIGxlbmd0aCggJHJlbCApIDwgbGVuZ3RoKCAkYWJzICkgPyAkcmVsIDogJGFicyApOworICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgJHBhdGggPX4gc3tcXH17L31nOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHBhdGg7Cit9OyAjIHN1YiBzaG9ydGVyCisKK3N1YiB0ZWUoJCQpIHsKKworICAgIG15ICggJGFjdGlvbiwgJGZpbGUgKSA9IEBfOworICAgIG15ICRwaWQgPSAwOworCisgICAgbXkgJHNhdmVfc3Rkb3V0ID0gU3ltYm9sOjpnZW5zeW0oKTsKKyAgICBteSAkc2F2ZV9zdGRlcnIgPSBTeW1ib2w6OmdlbnN5bSgpOworCisgICAgIyAtLS0gcmVkaXJlY3Qgc3Rkb3V0IC0tLQorICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAjIFNhdmUgc3Rkb3V0IGluICRzYXZlX3N0ZG91dC4KKyAgICBvcGVuKCAkc2F2ZV9zdGRvdXQsICI+JiIgLiBTVERPVVQtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKyAgICAjIFJlZGlyZWN0IHN0ZG91dCB0byB0ZWUgb3IgdG8gZmlsZS4KKyAgICBpZiAoICR0b29sczo6dmVyYm9zZSApIHsKKyAgICAgICAgJHBpZCA9IG9wZW4oIFNURE9VVCwgInwgdGVlIC1hIFwiJGZpbGVcIiIgKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3Qgb3BlbiBwaXBlIHRvIFwidGVlXCI6ICQhOyBzdG9wcGVkIjsKKyAgICB9IGVsc2UgeworICAgICAgICBvcGVuKCBTVERPVVQsICI+PiRmaWxlIiApCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBvcGVuIGZpbGUgXCIkZmlsZVwiIGZvciB3cml0aW5nOiAkITsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorCisgICAgIyAtLS0gcmVkaXJlY3Qgc3RkZXJyIC0tLQorICAgIFNUREVSUi0+Zmx1c2goKTsKKyAgICAjIFNhdmUgc3RkZXJyIGluICRzYXZlX3N0ZGVyci4KKyAgICBvcGVuKCAkc2F2ZV9zdGRlcnIsICI+JiIgLiBTVERFUlItPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKyAgICAjIFJlZGlyZWN0IHN0ZGVyciB0byBzdGRvdXQuCisgICAgb3BlbiggU1RERVJSLCAiPiYiIC4gU1RET1VULT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisKKyAgICAjIFBlcmZvcm0gYWN0aW9ucy4KKyAgICAkYWN0aW9uLT4oKTsKKworICAgICMgLS0tIHJlc3RvcmUgc3RkZXJyIC0tLQorICAgIFNUREVSUi0+Zmx1c2goKTsKKyAgICAjIFJlc3RvcmUgc3RkZXJyIGZyb20gJHNhdmVfc3RkZXJyLgorICAgIG9wZW4oIFNUREVSUiwgIj4mIiAuICRzYXZlX3N0ZGVyci0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworICAgICMgQ2xvc2UgJHNhdmVfc3RkZXJyLgorICAgICRzYXZlX3N0ZGVyci0+Y2xvc2UoKSBvciBkaWUgKCAiQ2Fubm90IGNsb3NlIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworCisgICAgIyAtLS0gcmVzdG9yZSBzdGRvdXQgLS0tCisgICAgU1RET1VULT5mbHVzaCgpOworICAgICMgUmVzdG9yZSBzdGRvdXQgZnJvbSAkc2F2ZV9zdGRvdXQuCisgICAgb3BlbiggU1RET1VULCAiPiYiIC4gJHNhdmVfc3Rkb3V0LT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisgICAgIyBDbG9zZSAkc2F2ZV9zdGRvdXQuCisgICAgJHNhdmVfc3Rkb3V0LT5jbG9zZSgpIG9yIGRpZSAoICJDYW5ub3QgY2xvc2UgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisKKyAgICAjIFdhaXQgZm9yIHRoZSBjaGlsZCB0ZWUgcHJvY2Vzcywgb3RoZXJ3aXNlIG91dHB1dCBvZiBtYWtlIGFuZCBidWlsZC5wbCBpbnRlcmxlYXZlcy4KKyAgICBpZiAoICRwaWQgIT0gMCApIHsKKyAgICAgICAgd2FpdHBpZCggJHBpZCwgMCApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgdGVlCisKK3N1YiBsb2dfaXQoJCRAKSB7CisgICAgbXkgKCAkdGl0bGUsICRmb3JtYXQsIEBhcmdzICkgPSBAXzsKKyAgICBteSAkbWVzc2FnZSAgPSBzcHJpbnRmKCAkZm9ybWF0LCBAYXJncyApOworICAgIG15ICRwcm9ncmVzcyA9IGNhdF9maWxlKCAkdG1wLCBzcHJpbnRmKCAiJXMtJXMubG9nIiwgJHRhcmdldF9wbGF0Zm9ybSwgVW5hbWU6Omhvc3RfbmFtZSgpICkgKTsKKyAgICBpZiAoICR0aXRsZSBuZSAiIiBhbmQgJG1lc3NhZ2UgbmUgIiIgKSB7CisgICAgICAgIG15ICRsaW5lID0gc3ByaW50ZiggIiUtMTVzIDogJXNcbiIsICR0aXRsZSwgJG1lc3NhZ2UgKTsKKyAgICAgICAgaW5mbyggJGxpbmUgKTsKKyAgICAgICAgd3JpdGVfZmlsZSggJHByb2dyZXNzLCB0c3RyKCkgLiAiOiAiIC4gJGxpbmUsIC1hcHBlbmQgPT4gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlX2ZpbGUoICRwcm9ncmVzcywgIlxuIiwgLWFwcGVuZCA9PiAxICk7CisgICAgfTsgIyBpZgorfTsgIyBzdWIgbG9nX2l0CisKK3N1YiBwcm9ncmVzcygkJEApIHsKKyAgICBteSAoICR0aXRsZSwgJGZvcm1hdCwgQGFyZ3MgKSA9IEBfOworICAgIGxvZ19pdCggJHRpdGxlLCAkZm9ybWF0LCBAYXJncyApOworfTsgIyBzdWIgcHJvZ3Jlc3MKKworc3ViIHN1bW1hcnkoKSB7CisgICAgbXkgJHRvdGFsICAgPSBAam9iczsKKyAgICBteSAkc3VjY2VzcyA9IDA7CisgICAgbXkgJGZpbmlzaCA9IHRpbWUoKTsKKyAgICBmb3JlYWNoIG15ICRqb2IgKCBAam9icyApIHsKKyAgICAgICAgbXkgKCAkYnVpbGRfZGlyLCAkcmMgKSA9ICggJGpvYi0+eyBidWlsZF9kaXIgfSwgJGpvYi0+eyByYyB9ICk7CisgICAgICAgIHByb2dyZXNzKCByc3RyKCAkcmMgKSwgIiVzIiwgJGJ1aWxkX2RpciApOworICAgICAgICBpZiAoICRyYyA9PSAwICkgeworICAgICAgICAgICAgKysgJHN1Y2Nlc3M7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGpvYgorICAgIG15ICRmYWlsdXJlID0gJHRvdGFsIC0gJHN1Y2Nlc3M7CisgICAgcHJvZ3Jlc3MoICJTdWNjZXNzZXMiLCAgICAgICIlM2Qgb2YgJTNkIiwgJHN1Y2Nlc3MsICR0b3RhbCApOworICAgIHByb2dyZXNzKCAiRmFpbHVyZXMiLCAgICAgICAiJTNkIG9mICUzZCIsICRmYWlsdXJlLCAkdG90YWwgKTsKKyAgICBwcm9ncmVzcyggIlRpbWUgZWxhcHNlZCIsICAgIiAgJXMiLCBkc3RyKCAkZmluaXNoIC0gJHN0YXJ0ICkgKTsKKyAgICBwcm9ncmVzcyggIk92ZXJhbGwgcmVzdWx0IiwgIiVzIiwgcnN0ciggJGZhaWx1cmUgKSApOworICAgIHJldHVybiAkZmFpbHVyZTsKK307ICMgc3ViIHN1bW1hcnkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXb3JrZXIgZnVuY3Rpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgaW5pdCgpIHsKKyAgICBtYWtlX2RpciggJHRtcCApOworfTsgIyBzdWIgaW5pdAorCitzdWIgY2xlYW4oQCkgeworICAgICMgQ2xlYW4gZGlyZWN0b3JpZXMuCisgICAgbXkgKCBAZGlycyApID0gQF87CisgICAgbXkgJGV4aXQgPSAwOworICAgICMgTWltaXNjIG1ha2VmaWxlIC0tIHByaW50IGEgY29tbWFuZC4KKyAgICBwcmludCggInJtIC1mIC1yICIgLiBqb2luKCAiICIsIG1hcCggc2hvcnRlciggJF8gKSAuICIvKiIsIEBkaXJzICkgKSAuICJcbiIgKTsKKyAgICAkZXhpdCA9CisgICAgICAgIGV4ZWN1dGUoCisgICAgICAgICAgICBbICReWCwgY2F0X2ZpbGUoICRFTlZ7IExJQk9NUF9XT1JLIH0sICJ0b29scyIsICJjbGVhbi1kaXIucGwiICksIEBkaXJzIF0sCisgICAgICAgICAgICAtaWdub3JlX3N0YXR1cyA9PiAxLAorICAgICAgICAgICAgKCAkdG9vbHM6OnZlcmJvc2UgPyAoKSA6ICggLXN0ZG91dCA9PiB1bmRlZiwgLXN0ZGVyciA9PiAiIiApICksCisgICAgICAgICk7CisgICAgcmV0dXJuICRleGl0OworfTsgIyBzdWIgY2xlYW4KKworc3ViIG1ha2UoJCQkKSB7CisgICAgIyBDaGFuZ2UgZGlyIHRvIGJ1aWxkIG9uZSBhbmQgcnVuIG1ha2UuCisgICAgbXkgKCAkam9iLCAkY2xlYW4sICRtYXJrZXIgKSA9IEBfOworICAgIG15ICRkaXIgICAgICA9ICRqb2ItPnsgYnVpbGRfZGlyIH07CisgICAgbXkgJG1ha2VmaWxlID0gJGpvYi0+eyBtYWtlZmlsZSB9OworICAgIG15ICRhcmdzICAgICA9ICRqb2ItPnsgbWFrZV9hcmdzIH07CisgICAgbXkgJGN3ZCAgICAgID0gQ3dkOjpjd2QoKTsKKyAgICBteSAkd2lkdGggICAgPSAtMTA7CisKKyAgICBteSAkZXhpdDsKKyAgICAkZGlyID0gY2F0X2RpciggJHRtcCwgJGRpciApOworICAgIG1ha2VfZGlyKCAkZGlyICk7CisgICAgY2hhbmdlX2RpciggJGRpciApOworCisgICAgbXkgJGFjdGlvbnMgPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgJHN0YXJ0ID0gdGltZSgpOworICAgICAgICAgICAgJG1ha2VmaWxlID0gc2hvcnRlciggJG1ha2VmaWxlICk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiU3RhcnRlZCIsICAgdHN0ciggJHN0YXJ0ICkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiUm9vdCBkaXIiLCAgJHJvb3QgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiQnVpbGQgZGlyIiwgc2hvcnRlciggJGRpciwgJHJvb3QgKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJNYWtlZmlsZSIsICAkbWFrZWZpbGUgKTsKKyAgICAgICAgICAgIHByaW50KCAiLSIgeCA3OSwgIlxuIiApOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgVXNlIHNob3J0ZXIgTElCT01QX1dPUksgdG8gaGF2ZSBzaG9ydGVyIGNvbW1hbmQgbGluZXMuCisgICAgICAgICAgICAgICAgIyBOb3RlOiBTb21lIHRvb2xzIG1heSBub3Qgd29yayBpZiBjdXJyZW50IGRpciBpcyBjaGFuZ2VkLgorICAgICAgICAgICAgICAgIGxvY2FsICRFTlZ7IExJQk9NUF9XT1JLIH0gPSBzaG9ydGVyKCAkRU5WeyBMSUJPTVBfV09SSyB9ICk7CisgICAgICAgICAgICAgICAgJGV4aXQgPQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWtlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZiIsICRtYWtlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJjaD0iIC4gJHRhcmdldF9hcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXJrZXI9JG1hcmtlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCRhcmdzCisgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgLWlnbm9yZV9zdGF0dXMgPT4gMQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGlmICggJGNsZWFuIGFuZCAkZXhpdCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAkZXhpdCA9IGNsZWFuKCAkZGlyICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgbXkgJGZpbmlzaCA9IHRpbWUoKTsKKyAgICAgICAgICAgIHByaW50KCAiLSIgeCA3OSwgIlxuIiApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJGaW5pc2hlZCIsIHRzdHIoICRmaW5pc2ggKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJFbGFwc2VkIiwgZHN0ciggJGZpbmlzaCAtICRzdGFydCApICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIlJlc3VsdCIsIHJzdHIoICRleGl0ICkgKTsKKyAgICAgICAgICAgIHByaW50KCAiLSIgeCA3OSwgIlxuIiApOworICAgICAgICAgICAgcHJpbnQoICJcbiIgKTsKKyAgICAgICAgfTsgIyBzdWIKKyAgICB0ZWUoICRhY3Rpb25zLCAiYnVpbGQubG9nIiApOworCisgICAgY2hhbmdlX2RpciggJGN3ZCApOworCisgICAgIyBTYXZlIGNvbXBsZXRlZCBqb2IgdG8gYmUgYWJsZSBwcmludCBzdW1tYXJ5IGxhdGVyLgorICAgICRqb2ItPnsgcmMgfSA9ICRleGl0OworICAgIHB1c2goIEBqb2JzLCAkam9iICk7CisKKyAgICByZXR1cm4gJGV4aXQ7CisKK307ICMgc3ViIG1ha2UKKworMTsKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rvb2xzL2xpYi9MaWJPTVAucG0gYi9yYzMvcnVudGltZS90b29scy9saWIvTGliT01QLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjc2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90b29scy9saWIvTGliT01QLnBtCkBAIC0wLDAgKzEsODUgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKK3BhY2thZ2UgTGliT01QOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgdG9vbHM7CisKK3N1YiBlbXB0eSgkKSB7CisgICAgbXkgKCAkdmFyICkgPSBAXzsKKyAgICByZXR1cm4gKG5vdCBleGlzdHMoJEVOVnskdmFyfSkpIG9yIChub3QgZGVmaW5lZCgkRU5WeyR2YXJ9KSkgb3IgKCRFTlZ7JHZhcn0gZXEgIiIpOworfTsgIyBzdWIgZW1wdHkKKworbXkgKCAkYmFzZSwgJG91dCwgJHRtcCApOworaWYgKCBlbXB0eSggIkxJQk9NUF9XT1JLIiApICkgeworICAgICMgJEZpbmRCaW46OkJpbiBpcyBub3QgdXNlZCBpbnRlbnRpb25hbGx5IGJlY2F1c2UgaXQgZ2l2ZXMgcmVhbCBwYXRoLiBJIHdhbnQgdG8gdXNlIGFic29sdXRlLAorICAgICMgYnV0IG5vdCByZWFsIG9uZSAocmVhbCBwYXRoIGRvZXMgbm90IGNvbnRhaW4gc3ltbGlua3Mgd2hpbGUgYWJzb2x1dGUgcGF0aCBtYXkgY29udGFpbgorICAgICMgc3ltbGlua3MpLgorICAgICRiYXNlID0gZ2V0X2RpciggZ2V0X2RpciggYWJzX3BhdGgoICQwICkgKSApOworfSBlbHNlIHsKKyAgICAkYmFzZSA9IGFic19wYXRoKCAkRU5WeyBMSUJPTVBfV09SSyB9ICk7Cit9OyAjIGlmCisKK2lmICggZW1wdHkoICJMSUJPTVBfRVhQT1JUUyIgKSApIHsKKyAgICAkb3V0ID0gY2F0X2RpciggJGJhc2UsICJleHBvcnRzIiApOworfSBlbHNlIHsKKyAgICAkb3V0ID0gYWJzX3BhdGgoICRFTlZ7IExJQk9NUF9FWFBPUlRTIH0gKTsKK307ICMgaWYKKworaWYgKCBlbXB0eSggIkxJQk9NUF9UTVAiICkgKSB7CisgICAgJHRtcCA9IGNhdF9kaXIoICRiYXNlLCAidG1wIiApOworfSBlbHNlIHsKKyAgICAkdG1wID0gYWJzX3BhdGgoICRFTlZ7IExJQk9NUF9UTVAgfSApOworfTsgIyBpZgorCiskRU5WeyBMSUJPTVBfV09SSyAgICB9ID0gJGJhc2U7CiskRU5WeyBMSUJPTVBfRVhQT1JUUyB9ID0gJG91dDsKKyRFTlZ7IExJQk9NUF9UTVAgICAgIH0gPSAkdG1wOworCityZXR1cm4gMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8TGliT01QLnBtPiAtLQorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBGaW5kQmluOworICAgIHVzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKyAgICB1c2UgTGliT01QOworCisgICAgJEVOVnsgTElCT01QX1dPUksgICAgfQorICAgICRFTlZ7IExJQk9NUF9UTVAgICAgIH0KKyAgICAkRU5WeyBMSUJPTVBfRVhQT1JUUyB9CisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgbW9kdWxlIGNoZWNrcyBDPExJQk9NUF9XT1JLPiwgQzxMSUJPTVBfRVhQT1JUUz4sIGFuZCBDPExJQk9NUF9UTVA+IGVudmlyb25tZW50cyB2YXJpYWJsZXMuCitJZiBhIHZhcmlhYmxlIHNldCwgdGhlIG1vZHVsZSBtYWtlcyBzdXJlIGl0IGlzIGFic29sdXRlLiBJZiBhIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCB0aGUgbW9kdWxlCitzZXRzIGl0IHRvIGRlZmF1bHQgdmFsdWUuCisKK0RlZmF1bHQgdmFsdWUgZm9yIEM8TElCT01QX0VYUE9SVFM+IGlzIEM8JExJQk9NUF9XT1JLL2V4cG9ydHM+LCBmb3IgQzxMSUJPTVBfVE1QPiAtLQorQzwkTElCT01QX1dPUksvdG1wPi4KKworVmFsdWUgZm9yIEM8TElCT01QX1dPUks+IGlzIGd1ZXNzZWQuIFRoZSBtb2R1bGUgYXNzdW1lcyB0aGUgc2NyaXB0ICh3aGljaCB1c2VzIHRoZSBtb2R1bGUpIGlzCitsb2NhdGVkIGluIEM8dG9vbHMvPiBkaXJlY3Rvcnkgb2YgbGlib21wIGRpcmVjdG9yeSB0cmVlLCBhbmQgdXNlcyBwYXRoIG9mIHRoZSBzY3JpcHQgdG8gY2FsY3VsYXRlCitDPExJQk9NUF9XT1JLPiwKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdG9vbHMvbGliL1BsYXRmb3JtLnBtIGIvcmMzL3J1bnRpbWUvdG9vbHMvbGliL1BsYXRmb3JtLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTYzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90b29scy9saWIvUGxhdGZvcm0ucG0KQEAgLTAsMCArMSw0ODQgQEAKKyMKKyMgVGhpcyBpcyBub3QgYSBydW5uYWJsZSBzY3JpcHQsIGl0IGlzIGEgUGVybCBtb2R1bGUsIGEgY29sbGVjdGlvbiBvZiB2YXJpYWJsZXMsIHN1YnJvdXRpbmVzLCBldGMuCisjIHRvIGJlIHVzZWQgaW4gUGVybCBzY3JpcHRzLgorIworIyBUbyBnZXQgaGVscCBhYm91dCBleHBvcnRlZCB2YXJpYWJsZXMgYW5kIHN1YnJvdXRpbmVzLCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyMKKyMgICAgIHBlcmxkb2MgUGxhdGZvcm0ucG0KKyMKKyMgb3Igc2VlIFBPRCAoUGxhaW4gT2xkIERvY3VtZW50YXRpb24pIGltYmVkZGVkIHRvIHRoZSBzb3VyY2UuLi4KKyMKKyMKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworcGFja2FnZSBQbGF0Zm9ybTsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIGJhc2UgIkV4cG9ydGVyIjsKKwordXNlIFVuYW1lOworCitteSBAdmFyczsKKworQkVHSU4geworICAgIEB2YXJzID0gcXd7ICRob3N0X2FyY2ggJGhvc3Rfb3MgJGhvc3RfcGxhdGZvcm0gJHRhcmdldF9hcmNoICR0YXJnZXRfbWljX2FyY2ggJHRhcmdldF9vcyAkdGFyZ2V0X3BsYXRmb3JtIH07Cit9CisKK291ciAkVkVSU0lPTiAgICAgPSAiMC4wMTQiOworb3VyIEBFWFBPUlQgICAgICA9IHF3e307CitvdXIgQEVYUE9SVF9PSyAgID0gKCBxd3sgY2Fub25fYXJjaCBjYW5vbl9vcyBjYW5vbl9taWNfYXJjaCBsZWdhbF9hcmNoIGFyY2hfb3B0IH0sIEB2YXJzICk7CitvdXIgJUVYUE9SVF9UQUdTID0gKCBhbGwgPT4gWyBARVhQT1JUX09LIF0sIHZhcnMgPT4gXEB2YXJzICk7CisKKyMgQ2Fub25pemUgYXJjaGl0ZWN0dXJlIG5hbWUuCitzdWIgY2Fub25fYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICBpZiAoICRhcmNoID1+IG17XEFccyooPzozMnxJQS0/MzJ8SUEtPzMyIGFyY2hpdGVjdHVyZXxpWzM0NTZdODZ8eDg2KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICIzMiI7CisgICAgICAgIH0gZWxzaWYgKCAkYXJjaCA9fiBte1xBXHMqKD86NDh8KD86aWEpPzMyZXxJbnRlbFxzKjY0fEludGVsXChSXClccyo2NHx4ODZbXy1dNjR8eDY0fEFNRDY0KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICIzMmUiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQWFybSg/OnY3XEQqKT9cen0gKSB7CisgICAgICAgICAgICAkYXJjaCA9ICJhcm0iOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQXBwYzY0bGV9ICkgeworCQkJJGFyY2ggPSAicHBjNjRsZSI7CisgICAgICAgIH0gZWxzaWYgKCAkYXJjaCA9fiBte1xBcHBjNjR9ICkgeworICAgICAgICAJJGFyY2ggPSAicHBjNjQiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQWFhcmNoNjR9ICkgeworICAgICAgICAgICAgICAgICRhcmNoID0gImFhcmNoNjQiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQW1pY30gKSB7CisgICAgICAgICAgICAkYXJjaCA9ICJtaWMiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQW1pcHM2NH0gKSB7CisgICAgICAgICAgICAkYXJjaCA9ICJtaXBzNjQiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQW1pcHN9ICkgeworICAgICAgICAgICAgJGFyY2ggPSAibWlwcyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkYXJjaCA9IHVuZGVmOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHJldHVybiAkYXJjaDsKK307ICMgc3ViIGNhbm9uX2FyY2gKKworIyBDYW5vbml6ZSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgbmFtZS4KK3N1YiBjYW5vbl9taWNfYXJjaCgkKSB7CisgICAgbXkgKCAkbWljX2FyY2ggKSA9IEBfOworICAgIGlmICggZGVmaW5lZCggJG1pY19hcmNoICkgKSB7CisgICAgICAgIGlmICggJG1pY19hcmNoID1+IG17XEFrbmZ9ICkgeworICAgICAgICAgICAgJG1pY19hcmNoID0gImtuZiI7CisgICAgICAgIH0gZWxzaWYgKCAkbWljX2FyY2ggPX4gbXtcQWtuY30pIHsKKyAgICAgICAgICAgICRtaWNfYXJjaCA9ICJrbmMiOworICAgICAgICB9IGVsc2lmICggJG1pY19hcmNoID1+IG17XEFrbmx9ICkgeworICAgICAgICAgICAgJG1pY19hcmNoID0gImtubCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkbWljX2FyY2ggPSB1bmRlZjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG1pY19hcmNoOworfTsgIyBzdWIgY2Fub25fbWljX2FyY2gKKworeyAgIyBSZXR1cm4gbGVnYWwgYXBwcm92ZWQgYXJjaGl0ZWN0dXJlIG5hbWUuCisgICAgbXkgJWxlZ2FsID0gKAorICAgICAgICAiMzIiICA9PiAiSUEtMzIgYXJjaGl0ZWN0dXJlIiwKKyAgICAgICAgIjMyZSIgPT4gIkludGVsKFIpIDY0IiwKKyAgICAgICAgImFybSIgPT4gIkFSTSIsCisgICAgICAgICJhYXJjaDY0IiA9PiAiQUFyY2g2NCIsCisgICAgICAgICJtaWMiID0+ICJJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUiLAorICAgICAgICAibWlwcyIgPT4gIk1JUFMiLAorICAgICAgICAibWlwczY0IiA9PiAiTUlQUzY0IiwKKyAgICApOworCisgICAgc3ViIGxlZ2FsX2FyY2goJCkgeworICAgICAgICBteSAoICRhcmNoICkgPSBAXzsKKyAgICAgICAgJGFyY2ggPSBjYW5vbl9hcmNoKCAkYXJjaCApOworICAgICAgICBpZiAoIGRlZmluZWQoICRhcmNoICkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICRsZWdhbHsgJGFyY2ggfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGFyY2g7CisgICAgfTsgIyBzdWIgbGVnYWxfYXJjaAorfQorCit7ICAjIFJldHVybiBhcmNoaXRlY3R1cmUgbmFtZSBzdWl0YWJsZSBmb3IgSW50ZWwgY29tcGlsZXIgc2V0dXAgc2NyaXB0cy4KKyAgICBteSAlb3B0aW9uID0gKAorICAgICAgICAiMzIiICA9PiAiaWEzMiIsCisgICAgICAgICIzMmUiID0+ICJpbnRlbDY0IiwKKyAgICAgICAgIjY0IiAgPT4gImlhNjQiLAorICAgICAgICAiYXJtIiA9PiAiYXJtIiwKKyAgICAgICAgImFhcmNoNjQiID0+ICJhYXJjaCIsCisgICAgICAgICJtaWMiID0+ICJpbnRlbDY0IiwKKyAgICAgICAgIm1pcHMiID0+ICJtaXBzIiwKKyAgICAgICAgIm1pcHM2NCIgPT4gIk1JUFM2NCIsCisgICAgKTsKKworICAgIHN1YiBhcmNoX29wdCgkKSB7CisgICAgICAgIG15ICggJGFyY2ggKSA9IEBfOworICAgICAgICAkYXJjaCA9IGNhbm9uX2FyY2goICRhcmNoICk7CisgICAgICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgICAgICRhcmNoID0gJG9wdGlvbnsgJGFyY2ggfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGFyY2g7CisgICAgfTsgIyBzdWIgYXJjaF9vcHQKK30KKworIyBDYW5vbml6ZSBPUyBuYW1lLgorc3ViIGNhbm9uX29zKCQpIHsKKyAgICBteSAoICRvcyApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkb3MgKSApIHsKKyAgICAgICAgaWYgKCAkb3MgPX4gbXtcQVxzKig/OkxpbnV4fGxpbnxsKVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkb3MgPSAibGluIjsKKyAgICAgICAgfSBlbHNpZiAoICRvcyA9fiBte1xBXHMqKD86TWFjKD86XHMqT1MoPzpccypYKT8pP3xtYWN8bXxEYXJ3aW4pXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJtYWMiOworICAgICAgICB9IGVsc2lmICggJG9zID1+IG17XEFccyooPzpXaW4oPzpkb3dzKT8oPzooPzpffFxzKik/KD86TlR8WFB8OTV8OTh8MjAwMykpP3x3KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkb3MgPSAid2luIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRvcyA9IHVuZGVmOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHJldHVybiAkb3M7Cit9OyAjIHN1YiBjYW5vbl9vcworCitteSAoICRfaG9zdF9vcywgJF9ob3N0X2FyY2gsICRfdGFyZ2V0X29zLCAkX3RhcmdldF9hcmNoLCAkX3RhcmdldF9taWNfYXJjaCwgJF9kZWZhdWx0X21pY19hcmNoKTsKKworIyBTZXQgdGhlIGRlZmF1bHQgbWljLWFyY2ggdmFsdWUuCiskX2RlZmF1bHRfbWljX2FyY2ggPSAia25jIjsKKworc3ViIHNldF90YXJnZXRfYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gY2Fub25fYXJjaCggJF9bIDAgXSApOworICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgJF90YXJnZXRfYXJjaCAgICAgICA9ICRhcmNoOworICAgICAgICAkRU5WeyBMSUJPTVBfQVJDSCB9ID0gJGFyY2g7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkYXJjaDsKK307ICMgc3ViIHNldF90YXJnZXRfYXJjaAorCitzdWIgc2V0X3RhcmdldF9taWNfYXJjaCgkKSB7CisgICAgbXkgKCAkbWljX2FyY2ggKSA9IGNhbm9uX21pY19hcmNoKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkbWljX2FyY2ggKSApIHsKKyAgICAgICAgJF90YXJnZXRfbWljX2FyY2ggICAgICAgPSAkbWljX2FyY2g7CisgICAgICAgICRFTlZ7IExJQk9NUF9NSUNfQVJDSCB9ID0gJG1pY19hcmNoOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG1pY19hcmNoOworfTsgIyBzdWIgc2V0X3RhcmdldF9taWNfYXJjaAorCitzdWIgc2V0X3RhcmdldF9vcygkKSB7CisgICAgbXkgKCAkb3MgKSA9IGNhbm9uX29zKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkb3MgKSApIHsKKyAgICAgICAgJF90YXJnZXRfb3MgICAgICAgPSAkb3M7CisgICAgICAgICRFTlZ7IExJQk9NUF9PUyB9ID0gJG9zOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG9zOworfTsgIyBzdWIgc2V0X3RhcmdldF9vcworCitzdWIgdGFyZ2V0X29wdGlvbnMoKSB7CisgICAgbXkgQG9wdGlvbnMgPSAoCisgICAgICAgICJ0YXJnZXQtb3N8b3M9cyIgPT4KKyAgICAgICAgICAgIHN1YiB7CisgICAgICAgICAgICAgICAgc2V0X3RhcmdldF9vcyggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgIGRpZSAiQmFkIHZhbHVlIG9mIC0tdGFyZ2V0LW9zIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgICB9LAorICAgICAgICAidGFyZ2V0LWFyY2hpdGVjdHVyZXx0YXJnZXJ0LWFyY2h8YXJjaGl0ZWN0dXJlfGFyY2g9cyIgPT4KKyAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgIHNldF90YXJnZXRfYXJjaCggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgZGllICJCYWQgdmFsdWUgb2YgLS10YXJnZXQtYXJjaGl0ZWN0dXJlIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgIH0sCisgICAgICAgICJ0YXJnZXQtbWljLWFyY2hpdGVjdHVyZXx0YXJnZXJ0LW1pYy1hcmNofG1pYy1hcmNoaXRlY3R1cmV8bWljLWFyY2g9cyIgPT4KKyAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgIHNldF90YXJnZXRfbWljX2FyY2goICRfWyAxIF0gKSBvcgorICAgICAgICAgICAgICAgICAgIGRpZSAiQmFkIHZhbHVlIG9mIC0tdGFyZ2V0LW1pYy1hcmNoaXRlY3R1cmUgb3B0aW9uOiBcIiRfWyAxIF1cIlxuIjsKKyAgICAgICAgICAgfSwKKyAgICApOworICAgIHJldHVybiBAb3B0aW9uczsKK307ICMgc3ViIHRhcmdldF9vcHRpb25zCisKKyMgRGV0ZWN0IGhvc3QgYXJjaC4KK3sKKyAgICBteSAkaGFyZHdhcmVfcGxhdGZvcm0gPSBVbmFtZTo6aGFyZHdhcmVfcGxhdGZvcm0oKTsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiaTM4NiIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjMyIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJpYTY0IiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiNjQiOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgIng4Nl82NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjMyZSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiYXJtIiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiYXJtIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJwcGM2NGxlIiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAicHBjNjRsZSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAicHBjNjQiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICJwcGM2NCI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiYWFyY2g2NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gImFhcmNoNjQiOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgIm1pcHM2NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIm1pcHM2NCI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAibWlwcyIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIm1pcHMiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgaG9zdCBoYXJkd2FyZSBwbGF0Zm9ybTogXCIkaGFyZHdhcmVfcGxhdGZvcm1cIjsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfQorCisjIERldGVjdCBob3N0IE9TLgoreworICAgIG15ICRvcGVyYXRpbmdfc3lzdGVtID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW0oKTsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJHTlUvTGludXgiICkgeworICAgICAgICAkX2hvc3Rfb3MgPSAibGluIjsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIkZyZWVCU0QiICkgeworICAgICAgICAjIEhvc3QgT1MgcmVzZW1ibGVzIExpbnV4LgorICAgICAgICAkX2hvc3Rfb3MgPSAibGluIjsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIk5ldEJTRCIgKSB7CisgICAgICAgICMgSG9zdCBPUyByZXNlbWJsZXMgTGludXguCisgICAgICAgICRfaG9zdF9vcyA9ICJsaW4iOworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiRGFyd2luIiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gIm1hYyI7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJNUyBXaW5kb3dzIiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gIndpbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBob3N0IG9wZXJhdGluZyBzeXN0ZW06IFwiJG9wZXJhdGluZ19zeXN0ZW1cIjsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfQorCisjIERldGVjdCB0YXJnZXQgYXJjaC4KK2lmICggZGVmaW5lZCggJEVOVnsgTElCT01QX0FSQ0ggfSApICkgeworICAgICMgVXNlIGFyY2ggc3BlY2lmaWVkIGluIExJQk9NUF9BUkNILgorICAgICRfdGFyZ2V0X2FyY2ggPSBjYW5vbl9hcmNoKCAkRU5WeyBMSUJPTVBfQVJDSCB9ICk7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJF90YXJnZXRfYXJjaCApICkgeworICAgICAgICBkaWUgIlVua25vd24gYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBpbiBMSUJPTVBfQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZTogXCIkRU5WeyBMSUJPTVBfQVJDSCB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGhvc3QgYXJjaGl0ZWN0dXJlLgorICAgICRfdGFyZ2V0X2FyY2ggPSAkX2hvc3RfYXJjaDsKK307ICMgaWYKKyRFTlZ7IExJQk9NUF9BUkNIIH0gPSAkX3RhcmdldF9hcmNoOworCisjIERldGVjdCB0YXJnZXQgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLgoraWYgKCBkZWZpbmVkKCAkRU5WeyBMSUJPTVBfTUlDX0FSQ0ggfSApICkgeworICAgICMgVXNlIG1pYyBhcmNoIHNwZWNpZmllZCBpbiBMSUJPTVBfTUlDX0FSQ0guCisgICAgJF90YXJnZXRfbWljX2FyY2ggPSBjYW5vbl9taWNfYXJjaCggJEVOVnsgTElCT01QX01JQ19BUkNIIH0gKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkX3RhcmdldF9taWNfYXJjaCApICkgeworICAgICAgICBkaWUgIlVua25vd24gYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBpbiBMSUJPTVBfTUlDX0FSQ0ggZW52aXJvbm1lbnQgdmFyaWFibGU6IFwiJEVOVnsgTElCT01QX01JQ19BUkNIIH1cIiI7CisgICAgfTsgIyBpZgorfSBlbHNlIHsKKyAgICAjIE90aGVyd2lzZSB1c2UgZGVmYXVsdCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuCisgICAgJF90YXJnZXRfbWljX2FyY2ggPSAkX2RlZmF1bHRfbWljX2FyY2g7Cit9OyAjIGlmCiskRU5WeyBMSUJPTVBfTUlDX0FSQ0ggfSA9ICRfdGFyZ2V0X21pY19hcmNoOworCisjIERldGVjdCB0YXJnZXQgT1MuCitpZiAoIGRlZmluZWQoICRFTlZ7IExJQk9NUF9PUyB9ICkgKSB7CisgICAgIyBVc2UgT1Mgc3BlY2lmaWVkIGluIExJQk9NUF9PUy4KKyAgICAkX3RhcmdldF9vcyA9IGNhbm9uX29zKCAkRU5WeyBMSUJPTVBfT1MgfSApOworICAgIGlmICggbm90IGRlZmluZWQoICRfdGFyZ2V0X29zICkgKSB7CisgICAgICAgIGRpZSAiVW5rbm93biBPUyBzcGVjaWZpZWQgaW4gTElCT01QX09TIGVudmlyb25tZW50IHZhcmlhYmxlOiBcIiRFTlZ7IExJQk9NUF9PUyB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGhvc3QgT1MuCisgICAgJF90YXJnZXRfb3MgPSAkX2hvc3Rfb3M7Cit9OyAjIGlmCiskRU5WeyBMSUJPTVBfT1MgfSA9ICRfdGFyZ2V0X29zOworCit1c2UgdmFycyBAdmFyczsKKwordGllKCAkaG9zdF9hcmNoLCAgICAgICAiUGxhdGZvcm06Omhvc3RfYXJjaCIgKTsKK3RpZSggJGhvc3Rfb3MsICAgICAgICAgIlBsYXRmb3JtOjpob3N0X29zIiApOwordGllKCAkaG9zdF9wbGF0Zm9ybSwgICAiUGxhdGZvcm06Omhvc3RfcGxhdGZvcm0iICk7Cit0aWUoICR0YXJnZXRfYXJjaCwgICAgICJQbGF0Zm9ybTo6dGFyZ2V0X2FyY2giICk7Cit0aWUoICR0YXJnZXRfbWljX2FyY2gsICJQbGF0Zm9ybTo6dGFyZ2V0X21pY19hcmNoIiApOwordGllKCAkdGFyZ2V0X29zLCAgICAgICAiUGxhdGZvcm06OnRhcmdldF9vcyIgKTsKK3RpZSggJHRhcmdldF9wbGF0Zm9ybSwgIlBsYXRmb3JtOjp0YXJnZXRfcGxhdGZvcm0iICk7CisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6YmFzZTsKKworICAgIHVzZSBDYXJwOworCisgICAgdXNlIFRpZTo6U2NhbGFyOworICAgIHVzZSBiYXNlICJUaWU6OlN0ZFNjYWxhciI7CisKKyAgICBzdWIgU1RPUkUgeworICAgICAgICBteSAkc2VsZiA9IHNoaWZ0KCBAXyApOworICAgICAgICBjcm9hayggIk1vZGlmeWluZyBcJCIgLiByZWYoICRzZWxmICkgLiAiIGlzIG5vdCBhbGxvd2VkOyBzdG9wcGVkIiApOworICAgIH07ICMgc3ViIFNUT1JFCisKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpiYXNlCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9hcmNoOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfaG9zdF9hcmNoOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9hcmNoCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9vczsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX2hvc3Rfb3M7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X29zCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9wbGF0Zm9ybTsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAiJHtfaG9zdF9vc31fJHtfaG9zdF9hcmNofSI7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X3BsYXRmb3JtCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X2FyY2g7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF90YXJnZXRfYXJjaDsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9hcmNoCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X21pY19hcmNoOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfdGFyZ2V0X21pY19hcmNoOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X21pY19hcmNoCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X29zOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfdGFyZ2V0X29zOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X29zCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X3BsYXRmb3JtOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgaWYgKCRfdGFyZ2V0X2FyY2ggZXEgIm1pYyIpIHsKKyAgICAgICAgICAgIHJldHVybiAiJHtfdGFyZ2V0X29zfV8ke190YXJnZXRfbWljX2FyY2h9IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICIke190YXJnZXRfb3N9XyR7X3RhcmdldF9hcmNofSI7CisgICAgICAgIH0KKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybQorCisKK3JldHVybiAxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxQbGF0Zm9ybS5wbT4gLS0gRmV3IHN1YnJvdXRpbmVzIHRvIGdldCBPUywgYXJjaGl0ZWN0dXJlIGFuZCBwbGF0Zm9ybSBuYW1lIGluIGZvcm0gc3VpdGFibGUgZm9yCituYW1pbmcgZmlsZXMsIGRpcmVjdG9yaWVzLCBtYWNyb3MsIGV0Yy4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgUGxhdGZvcm0gIjphbGwiOworICAgIHVzZSB0b29sczsKKworICAgIG15ICRhcmNoICAgPSBjYW5vbl9hcmNoKCAiZW02NFQiICk7ICAgICAgICAjIFJldHVybnMgIjMyZSIuCisgICAgbXkgJGxlZ2FsICA9IGxlZ2FsX2FyY2goICJlbTY0dCIgKTsgICAgICAgICMgUmV0dXJucyAiSW50ZWwoUikgNjQiLgorICAgIG15ICRvcHRpb24gPSBhcmNoX29wdCggImVtNjR0IiApOyAgICAgICAgICAjIFJldHVybnMgImludGVsNjQiLgorICAgIG15ICRvcyAgICAgPSBjYW5vbl9vcyggIldpbmRvd3MgTlQiICk7ICAgICAjIFJldHVybnMgIndpbiIuCisKKyAgICBwcmludCggJGhvc3RfYXJjaCwgJGhvc3Rfb3MsICRob3N0X3BsYXRmb3JtICk7CisgICAgcHJpbnQoICR0YXJlZ3RfYXJjaCwgJHRhcmdldF9vcywgJHRhcmdldF9wbGF0Zm9ybSApOworCisgICAgdG9vbHM6OmdldF9vcHRpb25zKAorICAgICAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAgICAgLi4uCisgICAgKTsKKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworRW52aXJvbm1lbnQgdmFyaWFibGUgTElCT01QX09TIHNwZWNpZmllcyB0YXJnZXQgT1MgdG8gcmVwb3J0LiBJZiBMSUJPTVBfT1MgaWQgbm90IGRlZmluZWQsCit0aGUgc2NyaXB0IGFzc3VtZXMgaG9zdCBPUyBpcyB0YXJnZXQgT1MuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlIExJQk9NUF9BUkNIIHNwZWNpZmllcyB0YXJnZXQgYXJjaGl0ZWN0dXJlIHRvIHJlcG9ydC4gSWYgTElCT01QX0FSQ0ggaXMgbm90IGRlZmluZWQsCit0aGUgc2NyaXB0IGFzc3VtZXMgaG9zdCBhcmNoaXRlY3R1cmUgaXMgdGFyZ2V0IG9uZS4KKworPWhlYWQyIEZ1bmN0aW9ucy4KKworPW92ZXIKKworPWl0ZW0gQjxjYW5vbl9hcmNoKCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYW4gYXJjaGl0ZWN0dXJlIG5hbWUgdG8gY2Fub25pemUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIG1hbnkgdmFyaWFudHMsIGZvciBleGFtcGxlOgorQzwzMmU+LCBDPEludGVsNjQ+LCBDPEludGVsKFIpIDY0PiwgZXRjLiBSZXR1cm5lZCBzdHJpbmcgaXMgYSBjYW5vbm9uaXplZCBhcmNoaXRlY3R1cmUgbmFtZSwKK29uZSBvZjogQzwzMj4sIEM8MzJlPiwgQzw2ND4sIEM8YXJtPiwgQzxwcGM2NGxlPiwgQzxwcGM2ND4sIEM8bWljPiwgQzxtaXBzPiwgQzxtaXBzNjQ+LCBvciBDPHVuZGVmPiBpcyBpbnB1dCBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQuCisKKz1pdGVtIEI8bGVnYWxfYXJjaCggJGFyY2ggKT4KKworSW5wdXQgc3RyaW5nIGlzIGFyY2hpdGVjdHVyZSBuYW1lLiBUaGUgZnVuY3Rpb24gcmVjb2duaXplcyB0aGUgc2FtZSB2YXJpYW50cyBhcyBDPGFyY2hfY2Fub24oKT4gZG9lcy4KK1JldHVybmVkIHN0cmluZyBpcyBhIG5hbWUgYXBwcm92ZWQgYnkgSW50ZWwgTGVnYWwsIG9uZSBvZjogQzxJQS0zMiBhcmNoaXRlY3R1cmU+LCBDPEludGVsKFIpIDY0Pgorb3IgQzx1bmRlZj4gaWYgaW5wdXQgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLgorCis9aXRlbSBCPGFyY2hfb3B0KCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYXJjaGl0ZWN0dXJlIG5hbWUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIHRoZSBzYW1lIHZhcmlhbnRzIGFzIEM8YXJjaF9jYW5vbigpPiBkb2VzLgorUmV0dXJuZWQgc3RyaW5nIGlzIGFuIGFyY2hpdGVjdHVyZSBuYW1lIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGNvbXBpbGVyIHNldHVwIHNjcmlwdHMKKyhlLiBnLiBDPGljY3ZhcnMuc2g+KSwgb25lIG9mOiBDPElBLTMyIGFyY2hpdGVjdHVyZT4sIEM8SW50ZWwoUikgNjQ+IG9yIEM8dW5kZWY+IGlmIGlucHV0IHN0cmluZyBpcyBub3QKK3JlY29nbml6ZWQuCisKKz1pdGVtIEI8Y2Fub25fb3MoICRvcyApPgorCitJbnB1dCBzdHJpbmcgaXMgT1MgbmFtZSB0byBjYW5vbml6ZS4gVGhlIGZ1bmN0aW9uIHJlY29nbml6ZXMgbWFueSB2YXJpYW50cywgZm9yIGV4YW1wbGU6IEM8bWFjPiwgQzxPUyBYPiwgZXRjLiBSZXR1cm5lZCBzdHJpbmcgaXMgYSBjYW5vbml6ZWQgT1MgbmFtZSwgb25lIG9mOiBDPGxpbj4sCitDPG1hYz4sIEM8d2luPiwgb3IgQzx1bmRlZj4gaXMgaW5wdXQgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLgorCis9aXRlbSBCPHRhcmdldF9vcHRpb25zKCk+CisKK1JldHVybnMgYXJyYXkgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gQzx0b29sczo6Z2V0X29wdGlvbnMoKT4gdG8gbGV0IGEgc2NyaXB0IHJlY29nbml6ZQorQzwtLXRhcmdldC1hcmNoaXRlY3R1cmU9STxzdHI+PiBhbmQgQzwtLXRhcmdldC1vcz1JPHN0cj4+IG9wdGlvbnMuIFR5cGljYWwgdXNhZ2UgaXM6CisKKyAgICB1c2UgdG9vbHM7CisgICAgdXNlIFBsYXRmb3JtOworCisgICAgbXkgKCAkb3MsICRhcmNoLCAkcGxhdGZvcm0gKTsgICAgIyBHbG9iYWwgdmFyaWFibGVzLCBub3QgaW5pdGlhbGl6ZWQuCisKKyAgICAuLi4KKworICAgIGdldF9vcHRpb25zKAorICAgICAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwgICMgTGV0IHNjcmlwdCByZWNvZ25pemUgLS10YXJnZXQtb3MgYW5kIC0tdGFyZ2V0LWFyY2ggb3B0aW9ucy4KKyAgICAgICAgLi4uCisgICAgKTsKKyAgICAjIEluaXRpYWxpemUgdmFyaWFibHMgYWZ0ZXIgcGFyc2luZyBjb21tYW5kIGxpbmUuCisgICAgKCAkb3MsICRhcmNoLCAkcGxhdGZvcm0gKSA9ICggUGxhdGZvcm06OnRhcmdldF9vcygpLCBQbGF0Zm9ybTo6dGFyZ2V0X2FyY2goKSwgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybSgpICk7CisKKz1iYWNrCisKKz1oZWFkMiBWYXJpYWJsZXMKKworPWl0ZW0gQjwkaG9zdF9hcmNoPgorCitDYW5vbml6ZWQgbmFtZSBvZiBob3N0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwkaG9zdF9vcz4KKworQ2Fub25pemVkIG5hbWUgb2YgaG9zdCBPUy4KKworPWl0ZW0gQjwkaG9zdF9wbGF0Zm9ybT4KKworSG9zdCBwbGF0Zm9ybSBuYW1lIChjb25jYXRlbmF0ZWQgY2Fub25pemVkIE9TIG5hbWUsIHVuZGVyc2NvcmUsIGFuZCBjYW5vbml6ZWQgYXJjaGl0ZWN0dXJlIG5hbWUpLgorCis9aXRlbSBCPCR0YXJnZXRfYXJjaD4KKworQ2Fub25pemVkIG5hbWUgb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwkdGFyZ2V0X29zPgorCitDYW5vbml6ZWQgbmFtZSBvZiB0YXJnZXQgT1MuCisKKz1pdGVtIEI8JHRhcmdldF9wbGF0Zm9ybT4KKworVGFyZ2V0IHBsYXRmb3JtIG5hbWUgKGNvbmNhdGVuYXRlZCBjYW5vbml6ZWQgT1MgbmFtZSwgdW5kZXJzY29yZSwgYW5kIGNhbm9uaXplZCBhcmNoaXRlY3R1cmUgbmFtZSkuCisKKz1iYWNrCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90b29scy9saWIvVW5hbWUucG0gYi9yYzMvcnVudGltZS90b29scy9saWIvVW5hbWUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1ZTFlZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbQpAQCAtMCwwICsxLDYzOSBAQAorIworIyBUaGlzIGlzIG5vdCBhIHJ1bm5hYmxlIHNjcmlwdCwgaXQgaXMgYSBQZXJsIG1vZHVsZSwgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgc3Vicm91dGluZXMsIGV0Yy4KKyMgVG8gZ2V0IGhlbHAgYWJvdXQgZXhwb3J0ZWQgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIFVuYW1lLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBlbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3BhY2thZ2UgVW5hbWU7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2Ugd2FybmluZ3M6OnJlZ2lzdGVyOwordXNlIEV4cG9ydGVyOworCit1c2UgUE9TSVg7Cit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOwordXNlIE5ldDo6RG9tYWluIHF3e307CisKKyMgRm9sbG93aW5nIGNvZGUgZG9lcyBub3Qgd29yayB3aXRoIFBlcmwgNS42IG9uIExpbnV4KiBPUyBhbmQgV2luZG93cyogT1M6CisjCisjICAgICB1c2UgaWYgJF5PIGVxICJkYXJ3aW4iLCB0b29scyA9PiBxd3t9OworIworIyBUaGUgd29ya2Fyb3VuZCBmb3IgUGVybCA1LjY6CisjCitCRUdJTiB7CisgICAgaWYgKCAkXk8gZXEgImRhcndpbiIgb3IgJF5PIGVxICJsaW51eCIgKSB7CisJcmVxdWlyZSB0b29sczsKKyAgICAgICAgaW1wb3J0IHRvb2xzOworICAgIH07ICMgaWYKKyAgICBpZiAoICReTyBlcSAiTVNXaW4zMiIgKSB7CisgICAgICAgIHJlcXVpcmUgV2luMzI7CisgICAgfTsgIyBpZgorfTsgIyBCRUdJTgorCitteSAkbXN3aW4gPSBxcntcQSg/Ok1TV2luMzJ8V2luZG93c19OVClcen07CisKK215IEBwb3NpeCA9IHF3eyBrZXJuZWxfbmFtZSBmcWRuIGtlcm5lbF9yZWxlYXNlIGtlcm5lbF92ZXJzaW9uIG1hY2hpbmUgfTsKKyAgICAjIFByb3BlcnRpZXMgc3VwcG9ydGVkIGJ5IFBPU0lYOjp1bmFtZSgpLgorbXkgQGxpbnV4ID0KKyAgICBxd3sgcHJvY2Vzc29yIGhhcmR3YXJlX3BsYXRmb3JtIG9wZXJhdGluZ19zeXN0ZW0gfTsKKyAgICAjIFByb3BlcnRpZXMgcmVwb3J0ZWQgYnkgdW5hbWUgaW4gTGludXgqIE9TLgorbXkgQGJhc2UgPSAoIEBwb3NpeCwgQGxpbnV4ICk7CisgICAgIyBCYXNlIHByb3BlcnRpZXMuCitteSBAYXV4ID0KKyAgICAoCisgICAgICAgIHF3eyBob3N0X25hbWUgZG9tYWluX25hbWUgfSwKKyAgICAgICAgbWFwKCAib3BlcmF0aW5nX3N5c3RlbV8kXyIsIHF3eyBuYW1lIHJlbGVhc2UgY29kZW5hbWUgZGVzY3JpcHRpb24gfSApCisgICAgKTsKKyAgICAjIEF1eGlsaWFyeSBwcm9wZXJ0aWVzLgorbXkgQGFsbCA9ICggQGJhc2UsIEBhdXggKTsKKyAgICAjIEFsbCB0aGUgcHJvcGVydGllcy4KK215IEBtZXRhID0gcXd7IGJhc2VfbmFtZXMgYWxsX25hbWVzIHZhbHVlIH07CisgICAgIyBNZXRhIGZ1bmN0aW9ucy4KKworb3VyICRWRVJTSU9OICAgICA9ICIwLjA3IjsKK291ciBASVNBICAgICAgICAgPSBxd3sgRXhwb3J0ZXIgfTsKK291ciBARVhQT1JUICAgICAgPSBxd3t9Oworb3VyIEBFWFBPUlRfT0sgICA9ICggQGFsbCwgQG1ldGEgKTsKK291ciAlRVhQT1JUX1RBR1MgPQorICAgICgKKyAgICAgICAgYmFzZSA9PiBbIEBiYXNlIF0sCisgICAgICAgIGFsbCAgPT4gWyBAYWxsICBdLAorICAgICAgICBtZXRhID0+IFsgQG1ldGEgXSwKKyAgICApOworCitteSAldmFsdWVzOworICAgICMgSGFzaCBvZiB2YWx1ZXMuIFNvbWUgdmFsdWVzIGFyZSBzdHJpbmdzLCBzb21lIG1heSBiZSByZWZlcmVuY2VzIHRvIGNvZGUgd2hpY2ggc2hvdWxkIGJlCisgICAgIyBldmFsdWF0ZWQgdG8gZ2V0IHJlYWwgdmFsdWUuIFRoaXMgdHJpY2sgaXMgaW1wbGVtZW50ZWQgYmVjYXVzZSBjYWxsIHRvIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpCisgICAgIyBpcyByZWxhdGl2ZWx5IHNsb3cuCisKKyMgR2V0IHZhbHVlcyBmcm9tIFBPU0lYOjp1bmFtZSgpLgorQHZhbHVlc3sgQHBvc2l4IH0gPSBQT1NJWDo6dW5hbWUoKTsKKworIyBPbiBzb21lIHN5c3RlbXMgUE9TSVg6OnVuYW1lKCkgcmV0dXJucyAic2hvcnQiIG5vZGUgbmFtZSAod2l0aG91dCBkb21haW4gbmFtZSkuIFRvIGJlIGNvbnNpc3RlbnQKKyMgb24gYWxsIHN5c3RlbXMsIHdlIHdpbGwgZ2V0IG5vZGUgbmFtZSBmcm9tIGFsdGVybmF0aXZlIHNvdXJjZS4KK2lmICggJF5PID1+IG0vY3lnd2luL2kgKSB7CisgICAgIyBGdW5jdGlvbiBmcm9tIE5ldDo6RG9tYWluIG1vZHVsZSB3b3JrcyB3ZWxsLCBidXQgb24gQ3lnd2luIGl0IHByaW50cyB0bworICAgICMgc3RkZXJyICJkb21haW5uYW1lOiBub3QgZm91bmQiLiBTbyB3ZSB3aWxsIHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIG5vdy4KKyAgICAkdmFsdWVzeyBmcWRuIH0gPSBsYyggJEVOVnsgQ09NUFVURVJOQU1FIH0gLiAiLiIgLiAkRU5WeyBVU0VSRE5TRE9NQUlOIH0gKTsKK30gZWxzZSB7CisgICAgIyBPbiBzeXN0ZW1zIG90aGVyIHRoYW4gQ3lnd2luLCBsZXQgdXMgdXNlIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpLCBidXQgZG8gaXQgb25seSBub2RlIG5hbWUKKyAgICAjIGlzIHJlYWxseSByZXF1ZXN0ZWQuCisgICAgJHZhbHVlc3sgZnFkbiB9ID0KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICRmcWRuID0gTmV0OjpEb21haW46Omhvc3RmcWRuKCk7ICMgImZxZG4iIHN0YW5kcyBmb3IgImZ1bGx5IHF1YWxpZmllZCBkb2FtYWluIG5hbWUiLgorICAgICAgICAgICAgIyBPbiBzb21lIHN5c3RlbXMgUE9TSVg6OnVuYW1lKCkgYW5kIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpIHJlcG9ydHMgZGlmZmVyZW50IG5hbWVzLgorICAgICAgICAgICAgIyBMZXQgdXMgaXNzdWUgYSB3YXJuaW5nIGlmIHRoZXkgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuIE5hbWVzIGFyZSBpbnNpZ25pZmljYW50bHkKKyAgICAgICAgICAgICMgZGlmZmVyZW50IGlmIFBPU0lYOjp1bmFtZSgpIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKS4KKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAkZnFkbiBlcSBzdWJzdHIoICRmcWRuLCAwLCBsZW5ndGgoICRmcWRuICkgKQorICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICBsZW5ndGgoICRmcWRuICkgPT0gbGVuZ3RoKCAkZnFkbiApCisgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJGZxZG4sIGxlbmd0aCggJGZxZG4gKSwgMSApIGVxICIuIgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICMgT2suCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdhcm5pbmdzOjp3YXJuaWYoCisgICAgICAgICAgICAgICAgICAgICJQT1NJWDo6dW5hbWUoKSBhbmQgTmV0OjpEb21haW46Omhvc3RmcWRuKCkgcmVwb3J0ZWQgZGlmZmVyZW50IG5hbWVzOiAiIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICJcIiR2YWx1ZXN7IGZxZG4gfVwiIGFuZCBcIiRmcWRuXCIgcmVzcGVjdGl2ZWx5XG4iCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIHJldHVybiAkZnFkbjsKKyAgICAgICAgfTsgIyBzdWIKK307ICMgaWYKKworaWYgKCAkXk8gPX4gJG1zd2luICkgeworICAgIGlmICgKKyAgICAgICAgJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEEoPzp4ODZ8WzU2XTg2KVx6fQorICAgICAgICBhbmQKKyAgICAgICAgZXhpc3RzKCAkRU5WeyBQUk9DRVNTT1JfQVJDSElURUNUVVJFIH0gKSBhbmQgJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSB9IGVxICJ4ODYiCisgICAgICAgIGFuZAorICAgICAgICBleGlzdHMoICRFTlZ7IFBST0NFU1NPUl9BUkNISVRFVzY0MzIgfSApCisgICAgKSB7CisgICAgICAgIGlmICggJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVXNjQzMiB9IGVxICJBTUQ2NCIgKSB7CisgICAgICAgICAgICAkdmFsdWVzeyBtYWNoaW5lIH0gPSAieDg2XzY0IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKK307ICMgaWYKKworIyBTb21lIHZhbHVlcyBhcmUgbm90IHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpLCBsZXQgdXMgY29tcHV0ZSB0aGVtLgorCisjIHByb2Nlc3Nvci4KKyR2YWx1ZXN7IHByb2Nlc3NvciB9ID0gJHZhbHVlc3sgbWFjaGluZSB9OworCisjIGhhcmR3YXJlX3BsYXRmb3JtLgoraWYgKCAwICkgeworfSBlbHNpZiAoICReTyBlcSAibGludXgiIG9yICReTyBlcSAiZnJlZWJzZCIgb3IgJF5PIGVxICJuZXRic2QiICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFpWzM0NTZdODZcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiaTM4NiI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBKHg4Nl82NHxhbWQ2NClcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFhcm12N1xEKlx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJhcm0iOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQXBwYzY0bGVcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAicHBjNjRsZSI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBcHBjNjRcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAicHBjNjQiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWFhcmNoNjRcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiYWFyY2g2NCI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBbWlwczY0XHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIm1pcHM2NCI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBbWlwc1x6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJtaXBzIjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJF5PIGVxICJkYXJ3aW4iICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9IGVxICJ4ODYiIG9yICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAiaTM4NiIgKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPQorICAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgICBteSAkcGxhdGZvcm0gPSAiaTM4NiI7CisgICAgICAgICAgICAgICAgIyBTb21lIE9TZXMgb24gSW50ZWwoUikgNjQgc3RpbGwgcmVwb3J0cyAiaTM4NiIgbWFjaGluZS4gVmVyaWZ5IGl0IGJ5IHVzaW5nCisgICAgICAgICAgICAgICAgIyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgJ3N5c2N0bCAtbiBody5vcHRpb25hbC54ODZfNjQnLiBPbiBJbnRlbChSKSA2NC1iaXQgc3lzdGVtcyB0aGUKKyAgICAgICAgICAgICAgICAjIHZhbHVlID09IDE7IG9uIDMyLWJpdCBzeXN0ZW1zIHRoZSAnaHcub3B0aW9uYWwueDg2XzY0JyBwcm9wZXJ0eSBlaXRoZXIgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAjIG9yIHRoZSB2YWx1ZSA9PSAwLiBUaGUgcGF0aCB2YXJpYWJsZSBkb2VzIG5vdCBjb250YWluIGEgcGF0aCB0byBzeXNjdGwgd2hlbgorICAgICAgICAgICAgICAgICMgc3RhcnRlZCBieSBjcm9udGFiLgorICAgICAgICAgICAgICAgIG15ICRzeXNjdGwgPSAoIHdoaWNoKCAic3lzY3RsIiApIG9yICIvdXNyL3NiaW4vc3lzY3RsIiApOworICAgICAgICAgICAgICAgIG15ICRvdXRwdXQ7CisgICAgICAgICAgICAgICAgZGVidWcoICJFeGVjdXRpbmcgJHN5c2N0bC4uLiIgKTsKKyAgICAgICAgICAgICAgICBleGVjdXRlKCBbICRzeXNjdGwsICItbiIsICJody5vcHRpb25hbC54ODZfNjQiIF0sIC1zdGRvdXQgPT4gXCRvdXRwdXQsIC1zdGRlcnIgPT4gdW5kZWYgKTsKKyAgICAgICAgICAgICAgICBjaG9tcCggJG91dHB1dCApOworICAgICAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICggIiRvdXRwdXQiIGVxICIiIG9yICIkb3V0cHV0IiBlcSAiMCIgKSB7CisgICAgICAgICAgICAgICAgICAgICRwbGF0Zm9ybSA9ICJpMzg2IjsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICggIiRvdXRwdXQiIGVxICIxIiApIHsKKyAgICAgICAgICAgICAgICAgICAgJHBsYXRmb3JtID0gIng4Nl82NCI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGllICJVbnN1cHBvcnRlZCB2YWx1ZSAoXCIkb3V0cHV0XCIpIHJldHVybmVkIGJ5IFwiJHN5c2N0bCAtbiBody5vcHRpb25hbC54ODZfNjRcIjsgc3RvcHBlZCI7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIHJldHVybiAkcGxhdGZvcm07CisgICAgICAgICAgICB9OyAjIHN1YiB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2XzY0IiApIHsKKwkjIFNvbWUgT1MgWCogdmVyc2lvbnMgcmVwb3J0ICJ4ODZfNjQiLgorCSR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJF5PID1+ICRtc3dpbiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBKD86eDg2fFs1Nl04Nilcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiaTM4NiI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2XzY0IiBvciAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgImFtZDY0IiApIHsKKyAgICAgICAgIyBBY3RpdmVQZXJsIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgcmV0dXJucyAieDg2XzY0Iiwgd2hpbGUgQWN0aXZlUGVybCBmb3IgSW50ZWwoUikgNjQgcmV0dXJucyAiYW1kNjQiLgorICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIng4Nl82NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBtYWNoaW5lIChcIiR2YWx1ZXN7IG1hY2hpbmUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfSBlbHNpZiAoICReTyBlcSAiY3lnd2luIiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBaVszNDU2XTg2XHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImkzODYiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgIng4Nl82NCIgKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2UgeworICAgIGRpZSAiVW5zdXBwb3J0ZWQgT1MgKFwiJF5PXCIpOyBzdG9wcGVkIjsKK307ICMgaWYKKworIyBvcGVyYXRpbmdfc3lzdGVtLgoraWYgKCAwICkgeworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gZXEgIkxpbnV4IiApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiR05VL0xpbnV4IjsKKyAgICBteSAkcmVsZWFzZTsgICAgIyBOYW1lIG9mIGNob3NlbiAiKi1yZWxlYXNlIiBmaWxlLgorICAgIG15ICRidWxrOyAgICAgICAjIENvbnRlbnQgb2YgcmVsZWFzZSBmaWxlLgorICAgICMgT24gVWJ1bnR1LCBsc2ItcmVsZWFzZSBpcyBxdWl0ZSBpbmZvcm1hdGl2ZSwgZS4gZy46CisgICAgIyAgICAgRElTVFJJQl9JRD1VYnVudHUKKyAgICAjICAgICBESVNUUklCX1JFTEVBU0U9OS4wNAorICAgICMgICAgIERJU1RSSUJfQ09ERU5BTUU9amF1bnR5CisgICAgIyAgICAgRElTVFJJQl9ERVNDUklQVElPTj0iVWJ1bnR1IDkuMDQiCisgICAgIyBUcnkgbHNiLXJlbGVhc2UgZmlyc3QuIEJ1dCBvbiBzb21lIG9sZGVyIHN5c3RlbXMgbHNiLXJlbGVhc2UgaXMgbm90IGluZm9ybWF0aXZlLgorICAgICMgSXQgbWF5IGNvbnRhaW4ganVzdCBvbmUgbGluZToKKyAgICAjICAgICBMU0JfVkVSU0lPTj0iMS4zIgorICAgICRyZWxlYXNlID0gIi9ldGMvbHNiLXJlbGVhc2UiOworICAgIGlmICggLWUgJHJlbGVhc2UgKSB7CisgICAgICAgICRidWxrID0gcmVhZF9maWxlKCAkcmVsZWFzZSApOworICAgIH0gZWxzZSB7CisgICAgICAgICRidWxrID0gIiI7CisgICAgfTsgIyBpZgorICAgIGlmICggJGJ1bGsgPX4gbXteRElTVFJJQl99ICkgeworICAgICAgICAjIE9rLCB0aGlzIGxzYi1yZWxlYXNlIGlzIGluZm9ybWF0aXZlLgorICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX0lEXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfSUQ6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lIH0gPSAkMTsKKyAgICAgICAgJGJ1bGsgPX4gbXteRElTVFJJQl9SRUxFQVNFXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfUkVMRUFTRToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICQxOworICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX0NPREVOQU1FXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfQ09ERU5BTUU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSB9ID0gJDE7CisgICAgICAgICRidWxrID1+IG17XkRJU1RSSUJfREVTQ1JJUFRJT05ccyo9Ij9ccyooLio/KSI/XHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfREVTQ1JJUFRJT046IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gJDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBPb3BzLiBsc2ItcmVsZWFzZSBpcyBtaXNzZWQgb3Igbm90IGluZm9ybWF0aXZlLiBUcnkgb3RoZXIgKi1yZWxlYXNlIGZpbGVzLgorICAgICAgICAkcmVsZWFzZSA9ICIvZXRjL3N5c3RlbS1yZWxlYXNlIjsKKyAgICAgICAgaWYgKCBub3QgLWUgJHJlbGVhc2UgKSB7ICAgICMgVXNlIC9ldGMvc3lzdGVtLXJlbGVhc2UiIGlmIHN1Y2ggZmlsZSBleGlzdHMuCisgICAgICAgICAgICAjIE90aGVyd2lzZSB0cnkgb3RoZXIgIi9ldGMvKi1yZWxlYXNlIiBmaWxlcywgYnV0IGlnbm9yZSAiL2V0Yy9sc2ItcmVsZWFzZSIuCisgICAgICAgICAgICBteSBAcmVsZWFzZXMgPSBncmVwKCAkXyBuZSAiL2V0Yy9sc2ItcmVsZWFzZSIsIGJzZF9nbG9iKCAiL2V0Yy8qLXJlbGVhc2UiICkgKTsKKyAgICAgICAgICAgICMgT24gc29tZSBGZWRvcmEgc3lzdGVtcyB0aGVyZSBhcmUgdHdvIGZpbGVzOiBmZWRvcmEtcmVsZWFzZSBhbmQgcmVkaGF0LXJlbGVhc2UKKyAgICAgICAgICAgICMgd2l0aCBpZGVudGljYWwgY29udGVudC4gSWYgZmVkb3JhLXJlbGVhc2UgcHJlc2VudCwgaWdub3JlIHJlZGphdC1yZWxlYXNlLgorICAgICAgICAgICAgaWYgKCBncmVwKCAkXyBlcSAiL2V0Yy9mZWRvcmEtcmVsZWFzZSIsIEByZWxlYXNlcyApICkgeworICAgICAgICAgICAgICAgIEByZWxlYXNlcyA9IGdyZXAoICRfIG5lICIvZXRjL3JlZGhhdC1yZWxlYXNlIiwgQHJlbGVhc2VzICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoIEByZWxlYXNlcyA9PSAxICkgeworICAgICAgICAgICAgICAgICRyZWxlYXNlID0gJHJlbGVhc2VzWyAwIF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggQHJlbGVhc2VzID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICMgTm8gKi1yZWxlYXNlIGZpbGVzIGZvdW5kLCB0cnkgZGViaWFuX3ZlcnNpb24uCisgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gIi9ldGMvZGViaWFuX3ZlcnNpb24iOworICAgICAgICAgICAgICAgICAgICBpZiAoIG5vdCAtZSAkcmVsZWFzZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gdW5kZWY7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiTm8gcmVsZWFzZSBmaWxlcyBmb3VuZCBpbiBcIi9ldGMvXCIgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gdW5kZWY7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICJNb3JlIHRoYW4gb25lIHJlbGVhc2UgZmlsZXMgZm91bmQgaW4gXCIvZXRjL1wiIGRpcmVjdG9yeToiLCBAcmVsZWFzZXMgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkcmVsZWFzZSApICkgeworICAgICAgICAgICAgJGJ1bGsgPSByZWFkX2ZpbGUoICRyZWxlYXNlICk7CisgICAgICAgICAgICBpZiAoICRyZWxlYXNlID1+IG17c3lzdGVtfHJlZGhhdHxmZWRvcmF9ICkgeworICAgICAgICAgICAgICAgICMgUmVkIEhhdCBvciBGZWRvcmEuIFBhcnNlIHRoZSBmaXJzdCBsaW5lIG9mIGZpbGUuCisgICAgICAgICAgICAgICAgIyBUeXBpY2FsIHZhbHVlcyBvZiAqLXJlbGVhc2UgKG9uZSBvZik6CisgICAgICAgICAgICAgICAgIyAgICAgUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBTZXJ2ZXIgcmVsZWFzZSA1LjIgKFRpa2FuZ2EpCisgICAgICAgICAgICAgICAgIyAgICAgUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBBUyByZWxlYXNlIDMgKFRhcm9vbiBVcGRhdGUgNCkKKyAgICAgICAgICAgICAgICAjICAgICBGZWRvcmEgcmVsZWFzZSAxMCAoQ2FtYnJpZGdlKQorICAgICAgICAgICAgICAgICRidWxrID1+IG17XEEoLiopJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICBteSAkZmlyc3RfbGluZSA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9ICRmaXJzdF9saW5lOworICAgICAgICAgICAgICAgICRmaXJzdF9saW5lID1+IG17XEEoLio/KVxzK3JlbGVhc2VccysoLio/KSg/OlxzK1woKC4qPykoPzpccytVcGRhdGVccysoLio/KSk/XCkpP1xzKiR9CisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZToxOiBDYW5ub3QgcGFyc2UgbGluZToiLCAkZmlyc3RfbGluZSApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICB9ICA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9ICA9ICQyIC4gKCBkZWZpbmVkKCAkNCApID8gIi4kNCIgOiAiIiApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgfSA9ICQzOworICAgICAgICAgICAgfSBlbHNpZiAoICRyZWxlYXNlID1+IG17U3VTRX0gKSB7CisgICAgICAgICAgICAgICAgIyBUeXBpY2FsIFN1U0UtcmVsZWFzZToKKyAgICAgICAgICAgICAgICAjICAgICBTVVNFIExpbnV4KiBPUyBFbnRlcnByaXNlIFNlcnZlciAxMCAoeDg2XzY0KQorICAgICAgICAgICAgICAgICMgICAgIFZFUlNJT04gPSAxMAorICAgICAgICAgICAgICAgICMgICAgIFBBVENITEVWRUwgPSAyCisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gbXtcQSguKikkfW0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBDYW5ub3QgZmluZCB0aGUgZmlyc3QgbGluZToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAgICAgICAgIG15ICRmaXJzdF9saW5lID0gJDE7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gJGZpcnN0X2xpbmU7CisgICAgICAgICAgICAgICAgJGZpcnN0X2xpbmUgPX4gbXteKC4qPylccyooXGQrKVxzKlwoLio/XClccyokfQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6MTogQ2Fubm90IHBhcnNlIGxpbmU6IiwgJGZpcnN0X2xpbmUgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSA9ICQxOworICAgICAgICAgICAgICAgICRidWxrID1+IG17XlZFUlNJT05ccyo9XHMqKC4qKVxzKiR9bQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIFZFUlNJT046IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICQxOworICAgICAgICAgICAgICAgIGlmICggJGJ1bGsgPX4gbXteUEFUQ0hMRVZFTFxzKj1ccyooLiopXHMqJH1tICkgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSAuPSAiLiQxIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9IGVsc2lmICggJHJlbGVhc2UgPX4gbXtkZWJpYW5fdmVyc2lvbn0gKSB7CisgICAgICAgICAgICAgICAgIyBEZWJpYW4uIFRoZSBmaWxlIGRlYmlhbl92ZXJzaW9uIGNvbnRhaW5zIGp1c3QgdmVyc2lvbiBudW1iZXIsIG5vdGhpbmcgbW9yZToKKyAgICAgICAgICAgICAgICAjICAgICA0LjAKKyAgICAgICAgICAgICAgICBteSAkbmFtZSA9ICJEZWJpYW4iOworICAgICAgICAgICAgICAgICRidWxrID1+IG17XEEoLiopJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICBteSAkdmVyc2lvbiA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICAgICAgfSA9ICRuYW1lOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSAgICAgfSA9ICR2ZXJzaW9uOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgICAgfSA9ICJ1bmtub3duIjsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSBzcHJpbnRmKCAiJXMgJXMiLCAkbmFtZSwgJHZlcnNpb24gKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSApICkgeworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSA9ICJHTlUvTGludXgiOworICAgIH07ICMgaWYKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9IGVxICJEYXJ3aW4iICkgeworICAgIG15ICVjb2RlbmFtZXMgPSAoCisgICAgICAgIDEwLjQgPT4gIlRpZ2VyIiwKKyAgICAgICAgMTAuNSA9PiAiTGVvcGFyZCIsCisgICAgICAgIDEwLjYgPT4gIlNub3cgTGVvcGFyZCIsCisgICAgKTsKKyAgIG15ICRkYXJ3aW47CisgICBteSAkZ2V0X29zX2luZm8gPQorICAgICAgIHN1YiB7CisgICAgICAgICAgIG15ICggJG5hbWUgKSA9IEBfOworICAgICAgICAgICBpZiAoIG5vdCBkZWZpbmVkICRkYXJ3aW4gKSB7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJEYXJ3aW4iOworICAgICAgICAgICAgICAgIyBzd192ZXJzIHByaW50cyBPUyBYKiB2ZXJzaW9uIHRvIHN0ZG91dDoKKyAgICAgICAgICAgICAgICMgICAgIFByb2R1Y3ROYW1lOiAgICAgICBPUyBYKgorICAgICAgICAgICAgICAgIyAgICAgUHJvZHVjdFZlcnNpb246ICAgIDEwLjQuMTEKKyAgICAgICAgICAgICAgICMgICAgIEJ1aWxkVmVyc2lvbjogICAgICA4UzIxNjcKKyAgICAgICAgICAgICAgICMgSXQgZG9lcyBub3QgcHJpbnQgY29kZW5hbWUsIHNvIHdlIGNvZGUgT1MgWCogY29kZW5hbWVzIGhlcmUuCisgICAgICAgICAgICAgICBteSAkc3dfdmVycyA9IHdoaWNoKCAic3dfdmVycyIgKSB8fCAiL3Vzci9iaW4vc3dfdmVycyI7CisgICAgICAgICAgICAgICBteSAkb3V0cHV0OworICAgICAgICAgICAgICAgZGVidWcoICJFeGVjdXRpbmcgJHN3X3ZlcnMuLi4iICk7CisgICAgICAgICAgICAgICBleGVjdXRlKCBbICRzd192ZXJzIF0sIC1zdGRvdXQgPT4gXCRvdXRwdXQsIC1zdGRlcnIgPT4gdW5kZWYgKTsKKyAgICAgICAgICAgICAgICRvdXRwdXQgPX4gbXteUHJvZHVjdE5hbWU6XHMqKC4qKVxzKiR9bQorICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJUaGVyZSBpcyBubyBQcm9kdWN0TmFtZSBpbiBzd192ZXJzIG91dHB1dDoiLCAkb3V0cHV0LCAiKGVvZikiICk7CisgICAgICAgICAgICAgICBteSAkbmFtZSA9ICQxOworICAgICAgICAgICAgICAgJG91dHB1dCA9fiBte15Qcm9kdWN0VmVyc2lvbjpccyooLiopXHMqJH1tCisgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIlRoZXJlIGlzIG5vIFByb2R1Y3RWZXJzaW9uIGluIHN3X3ZlcnMgb3V0cHV0OiIsICRvdXRwdXQsICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgIG15ICRyZWxlYXNlID0gJDE7CisgICAgICAgICAgICAgICAjIFNvbWV0aW1lcyByZWxlYXNlIHJlcG9ydGVkIGFzICIxMC40LjExIiAoMyBjb21wb25lbnRlcyksIHNvbWV0aW1lcyBhcyAiMTAuNiIuCisgICAgICAgICAgICAgICAjIEhhbmRsZSBib3RoIHZhcmlhbnRzLgorICAgICAgICAgICAgICAgJHJlbGVhc2UgPX4gbXteKFxkKy5cZCspKD86XC5cZCspPyg/PVxzfCQpfQorICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJDYW5ub3QgcGFyc2UgT1MgWCogdmVyc2lvbjogJHJlbGVhc2UiICk7CisgICAgICAgICAgICAgICBteSAkdmVyc2lvbiA9ICQxOworICAgICAgICAgICAgICAgbXkgJGNvZGVuYW1lID0gKCAkY29kZW5hbWVzeyAkdmVyc2lvbiB9IG9yICJ1bmtub3duIiApOworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgICAgICAgIH0gPSAkbmFtZTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlICAgICB9ID0gJHJlbGVhc2U7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgICAgfSA9ICRjb2RlbmFtZTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gc3ByaW50ZiggIiVzICVzICglcykiLCAkbmFtZSwgJHJlbGVhc2UsICRjb2RlbmFtZSApOworICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgIHJldHVybiAkZGFyd2luLT57ICRuYW1lIH07CisgICAgICAgfTsgIyBzdWIKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtICAgICAgICAgICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW0iICAgICAgICAgICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lICAgICAgICB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX25hbWUiICAgICAgICApOyB9OworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSAgICAgfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIiAgICAgKTsgfTsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUiICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIiApOyB9OworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQVdpbmRvd3NbIF9dTlRcen0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIk1TIFdpbmRvd3MiOworICAgICMgbXkgQG9zX25hbWUgPSBXaW4zMjo6R2V0T1NOYW1lKCk7CisgICAgIyAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICRvc19uYW1lWyAwIF07CisgICAgIyAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3VwZGF0ZSAgfSA9ICRvc19uYW1lWyAxIF07Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSA9fiBte1xBQ1lHV0lOX05ULX0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIk1TIFdpbmRvd3MiOworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQUZyZWVCU0R9ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJGcmVlQlNEIjsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9ID1+IG17XEFOZXRCU0R9ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJOZXRCU0QiOworfSBlbHNlIHsKKyAgICBkaWUgIlVuc3VwcG9ydGVkIGtlcm5lbF9uYW1lIChcIiR2YWx1ZXN7IGtlcm5lbF9uYW1lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworfTsgIyBpZgorCisjIGhvc3RfbmFtZSBhbmQgZG9tYWluX25hbWUKKyR2YWx1ZXN7IGhvc3RfbmFtZSB9ID0KKyAgICBzdWIgeworICAgICAgICBteSAkZnFkbiA9IHZhbHVlKCAiZnFkbiIgKTsKKyAgICAgICAgJGZxZG4gPX4gbXtcQShbXi5dKikoPzpcLiguKikpP1x6fTsKKyAgICAgICAgbXkgJGhvc3RfbmFtZSA9ICQxOworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkaG9zdF9uYW1lICkgb3IgJGhvc3RfbmFtZSBlcSAiIiApIHsKKyAgICAgICAgICAgIGRpZSAiVW5leHBlY3RlZCBlcnJvcjogdW5kZWZpbmVkIG9yIGVtcHR5IGhvc3QgbmFtZTsgc3RvcHBlZCI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcmV0dXJuICRob3N0X25hbWU7CisgICAgfTsKKyR2YWx1ZXN7IGRvbWFpbl9uYW1lIH0gPQorICAgIHN1YiB7CisgICAgICAgIG15ICRmcWRuID0gdmFsdWUoICJmcWRuIiApOworICAgICAgICAkZnFkbiA9fiBte1xBKFteLl0qKSg/OlwuKC4qKSk/XHp9OworICAgICAgICBteSAkZG9tYWluX25hbWUgPSAkMjsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGRvbWFpbl9uYW1lICkgb3IgJGRvbWFpbl9uYW1lIGVxICIiICkgeworICAgICAgICAgICAgZGllICJVbmV4cGVjdGVkIGVycm9yOiB1bmRlZmluZWQgb3IgZW1wdHkgZG9tYWluIG5hbWU7IHN0b3BwZWQiOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiAkZG9tYWluX25hbWU7CisgICAgfTsKKworIyBSZXBsYWNlIHVuZGVmaW5lZCB2YWx1ZXMgd2l0aCAidW5rbm93biIuCitmb3JlYWNoIG15ICRuYW1lICggQGFsbCApIHsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdmFsdWVzeyAkbmFtZSB9ICkgKSB7CisgICAgICAgICR2YWx1ZXN7ICRuYW1lIH0gPSAidW5rbm93biI7CisgICAgfTsgIyBpZgorfTsgIyBmb3JlYWNoICRuYW1lCisKKyMgRXhwb3J0IGZ1bmN0aW9ucyByZXBvcnRpbmcgcHJvcGVydGllcy4KK2ZvcmVhY2ggbXkgJG5hbWUgKCBAYWxsICkgeworICAgIG5vIHN0cmljdCAicmVmcyI7CisgICAgKiRuYW1lID0gc3ViIHsgcmV0dXJuIHZhbHVlKCAkbmFtZSApOyB9OworfTsgIyBmb3JlYWNoICRuYW1lCisKKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJhc2UgbmFtZXMuCitzdWIgYmFzZV9uYW1lcyB7CisgICAgcmV0dXJuIEBiYXNlOworfTsgIyBzdWIgYmFzZV9uYW1lcworCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbGwgdGhlIG5hbWVzLgorc3ViIGFsbF9uYW1lcyB7CisgICAgcmV0dXJuIEBhbGw7Cit9OyAjIHN1YiBhbGxfbmFtZXMKKworIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdmFsdWUgYnkgdGhlIHNwZWNpZmllZCBuYW1lLgorc3ViIHZhbHVlKCQpIHsKKyAgICBteSAkbmFtZSA9IHNoaWZ0KCBAXyApOworICAgIGlmICggcmVmKCAkdmFsdWVzeyAkbmFtZSB9ICkgKSB7CisgICAgICAgIG15ICR2YWx1ZSA9ICR2YWx1ZXN7ICRuYW1lIH0tPigpOworICAgICAgICAkdmFsdWVzeyAkbmFtZSB9ID0gJHZhbHVlOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHZhbHVlc3sgJG5hbWUgfTsKK307ICMgc3ViIHZhbHVlCisKK3JldHVybiAxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxVbmFtZS5wbT4gLS0gQSBmZXcgc3Vicm91dGluZXMgdG8gZ2V0IHN5c3RlbSBpbmZvcm1hdGlvbiB1c3VhbGx5IHByb3ZpZGVkIGJ5CitDPC9iaW4vdW5hbWU+IGFuZCBDPFBPU0lYOjp1bmFtZSgpPi4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgVW5hbWU7CisKKyAgICAjIEJhc2UgcHJvcGVydHkgZnVuY3Rpb25zLgorICAgICRrZXJuZWxfbmFtZSAgICAgICA9IFVuYW1lOjprZXJuZWxfbmFtZSgpOworICAgICRmcWRuICAgICAgICAgICAgICA9IFVuYW1lOjpmcWRuKCk7CisgICAgJGtlcm5lbF9yZWxlYXNlICAgID0gVW5hbWU6Omtlcm5lbF9yZWxlYXNlKCk7CisgICAgJGtlcm5lbF92ZXJzaW9uICAgID0gVW5hbWU6Omtlcm5lbF92ZXJzaW9uKCk7CisgICAgJG1hY2hpbmUgICAgICAgICAgID0gVW5hbWU6Om1hY2hpbmUoKTsKKyAgICAkcHJvY2Vzc29yICAgICAgICAgPSBVbmFtZTo6cHJvY2Vzc29yKCk7CisgICAgJGhhcmR3YXJlX3BsYXRmb3JtID0gVW5hbWU6OmhhcmR3YXJlX3BsYXRmb3JtKCk7CisgICAgJG9wZXJhdGluZ19zeXN0ZW0gID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW0oKTsKKworICAgICMgQXV4aWxpYXJ5IHByb3BlcnR5IGZ1bmN0aW9ucy4KKyAgICAkaG9zdF9uYW1lICAgICAgICAgPSBVbmFtZTo6aG9zdF9uYW1lKCk7CisgICAgJGRvbWFpbl9uYW1lICAgICAgID0gVW5hbWU6OmRvbWFpbl9uYW1lKCk7CisgICAgJG9zX25hbWUgICAgICAgICAgID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW1fbmFtZSgpOworICAgICRvc19yZWxlYXNlICAgICAgICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UoKTsKKyAgICAkb3NfY29kZW5hbWUgICAgICAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSgpOworICAgICRvc19kZXNjcmlwdGlvbiAgICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uKCk7CisKKyAgICAjIE1ldGEgZnVuY3Rpb25zLgorICAgIEBiYXNlX25hbWVzICA9IFVuYW1lOjpiYXNlX25hbWVzKCk7CisgICAgQGFsbF9uYW1lcyAgID0gVW5hbWU6OmFsbF9uYW1lcygpOworICAgICRrZXJuZWxfbmFtZSA9IFVuYW1lOjp2YWx1ZSggImtlcm5lbF9uYW1lIiApOworCis9aGVhZDEgREVTQ1JJUFRJT04KKworQjxVbmFtZS5wbT4gcmVzZW1ibGVzIGZ1bmN0aW9uYWxpdHkgZm91bmQgaW4gQzxQT1NJWDo6dW5hbWUoKT4gZnVuY3Rpb24gb3IgaW4gQzx1bmFtZT4gcHJvZ3JhbS4KK0hvd2V2ZXIsIGJvdGggQzxQT1NJWDo6dW5hbWUoKT4gYW5kIEM8L2Jpbi91bmFtZT4gaGF2ZSBzb21lIGRpc2FkdmFudGFnZXM6CisKKz1vdmVyCisKKz1pdGVtICoKKworQzx1bmFtZT4gbWF5IGJlIG5vdCBhdmFpbGFibGUgaW4gc29tZSBlbnZpcm9ubWVudHMsIGZvciBleGFtcGxlLCBpbiBXaW5kb3dzKiBPUworKEM8dW5hbWU+IG1heSBiZSBmb3VuZCBpbiBzb21lIHRoaXJkLXBhcnR5IHNvZnR3YXJlIHBhY2thZ2VzLCBsaWtlIE1LUyBUb29sa2l0IG9yIEN5Z3dpbiwgYnV0IGl0IGlzCitub3QgYSBwYXJ0IG9mIE9TKS4KKworPWl0ZW0gKgorCitUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQzx1bmFtZT4uIEZvciBleGFtcGxlLCBDPHVuYW1lPiBvbiBPUyBYKiBkb2VzIG5vdAorcmVjb2duaXplIG9wdGlvbnMgQzwtaT4sIEM8LW8+LCBhbmQgYW55IGxvbmcgb3B0aW9ucy4KKworPWl0ZW0gKgorCitEaWZmZXJlbnQgdmVyc2lvbnMgb2YgQzx1bmFtZT4gbWF5IHJlcG9ydCB0aGUgc2FtZSBwcm9wZXJ0eSBkaWZmZXJlbnRseS4gRm9yIGV4YW1wbGUsCitDPHVuYW1lPiBvbiBMaW51eCogT1MgcmVwb3J0cyBtYWNoaW5lIGFzIEM8aTY4Nj4sIHdoaWxlIEM8dW5hbWU+IG9uIE9TIFgqIHJlcG9ydHMgdGhlIHNhbWUgbWFjaGluZSBhcworQzx4ODY+LgorCis9aXRlbSAqCisKK0M8UE9TSVg6OnVuYW1lKCk+IHJldHVybnMgbGlzdCBvZiB2YWx1ZXMuIEkgY2Fubm90IHJlY2FsbCB3aGF0IGlzIHRoZSBmb3VydGggZWxlbWVudCBvZiB0aGUgbGlzdC4KKworPWJhY2sKKworPWhlYWQyIEJhc2UgRnVuY3Rpb25zCisKK0Jhc2UgcHJvcGVydHkgZnVuY3Rpb25zIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIGFzIEM8dW5hbWU+IHByb2dyYW0uCisKKz1vdmVyCisKKz1pdGVtIEI8a2VybmVsX25hbWUoKT4KKworUmV0dXJucyB0aGUga2VybmVsIG5hbWUsIGFzIHJlcG9ydGVkIGJ5IEM8UE9TSVg6OnVuYW1lKCk+LgorCis9aXRlbSBCPGZxZG4oKT4KKworUmV0dXJucyB0aGUgRlFETiwgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lLiBPbiBzb21lIHN5c3RlbXMgQzxQT1NJWDo6dW5hbWUoKT4gcmVwb3J0cyBzaG9ydCBub2RlCituYW1lICh3aXRoIG5vIGRvbWFpbiBuYW1lKSwgb24gb3RoZXJzIEM8UE9TSVg6OnVuYW1lKCk+IHJlcG9ydHMgZnVsbCBub2RlIG5hbWUuIFRoaXMKK2Z1bmN0aW9uIHN0cml2ZSB0byByZXR1cm4gRlFETiBhbHdheXMgKGJ5IHJlZmluaW5nIEM8UE9TSVg6OnVuYW1lKCk+IHdpdGgKK0M8TmV0OjpEb21haW46Omhvc3RmcWRuKCk+KS4KKworPWl0ZW0gQjxrZXJuZWxfcmVsZWFzZSgpPgorCitSZXR1cm5zIHRoZSBrZXJuZWwgcmVsZWFzZSBzdHJpbmcsIGFzIHJlcG9ydGVkIGJ5IEM8UE9TSVg6OnVuYW1lKCk+LiBVc3VhbGx5IHRoZSBzdHJpbmcgY29uc2lzdHMgb2YKK3NldmVyYWwgbnVtYmVycywgc2VwYXJhdGVkIGJ5IGRvdHMgYW5kIGRhc2hlcywgYnV0IG1heSBhbHNvIGluY2x1ZGUgc29tZSBub24tbnVtZXJpYyBzdWJzdHJpbmdzIGxpa2UKKyJzbXAiLgorCis9aXRlbSBCPGtlcm5lbF92ZXJzaW9uKCk+CisKK1JldHVybnMgdGhlIGtlcm5lbCB2ZXJzaW9uIHN0cmluZywgYXMgcmVwb3J0ZWQgYnkgQzxQT1NJWDo6dW5hbWUoKT4uIEl0IGlzIEI8bm90PiBzZXZlcmFsCitkb3Qtc2VwYXJhdGVkIG51bWJlcnMgYnV0IG11Y2ggbG9uZ2VyIHN0cmluZyBkZXNjcmliaW5nIHRoZSBrZXJuZWwuCitGb3IgZXhhbXBsZSwgb24gTGludXgqIE9TIGl0IGluY2x1ZGVzIGJ1aWxkIGRhdGUuCitJZiB5b3UgbG9vayBmb3Igc29tZXRoaW5nIGlkZW50aWZ5aW5nIHRoZSBrZXJuZWwsIGxvb2sgYXQgTDxrZXJuZWxfcmVsZWFzZT4uCisKKz1pdGVtIEI8bWFjaGluZSgpPgorCitSZXR1cm5zIHRoZSBtYWNoaW5lIGhhcmR3YXJlIG5hbWUsIGFzIHJlcG9ydGVkIGJ5IFBPU0lYOjp1bmFtZSgpLiBOb3QgcmVsaWFibGUuIERpZmZlcmVudCBPU2VzIG1heQorcmVwb3J0IHRoZSBzYW1lIG1hY2hpbmUgaGFyZHdhcmUgbmFtZSBkaWZmZXJlbnRseS4gRm9yIGV4YW1wbGUsIExpbnV4KiBPUyByZXBvcnRzIEM8aTY4Nj4sIHdoaWxlIE9TIFgqCityZXBvcnRzIEM8eDg2PiBvbiB0aGUgc2FtZSBtYWNoaW5lLgorCis9aXRlbSBCPHByb2Nlc3NvcigpPgorCitSZXR1cm5zIHRoZSBwcm9jZXNzb3IgdHlwZS4gTm90IHJlbGlhYmxlLiBVc3VhbGx5IHRoZSBzYW1lIGFzIEM8bWFjaGluZT4uCisKKz1pdGVtIEI8aGFyZHdhcmVfcGxhdGZvcm0oKT4KKworT25lIG9mOiBDPGkzODY+IG9yIEM8eDg2XzY0Pi4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtKCk+CisKK09uZSBvZjogQzxHTlUvTGludXg+LCBDPE9TIFgqPiwgb3IgQzxNUyBXaW5kb3dzPi4KKworPWJhY2sKKworPWhlYWQyIEF1eGlsaWFyeSBGdW5jdGlvbnMKKworQXV4aWxpYXJ5IGZ1bmN0aW9ucyBleHRlbmRzIGJhc2UgZnVuY3Rpb25zIHdpdGggaW5mb3JtYXRpb24gbm90IHJlcG9ydGVkIGJ5IEM8dW5hbWU+IHByb2dyYW0uCisKK0F1eGlsaWFyeSBmdW5jdGlvbnMgY29sbGVjdCBpbmZvcm1hdGlvbiBmcm9tIGRpZmZlcmVudCBzb3VyY2VzLiBGb3IgZXhhbXBsZSwgb24gT1MgWCosIHRoZXkgbWF5CitjYWxsIEM8c3dfdmVycz4gcHJvZ3JhbSB0byBmaW5kIG91dCBPUyByZWxlYXNlOyBvbiBMaW51eCogT1MgdGhleSBtYXkgcGFyc2UgQzwvZXRjL3JlZGhhdC1yZWxlYXNlPiBmaWxlLAorZXRjLgorCis9b3ZlcgorCis9aXRlbSBCPGhvc3RfbmFtZSgpPgorCitSZXR1cm5zIGhvc3QgbmFtZSAoRlFETiB3aXRoIGRyb3BwZWQgZG9tYWluIHBhcnQpLgorCis9aXRlbSBCPGRvbWFpbl9uYW1lKCk+CisKK1JldHVybnMgZG9tYWluIG5hbWUgKEZRRE4gd2l0aCBkcm9wcGVkIGhvc3QgcGFydCkuCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbV9uYW1lPgorCitOYW1lIG9mIG9wZXJhdGluZyBzeXN0ZW0gb3IgbmFtZSBvZiBMaW51eCogT1MgZGlzdHJpYnV0aW9uLCBsaWtlICJGZWRvcmEiIG9yCisiUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBTZXJ2ZXIiLgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZT4KKworUmVsZWFzZSAodmVyc2lvbikgb2Ygb3BlcmF0aW5nIHN5c3RlbSBvciBMaW51eCogT1MgZGlzdHJpYnV0aW9uLiBVc3VhbGx5IGl0IGlzIGEgc2VyaWVzIG9mCitkb3Qtc2VwYXJhdGVkIG51bWJlcnMuCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZT4KKworQ29kZW5hbWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSByZWxlYXNlIG9yIExpbnV4KiBPUyBkaXN0cmlidXRpb24uIEZvciBleGFtcGxlLCBGZWRvcmEgMTAgaXMgIkNhbWJyaWRnZSIKK3doaWxlIE9TIFgqIDEwLjQgaXMgIlRpZ2VyIi4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uPgorCitMb25nZXIgc3RyaW5nLiBVc3VhbGx5IGl0IGluY2x1ZGVzIGFsbCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBwcm9wZXJ0aW5nIG1lbnRpb25lZCBhYm92ZSAtLSBuYW1lLAorcmVsZWFzZSwgY29kZW5hbWUgaW4gcGFyZW50aGVzZXMuCisKKz1iYWNrCisKKz1oZWFkMiBNZXRhIEZ1bmN0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPGJhc2VfbmFtZXMoKT4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsaXN0IG9mIGJhc2UgcHJvcGVydHkgbmFtZXMuCisKKz1pdGVtIEI8YWxsX25hbWVzKCk+CisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcHJvcGVydHkgbmFtZXMuCisKKz1pdGVtIEI8dmFsdWUoPiBJPG5hbWU+IEI8KT4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgc3BlY2lmaWVkIGJ5IEk8bmFtZT4uCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCisgICAgdXNlIFVuYW1lOworCisgICAgcHJpbnQoIFVuYW1lOjpzdHJpbmcoKSwgIlxuIiApOworCisgICAgZm9yZWFjaCBteSAkbmFtZSAoIFVuYW1lOjphbGxfbmFtZXMoKSApIHsKKyAgICAgICAgcHJpbnQoICIkbmFtZT1cIiIgLiBVbmFtZTo6dmFsdWUoICRuYW1lICkgLiAiXCJcbiIgKTsKKyAgICB9OyAjIGZvcmVhY2ggJG5hbWUKKworPWhlYWQxIFNFRSBBTFNPCisKK0w8UE9TSVg6OnVuYW1lPiwgTDx1bmFtZT4uCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rvb2xzL2xpYi90b29scy5wbSBiL3JjMy9ydW50aW1lL3Rvb2xzL2xpYi90b29scy5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVjZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdG9vbHMvbGliL3Rvb2xzLnBtCkBAIC0wLDAgKzEsMTk4MSBAQAorIworIyBUaGlzIGlzIG5vdCBhIHJ1bm5hYmxlIHNjcmlwdCwgaXQgaXMgYSBQZXJsIG1vZHVsZSwgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgc3Vicm91dGluZXMsIGV0Yy4KKyMgdG8gYmUgdXNlZCBpbiBvdGhlciBzY3JpcHRzLgorIworIyBUbyBnZXQgaGVscCBhYm91dCBleHBvcnRlZCB2YXJpYWJsZXMgYW5kIHN1YnJvdXRpbmVzLCBwbGVhc2UgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIHRvb2xzLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBpbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKz1oZWFkMSBOQU1FCisKK0I8dG9vbHMucG0+IC0tIEEgY29sbGVjdGlvbiBvZiBzdWJyb3V0aW5lcyB3aGljaCBhcmUgd2lkZWx5IHVzZWQgaW4gUGVybCBzY3JpcHRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBGaW5kQmluOworICAgIHVzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKyAgICB1c2UgdG9vbHM7CisKKz1oZWFkMSBERVNDUklQVElPTgorCitCPE5vdGU6PiBCZWNhdXNlIHRoaXMgY29sbGVjdGlvbiBpcyBzbWFsbCBhbmQgaW50ZW5kZWQgZm9yIHdpZGVseSB1c2luZyBpbiBwYXJ0aWN1bGFyIHByb2plY3QsCithbGwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5IGRlZmF1bHQuCisKK0I8Tm90ZTo+IEkgaGF2ZSBzb21lIGlkZWFzIGhvdyB0byBpbXByb3ZlIHRoaXMgY29sbGVjdGlvbiwgYnV0IGl0IGlzIGluIG15IGxvbmctdGVybSBwbGFucy4KK0N1cnJlbnQgc2hhcGUgaXMgbm90IGlkZWFsLCBidXQgZ29vZCBlbm91Z2ggdG8gdXNlLgorCis9Y3V0CisKK3BhY2thZ2UgdG9vbHM7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSB2YXJzIHF3KCBASVNBIEBFWFBPUlQgQEVYUE9SVF9PSyAlRVhQT1JUX1RBR1MgKTsKK3JlcXVpcmUgRXhwb3J0ZXI7CitASVNBID0gcXcoIEV4cG9ydGVyICk7CisKK215IEB2YXJzICAgPSBxdyggJHRvb2wgKTsKK215IEB1dGlscyAgPSBxdyggY2hlY2tfb3B0cyB2YWxpZGF0ZSApOworbXkgQG9wdHMgICA9IHF3KCBnZXRfb3B0aW9ucyApOworbXkgQHByaW50ICA9IHF3KCBkZWJ1ZyBpbmZvIHdhcm5pbmcgY21kbGluZV9lcnJvciBydW50aW1lX2Vycm9yIHF1ZXN0aW9uICk7CitteSBAbmFtZSAgID0gcXcoIGdldF92b2wgZ2V0X2RpciBnZXRfZmlsZSBnZXRfbmFtZSBnZXRfZXh0IGNhdF9maWxlIGNhdF9kaXIgKTsKK215IEBmaWxlICAgPSBxdyggd2hpY2ggYWJzX3BhdGggcmVsX3BhdGggcmVhbF9wYXRoIG1ha2VfZGlyIGNsZWFuX2RpciBjb3B5X2RpciBtb3ZlX2RpciBkZWxfZGlyIGNoYW5nZV9kaXIgY29weV9maWxlIG1vdmVfZmlsZSBkZWxfZmlsZSApOworbXkgQGlvICAgICA9IHF3KCByZWFkX2ZpbGUgd3JpdGVfZmlsZSApOworbXkgQGV4ZWMgICA9IHF3KCBleGVjdXRlIGJhY2t0aWNrcyApOworbXkgQHN0cmluZyA9IHF3eyBwYWQgfTsKK0BFWFBPUlQgPSAoIEB1dGlscywgQG9wdHMsIEB2YXJzLCBAcHJpbnQsIEBuYW1lLCBAZmlsZSwgQGlvLCBAZXhlYywgQHN0cmluZyApOworCit1c2UgVU5JVkVSU0FMICAgICgpOworCit1c2UgRmluZEJpbjsKK3VzZSBJTzo6SGFuZGxlOwordXNlIElPOjpGaWxlOwordXNlIElPOjpEaXI7CisjIE5vdCBhdmFpbGFibGUgb24gc29tZSBtYWNoaW5lczogdXNlIElPOjpabGliOworCit1c2UgR2V0b3B0OjpMb25nICgpOwordXNlIFBvZDo6VXNhZ2UgICAoKTsKK3VzZSBDYXJwICAgICAgICAgKCk7Cit1c2UgRmlsZTo6Q29weSAgICgpOwordXNlIEZpbGU6OlBhdGggICAoKTsKK3VzZSBGaWxlOjpUZW1wICAgKCk7Cit1c2UgRmlsZTo6U3BlYyAgICgpOwordXNlIFBPU0lYICAgICAgICBxd3sgOmZjbnRsX2ggOmVycm5vX2ggfTsKK3VzZSBDd2QgICAgICAgICAgKCk7Cit1c2UgU3ltYm9sICAgICAgICgpOworCit1c2UgRGF0YTo6RHVtcGVyOworCit1c2UgdmFycyBxdyggJHRvb2wgJHZlcmJvc2UgJHRpbWVzdGFtcHMgKTsKKyR0b29sID0gJEZpbmRCaW46OlNjcmlwdDsKKworbXkgQHdhcm5pbmcgPSAoIHN1YiB7fSwgXCZ3YXJuaW5nLCBcJnJ1bnRpbWVfZXJyb3IgKTsKKworCitzdWIgY2hlY2tfb3B0cyhcJSQ7JCkgeworCisgICAgbXkgJG9wdHMgPSBzaGlmdCggQF8gKTsgICMgUmVmZXJlbnNlIHRvIGhhc2ggY29udGFpbmluZyByZWFsIG9wdGlvbnMgYW5kIHRoZWlyIHZhbHVlcy4KKyAgICBteSAkZ29vZCA9IHNoaWZ0KCBAXyApOyAgIyBSZWZlcmVuY2UgdG8gYW4gYXJyYXkgY29udGFpbmluZyBhbGwga25vd24gb3B0aW9uIG5hbWVzLgorICAgIG15ICRtc2cgID0gc2hpZnQoIEBfICk7ICAjIE9wdGlvbmFsIChub24tbWFuZGF0b3J5KSBtZXNzYWdlLgorCisgICAgaWYgKCBub3QgZGVmaW5lZCggJG1zZyApICkgeworICAgICAgICAkbXNnID0gInVua25vd24gb3B0aW9uKHMpIHBhc3NlZCI7ICAgIyBEZWZhdWx0IHZhbHVlIGZvciAkbXNnLgorICAgIH07ICMgaWYKKworICAgICMgSSdsbCB1c2UgdGhlc2UgaGFzaGVzIGFzIHNldHMgb2Ygb3B0aW9ucy4KKyAgICBteSAlZ29vZCA9IG1hcCggKCAkXyA9PiAxICksIEAkZ29vZCApOyAgICMgJWdvb2Qgbm93IGlzIGZpbGxlZCB3aXRoIGFsbCBrbm93biBvcHRpb25zLgorICAgIG15ICViYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlYmFkIGlzIGVtcHR5LgorCisgICAgZm9yZWFjaCBteSAkb3B0ICgga2V5cyggJSRvcHRzICkgKSB7ICAgICAjIEZvciBlYWNoIHJlYWwgb3B0aW9uLi4uCisgICAgICAgIGlmICggbm90IGV4aXN0cyggJGdvb2R7ICRvcHQgfSApICkgeyAjIExvb2sgaXRzIG5hbWUgaW4gdGhlIHNldCBvZiBrbm93biBvcHRpb25zLi4uCisgICAgICAgICAgICAkYmFkeyAkb3B0IH0gPSAxOyAgICAgICAgICAgICAgICAjIEFkZCB1bmtub3duIG9wdGlvbiB0byAlYmFkIHNldC4KKyAgICAgICAgICAgIGRlbGV0ZSggJG9wdHMtPnsgJG9wdCB9ICk7ICAgICAgICMgQW5kIGRlbGV0ZSBvcmlnaW5hbCBvcHRpb24uCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJG9wdAorICAgIGlmICggJWJhZCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiAlYmFkIHNldCBpcyBub3QgZW1wdHkuLi4KKyAgICAgICAgbXkgQGNhbGxlciA9IGNhbGxlciggMSApOyAgICAgICAgICAgICMgSXNzdWUgYSB3YXJuaW5nLgorICAgICAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gMjsKKyAgICAgICAgQ2FycDo6Y2x1Y2soICRjYWxsZXJbIDMgXSAuICI6ICIgLiAkbXNnIC4gIjogIiAuIGpvaW4oICIsICIsIHNvcnQoIGtleXMoICViYWQgKSApICkgKTsKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gMTsKKworfTsgIyBzdWIgY2hlY2tfb3B0cworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHVycG9zZToKKyMgICAgIENoZWNrIHN1YnJvdXRpbmUgYXJndW1lbnRzLgorIyBTeW5vcHNpczoKKyMgICAgIG15ICVvcHRzID0gdmFsaWRhdGUoIHBhcmFtcyA9PiBcQF8sIHNwZWMgPT4geyAuLi4gfSwgY2FsbGVyID0+IG4gKTsKKyMgQXJndW1lbnRzOgorIyAgICAgcGFyYW1zIC0tIEEgcmVmZXJlbmNlIHRvIHN1YnJvdXRpbmUncyBhY3R1YWwgYXJndW1lbnRzLgorIyAgICAgc3BlYyAgIC0tIFNwZWNpZmljYXRpb24gb2YgZXhwZWN0ZWQgYXJndW1lbnRzLgorIyAgICAgY2FsbGVyIC0tIC4uLgorIyBSZXR1cm4gdmFsdWU6CisjICAgICBBIGhhc2ggb2YgdmFsaWRhdGVkIG9wdGlvbnMuCisjIERlc2NyaXB0aW9uOgorIyAgICAgSSB3b3VsZCBsaWtlIHRvIHVzZSBQYXJhbXM6OlZhbGlkYXRlIG1vZHVsZSwgYnV0IGl0IGlzIG5vdCBhIHBhcnQgb2YgZGVmYXVsdCBQZXJsCisjICAgICBkaXN0cmlidXRpb24sIHNvIEkgY2Fubm90IHJlbHkgb24gaXQuIFRoaXMgc3Vicm91dGluZSByZXNlbWJsZXMgdG8gc29tZSBleHRlbnQgdG8KKyMgICAgIFBhcmFtczo6VmFsaWRhdGU6OnZhbGlkYXRlX3dpdGgoKS4KKyMgICAgIFNwZWNpZmljYXRpb24gb2YgZXhwZWN0ZWQgYXJndW1lbnRzOgorIyAgICAgICAgeyAkb3B0ID0+IHsgdHlwZSA9PiAkdHlwZSwgZGVmYXVsdCA9PiAkZGVmYXVsdCB9LCAuLi4gfQorIyAgICAgICAgJG9wdCAgICAgLS0gU3RyaW5nLCBvcHRpb24gbmFtZS4KKyMgICAgICAgICR0eXBlICAgIC0tIFN0cmluZywgZXhwZWN0ZWQgdHlwZShzKS4gQWxsb3dlZCB2YWx1ZXMgYXJlICJTQ0FMQVIiLCAiVU5ERUYiLCAiQk9PTEVBTiIsCisjICAgICAgICAgICAgICAgICAgICAiQVJSQVlSRUYiLCAiSEFTSFJFRiIsICJDT0RFUkVGIi4gTXVsdGlwbGUgdHlwZXMgbWF5IGxpc3RlZCB1c2luZyBiYXI6CisjICAgICAgICAgICAgICAgICAgICAiU0NBTEFSfEFSUkFZUkVGIi4gVGhlIHR5cGUgc3RyaW5nIGlzIGNhc2UtaW5zZW5zaXRpdmUuCisjICAgICAgICAkZGVmYXVsdCAtLSBEZWZhdWx0IHZhbHVlIGZvciBhbiBvcHRpb24uIFdpbGwgYmUgdXNlZCBpZiBvcHRpb24gaXMgbm90IHNwZWNpZmllZCBvcgorIyAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLgorIworc3ViIHZhbGlkYXRlKEApIHsKKworICAgIG15ICVvcHRzID0gQF87ICAgICMgVGVtcG9yYXJ5IHVzZSAlb3B0cyBmb3IgcGFyYW1ldGVycyBvZiBgdmFsaWRhdGUnIHN1YnJvdXRpbmUuCisgICAgbXkgJHBhcmFtcyA9ICRvcHRzeyBwYXJhbXMgfTsKKyAgICBteSAkY2FsbGVyID0gKCAkb3B0c3sgY2FsbGVyIH0gb3IgMCApICsgMTsKKyAgICBteSAkc3BlYyAgID0gJG9wdHN7IHNwZWMgfTsKKyAgICB1bmRlZiggJW9wdHMgKTsgICAjIE9rLCBDbGVhbiAlb3B0cywgbm93IHdlIHdpbGwgY29sbGVjdCByZXN1bHQgb2YgdGhlIHN1YnJvdXRpbmUuCisKKyAgICAjIEZpbmQgb3V0IGNhbGxlciBwYWNrYWdlLCBmaWxlbmFtZSwgbGluZSwgYW5kIHN1YnJvdXRpbmUgbmFtZS4KKyAgICBteSAoICRwa2csICRmaWxlLCAkbGluZSwgJHN1YnIgKSA9IGNhbGxlciggJGNhbGxlciApOworICAgIG15IEBlcnJvcnM7ICAgICMgV2Ugd2lsbCBjb2xsZWN0IGVycm9ycyBpbiBhcnJheSBub3QgdG8gc3RvcCBvbiB0aGUgZmlyc3QgZm91bmQgZXJyb3IuCisgICAgbXkgJGVycm9yID0KKyAgICAgICAgc3ViICgkKSB7CisgICAgICAgICAgICBteSAkbXNnID0gc2hpZnQoIEBfICk7CisgICAgICAgICAgICBwdXNoKCBAZXJyb3JzLCAiJG1zZyBhdCAkZmlsZSBsaW5lICRsaW5lLlxuIiApOworICAgICAgICB9OyAjIHN1YgorCisgICAgIyBDaGVjayBvcHRpb25zLgorICAgIHdoaWxlICggQCRwYXJhbXMgKSB7CisgICAgICAgICMgQ2hlY2sgb3B0aW9uIG5hbWUuCisgICAgICAgIG15ICRvcHQgPSBzaGlmdCggQCRwYXJhbXMgKTsKKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkc3BlYy0+eyAkb3B0IH0gKSApIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAiSW52YWxpZCBvcHRpb24gYCRvcHQnIiApOworICAgICAgICAgICAgc2hpZnQoIEAkcGFyYW1zICk7ICMgU2tpcCB2YWx1ZSBvZiB1bmtub3cgb3B0aW9uLgorICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIENoZWNrIG9wdGlvbiB2YWx1ZSBleGlzdHMuCisgICAgICAgIGlmICggbm90IEAkcGFyYW1zICkgeworICAgICAgICAgICAgJGVycm9yLT4oICJPcHRpb24gYCRvcHQnIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSIgKTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgJHZhbCA9IHNoaWZ0KCBAJHBhcmFtcyApOworICAgICAgICAjIENoZWNrIG9wdGlvbiB2YWx1ZSB0eXBlLgorICAgICAgICBpZiAoIGV4aXN0cyggJHNwZWMtPnsgJG9wdCB9LT57IHR5cGUgfSApICkgeworICAgICAgICAgICAgIyBUeXBlIHNwZWNpZmljYXRpb24gZXhpc3RzLiBDaGVjayBvcHRpb24gdmFsdWUgdHlwZS4KKyAgICAgICAgICAgIG15ICRhY3R1YWxfdHlwZTsKKyAgICAgICAgICAgIGlmICggcmVmKCAkdmFsICkgbmUgIiIgKSB7CisgICAgICAgICAgICAgICAgJGFjdHVhbF90eXBlID0gcmVmKCAkdmFsICkgLiAiUkVGIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGFjdHVhbF90eXBlID0gKCBkZWZpbmVkKCAkdmFsICkgPyAiU0NBTEFSIiA6ICJVTkRFRiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIG15IEB3YW50ZWRfdHlwZXMgPSBzcGxpdCggbXtcfH0sIGxjKCAkc3BlYy0+eyAkb3B0IH0tPnsgdHlwZSB9ICkgKTsKKyAgICAgICAgICAgIG15ICR3YW50ZWRfdHlwZXMgPSBqb2luKCAifCIsIG1hcCggJF8gZXEgImJvb2xlYW4iID8gInNjYWxhcnx1bmRlZiIgOiBxdW90ZW1ldGEoICRfICksIEB3YW50ZWRfdHlwZXMgKSApOworICAgICAgICAgICAgaWYgKCAkYWN0dWFsX3R5cGUgIX4gbXtcQSg/OiR3YW50ZWRfdHlwZXMpXHp9aSApIHsKKyAgICAgICAgICAgICAgICAkYWN0dWFsX3R5cGUgPSBsYyggJGFjdHVhbF90eXBlICk7CisgICAgICAgICAgICAgICAgJHdhbnRlZF90eXBlcyA9IGxjKCBqb2luKCAiIG9yICIsIG1hcCggImAkXyciLCBAd2FudGVkX3R5cGVzICkgKSApOworICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3B0aW9uIGAkb3B0JyB2YWx1ZSB0eXBlIGlzIGAkYWN0dWFsX3R5cGUnIGJ1dCBleHBlY3RlZCB0byBiZSAkd2FudGVkX3R5cGVzIiApOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBleGlzdHMoICRzcGVjLT57ICRvcHQgfS0+eyB2YWx1ZXMgfSApICApIHsKKyAgICAgICAgICAgIG15ICR2YWx1ZXMgPSAkc3BlYy0+eyAkb3B0IH0tPnsgdmFsdWVzIH07CisgICAgICAgICAgICBpZiAoIG5vdCBncmVwKCAkXyBlcSAkdmFsLCBAJHZhbHVlcyApICkgeworICAgICAgICAgICAgICAgICR2YWx1ZXMgPSBqb2luKCAiLCAiLCBtYXAoICJgJF8nIiwgQCR2YWx1ZXMgKSApOworICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3B0aW9uIGAkb3B0JyB2YWx1ZSBpcyBgJHZhbCcgYnV0IGV4cGVjdGVkIHRvIGJlIG9uZSBvZiAkdmFsdWVzIiApOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJG9wdHN7ICRvcHQgfSA9ICR2YWw7CisgICAgfTsgIyB3aGlsZQorCisgICAgIyBBc3NpZ24gZGVmYXVsdCB2YWx1ZXMuCisgICAgZm9yZWFjaCBteSAkb3B0ICgga2V5cyggJSRzcGVjICkgKSB7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRvcHRzeyAkb3B0IH0gKSBhbmQgZXhpc3RzKCAkc3BlYy0+eyAkb3B0IH0tPnsgZGVmYXVsdCB9ICkgKSB7CisgICAgICAgICAgICAkb3B0c3sgJG9wdCB9ID0gJHNwZWMtPnsgJG9wdCB9LT57IGRlZmF1bHQgfTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkb3B0CisKKyAgICAjIElmIHdlIGZvdW5kIGFueSBlcnJvcnMsIHJhaXNlIHRoZW0uCisgICAgaWYgKCBAZXJyb3JzICkgeworICAgICAgICBkaWUgam9pbiggIiIsIEBlcnJvcnMgKTsKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gJW9wdHM7CisKK307ICMgc3ViIHZhbGlkYXRlCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBHZXQgb3B0aW9uIGhlbHBlcnMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPWhlYWQyIEdldCBvcHRpb24gaGVscGVycy4KKworPWN1dAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIGdldF9vcHRpb25zCisKK0I8U3lub3BzaXM6PgorCisgICAgZ2V0X29wdGlvbnMoIEBhcmd1bWVudHMgKQorCitCPERlc2NyaXB0aW9uOj4KKworSXQgaXMgdmVyeSBzaW1wbGUgd3JhcHBlciBhcm91bmYgR2V0b3B0OjpMb25nOjpHZXRPcHRpb25zLiBJdCBwYXNzZXMgYWxsIGFyZ3VtZW50cyB0byBHZXRPcHRpb25zLAorYW5kIGFkZCBkZWZpbml0aW9ucyBmb3Igc3RhbmRhcmQgaGVscCBvcHRpb25zOiAtLWhlbHAsIC0tZG9jLCAtLXZlcmJvc2UsIGFuZCAtLXF1aWV0LgorV2hlbiBHZXRPcHRpb25zIGZpbmloZXMsIHRoaXMgc3Vicm91dGluZSBjaGVja3MgZXhpdCBjb2RlLCBpZiBpdCBpcyBub24temVybywgc3RhbmRhcmQgZXJyb3IKK21lc3NhZ2UgaXMgaXNzdWVkIGFuZCBzY3JpcHQgdGVybWluYXRlZC4KKworSWYgLS12ZXJib3NlIG9yIC0tcXVpZXQgb3B0aW9uIGlzIHNwZWNpZmllZCwgQzx0b29scy5wbV92ZXJib3NlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuCitJdCBpcyB0aGUgd2F5IHRvIHByb3BhZ2F0ZSB2ZXJib3NlL3F1aWV0IG1vZGUgdG8gY2FsbGVlIFBlcmwgc2NyaXB0cy4KKworPWN1dAorCitzdWIgZ2V0X29wdGlvbnMgeworCisgICAgR2V0b3B0OjpMb25nOjpDb25maWd1cmUoICJub19pZ25vcmVfY2FzZSIgKTsKKyAgICBHZXRvcHQ6Okxvbmc6OkdldE9wdGlvbnMoCisgICAgICAgICJoMHx1c2FnZSIgICAgICAgID0+IHN1YiB7IFBvZDo6VXNhZ2U6OnBvZDJ1c2FnZSggLWV4aXR2YWwgPT4gMCwgLXZlcmJvc2UgPT4gMCApOyB9LAorICAgICAgICAiaDF8aHxoZWxwIiAgICAgICA9PiBzdWIgeyBQb2Q6OlVzYWdlOjpwb2QydXNhZ2UoIC1leGl0dmFsID0+IDAsIC12ZXJib3NlID0+IDEgKTsgfSwKKyAgICAgICAgImgyfGRvY3xtYW51YWwiICAgPT4gc3ViIHsgUG9kOjpVc2FnZTo6cG9kMnVzYWdlKCAtZXhpdHZhbCA9PiAwLCAtdmVyYm9zZSA9PiAyICk7IH0sCisgICAgICAgICJ2ZXJzaW9uIiAgICAgICAgID0+IHN1YiB7IHByaW50KCAiJHRvb2wgdmVyc2lvbiAkbWFpbjo6VkVSU0lPTlxuIiApOyBleGl0KCAwICk7IH0sCisgICAgICAgICJ2fHZlcmJvc2UiICAgICAgID0+IHN1YiB7ICsrICR2ZXJib3NlOyAgICAgJEVOVnsgInRvb2xzLnBtX3ZlcmJvc2UiICAgIH0gPSAkdmVyYm9zZTsgICAgfSwKKyAgICAgICAgInF1aWV0IiAgICAgICAgICAgPT4gc3ViIHsgLS0gJHZlcmJvc2U7ICAgICAkRU5WeyAidG9vbHMucG1fdmVyYm9zZSIgICAgfSA9ICR2ZXJib3NlOyAgICB9LAorICAgICAgICAid2l0aC10aW1lc3RhbXBzIiA9PiBzdWIgeyAkdGltZXN0YW1wcyA9IDE7ICRFTlZ7ICJ0b29scy5wbV90aW1lc3RhbXBzIiB9ID0gJHRpbWVzdGFtcHM7IH0sCisgICAgICAgIEBfLCAjIENhbGxlciBhcmd1bWV0c2EgYXJlIGF0IHRoZSBlbmQgc28gY2FsbGVyIG9wdGlvbnMgb3ZlcnJpZGVzIHN0YW5kYXJkLgorICAgICkgb3IgY21kbGluZV9lcnJvcigpOworCit9OyAjIHN1YiBnZXRfb3B0aW9ucworCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBQcmludCB1dGlsaXRpZXMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPXBvZAorCis9aGVhZDIgUHJpbnQgdXRpbGl0aWVzLgorCitFYWNoIG9mIHRoZSBwcmludCBzdWJyb3V0aW5lcyBwcmVwZW5kcyBlYWNoIGxpbmUgb2YgaXRzIG91dHB1dCB3aXRoIHRoZSBuYW1lIG9mIGN1cnJlbnQgc2NyaXB0IGFuZAordGhlIHR5cGUgb2YgaW5mb3JtYXRpb24sIGZvciBleGFtcGxlOgorCisgICAgaW5mbyggIldyaXRpbmcgZmlsZS4uLiIgKTsKKword2lsbCBwcmludAorCisgICAgPHNjcmlwdD46IChpKTogV3JpdGluZyBmaWxlLi4uCisKK3doaWxlCisKKyAgICB3YXJuaW5nKCAiRmlsZSBkb2VzIG5vdCBleGlzdCEiICk7CisKK3dpbGwgcHJpbnQKKworICAgIDxzY3JpcHQ+OiAoISk6IEZpbGUgZG9lcyBub3QgZXhpc3QhCisKK0hlcmUgYXJlIGV4cG9ydGVkIGl0ZW1zOgorCis9Y3V0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgX2Zvcm1hdF9tZXNzYWdlKCRcQDskKSB7CisKKyAgICBteSAkcHJlZml4ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRhcmdzICAgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJG5vX2VvbCAgPSBzaGlmdCggQF8gKTsgICMgRG8gbm90IGFwcGVuZCAiXG4iIHRvIHRoZSBsYXN0IGxpbmUuCisgICAgbXkgJG1lc3NhZ2UgPSAiIjsKKworICAgIG15ICR0cyA9ICIiOworICAgIGlmICggJHRpbWVzdGFtcHMgKSB7CisgICAgICAgIG15ICggJHNlYywgJG1pbiwgJGhvdXIsICRkYXksICRtb250aCwgJHllYXIgKSA9IGdtdGltZSgpOworICAgICAgICAkbW9udGggKz0gMTsKKyAgICAgICAgJHllYXIgICs9IDE5MDA7CisgICAgICAgICR0cyA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCBVVEM6ICIsICR5ZWFyLCAkbW9udGgsICRkYXksICRob3VyLCAkbWluLCAkc2VjICk7CisgICAgfTsgIyBpZgorICAgIGZvciBteSAkaSAoIDEgLi4gQCRhcmdzICkgeworICAgICAgICBteSBAbGluZXMgPSBzcGxpdCggIlxuIiwgJGFyZ3MtPlsgJGkgLSAxIF0gKTsKKyAgICAgICAgZm9yIG15ICRqICggMSAuLiBAbGluZXMgKSB7CisgICAgICAgICAgICBteSAkbGluZSA9ICRsaW5lc1sgJGogLSAxIF07CisgICAgICAgICAgICBteSAkbGFzdF9saW5lID0gKCAoICRpID09IEAkYXJncyApIGFuZCAoICRqID09IEBsaW5lcyApICk7CisgICAgICAgICAgICBteSAkZW9sID0gKCAoIHN1YnN0ciggJGxpbmUsIC0xICkgZXEgIlxuIiApIG9yIGRlZmluZWQoICRub19lb2wgKSA/ICIiIDogIlxuIiApOworICAgICAgICAgICAgJG1lc3NhZ2UgLj0gIiR0cyR0b29sOiAoJHByZWZpeCkgIiAuICRsaW5lIC4gJGVvbDsKKyAgICAgICAgfTsgIyBmb3JlYWNoICRqCisgICAgfTsgIyBmb3JlYWNoICRpCisgICAgcmV0dXJuICRtZXNzYWdlOworCit9OyAjIHN1YiBfZm9ybWF0X21lc3NhZ2UKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1wb2QKKworPWhlYWQzICR2ZXJib3NlCisKK0I8U3lub3BzaXM6PgorCisgICAgJHZlcmJvc2UKKworQjxEZXNjcmlwdGlvbjo+CisKK1BhY2thZ2UgdmFyaWFibGUuIEl0IGRldGVybWluZXMgdmVyYm9zaXR5IGxldmVsLCB3aGljaCBhZmZlY3RzIEM8d2FybmluZygpPiwgQzxpbmZvKCk+LCBhbmQKK0M8ZGVidWcoKT4gc3Vicm91dG5lcyAuCisKK1RoZSB2YXJpYWJsZSBnZXRzIGluaXRpYWwgdmFsdWUgZnJvbSBDPHRvb2xzLnBtX3ZlcmJvc2U+IGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGlzIGV4aXN0cy4KK0lmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgdmFyaWFibGUgaXMgc2V0IHRvIDIuCisKK0luaXRpYWwgdmFsdWUgbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIgZGlyZWN0bHkgb3IgYnkgQzxnZXRfb3B0aW9ucz4gZnVuY3Rpb24uCisKKz1jdXQKKworJHZlcmJvc2UgPSBleGlzdHMoICRFTlZ7ICJ0b29scy5wbV92ZXJib3NlIiB9ICkgPyAkRU5WeyAidG9vbHMucG1fdmVyYm9zZSIgfSA6IDI7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9cG9kCisKKz1oZWFkMyAkdGltZXN0YW1wcworCitCPFN5bm9wc2lzOj4KKworICAgICR0aW1lc3RhbXBzCisKK0I8RGVzY3JpcHRpb246PgorCitQYWNrYWdlIHZhcmlhYmxlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgQzxkZWJ1ZygpPiwgQzxpbmZvKCk+LCBDPHdhcm5pbmcoKT4sIEM8cnVudGltZV9lcnJvcigpPgorc3Vicm91dG5lcyBwcmludCB0aW1lc3RhbXBzIG9yIG5vdC4KKworVGhlIHZhcmlhYmxlIGdldHMgaW5pdGlhbCB2YWx1ZSBmcm9tIEM8dG9vbHMucG1fdGltZXN0YW1wcz4gZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgaXMgZXhpc3RzLgorSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCB2YXJpYWJsZSBpcyBzZXQgdG8gZmFsc2UuCisKK0luaXRpYWwgdmFsdWUgbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIgZGlyZWN0bHkgb3IgYnkgQzxnZXRfb3B0aW9ucygpPiBmdW5jdGlvbi4KKworPWN1dAorCiskdGltZXN0YW1wcyA9IGV4aXN0cyggJEVOVnsgInRvb2xzLnBtX3RpbWVzdGFtcHMiIH0gKSA/ICRFTlZ7ICJ0b29scy5wbV90aW1lc3RhbXBzIiB9IDogMDsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1wb2QKKworPWhlYWQzIGRlYnVnCisKK0I8U3lub3BzaXM6PgorCisgICAgZGVidWcoIEBtZXNzYWdlcyApCisKK0I8RGVzY3JpcHRpb246PgorCitJZiB2ZXJib3NpdHkgbGV2ZWwgaXMgMyBvciBoaWdoZXIsIHByaW50IGRlYnVnIGluZm9ybWF0aW9uIHRvIHRoZSBzdGRlcnIsIHByZXBlbmRpbmcgaXQgd2l0aCAiKCMpIgorcHJlZml4LgorCis9Y3V0CisKK3N1YiBkZWJ1ZyhAKSB7CisKKyAgICBpZiAoICR2ZXJib3NlID49IDMgKSB7CisgICAgICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAgICAgU1RERVJSLT5wcmludCggX2Zvcm1hdF9tZXNzYWdlKCAiIyIsIEBfICkgKTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuIDE7CisKK307ICMgc3ViIGRlYnVnCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9cG9kCisKKz1oZWFkMyBpbmZvCisKK0I8U3lub3BzaXM6PgorCisgICAgaW5mbyggQG1lc3NhZ2VzICkKKworQjxEZXNjcmlwdGlvbjo+CisKK0lmIHZlcmJvc2l0eSBsZXZlbCBpcyAyIG9yIGhpZ2hlciwgcHJpbnQgaW5mb3JtYXRpb24gdG8gdGhlIHN0ZGVyciwgcHJlcGVuZGluZyBpdCB3aXRoICIoaSkiIHByZWZpeC4KKworPWN1dAorCitzdWIgaW5mbyhAKSB7CisKKyAgICBpZiAoICR2ZXJib3NlID49IDIgKSB7CisgICAgICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAgICAgU1RERVJSLT5wcmludCggX2Zvcm1hdF9tZXNzYWdlKCAiaSIsIEBfICApICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBpbmZvCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgd2FybmluZworCitCPFN5bm9wc2lzOj4KKworICAgIHdhcm5pbmcoIEBtZXNzYWdlcyApCisKK0I8RGVzY3JpcHRpb246PgorCitJZiB2ZXJib3NpdHkgbGV2ZWwgaXMgMSBvciBoaWdoZXIsIGlzc3VlIGEgd2FybmluZywgcHJlcGVuZGluZyBpdCB3aXRoICIoISkiIHByZWZpeC4KKworPWN1dAorCitzdWIgd2FybmluZyhAKSB7CisKKyAgICBpZiAoICR2ZXJib3NlID49IDEgKSB7CisgICAgICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAgICAgd2FybiggX2Zvcm1hdF9tZXNzYWdlKCAiISIsIEBfICApICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiB3YXJuaW5nCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgY21kbGluZV9lcnJvcgorCitCPFN5bm9wc2lzOj4KKworICAgIGNtZGxpbmVfZXJyb3IoIEBtZXNzYWdlICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1ByaW50IGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBzdGF0dXMgMi4KKworVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBjb21wbGFpbiBvbiBjb21tYW5kIGxpbmUgZXJyb3JzLCBlLiBnLiB1bmtub3duCitvcHRpb25zLCBpbnZhbGlkIGFyZ3VtZW50cywgZXRjLgorCis9Y3V0CisKK3N1YiBjbWRsaW5lX2Vycm9yKDskKSB7CisKKyAgICBteSAkbWVzc2FnZSA9IHNoaWZ0KCBAXyApOworCisgICAgaWYgKCBkZWZpbmVkKCAkbWVzc2FnZSApICkgeworICAgICAgICBpZiAoIHN1YnN0ciggJG1lc3NhZ2UsIC0xLCAxICkgbmUgIlxuIiApIHsKKyAgICAgICAgICAgICRtZXNzYWdlIC49ICJcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICAkbWVzc2FnZSA9ICIiOworICAgIH07ICMgaWYKKyAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgZGllICRtZXNzYWdlIC4gIlRyeSAtLWhlbHAgb3B0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIjsKKworfTsgIyBzdWIgY21kbGluZV9lcnJvcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHJ1bnRpbWVfZXJyb3IKKworQjxTeW5vcHNpczo+CisKKyAgICBydW50aW1lX2Vycm9yKCBAbWVzc2FnZSApCisKK0I8RGVzY3JpcHRpb246PgorCitQcmludCBlcnJvciBtZXNzYWdlIGFuZCBleGl0cyB0aGUgcHJvZ3JhbSB3aXRoIHN0YXR1cyAzLgorCitUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGNvbXBsYWluIG9uIHJ1bnRpbWUgZXJyb3JzLCBlLiBnLgorZGlyZWN0b3JpZXMgd2hpY2ggYXJlIG5vdCBmb3VuZCwgbm9uLXdyaXRhYmxlIGZpbGVzLCBldGMuCisKKz1jdXQKKworc3ViIHJ1bnRpbWVfZXJyb3IoQCkgeworCisgICAgU1RET1VULT5mbHVzaCgpOworICAgIGRpZSBfZm9ybWF0X21lc3NhZ2UoICJ4IiwgQF8gKTsKKworfTsgIyBzdWIgcnVudGltZV9lcnJvcgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHF1ZXN0aW9uCisKK0I8U3lub3BzaXM6PgorCisgICAgcXVlc3Rpb24oICRwcm9tcHQ7ICRhbnN3ZXIsICRjaG9pY2VzICApCisKK0I8RGVzY3JpcHRpb246PgorCitQcmludCAkcHJvbXAgdG8gdGhlIHN0ZGVyciwgcHJlcGVuZGluZyBpdCB3aXRoICJxdWVzdGlvbjoiIHByZWZpeC4gUmVhZCBhIGxpbmUgZnJvbSBzdGRpbiwgY2hvcAorIlxuIiBmcm9tIHRoZSBlbmQsIGl0IGlzIGFuc3dlci4KKworSWYgJGFuc3dlciBpcyBkZWZpbmVkLCBpdCBpcyB0cmVhdGVkIGFzIGZpcnN0IHVzZXIgaW5wdXQuCisKK0lmICRjaG9pY2VzIGlzIHNwZWNpZmllZCwgaXQgY291bGQgYmUgYSByZWdleHAgZm9yIHZhbGlkYXRpbmcgdXNlciBpbnB1dCwgb3IgYSBzdHJpbmcuIEluIGxhdHRlcgorY2FzZSBpdCBpbnRlcnByZXRlZCBhcyBsaXN0IG9mIGNoYXJhY3RlcnMsIGFjY2VwdGFibGUgKGNhc2UtaW5zZW5zaXRpdmUpIGNob2ljZXMuIElmIHVzZXIgZW50ZXJzCitub24tYWNjZXB0YWJsZSBhbnN3ZXIsIHF1ZXN0aW9uIGNvbnRpbnVlIGFza2luZyB1bnRpbCBhbnN3ZXIgaXMgYWNjZXB0YWJsZS4KK0lmICRjaG9pY2VzIGlzIG5vdCBzcGVjaWZpZWQsIGFueSBhbnN3ZXIgaXMgYWNjZXB0YWJsZS4KKworSW4gY2FzZSBvZiBlbmQtb2YtZmlsZSAob3IgQ3RybCtEIHByZXNzZWQgYnkgdXNlciksICRhbnN3ZXIgaXMgQzx1bmRlZj4uCisKK0I8RXhhbXBsZXM6PgorCisgICAgbXkgJGFuc3dlcjsKKyAgICBxdWVzdGlvbiggIlNhdmUgZmlsZSBbeW5dPyAiLCAkYW5zd2VyLCAieW4iICk7CisgICAgICAgICMgV2UgYWNjZXB0cyBvbmx5ICJ5IiwgIlkiLCAibiIsIG9yICJOIi4KKyAgICBxdWVzdGlvbiggIlByZXNzIGVudGVyIHRvIGNvbnRpbnVlIG9yIEN0cmwrQyB0byBhYm9ydC4uLiIgKTsKKyAgICAgICAgIyBXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gYW5zd2VyIHZhbHVlIC0tIGluIGNhc2Ugb2YgQ3RybCtDIHRoZSBzY3JpcHQgd2lsbCBiZSB0ZXJtaW5hdGVkLAorICAgICAgICAjIG90aGVyd2lzZSB3ZSBjb250aW51ZSBleGVjdXRpb24uCisgICAgcXVlc3Rpb24oICJGaWxlIG5hbWU/ICIsICRhbnN3ZXIgKTsKKyAgICAgICAgIyBBbnkgYW5zd2VyIGlzIGFjY2VwdGFibGUuCisKKz1jdXQKKworc3ViIHF1ZXN0aW9uKCQ7XCQkKSB7CisKKyAgICBteSAkcHJvbXB0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRhbnN3ZXIgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGNob2ljZXMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkYSAgICAgICA9ICggZGVmaW5lZCggJGFuc3dlciApID8gJCRhbnN3ZXIgOiB1bmRlZiApOworCisgICAgaWYgKCByZWYoICRjaG9pY2VzICkgZXEgIlJlZ2V4cCIgKSB7CisgICAgICAgICMgSXQgaXMgYWxyZWFkeSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgZG8gbm90aGluZy4KKyAgICB9IGVsc2lmICggZGVmaW5lZCggJGNob2ljZXMgKSApIHsKKyAgICAgICAgIyBDb252ZXJ0IHN0cmluZyB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAgJGNob2ljZXMgPSBxci9bQHsgWyBxdW90ZW1ldGEoICRjaG9pY2VzICkgXSB9XS9pOworICAgIH07ICMgaWYKKworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgU1RERVJSLT5wcmludCggX2Zvcm1hdF9tZXNzYWdlKCAiPyIsIEB7IFsgJHByb21wdCBdIH0sICJub19lb2wiICkgKTsKKyAgICAgICAgU1RERVJSLT5mbHVzaCgpOworICAgICAgICBpZiAoIGRlZmluZWQoICRhICkgKSB7CisgICAgICAgICAgICBTVERPVVQtPnByaW50KCAkYSAuICJcbiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRhID0gPFNURElOPjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkYSApICkgeworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBjaG9tcCggJGEgKTsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGNob2ljZXMgKSBvciAoICRhID1+IG0vXiRjaG9pY2VzJC8gKSApIHsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGEgPSB1bmRlZjsKKyAgICB9OyAjIGZvcmV2ZXIKKyAgICBpZiAoIGRlZmluZWQoICRhbnN3ZXIgKSApIHsKKyAgICAgICAgJCRhbnN3ZXIgPSAkYTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHF1ZXN0aW9uCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFJldHVybnMgdm9sdW1lIHBhcnQgb2YgcGF0aC4KK3N1YiBnZXRfdm9sKCQpIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgKCAkdm9sLCB1bmRlZiwgdW5kZWYgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICByZXR1cm4gJHZvbDsKKworfTsgIyBzdWIgZ2V0X3ZvbAorCisjIFJldHVybnMgZGlyZWN0b3J5IHBhcnQgb2YgcGF0aC4KK3N1YiBnZXRfZGlyKCQpIHsKKworICAgIG15ICRwYXRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCBzaGlmdCggQF8gKSApOworICAgIG15ICggJHZvbCwgJGRpciwgdW5kZWYgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICBteSBAZGlycyA9IEZpbGU6OlNwZWMtPnNwbGl0ZGlyKCAkZGlyICk7CisgICAgcG9wKCBAZGlycyApOworICAgICRkaXIgPSBGaWxlOjpTcGVjLT5jYXRkaXIoIEBkaXJzICk7CisgICAgJGRpciA9IEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXIsIHVuZGVmICk7CisgICAgcmV0dXJuICRkaXI7CisKK307ICMgc3ViIGdldF9kaXIKKworIyBSZXR1cm5zIGZpbGUgcGFydCBvZiBwYXRoLgorc3ViIGdldF9maWxlKCQpIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgKCB1bmRlZiwgdW5kZWYsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgcmV0dXJuICRmaWxlOworCit9OyAjIHN1YiBnZXRfZmlsZQorCisjIFJldHVybnMgZmlsZSBwYXJ0IG9mIHBhdGggd2l0aG91dCBsYXN0IHN1ZmZpeC4KK3N1YiBnZXRfbmFtZSgkKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICggdW5kZWYsIHVuZGVmLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgICRmaWxlID1+IHN7XC5bXi5dKlx6fXt9OworICAgIHJldHVybiAkZmlsZTsKKworfTsgIyBzdWIgZ2V0X25hbWUKKworIyBSZXR1cm5zIGxhc3Qgc3VmZml4IG9mIGZpbGUgcGFydCBvZiBwYXRoLgorc3ViIGdldF9leHQoJCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAoIHVuZGVmLCB1bmRlZiwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICBteSAkZXh0ID0gIiI7CisgICAgaWYgKCAkZmlsZSA9fiBteyhcLlteLl0qKVx6fSApIHsKKyAgICAgICAgJGV4dCA9ICQxOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJGV4dDsKKworfTsgIyBzdWIgZ2V0X2V4dAorCitzdWIgY2F0X2ZpbGUoQCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZmlsZSA9IHBvcCggQF8gKTsKKyAgICBteSBAZGlycyA9IEBfOworCisgICAgbXkgKCAkdm9sLCAkZGlycyApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCwgIm5vX2ZpbGUiICk7CisgICAgQGRpcnMgPSAoIEZpbGU6OlNwZWMtPnNwbGl0ZGlyKCAkZGlycyApLCBAZGlycyApOworICAgICRkaXJzID0gRmlsZTo6U3BlYy0+Y2F0ZGlyKCBAZGlycyApOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpcnMsICRmaWxlICk7CisKKyAgICByZXR1cm4gJHBhdGg7CisKK307ICMgc3ViIGNhdF9maWxlCisKK3N1YiBjYXRfZGlyKEApIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgQGRpcnMgPSBAXzsKKworICAgIG15ICggJHZvbCwgJGRpcnMgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGgsICJub19maWxlIiApOworICAgIEBkaXJzID0gKCBGaWxlOjpTcGVjLT5zcGxpdGRpciggJGRpcnMgKSwgQGRpcnMgKTsKKyAgICAkZGlycyA9IEZpbGU6OlNwZWMtPmNhdGRpciggQGRpcnMgKTsKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXJzLCAiIiApOworCisgICAgcmV0dXJuICRwYXRoOworCit9OyAjIHN1YiBjYXRfZGlyCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBGaWxlIGFuZCBkaXJlY3RvcnkgbWFuaXB1bGF0aW9uIHN1YnJvdXRpbmVzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1oZWFkMiBGaWxlIGFuZCBkaXJlY3RvcnkgbWFuaXB1bGF0aW9uIHN1YnJvdXRpbmVzLgorCis9b3ZlcgorCis9Y3V0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPHdoaWNoKCAkZmlsZSwgQG9wdGlvbnMgKT4KKworU2VhcmNoZXMgZm9yIHNwZWNpZmllZCBleGVjdXRhYmxlIGZpbGUgaW4gdGhlIChzcGVjaWZpZWQpIGRpcmVjdG9yaWVzLgorUmFpc2VzIGEgcnVudGltZSBlcm9yb3IgaWYgbm8gZXhlY3V0YWJsZSBmaWxlIGZvdW5kLiBSZXR1cm5zIGEgZnVsbCBwYXRoIG9mIGZvdW5kIGV4ZWN1dGFibGUocykuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LWFsbD4gPUU8Z3Q+IEk8Ym9vbD4KKworRG8gbm90IHN0b3Agb24gdGhlIGZpcnN0IGZvdW5kIGZpbGUuIE5vdGUsIHRoYXQgbGlzdCBvZiBmdWxsIHBhdGhzIGlzIHJldHVybmVkIGluIHRoaXMgY2FzZS4KKworPWl0ZW0gQzwtZGlycz4gPUU8Z3Q+IEk8cmVmX3RvX2FycmF5PgorCitTcGVjaWZ5IGRpcmVjdG9yeSBsaXN0IHRvIHNlYXJjaCB0aHJvdWdoLiBJZiBvcHRpb24gaXMgbm90IHBhc3NlZCwgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZQoraXMgdXNlZCBmb3IgZGlyZWN0b3J5IGxpc3QuCisKKz1pdGVtIEM8LWV4ZWM+ID1FPGd0PiBJPGJvb2w+CisKK1doZXRoZXIgY2hlY2sgZm9yIGV4ZWN1dGFibGUgZmlsZXMgb3Igbm90LiBCeSBkZWZhdWx0LCBDPHdoaWNoPiBzZWFyY2hlcyBleGVjdXRhYmxlIGZpbGVzLgorSG93ZXZlciwgb24gQ3lnd2luIGV4ZWN1dGFibGUgY2hlY2sgbmV2ZXIgcGVyZm9ybWVkLgorCis9YmFjaworCitFeGFtcGxlczoKKworTG9vayBmb3IgImVjaG8iIGluIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4gUEFUSDoKKworICAgIG15ICRlY2hvID0gd2hpY2goICJlY2hvIiApOworCitMb29rIGZvciBhbGwgb2NjdXJlbnNlcyBvZiAiY3AiIGluIHRoZSBQQVRIOgorCisgICAgbXkgQGNwcyA9IHdoaWNoKCAiY3AiLCAtYWxsID0+IDEgKTsKKworTG9vayBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgImljYyIgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcmllczoKKworICAgIG15ICRpY2MgPSB3aGljaCggImljYyIsIC1kaXJzID0+IFsgIi4iLCAiL3Vzci9sb2NhbC9iaW4iLCAiL3Vzci9iaW4iLCAiL2JpbiIgXSApOworCitMb29rIGZvciB0aGUgdGhlIEM8b21wX2xpYi5mPiBmaWxlOgorCisgICAgbXkgQG9tcF9saWIgPSB3aGljaCggIm9tcF9saWIuZiIsIC1hbGwgPT4gMSwgLWV4ZWMgPT4gMCwgLWRpcnMgPT4gWyBAaW5jbHVkZSBdICk7CisKKz1jdXQKKworc3ViIHdoaWNoKCRAKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLWFsbCAtZGlycyAtZXhlYyApIF0gKTsKKyAgICBpZiAoICRvcHRzeyAtYWxsIH0gYW5kIG5vdCB3YW50YXJyYXkoKSApIHsKKyAgICAgICAgbG9jYWwgJENhcnA6OkNhcnBMZXZlbCA9IDE7CisgICAgICAgIENhcnA6OmNsdWNrKCAiYC1hbGwnIG9wdGlvbiBwYXNzZWQgdG8gYHdoaWNoJyBidXQgbGlzdCBpcyBub3QgZXhwZWN0ZWQiICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IGRlZmluZWQoICRvcHRzeyAtZXhlYyB9ICkgKSB7CisgICAgICAgICRvcHRzeyAtZXhlYyB9ID0gMTsKKyAgICB9OyAjIGlmCisKKyAgICBteSAkZGlycyA9ICggZXhpc3RzKCAkb3B0c3sgLWRpcnMgfSApID8gJG9wdHN7IC1kaXJzIH0gOiBbIEZpbGU6OlNwZWMtPnBhdGgoKSBdICk7CisgICAgbXkgQGZvdW5kOworCisgICAgbXkgQGV4dHMgPSAoICIiICk7CisgICAgaWYgKCAkXk8gZXEgIk1TV2luMzIiIGFuZCAkb3B0c3sgLWV4ZWMgfSApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkRU5WeyBQQVRIRVhUIH0gKSApIHsKKyAgICAgICAgICAgIHB1c2goIEBleHRzLCBzcGxpdCggIjsiLCAkRU5WeyBQQVRIRVhUIH0gKSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIyBJZiBQQVRIRVhUIGRvZXMgbm90IGV4aXN0LCB1c2UgZGVmYXVsdCB2YWx1ZS4KKyAgICAgICAgICAgIHB1c2goIEBleHRzLCBxd3sgLkNPTSAuRVhFIC5CQVQgLkNNRCB9ICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBsb29wOgorICAgIGZvcmVhY2ggbXkgJGRpciAoIEAkZGlycyApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkZXh0ICggQGV4dHMgKSB7CisgICAgICAgICAgICBteSAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoICRkaXIsICRmaWxlIC4gJGV4dCApOworICAgICAgICAgICAgaWYgKCAtZSAkcGF0aCApIHsKKyAgICAgICAgICAgICAgICAjIEV4ZWN1dGFibGUgYml0IGlzIG5vdCByZWxpYWJsZSBvbiBDeWd3aW4sIGRvIG5vdCBjaGVjayBpdC4KKyAgICAgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWV4ZWMgfSBvciAteCAkcGF0aCBvciAkXk8gZXEgImN5Z3dpbiIgKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2goIEBmb3VuZCwgJHBhdGggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1hbGwgfSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgbG9vcDsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoICRleHQKKyAgICB9OyAjIGZvcmVhY2ggJGRpcgorCisgICAgaWYgKCBub3QgQGZvdW5kICkgeworICAgICAgICAjIFRCRDogV2UgbmVlZCB0byBpbnRyb2R1Y2UgYW4gb3B0aW9uIGZvciBjb25kaXRpb25hbCBlbmFibGluZyB0aGlzIGVycm9yLgorICAgICAgICAjIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgZmluZCBcIiRmaWxlXCIgZXhlY3V0YWJsZSBmaWxlIGluIFBBVEguIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIEBmb3VuZCA+IDEgKSB7CisgICAgICAgICMgVEJEOiBJc3N1ZSBhIHdhcm5pbmc/CisgICAgfTsgIyBpZgorCisgICAgaWYgKCAkb3B0c3sgLWFsbCB9ICkgeworICAgICAgICByZXR1cm4gQGZvdW5kOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAkZm91bmRbIDAgXTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHdoaWNoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGFic19wYXRoKCAkcGF0aCwgJGJhc2UgKT4KKworUmV0dXJuIGFic29sdXRlIHBhdGggZm9yIGFuIGFyZ3VtZW50LgorCitNb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgYnkgQzxGaWxlOjpTcGVjLT5yZWwyYWJzKCk+LiBDPGFic19wYXRoKCk+IGFkZGl0aW9uYWxseSBjb2xsYXBzZXMKK0M8ZGlyMS8uLi9kaXIyPiB0byBDPGRpcjI+LgorCitJdCBpcyBub3Qgc28gbmFpdmUgYW5kIG1hZGUgaW50ZW50aW9uYWxseS4gRm9yIGV4YW1wbGUgb24gTGludXgqIE9TIGluIEJhc2ggaWYgRjxsaW5rLz4gaXMgYSBzeW1ib2xpYworbGluayB0byBkaXJlY3RvcnkgRjxzb21lX2Rpci8+CisKKyAgICAkIGNkIGxpbmsKKyAgICAkIGNkIC4uCisKK2JyaW5ncyB5b3UgYmFjayB0byBGPGxpbmsvPidzIHBhcmVudCwgbm90IHRvIHBhcmVudCBvZiBGPHNvbWVfZGlyLz4sCisKKz1jdXQKKworc3ViIGFic19wYXRoKCQ7JCkgeworCisgICAgbXkgKCAkcGF0aCwgJGJhc2UgKSA9IEBfOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+cmVsMmFicyggJHBhdGgsICggZGVmaW5lZCggJGJhc2UgKSA/ICRiYXNlIDogJEVOVnsgUFdEIH0gKSApOworICAgIG15ICggJHZvbCwgJGRpciwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICB3aGlsZSAoICRkaXIgPX4gc3svKD8hXC5cLilbXi9dKi9cLlwuKD86L3xceil9ey99ICkgeworICAgIH07ICMgd2hpbGUKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCggRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpciwgJGZpbGUgKSApOworICAgIHJldHVybiAkcGF0aDsKKworfTsgIyBzdWIgYWJzX3BhdGgKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8cmVsX3BhdGgoICRwYXRoLCAkYmFzZSApPgorCitSZXR1cm4gcmVsYXRpdmUgcGF0aCBmb3IgYW4gYXJndW1lbnQuCisKKz1jdXQKKworc3ViIHJlbF9wYXRoKCQ7JCkgeworCisgICAgbXkgKCAkcGF0aCwgJGJhc2UgKSA9IEBfOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+YWJzMnJlbCggYWJzX3BhdGgoICRwYXRoICksICRiYXNlICk7CisgICAgcmV0dXJuICRwYXRoOworCit9OyAjIHN1YiByZWxfcGF0aAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxyZWFsX3BhdGgoICRkaXIgKT4KKworUmV0dXJuIHJlYWwgYWJzb2x1dGUgcGF0aCBmb3IgYW4gYXJndW1lbnQuIEluIHRoZSByZXN1bHQgYWxsIHJlbGF0aXZlIGNvbXBvbmVudHMgKEY8Lj4gYW5kIEY8Li4+KQorYW5kIFU8c3ltYm9saWMgbGlua3MgYXJlIHJlc29sdmVkPi4KKworSW4gbW9zdCBjYXNlcyBpdCBpcyBub3Qgd2hhdCB5b3Ugd2FudC4gQ29uc2lkZXIgdXNpbmcgQzxhYnNfcGF0aD4gZmlyc3QuCisKK0M8YWJzX3BhdGg+IGZ1bmN0aW9uIGZyb20gQjxDd2Q+IG1vZHVsZSB3b3JrcyB3aXRoIGRpcmVjdG9yaWVzIG9ubHkuIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBmaWxlcworYXMgd2VsbC4gQnV0LCBpZiBmaWxlIGlzIGEgc3ltYm9saWMgbGluaywgZnVuY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSBpdCAoeWV0KS4KKworVGhlIGZ1bmN0aW9uIHVzZXMgQzxydW50aW1lX2Vycm9yPiB0byByYWlzZSBhbiBlcnJvciBpZiBzb21ldGhpbmcgd3JvbmcuCisKKz1jdXQKKworc3ViIHJlYWxfcGF0aCgkKSB7CisKKyAgICBteSAkb3JpZ19wYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgJHJlYWxfcGF0aDsKKyAgICBteSAkbWVzc2FnZSA9ICIiOworICAgIGlmICggbm90IC1lICRvcmlnX3BhdGggKSB7CisgICAgICAgICRtZXNzYWdlID0gIlwiJG9yaWdfcGF0aFwiIGRvZXMgbm90IGV4aXN0cyI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBDd2Q6OmFic19wYXRoIGRvZXMgbm90IHdvcmsgd2l0aCBmaWxlcywgc28gaW4gdGhpcyBjYXNlIHdlIHNob3VsZCBoYW5kbGUgZmlsZSBzZXBhcmF0ZWx5LgorICAgICAgICBteSAkZmlsZTsKKyAgICAgICAgaWYgKCBub3QgLWQgJG9yaWdfcGF0aCApIHsKKyAgICAgICAgICAgICggbXkgJHZvbCwgbXkgJGRpciwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggRmlsZTo6U3BlYy0+cmVsMmFicyggJG9yaWdfcGF0aCApICk7CisgICAgICAgICAgICAkb3JpZ19wYXRoID0gRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpciApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsICRTSUd7IF9fV0FSTl9fIH0gPSBzdWIgeyAkbWVzc2FnZSA9ICRfWyAwIF07IH07CisgICAgICAgICAgICAkcmVhbF9wYXRoID0gQ3dkOjphYnNfcGF0aCggJG9yaWdfcGF0aCApOworICAgICAgICB9OworICAgICAgICBpZiAoIGRlZmluZWQoICRmaWxlICkgKSB7CisgICAgICAgICAgICAkcmVhbF9wYXRoID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSggJHJlYWxfcGF0aCwgJGZpbGUgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkcmVhbF9wYXRoICkgb3IgJG1lc3NhZ2UgbmUgIiIgKSB7CisgICAgICAgICRtZXNzYWdlID1+IHMvXnN0YXRcKC4qXCk6ICguKilccythdCAuKj8gbGluZSBcZCtccypcei8kMS87CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgZmluZCByZWFsIHBhdGggZm9yIFwiJG9yaWdfcGF0aFwiIiAuICggJG1lc3NhZ2UgbmUgIiIgPyAiOiAkbWVzc2FnZSIgOiAiIiApICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkcmVhbF9wYXRoOworCit9OyAjIHN1YiByZWFsX3BhdGgKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8bWFrZV9kaXIoICRkaXIsIEBvcHRpb25zICk+CisKK01ha2UgYSBkaXJlY3RvcnkuCisKK1RoaXMgZnVuY3Rpb24gbWFrZXMgYSBkaXJlY3RvcnkuIElmIG5lY2Vzc2FyeSwgbW9yZSB0aGFuIG9uZSBsZXZlbCBjYW4gYmUgY3JlYXRlZC4KK0lmIGRpcmVjdG9yeSBleGlzdHMsIHdhcm5pbmcgaXNzdWVzICh0aGUgc2NyaXB0IGJlaGF2aW9yIGRlcGVuZHMgb24gdmFsdWUgb2YKK0M8LXdhcm5pbmdfbGV2ZWw+IG9wdGlvbikuIElmIGRpcmVjdG9yeSBjcmVhdGlvbiBmYWlscyBvciBDPCRkaXI+IGV4aXN0cyBidXQgaXQgaXMgbm90IGEKK2RpcmVjdG9yeSwgZXJyb3IgaXNzc3Vlcy4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtbW9kZT4KKworVGhlIG51bWVyaWMgbW9kZSBmb3IgbmV3IGRpcmVjdG9yaWVzLCAwNzUwIChyd3hyLXgtLS0pIGJ5IGRlZmF1bHQuCisKKz1iYWNrCisKKz1jdXQKKworc3ViIG1ha2VfZGlyKCRAKSB7CisKKyAgICBteSAkZGlyICAgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgICA9CisgICAgICAgIHZhbGlkYXRlKAorICAgICAgICAgICAgcGFyYW1zID0+IFxAXywKKyAgICAgICAgICAgIHNwZWMgPT4geworICAgICAgICAgICAgICAgIHBhcmVudHMgPT4geyB0eXBlID0+ICJib29sZWFuIiwgZGVmYXVsdCA9PiAxICAgIH0sCisgICAgICAgICAgICAgICAgbW9kZSAgICA9PiB7IHR5cGUgPT4gInNjYWxhciIsICBkZWZhdWx0ID0+IDA3NzcgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGRpclwiIjsKKworICAgIGlmICggLWUgJGRpciApIHsKKyAgICAgICAgaWYgKCAtZCAkZGlyICkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IGl0IGV4aXN0cywgYnV0IG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICBldmFsIHsKKyAgICAgICAgICAgIEZpbGU6OlBhdGg6Om1rcGF0aCggJGRpciwgMCwgJG9wdHN7IG1vZGUgfSApOworICAgICAgICB9OyAjIGV2YWwKKyAgICAgICAgaWYgKCAkQCApIHsKKyAgICAgICAgICAgICRAID1+IHN7XHMrYXQgKD86W2EtekEtWjAtOSAvXy5dKi8pP3Rvb2xzXC5wbSBsaW5lIFxkK1xzKn17fTsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiAkQCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCAtZCAkZGlyICkgeyAjIEp1c3QgaW4gY2FzZSwgY2hlY2sgaXQgb25lIG1vcmUgdGltZS4uLgorICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXguIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBtYWtlX2RpcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxjb3B5X2RpciggJHNyY19kaXIsICRkc3RfZGlyLCBAb3B0aW9ucyApPgorCitDb3B5IGRpcmVjdG9yeSByZWN1cnNpdmVseS4KKworVGhpcyBmdW5jdGlvbiBjb3BpZXMgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkuCitJZiBzb3VyY2UgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IG9yIG5vdCBhIGRpcmVjdG9yeSwgZXJyb3IgaXNzdWVzLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1vdmVyd3JpdGU+CisKK092ZXJ3cml0ZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGlmIGl0IGV4aXN0cy4KKworPWJhY2sKKworPWN1dAorCitzdWIgY29weV9kaXIoJCRAKSB7CisKKyAgICBteSAkc3JjICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkc3QgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBjb3B5IGRpcmVjdG9yeSBcIiRzcmNcIiB0byBcIiRkc3RcIiI7CisKKyAgICBpZiAoIG5vdCAtZSAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgZG9lcyBub3QgZXhpc3QuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZCAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAtZSAkZHN0ICkgeworICAgICAgICBpZiAoIC1kICRkc3QgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzeyAtb3ZlcndyaXRlIH0gKSB7CisgICAgICAgICAgICAgICAgZGVsX2RpciggJGRzdCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgYWxyZWFkeSBleGlzdHMuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKCBbICJjcCIsICItUiIsICRzcmMsICRkc3QgXSApOworCit9OyAjIHN1YiBjb3B5X2RpcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxtb3ZlX2RpciggJHNyY19kaXIsICRkc3RfZGlyLCBAb3B0aW9ucyApPgorCitNb3ZlIGRpcmVjdG9yeS4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtb3ZlcndyaXRlPgorCitPdmVyd3JpdGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBpZiBpdCBleGlzdHMuCisKKz1iYWNrCisKKz1jdXQKKworc3ViIG1vdmVfZGlyKCQkQCkgeworCisgICAgbXkgJHNyYyAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHN0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgY29weSBkaXJlY3RvcnkgXCIkc3JjXCIgdG8gXCIkZHN0XCIiOworCisgICAgaWYgKCBub3QgLWUgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGRvZXMgbm90IGV4aXN0LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggLWUgJGRzdCApIHsKKyAgICAgICAgaWYgKCAtZCAkZHN0ICkgeworICAgICAgICAgICAgaWYgKCAkb3B0c3sgLW92ZXJ3cml0ZSB9ICkgeworICAgICAgICAgICAgICAgIGRlbF9kaXIoICRkc3QgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgZXhlY3V0ZSggWyAibXYiLCAkc3JjLCAkZHN0IF0gKTsKKworfTsgIyBzdWIgbW92ZV9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y2xlYW5fZGlyKCAkZGlyLCBAb3B0aW9ucyApPgorCitDbGVhbiBhIGRpcmVjdG9yeTogZGVsZXRlIGFsbCB0aGUgZW50cmllcyAocmVjdXJzaXZlbHkpLCBidXQgbGVhdmUgdGhlIGRpcmVjdG9yeS4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtZm9yY2U+ID0+IGJvb2wKKworSWYgYSBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLCB0cnkgdG8gY2hhbmdlIHBlcm1pc3Npb25zIGZpcnN0LCB0aGVuIGNsZWFuIGl0LgorCis9aXRlbSBDPC1za2lwPiA9PiByZWdleHAKKworUmVnZXhwLiBJZiBhIGRpcmVjdG9yeSBlbnRyeSBtYWNoZWQgdGhlIHJlZ2V4cCwgaXQgaXMgc2tpcHBlZCwgbm90IGRlbGV0ZWQuIChBcyBhIHN1YnNlcXVlbmNlLAorYSBkaXJlY3RvcnkgY29udGFpbmluZyBza2lwcGVkIGVudHJpZXMgaXMgbm90IGRlbGV0ZWQuKQorCis9YmFjaworCis9Y3V0CisKK3N1YiBfY2xlYW5fZGlyKCQpOworCitzdWIgX2NsZWFuX2RpcigkKSB7CisgICAgb3VyICVfY2xlYW5fZGlyX29wdHM7CisgICAgbXkgKCAkZGlyICkgPSBAXzsKKyAgICBteSAkc2tpcCAgICA9ICRfY2xlYW5fZGlyX29wdHN7IHNraXAgfTsgICAgIyBSZWdleHAuCisgICAgbXkgJHNraXBwZWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIHNraXBwZWQgZmlsZXMuCisgICAgbXkgJHByZWZpeCAgPSAiQ2xlYW5pbmcgYCRkaXInIGZhaWxlZDoiOworICAgIG15IEBzdGF0ICAgID0gc3RhdCggJGRpciApOworICAgIG15ICRtb2RlICAgID0gJHN0YXRbIDIgXTsKKyAgICBpZiAoIG5vdCBAc3RhdCApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBzdGF0IGAkZGlyJzogJCEiICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kIF8gKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJJdCBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtdyBfICkgeyAgICAgICAgIyBEaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLgorICAgICAgICBpZiAoIG5vdCAtbyBfIG9yIG5vdCAkX2NsZWFuX2Rpcl9vcHRzeyBmb3JjZSB9ICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUuIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICMgRGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBidXQgbWluZS4gVHJ5IHRvIGNoYW5nZSBwZXJtaXNzaW9ucy4KKyAgICAgICAgY2htb2QoICRtb2RlIHwgU19JV1VTUiwgJGRpciApCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IG1ha2UgZGlyZWN0b3J5IHdyaXRhYmxlOiAkISIgKTsKKyAgICB9OyAjIGlmCisgICAgbXkgJGhhbmRsZSAgID0gSU86OkRpci0+bmV3KCAkZGlyICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCByZWFkIGRpcmVjdG9yeTogJCEiICk7CisgICAgbXkgQGVudHJpZXMgID0gRmlsZTo6U3BlYy0+bm9fdXB3YXJkcyggJGhhbmRsZS0+cmVhZCgpICk7CisgICAgJGhhbmRsZS0+Y2xvc2UoKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IHJlYWQgZGlyZWN0b3J5OiAkISIgKTsKKyAgICBmb3JlYWNoIG15ICRlbnRyeSAoIEBlbnRyaWVzICkgeworICAgICAgICBteSAkcGF0aCA9IGNhdF9maWxlKCAkZGlyLCAkZW50cnkgKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkc2tpcCApIGFuZCAkZW50cnkgPX4gJHNraXAgKSB7CisgICAgICAgICAgICArKyAkc2tpcHBlZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggLWwgJHBhdGggKSB7CisgICAgICAgICAgICAgICAgdW5saW5rKCAkcGF0aCApIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgZGVsZXRlIHN5bWxpbmsgYCRwYXRoJzogJCEiICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXQoICRwYXRoICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBzdGF0IGAkcGF0aCc6ICQhICIgKTsKKyAgICAgICAgICAgICAgICBpZiAoIC1mIF8gKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbF9maWxlKCAkcGF0aCApOworICAgICAgICAgICAgICAgIH0gZWxzaWYgKCAtZCBfICkgeworICAgICAgICAgICAgICAgICAgICBteSAkcmMgPSBfY2xlYW5fZGlyKCAkcGF0aCApOworICAgICAgICAgICAgICAgICAgICBpZiAoICRyYyA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcm1kaXIoICRwYXRoICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBkZWxldGUgZGlyZWN0b3J5IGAkcGF0aCc6ICQhIiApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgICRza2lwcGVkICs9ICRyYzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiYCRwYXRoJyBpcyBuZWl0aGVyIGEgZmlsZSBub3IgYSBkaXJlY3RvcnkuIiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaAorICAgIHJldHVybiAkc2tpcHBlZDsKK307ICMgc3ViIF9jbGVhbl9kaXIKKworCitzdWIgY2xlYW5fZGlyKCRAKSB7CisgICAgbXkgJGRpciAgPSBzaGlmdCggQF8gKTsKKyAgICBvdXIgJV9jbGVhbl9kaXJfb3B0czsKKyAgICBsb2NhbCAlX2NsZWFuX2Rpcl9vcHRzID0KKyAgICAgICAgdmFsaWRhdGUoCisgICAgICAgICAgICBwYXJhbXMgPT4gXEBfLAorICAgICAgICAgICAgc3BlYyA9PiB7CisgICAgICAgICAgICAgICAgc2tpcCAgPT4geyB0eXBlID0+ICJyZWdleHByZWYiIH0sCisgICAgICAgICAgICAgICAgZm9yY2UgPT4geyB0eXBlID0+ICJib29sZWFuIiAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICApOworICAgIG15ICRza2lwcGVkID0gX2NsZWFuX2RpciggJGRpciApOworICAgIHJldHVybiAkc2tpcHBlZDsKK307ICMgc3ViIGNsZWFuX2RpcgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGRlbF9kaXIoICRkaXIsIEBvcHRpb25zICk+CisKK0RlbGV0ZSBhIGRpcmVjdG9yeSByZWN1cnNpdmVseS4KKworVGhpcyBmdW5jdGlvbiBkZWxldGVzIGEgZGlyZWN0b3J5LiBJZiBkaXJlY3RvcnkgY2FuIG5vdCBiZSBkZWxldGVkIG9yIGl0IGlzIG5vdCBhIGRpcmVjdG9yeSwgZXJyb3IKK21lc3NhZ2UgaXNzdWVzIChhbmQgc2NyaXB0IGV4aXN0cykuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1iYWNrCisKKz1jdXQKKworc3ViIGRlbF9kaXIoJEApIHsKKworICAgIG15ICRkaXIgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkRlbGV0aW5nIGRpcmVjdG9yeSBcIiRkaXJcIiBmYWlsZWQiOworICAgIG91ciAlX2NsZWFuX2Rpcl9vcHRzOworICAgIGxvY2FsICVfY2xlYW5fZGlyX29wdHMgPQorICAgICAgICB2YWxpZGF0ZSgKKyAgICAgICAgICAgIHBhcmFtcyA9PiBcQF8sCisgICAgICAgICAgICBzcGVjID0+IHsKKyAgICAgICAgICAgICAgICBmb3JjZSA9PiB7IHR5cGUgPT4gImJvb2xlYW4iIH0sCisgICAgICAgICAgICB9LAorICAgICAgICApOworCisgICAgaWYgKCBub3QgLWUgJGRpciApIHsKKyAgICAgICAgIyBOb3RoaW5nIHRvIGRvLgorICAgICAgICByZXR1cm47CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kICRkaXIgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBpdCBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgIH07ICMgaWYKKyAgICBfY2xlYW5fZGlyKCAkZGlyICk7CisgICAgcm1kaXIoICRkaXIgKSBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeC4iICk7CisKK307ICMgc3ViIGRlbF9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y2hhbmdlX2RpciggJGRpciApPgorCitDaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkuCisKK0lmIGFueSBlcnJvciBvY2N1cnJlZCwgZXJyb3IgaXNzdWVzIGFuZCBzY3JpcHQgZXhpdHMuCisKKz1jdXQKKworc3ViIGNoYW5nZV9kaXIoJCkgeworCisgICAgbXkgJGRpciA9IHNoaWZ0KCBAXyApOworCisgICAgQ3dkOjpjaGRpciggJGRpciApCisgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgY2hkaXIgdG8gXCIkZGlyXCI6ICQhIiApOworCit9OyAjIHN1YiBjaGFuZ2VfZGlyCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y29weV9maWxlKCAkc3JjX2ZpbGUsICRkc3RfZmlsZSwgQG9wdGlvbnMgKT4KKworQ29weSBmaWxlLgorCitUaGlzIGZ1bmN0aW9uIGNvcGllcyBhIGZpbGUuIElmIHNvdXJjZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBmaWxlLCBlcnJvciBpc3N1ZXMuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LW92ZXJ3cml0ZT4KKworT3ZlcndyaXRlIGRlc3RpbmF0aW9uIGZpbGUsIGlmIGl0IGV4aXN0cy4KKworPWJhY2sKKworPWN1dAorCitzdWIgY29weV9maWxlKCQkQCkgeworCisgICAgbXkgJHNyYyAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHN0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgY29weSBmaWxlIFwiJHNyY1wiIHRvIFwiJGRzdFwiIjsKKworICAgIGlmICggbm90IC1lICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBkb2VzIG5vdCBleGlzdC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1mICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAtZSAkZHN0ICkgeworICAgICAgICBpZiAoIC1mICRkc3QgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzeyAtb3ZlcndyaXRlIH0gKSB7CisgICAgICAgICAgICAgICAgZGVsX2ZpbGUoICRkc3QgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIEZpbGU6OkNvcHk6OmNvcHkoICRzcmMsICRkc3QgKSBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogJCEiICk7CisgICAgIyBPbiBXaW5kb3dzKiBPUyBGaWxlOjpDb3B5IHByZXNlcnZlcyBmaWxlIGF0dHJpYnV0ZXMsIGJ1dCBvbiBMaW51eCogT1MgaXQgZG9lc24ndC4KKyAgICAjIFNvIHdlIHNob3VsZCBkbyBpdCBtYW51YWxseS4uLgorICAgIGlmICggJF5PID1+IG0vXmxpbnV4XHovICkgeworICAgICAgICBteSAkbW9kZSA9ICggc3RhdCggJHNyYyApIClbIDIgXQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IGNhbm5vdCBnZXQgc3RhdHVzIGluZm8gZm9yIHNvdXJjZSBmaWxlLiIgKTsKKyAgICAgICAgY2htb2QoICRtb2RlLCAkZHN0ICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBjYW5ub3QgY2hhbmdlIG1vZGUgb2YgZGVzdGluYXRpb24gZmlsZS4iICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBjb3B5X2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBtb3ZlX2ZpbGUoJCRAKSB7CisKKyAgICBteSAkc3JjICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkc3QgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBtb3ZlIGZpbGUgXCIkc3JjXCIgdG8gXCIkZHN0XCIiOworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1vdmVyd3JpdGUgKSBdICk7CisKKyAgICBpZiAoIG5vdCAtZSAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgZG9lcyBub3QgZXhpc3QuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZiAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgaXMgbm90IGEgZmlsZS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggLWUgJGRzdCApIHsKKyAgICAgICAgaWYgKCAtZiAkZHN0ICkgeworICAgICAgICAgICAgaWYgKCAkb3B0c3sgLW92ZXJ3cml0ZSB9ICkgeworICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIEZpbGU6OkNvcHk6Om1vdmUoICRzcmMsICRkc3QgKSBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogJCEiICk7CisKK307ICMgc3ViIG1vdmVfZmlsZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIGRlbF9maWxlKCQpIHsKKyAgICBteSAkZmlsZXMgPSBzaGlmdCggQF8gKTsKKyAgICBpZiAoIHJlZiggJGZpbGVzICkgZXEgIiIgKSB7CisgICAgICAgICRmaWxlcyA9IFsgJGZpbGVzIF07CisgICAgfTsgIyBpZgorICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBAJGZpbGVzICkgeworICAgICAgICBkZWJ1ZyggIkRlbGV0aW5nIGZpbGUgYCRmaWxlJy4uLiIgKTsKKyAgICAgICAgbXkgJHJjID0gdW5saW5rKCAkZmlsZSApOworICAgICAgICBpZiAoICRyYyA9PSAwICYmICQhICE9IEVOT0VOVCApIHsKKyAgICAgICAgICAgICMgUmVwb3JuIGFuIGVycm9yLCBidXQgaWdub3JlIEVOT0VOVCwgYmVjYXVzZSB0aGUgZ29hbCBpcyBhY2hpZXZlZC4KKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJEZWxldGluZyBmaWxlIGAkZmlsZScgZmFpbGVkOiAkISIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkZmlsZQorfTsgIyBzdWIgZGVsX2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1iYWNrCisKKz1jdXQKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEZpbGUgSS9PIHN1YnJvdXRpbmVzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1oZWFkMiBGaWxlIEkvTyBzdWJyb3V0aW5lcy4KKworPWN1dAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHJlYWRfZmlsZQorCitCPFN5bm9wc2lzOj4KKworICAgIHJlYWRfZmlsZSggJGZpbGUsIEBvcHRpb25zICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1JlYWQgZmlsZSBhbmQgcmV0dXJuIGl0cyBjb250ZW50LiBJbiBzY2FsYXIgY29udGV4dCBmdW5jdGlvbiByZXR1cm5zIGEgc2NhbGFyLCBpbiBsaXN0IGNvbnRleHQKK2Z1bmN0aW9uIHJldHVybnMgbGlzdCBvZiBsaW5lcy4KKworTm90ZTogSWYgdGhlIGxhc3Qgb2YgZmlsZSBkb2VzIG5vdCB0ZXJtaW5hdGUgd2l0aCBuZXdsaW5lLCBmdW5jdGlvbiB3aWxsIGFwcGVuZCBpdC4KKworQjxBcmd1bWVudHM6PgorCis9b3ZlcgorCis9aXRlbSBCPCRmaWxlPgorCitBIG5hbWUgb3IgaGFuZGxlIG9mIGZpbGUgdG8gcmVhZCBmcm9tLgorCis9YmFjaworCitCPE9wdGlvbnM6PgorCis9b3ZlcgorCis9aXRlbSBCPC1iaW5hcnk+CisKK0lmIHRydWUsIGZpbGUgdHJlYXRzIGFzIGEgYmluYXJ5IGZpbGU6IG5vIG5ld2xpbmUgY29udmVyc2lvbiwgbm8gdHJ1bmNhdGluZyB0cmFpbGluZyBzcGFjZSwgbm8KK25ld2xpbmUgcmVtb3ZpbmcgcGVyZm9ybWVkLiBFbnRpcmUgZmlsZSByZXR1cm5lZCBhcyBhIHNjYWxhci4KKworPWl0ZW0gQjwtYnVsaz4KKworVGhpcyBvcHRpb24gaXMgYWxsb3dlZCBvbmx5IGluIGJpbmFyeSBtb2RlLiBPcHRpb24ncyB2YWx1ZSBzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYSBzY2FsYXIuCitJZiBvcHRpb24gcHJlc2VudCwgZmlsZSBjb250ZW50IHBsYWNlZCB0byBwb2ludGVlIHNjYWxhciBhbmQgZnVuY3Rpb24gcmV0dXJucyB0cnVlICgxKS4KKworPWl0ZW0gQjwtY2hvbXA+CisKK0lmIHRydWUsIG5ld2xpbmUgY2hhcmFjdGVycyBhcmUgcmVtb3ZlZCBmcm9tIGZpbGUgY29udGVudC4gQnkgZGVmYXVsdCBuZXdsaW5lIGNoYXJhY3RlcnMgcmVtYWluLgorVGhpcyBvcHRpb24gaXMgbm90IGFwcGxpY2FibGUgaW4gYmluYXJ5IG1vZGUuCisKKz1pdGVtIEI8LWtlZXBfdHJhaWxpbmdfc3BhY2U+CisKK0lmIHRydWUsIHRyYWlubGluZyBzcGFjZSByZW1haW4gYXQgdGhlIGVuZHMgb2YgbGluZXMuIEJ5IGRlZmF1bHQgYWxsIHRyYWlsaW5nIHNwYWNlcyBhcmUgcmVtb3ZlZC4KK1RoaXMgb3B0aW9uIGlzIG5vdCBhcHBsaWNhYmxlIGluIGJpbmFyeSBtb2RlLgorCis9YmFjaworCitCPEV4YW1wbGVzOj4KKworUmV0dXJuIGZpbGUgYXMgc2luZ2xlIGxpbmUsIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMuCisKKyAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggIm1lc3NhZ2UudHh0IiApOworCitSZXR1cm4gZmlsZSBhcyBsaXN0IG9mIGxpbmVzIHdpdGggcmVtb3ZlZCB0cmFpbGluZyBzcGFjZSBhbmQKK25ld2xpbmUgY2hhcmFjdGVycy4KKworICAgIG15IEBidWxrID0gcmVhZF9maWxlKCAibWVzc2FnZS50eHQiLCAtY2hvbXAgPT4gMSApOworCitSZWFkIGEgYmluYXJ5IGZpbGU6CisKKyAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggIm1lc3NhZ2UudHh0IiwgLWJpbmFyeSA9PiAxICk7CisKK1JlYWQgYSBiaWcgYmluYXJ5IGZpbGU6CisKKyAgICBteSAkYnVsazsKKyAgICByZWFkX2ZpbGUoICJiaWdfYmluYXJ5X2ZpbGUiLCAtYmluYXJ5ID0+IDEsIC1idWxrID0+IFwkYnVsayApOworCitSZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQ6CisKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggXCpTVERJTiApOworCis9Y3V0CisKK3N1YiByZWFkX2ZpbGUoJEApIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQoIEBfICk7ICAjIFRoZSBuYW1lIG9yIGhhbmRsZSBvZiBmaWxlIHRvIHJlYWQgZnJvbS4KKyAgICBteSAlb3B0cyA9IEBfOyAgICAgICAgICAgIyBPcHRpb25zLgorCisgICAgbXkgJG5hbWU7CisgICAgbXkgJGhhbmRsZTsKKyAgICBteSBAYnVsazsKKyAgICBteSAkZXJyb3IgPSBcJnJ1bnRpbWVfZXJyb3I7CisKKyAgICBteSBAYmlub3B0cyA9IHF3KCAtYmluYXJ5IC1lcnJvciAtYnVsayApOyAgICAgICAgICAgICAgICAgICAgICAgIyBPcHRpb25zIGF2YWlsYWJsZSBpbiBiaW5hcnkgbW9kZS4KKyAgICBteSBAdHh0b3B0cyA9IHF3KCAtYmluYXJ5IC1lcnJvciAta2VlcF90cmFpbGluZ19zcGFjZSAtY2hvbXAgLWxheWVyICk7ICMgT3B0aW9ucyBhdmFpbGFibGUgaW4gdGV4dCAobm9uLWJpbmFyeSkgbW9kZS4KKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBAYmlub3B0cywgQHR4dG9wdHMgXSApOworICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgQGJpbm9wdHMgXSwgInRoZXNlIG9wdGlvbnMgY2Fubm90IGJlIHVzZWQgd2l0aCAtYmluYXJ5IiApOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIEB0eHRvcHRzIF0sICJ0aGVzZSBvcHRpb25zIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgLWJpbmFyeSIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgZXhpc3RzKCAkb3B0c3sgLWVycm9yIH0gKSApIHsKKyAgICAgICAgJG9wdHN7IC1lcnJvciB9ID0gImVycm9yIjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkb3B0c3sgLWVycm9yIH0gZXEgIndhcm5pbmciICkgeworICAgICAgICAkZXJyb3IgPSBcJndhcm5pbmc7CisgICAgfSBlbHNpZiggJG9wdHN7IC1lcnJvciB9IGVxICJpZ25vcmUiICkgeworICAgICAgICAkZXJyb3IgPSBzdWIge307CisgICAgfSBlbHNpZiAoIHJlZiggJG9wdHN7IC1lcnJvciB9ICkgZXEgIkFSUkFZIiApIHsKKyAgICAgICAgJGVycm9yID0gc3ViIHsgcHVzaCggQHsgJG9wdHN7IC1lcnJvciB9IH0sICRfWyAwIF0gKTsgfTsKKyAgICB9OyAjIGlmCisKKyAgICBpZiAoICggcmVmKCAkZmlsZSApIGVxICJHTE9CIiApIG9yIFVOSVZFUlNBTDo6aXNhKCAkZmlsZSwgIklPOjpIYW5kbGUiICkgKSB7CisgICAgICAgICRuYW1lID0gInVua25vd24iOworICAgICAgICAkaGFuZGxlID0gJGZpbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJG5hbWUgPSAkZmlsZTsKKyAgICAgICAgaWYgKCBnZXRfZXh0KCAkZmlsZSApIGVxICIuZ3oiIGFuZCBub3QgJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgICAgICRoYW5kbGUgPSBJTzo6WmxpYi0+bmV3KCAkbmFtZSwgInJiIiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGhhbmRsZSA9IElPOjpGaWxlLT5uZXcoICRuYW1lLCAiciIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkaGFuZGxlICkgKSB7CisgICAgICAgICAgICAkZXJyb3ItPiggIkZpbGUgXCIkbmFtZVwiIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yIGlucHV0OiAkISIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIGRlZmluZWQoICRoYW5kbGUgKSApIHsKKyAgICAgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICAgICAgYmlubW9kZSggJGhhbmRsZSApOworICAgICAgICAgICAgbG9jYWwgJC8gPSB1bmRlZjsgICAjIFNldCBpbnB1dCByZWNvcmQgc2VwYXJhdG9yIHRvIHVuZGVmIHRvIHJlYWQgZW50aXJlIGZpbGUgYXMgb25lIGxpbmUuCisgICAgICAgICAgICBpZiAoIGV4aXN0cyggJG9wdHN7IC1idWxrIH0gKSApIHsKKyAgICAgICAgICAgICAgICAkeyAkb3B0c3sgLWJ1bGsgfSB9ID0gJGhhbmRsZS0+Z2V0bGluZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkYnVsa1sgMCBdID0gJGhhbmRsZS0+Z2V0bGluZSgpOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkb3B0c3sgLWxheWVyIH0gKSApIHsKKyAgICAgICAgICAgICAgICBiaW5tb2RlKCAkaGFuZGxlLCAkb3B0c3sgLWxheWVyIH0gKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIEBidWxrID0gJGhhbmRsZS0+Z2V0bGluZXMoKTsKKyAgICAgICAgICAgICMgU3BlY2lhbCB0cmljayBmb3IgVVRGLTggZmlsZXM6IERlbGV0ZSBCT00sIGlmIGFueS4KKyAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9wdHN7IC1sYXllciB9ICkgYW5kICRvcHRzeyAtbGF5ZXIgfSBlcSAiOnV0ZjgiICkgeworICAgICAgICAgICAgICAgIGlmICggc3Vic3RyKCAkYnVsa1sgMCBdLCAwLCAxICkgZXEgIlx4e0ZFRkZ9IiApIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkYnVsa1sgMCBdLCAwLCAxICkgPSAiIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGhhbmRsZS0+Y2xvc2UoKQorICAgICAgICAgICAgb3IgJGVycm9yLT4oICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgY2xvc2VkIGFmdGVyIGlucHV0OiAkISIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gYW5kIGV4aXN0cyggJG9wdHN7IC1idWxrIH0gKSApIHsKKyAgICAgICAgICAgICR7ICRvcHRzeyAtYnVsayB9IH0gPSAiIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgIGlmICggZXhpc3RzKCAkb3B0c3sgLWJ1bGsgfSApICkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gJGJ1bGtbIDAgXTsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggKCBAYnVsayA+IDAgKSBhbmQgKCBzdWJzdHIoICRidWxrWyAtMSBdLCAtMSwgMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICRidWxrWyAtMSBdIC49ICJcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1rZWVwX3RyYWlsaW5nX3NwYWNlIH0gKSB7CisgICAgICAgICAgICBtYXAoICRfID1+IHMvXHMrXG5cei9cbi8sIEBidWxrICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCAkb3B0c3sgLWNob21wIH0gKSB7CisgICAgICAgICAgICBjaG9tcCggQGJ1bGsgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIHdhbnRhcnJheSgpICkgeworICAgICAgICAgICAgcmV0dXJuIEBidWxrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGpvaW4oICIiLCBAYnVsayApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCit9OyAjIHN1YiByZWFkX2ZpbGUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyB3cml0ZV9maWxlCisKK0I8U3lub3BzaXM6PgorCisgICAgd3JpdGVfZmlsZSggJGZpbGUsICRidWxrLCBAb3B0aW9ucyApCisKK0I8RGVzY3JpcHRpb246PgorCitXcml0ZSBmaWxlLgorCitCPEFyZ3VtZW50czo+CisKKz1vdmVyCisKKz1pdGVtIEI8JGZpbGU+CisKK1RoZSBuYW1lIG9yIGhhbmRsZSBvZiBmaWxlIHRvIHdyaXR0ZSB0by4KKworPWl0ZW0gQjwkYnVsaz4KKworQnVsayB0byB3cml0ZSB0byBhIGZpbGUuIENhbiBiZSBhIHNjYWxhciwgb3IgYSByZWZlcmVuY2UgdG8gc2NhbGFyIG9yIGFuIGFycmF5LgorCis9YmFjaworCitCPE9wdGlvbnM6PgorCis9b3ZlcgorCis9aXRlbSBCPC1iYWNrdXA+CisKK0lmIHRydWUsIGNyZWF0ZSBhIGJhY2t1cCBjb3B5IG9mIGZpbGUgb3ZlcndyaXR0ZW4uIEJhY2t1cCBjb3B5IGlzIHBsYWNlZCBpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeS4KK1RoZSBuYW1lIG9mIGJhY2t1cCBjb3B5IGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIGZpbGUgd2l0aCBgficgYXBwZW5kZWQuIEJ5IGRlZmF1bHQgYmFja3VwIGNvcHkKK2lzIG5vdCBjcmVhdGVkLgorCis9aXRlbSBCPC1hcHBlbmQ+CisKK0lmIHRydWUsIHRoZSB0ZXh0IHdpbGwgYmUgYWRkZWQgdG8gZXhpc3RpbmcgZmlsZS4KKworPWJhY2sKKworQjxFeGFtcGxlczo+CisKKyAgICB3cml0ZV9maWxlKCAibWVzc2FnZS50eHQiLCBcJGJ1bGsgKTsKKyAgICAgICAgIyBXcml0ZSBmaWxlLCB0YWtlIGNvbnRlbnQgZnJvbSBhIHNjYWxhci4KKworICAgIHdyaXRlX2ZpbGUoICJtZXNzYWdlLnR4dCIsIFxAYnVsaywgLWJhY2t1cCA9PiAxICk7CisgICAgICAgICMgV3JpdGUgZmlsZSwgdGFrZSBjb250ZW50IGZyb20gYW4gYXJyYXksIGNyZWF0ZSBhIGJhY2t1cCBjb3B5LgorCis9Y3V0CisKK3N1YiB3cml0ZV9maWxlKCQkQCkgeworCisgICAgbXkgJGZpbGUgPSBzaGlmdCggQF8gKTsgICMgVGhlIG5hbWUgb3IgaGFuZGxlIG9mIGZpbGUgdG8gd3JpdGUgdG8uCisgICAgbXkgJGJ1bGsgPSBzaGlmdCggQF8gKTsgICMgVGhlIHRleHQgdG8gd3JpdGUuIENhbiBiZSByZWZlcmVuY2UgdG8gYXJyYXkgb3Igc2NhbGFyLgorICAgIG15ICVvcHRzID0gQF87ICAgICAgICAgICAjIE9wdGlvbnMuCisKKyAgICBteSAkbmFtZTsKKyAgICBteSAkaGFuZGxlOworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1hcHBlbmQgLWJhY2t1cCAtYmluYXJ5IC1sYXllciApIF0gKTsKKworICAgIG15ICRtb2RlID0gJG9wdHN7IC1hcHBlbmQgfSA/ICJhIjogInciOworICAgIGlmICggKCByZWYoICRmaWxlICkgZXEgIkdMT0IiICkgb3IgVU5JVkVSU0FMOjppc2EoICRmaWxlLCAiSU86OkhhbmRsZSIgKSApIHsKKyAgICAgICAgJG5hbWUgPSAidW5rbm93biI7CisgICAgICAgICRoYW5kbGUgPSAkZmlsZTsKKyAgICB9IGVsc2UgeworICAgICAgICAkbmFtZSA9ICRmaWxlOworICAgICAgICBpZiAoICRvcHRzeyAtYmFja3VwIH0gYW5kICggLWYgJG5hbWUgKSApIHsKKyAgICAgICAgICAgIGNvcHlfZmlsZSggJG5hbWUsICRuYW1lIC4gIn4iLCAtb3ZlcndyaXRlID0+IDEgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkaGFuZGxlID0gSU86OkZpbGUtPm5ldyggJG5hbWUsICRtb2RlICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciBvdXRwdXQ6ICQhIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgIGJpbm1vZGUoICRoYW5kbGUgKTsKKyAgICB9IGVsc2lmICggJG9wdHN7IC1sYXllciB9ICkgeworICAgICAgICBiaW5tb2RlKCAkaGFuZGxlLCAkb3B0c3sgLWxheWVyIH0gKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCByZWYoICRidWxrICkgZXEgIiIgKSB7CisgICAgICAgIGlmICggZGVmaW5lZCggJGJ1bGsgKSApIHsKKyAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAkYnVsayApOworICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1iaW5hcnkgfSBhbmQgKCBzdWJzdHIoICRidWxrLCAtMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggIlxuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNpZiAoIHJlZiggJGJ1bGsgKSBlcSAiU0NBTEFSIiApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkJGJ1bGsgKSApIHsKKyAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAkJGJ1bGsgKTsKKyAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtYmluYXJ5IH0gYW5kICggc3Vic3RyKCAkJGJ1bGssIC0xICkgbmUgIlxuIiApICkgeworICAgICAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAiXG4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2lmICggcmVmKCAkYnVsayApIGVxICJBUlJBWSIgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAJGJ1bGsgKSB7CisgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRsaW5lICkgKSB7CisgICAgICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICRsaW5lICk7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1iaW5hcnkgfSBhbmQgKCBzdWJzdHIoICRsaW5lLCAtMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICJcbiIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgZm9yZWFjaAorICAgIH0gZWxzZSB7CisgICAgICAgIENhcnA6OmNyb2FrKCAid3JpdGVfZmlsZTogXCRidWxrIG11c3QgYmUgYSBzY2FsYXIgb3IgcmVmZXJlbmNlIHRvIChzY2FsYXIgb3IgYXJyYXkpIiApOworICAgIH07ICMgaWYKKyAgICAkaGFuZGxlLT5jbG9zZSgpCisgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgY2xvc2VkIGFmdGVyIG91dHB1dDogJCEiICk7CisKK307ICMgc3ViIHdyaXRlX2ZpbGUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1jdXQKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEV4ZWN1dGlvbiBzdWJyb3V0aW5lcy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9aGVhZDIgRXhlY3V0aW9uIHN1YnJvdXRpbmVzLgorCis9b3ZlcgorCis9Y3V0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgX3ByZSB7CisKKyAgICBteSAkYXJnID0gc2hpZnQoIEBfICk7CisKKyAgICAjIElmIHJlZGlyZWN0aW9uIGlzIG5vdCByZXF1aXJlZCwgZXhpdC4KKyAgICBpZiAoIG5vdCBleGlzdHMoICRhcmctPnsgcmVkaXIgfSApICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OyAjIGlmCisKKyAgICAjIElucHV0IHBhcmFtZXRlcnMuCisgICAgbXkgJG1vZGUgICA9ICRhcmctPnsgbW9kZSAgIH07ICMgTW9kZSwgIjwiIChpbnB1dCApIG9yICI+IiAob3V0cHV0KS4KKyAgICBteSAkaGFuZGxlID0gJGFyZy0+eyBoYW5kbGUgfTsgIyBIYW5kbGUgdG8gbWFuaXB1bGF0ZS4KKyAgICBteSAkcmVkaXIgID0gJGFyZy0+eyByZWRpciAgfTsgIyBEYXRhLCBhIGZpbGUgbmFtZSBpZiBhIHNjYWxhciwgb3IgZmlsZSBjb250ZW50cywgaWYgYSByZWZlcmVuY2UuCisKKyAgICAjIE91dHB1dCBwYXJhbWV0ZXJzLgorICAgIG15ICRzYXZlX2hhbmRsZTsKKyAgICBteSAkdGVtcF9oYW5kbGU7CisgICAgbXkgJHRlbXBfbmFtZTsKKworICAgICMgU2F2ZSBvcmlnaW5hbCBoYW5kbGUgKGJ5IGR1cGluZyBpdCkuCisgICAgJHNhdmVfaGFuZGxlID0gU3ltYm9sOjpnZW5zeW0oKTsKKyAgICAkaGFuZGxlLT5mbHVzaCgpOworICAgIG9wZW4oICRzYXZlX2hhbmRsZSwgJG1vZGUgLiAiJiIgLiAkaGFuZGxlLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCEiICk7CisKKyAgICAjIFByZXBhcmUgYSBmaWxlIHRvIElPLgorICAgIGlmICggVU5JVkVSU0FMOjppc2EoICRyZWRpciwgIklPOjpIYW5kbGUiICkgb3IgKCByZWYoICRyZWRpciApIGVxICJHTE9CIiApICkgeworICAgICAgICAjICRyZWRpciBpcyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IG9mIElPOjpIYW5kbGUgY2xhc3MgKG9yIGl0cyBkZWNlZGFudCkuCisgICAgICAgICR0ZW1wX2hhbmRsZSA9ICRyZWRpcjsKKyAgICB9IGVsc2lmICggcmVmKCAkcmVkaXIgKSApIHsKKyAgICAgICAgIyAkcmVkaXIgaXMgYSByZWZlcmVuY2UgdG8gY29udGVudCB0byBiZSByZWFkL3dyaXR0ZW4uCisgICAgICAgICMgUHJlcGFyZSB0ZW1wIGZpbGUuCisgICAgICAgICggJHRlbXBfaGFuZGxlLCAkdGVtcF9uYW1lICkgPQorICAgICAgICAgICAgRmlsZTo6VGVtcDo6dGVtcGZpbGUoCisgICAgICAgICAgICAgICAgIiR0b29sLlhYWFhYWFhYIiwKKyAgICAgICAgICAgICAgICBESVIgICAgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCksCisgICAgICAgICAgICAgICAgU1VGRklYID0+ICIudG1wIiwKKyAgICAgICAgICAgICAgICBVTkxJTksgPT4gMQorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJHRlbXBfaGFuZGxlICkgKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wIGZpbGUuIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggJG1vZGUgZXEgIjwiICkgeworICAgICAgICAgICAgIyBJdCBpcyBhIGZpbGUgdG8gYmUgcmVhZCBieSBjaGlsZCwgcHJlcGFyZSBmaWxlIGNvbnRlbnQgdG8gYmUgcmVhZC4KKyAgICAgICAgICAgICR0ZW1wX2hhbmRsZS0+cHJpbnQoIHJlZiggJHJlZGlyICkgZXEgIlNDQUxBUiIgPyAkeyAkcmVkaXIgfSA6IEB7ICRyZWRpciB9ICk7CisgICAgICAgICAgICAkdGVtcF9oYW5kbGUtPmZsdXNoKCk7CisgICAgICAgICAgICBzZWVrKCAkdGVtcF9oYW5kbGUsIDAsIDAgKTsKKyAgICAgICAgICAgICAgICAjIFVuZm9ydHVuYXRlbGx5LCBJIGNvdWxkIG5vdCB1c2UgT08gaW50ZXJmYWNlIHRvIHNlZWsuCisgICAgICAgICAgICAgICAgIyBBY3RpdmVQZXJsIDUuNi4xIGNvbXBsYWlucyBvbiBib3RoIGZvcm1zOgorICAgICAgICAgICAgICAgICMgICAgJHRlbXBfaGFuZGxlLT5zZWVrKCAwICk7ICAgICMgQXMgZGVjbGFyZWQgaW4gSU86OlNlZWthYmxlLgorICAgICAgICAgICAgICAgICMgICAgJHRlbXBfaGFuZGxlLT5zZXRwb3MoIDAgKTsgICMgQXMgZGVzY3JpYmVkIGluIGRvY3VtZW50YXRpb24uCisgICAgICAgIH0gZWxzaWYgKCAkbW9kZSBlcSAiPiIgKSB7CisgICAgICAgICAgICAjIEl0IGlzIGEgZmlsZSBmb3Igb3V0cHV0LiBDbGVhciBvdXRwdXQgdmFyaWFibGUuCisgICAgICAgICAgICBpZiAoIHJlZiggJHJlZGlyICkgZXEgIlNDQUxBUiIgKSB7CisgICAgICAgICAgICAgICAgJHsgJHJlZGlyIH0gPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQHsgJHJlZGlyIH0gPSAoKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgICMgJHJlZGlyIGlzIGEgbmFtZSBvZiBmaWxlIHRvIGJlIHJlYWQvd3JpdHRlbi4KKyAgICAgICAgIyBKdXN0IG9wZW4gZmlsZS4KKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkcmVkaXIgKSApIHsKKyAgICAgICAgICAgICR0ZW1wX25hbWUgPSAkcmVkaXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGVtcF9uYW1lID0gRmlsZTo6U3BlYy0+ZGV2bnVsbCgpOworICAgICAgICB9OyAjIGlmCisgICAgICAgICR0ZW1wX2hhbmRsZSA9IElPOjpGaWxlLT5uZXcoICR0ZW1wX25hbWUsICRtb2RlICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJmaWxlIFwiJHRlbXBfbmFtZVwiIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yICIgLiAoICRtb2RlIGVxICI8IiA/ICJpbnB1dCIgOiAib3V0cHV0IiApIC4gIjogJCEiICk7CisgICAgfTsgIyBpZgorCisgICAgIyBSZWRpcmVjdCBoYW5kbGUgdG8gdGVtcCBmaWxlLgorICAgIG9wZW4oICRoYW5kbGUsICRtb2RlIC4gIiYiIC4gJHRlbXBfaGFuZGxlLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCEiICk7CisKKyAgICAjIFNhdmUgb3V0cHV0IHBhcmFtZXRlcnMuCisgICAgJGFyZy0+eyBzYXZlX2hhbmRsZSB9ID0gJHNhdmVfaGFuZGxlOworICAgICRhcmctPnsgdGVtcF9oYW5kbGUgfSA9ICR0ZW1wX2hhbmRsZTsKKyAgICAkYXJnLT57IHRlbXBfbmFtZSAgIH0gPSAkdGVtcF9uYW1lOworCit9OyAjIHN1YiBfcHJlCisKKworc3ViIF9wb3N0IHsKKworICAgIG15ICRhcmcgPSBzaGlmdCggQF8gKTsKKworICAgICMgSW5wdXQgcGFyYW1ldGVycy4KKyAgICBteSAkbW9kZSAgID0gJGFyZy0+eyBtb2RlICAgfTsgIyBNb2RlLCAiPCIgb3IgIj4iLgorICAgIG15ICRoYW5kbGUgPSAkYXJnLT57IGhhbmRsZSB9OyAjIEhhbmRsZSB0byBzYXZlIGFuZCBzZXQuCisgICAgbXkgJHJlZGlyICA9ICRhcmctPnsgcmVkaXIgIH07ICMgRGF0YSwgYSBmaWxlIG5hbWUgaWYgYSBzY2FsYXIsIG9yIGZpbGUgY29udGVudHMsIGlmIGEgcmVmZXJlbmNlLgorCisgICAgIyBQYXJhbWV0ZXJzIHNhdmVkIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorICAgIG15ICRzYXZlX2hhbmRsZSA9ICRhcmctPnsgc2F2ZV9oYW5kbGUgfTsKKyAgICBteSAkdGVtcF9oYW5kbGUgPSAkYXJnLT57IHRlbXBfaGFuZGxlIH07CisgICAgbXkgJHRlbXBfbmFtZSAgID0gJGFyZy0+eyB0ZW1wX25hbWUgICB9OworCisgICAgIyBJZiBubyBoYW5kbGUgd2FzIHNhdmVkLCBleGl0LgorICAgIGlmICggbm90ICRzYXZlX2hhbmRsZSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsgIyBpZgorCisgICAgIyBDbG9zZSBoYW5kbGUuCisgICAgJGhhbmRsZS0+Y2xvc2UoKQorICAgICAgICBvciBkaWUoICIkISIgKTsKKworICAgICMgUmVhZCB0aGUgY29udGVudCBvZiB0ZW1wIGZpbGUsIGlmIG5lY2Vzc2FyeSwgYW5kIGNsb3NlIHRlbXAgZmlsZS4KKyAgICBpZiAoICggJG1vZGUgbmUgIjwiICkgYW5kIHJlZiggJHJlZGlyICkgKSB7CisgICAgICAgICR0ZW1wX2hhbmRsZS0+Zmx1c2goKTsKKyAgICAgICAgc2VlayggJHRlbXBfaGFuZGxlLCAwLCAwICk7CisgICAgICAgIGlmICggJF5PID1+IG0vTVNXaW4vICkgeworICAgICAgICAgICAgYmlubW9kZSggJHRlbXBfaGFuZGxlLCAiOmNybGYiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCByZWYoICRyZWRpciApIGVxICJTQ0FMQVIiICkgeworICAgICAgICAgICAgJHsgJHJlZGlyIH0gLj0gam9pbiggIiIsICR0ZW1wX2hhbmRsZS0+Z2V0bGluZXMoKSApOworICAgICAgICB9IGVsc2lmICggcmVmKCAkcmVkaXIgKSBlcSAiQVJSQVkiICkgeworICAgICAgICAgICAgcHVzaCggQHsgJHJlZGlyIH0sICR0ZW1wX2hhbmRsZS0+Z2V0bGluZXMoKSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggbm90IFVOSVZFUlNBTDo6aXNhKCAkcmVkaXIsICJJTzo6SGFuZGxlIiApICkgeworICAgICAgICAkdGVtcF9oYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgICAgIG9yIGRpZSggIiQhIiApOworICAgIH07ICMgaWYKKworICAgICMgUmVzdG9yZSBoYW5kbGUgdG8gb3JpZ2luYWwgdmFsdWUuCisgICAgJHNhdmVfaGFuZGxlLT5mbHVzaCgpOworICAgIG9wZW4oICRoYW5kbGUsICRtb2RlIC4gIiYiIC4gJHNhdmVfaGFuZGxlLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCEiICk7CisKKyAgICAjIENsb3NlIHNhdmUgaGFuZGxlLgorICAgICRzYXZlX2hhbmRsZS0+Y2xvc2UoKQorICAgICAgICBvciBkaWUoICIkISIgKTsKKworICAgICMgRGVsZXRlIHBhcmFtZXRlcnMgc2F2ZWQgZHVyaW5nIHByZXByb2Nlc3NpbmcuCisgICAgZGVsZXRlKCAkYXJnLT57IHNhdmVfaGFuZGxlIH0gKTsKKyAgICBkZWxldGUoICRhcmctPnsgdGVtcF9oYW5kbGUgfSApOworICAgIGRlbGV0ZSggJGFyZy0+eyB0ZW1wX25hbWUgICB9ICk7CisKK307ICMgc3ViIF9wb3N0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGV4ZWN1dGUoIFsgQGNvbW1hbmQgXSwgQG9wdGlvbnMgKT4KKworRXhlY3V0ZSBzcGVjaWZpZWQgcHJvZ3JhbSBvciBzaGVsbCBjb21tYW5kLgorCitQcm9ncmFtIGlzIHNwZWNpZmllZCBieSByZWZlcmVuY2UgdG8gYW4gYXJyYXksIHRoYXQgYXJyYXkgaXMgcGFzc2VkIHRvIEM8c3lzdGVtKCk+IGZ1bmN0aW9uIHdoaWNoCitleGVjdXRlcyB0aGUgY29tbWFuZC4gU2VlIEw8cGVybGZ1bmM+IGZvciBkZXRhaWxzIGhvdyBDPHN5c3RlbSgpPiBpbnRlcnByZXRzIHZhcmlvdXMgZm9ybXMgb2YKK0M8QGNvbW1hbmQ+LgorCitCeSBkZWZhdWx0LCBpbiBjYXNlIG9mIGFueSBlcnJvciBlcnJvciBtZXNzYWdlIGlzIGlzc3VlZCBhbmQgc2NyaXB0IHRlcm1pbmF0ZWQgKGJ5IHJ1bnRpbWVfZXJyb3IoKSkuCitGdW5jdGlvbiByZXR1cm5zIGFuIGV4aXQgY29kZSBvZiBwcm9ncmFtLgorCitBbHRlcm5hdGl2ZWx5LCBoZSBmdW5jdGlvbiBtYXkgcmV0dXJuIGV4aXQgc3RhdHVzIG9mIHRoZSBwcm9ncmFtIChzZWUgQzwtaWdub3JlX3N0YXR1cz4pIG9yIHNpZ25hbAorKHNlZSBDPC1pZ25vcmVfc2lnbmFsPikgc28gY2FsbGVyIG1heSBhbmFseXplIGl0IGFuZCBjb250aW51ZSBleGVjdXRpb24uCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LXN0ZGluPgorCitSZWRpcmVjdCBzdGRpbiBvZiBwcm9ncmFtLiBUaGUgdmFsdWUgb2Ygb3B0aW9uIGNhbiBiZToKKworPW92ZXIKKworPWl0ZW0gQzx1bmRlZj4KKworU3RkaW4gb2YgY2hpbGQgaXMgYXR0YWNoZWQgdG8gbnVsbCBkZXZpY2UuCisKKz1pdGVtIGEgc3RyaW5nCisKK1N0ZGluIG9mIGNoaWxkIGlzIGF0dGFjaGVkIHRvIGEgZmlsZSB3aXRoIG5hbWUgc3BlY2lmaWVkIGJ5IG9wdGlvbi4KKworPWl0ZW0gYSByZWZlcmVuY2UgdG8gYSBzY2FsYXIKKworQSBkZXJlZmVyZW5jZWQgc2NhbGFyIGlzIHdyaXR0ZW4gdG8gYSB0ZW1wIGZpbGUsIGFuZCBjaGlsZCdzIHN0ZGluIGlzIGF0dGFjaGVkIHRvIHRoYXQgZmlsZS4KKworPWl0ZW0gYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkKKworQSBkZXJlZmVyZW5jZWQgYXJyYXkgaXMgd3JpdHRlbiB0byBhIHRlbXAgZmlsZSwgYW5kIGNoaWxkJ3Mgc3RkaW4gaXMgYXR0YWNoZWQgdG8gdGhhdCBmaWxlLgorCis9YmFjaworCis9aXRlbSBDPC1zdGRvdXQ+CisKK1JlZGlyZWN0IHN0ZG91dC4gUG9zc2libGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgQzwtc3RkaW4+IG9wdGlvbi4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcworcmVmZXJlbmNlIHNwZWNpZmllcyBhIHZhcmlhYmxlIHJlY2VpdmluZyBwcm9ncmFtJ3Mgb3V0cHV0LgorCis9aXRlbSBDPC1zdGRlcnI+CisKK0l0IHNpbWlsYXIgdG8gQzwtc3Rkb3V0PiwgYnV0IHJlZGlyZWN0cyBzdGRlcnIuIFRoZXJlIGlzIG9ubHkgb25lIGFkZGl0aW9uYWwgdmFsdWU6CisKKz1vdmVyCisKKz1pdGVtIGFuIGVtcHR5IHN0cmluZworCittZWFucyB0aGF0IHN0ZGVyciBzaG91bGQgYmUgcmVkaXJlY3RlZCB0byB0aGUgc2FtZSBwbGFjZSB3aGVyZSBzdGRvdXQgaXMgcmVkaXJlY3RlZCB0by4KKworPWJhY2sKKworPWl0ZW0gQzwtYXBwZW5kPgorCitSZWRpcmVjdGVkIHN0cmVhbSB3aWxsIG5vdCBvdmVyd3JpdGUgcHJldmlvdXMgY29udGVudCBvZiBmaWxlIChvciB2YXJpYWJsZSkuCitOb3RlLCB0aGF0IG9wdGlvbiBhZmZlY3RzIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIuCisKKz1pdGVtIEM8LWlnbm9yZV9zdGF0dXM+CisKK0J5IGRlZmF1bHQsIHN1YnJvdXRpbmUgcmFpc2VzIGFuIGVycm9yIGFuZCBleGl0cyB0aGUgc2NyaXB0IGlmIHByb2dyYW0gcmV0dXJucyBub24tZXhpdCBzdGF0dXMuIElmCit0aGlzIG9wdGlvbnMgaXMgdHJ1ZSwgbm8gZXJyb3IgaXMgcmFpc2VkLiBJbnN0ZWFkLCBzdGF0dXMgaXMgcmV0dXJuZWQgYXMgZnVuY3Rpb24gcmVzdWx0IChhbmQgJEAgaXMKK3NldCB0byBlcnJvciBtZXNzYWdlKS4KKworPWl0ZW0gQzwtaWdub3JlX3NpZ25hbD4KKworQnkgZGVmYXVsdCwgc3Vicm91dGluZSByYWlzZXMgYW4gZXJyb3IgYW5kIGV4aXRzIHRoZSBzY3JpcHQgaWYgcHJvZ3JhbSBkaWUgd2l0aCBzaWduYWwuIElmCit0aGlzIG9wdGlvbnMgaXMgdHJ1ZSwgbm8gZXJyb3IgaXMgcmFpc2VkIGluIHN1Y2ggYSBjYXNlLiBJbnN0ZWFkLCBzaWduYWwgbnVtYmVyIGlzIHJldHVybmVkIChhcworbmVnYXRpdmUgdmFsdWUpLCBlcnJvciBtZXNzYWdlIGlzIHBsYWNlZCB0byBDPCRAPiB2YXJpYWJsZS4KKworSWYgY29tbWFuZCBpcyBub3QgZXZlbiBzdGFydGVkLCAtMjU2IGlzIHJldHVybmVkLgorCis9YmFjaworCitFeGFtcGxlczoKKworICAgIGV4ZWN1dGUoIFsgImNtZC5leGUiLCAiL2MiLCAiZGlyIiBdICk7CisgICAgICAgICMgRXhlY3V0ZSBOVCBzaGVsbCB3aXRoIHNwZWNpZmllZCBvcHRpb25zLCBubyByZWRpcmVjdGlvbnMgYXJlCisgICAgICAgICMgbWFkZS4KKworICAgIG15ICRvdXRwdXQ7CisgICAgZXhlY3V0ZSggWyAiY3ZzIiwgIi1uIiwgIi1xIiwgInVwZGF0ZSIsICIuIiBdLCAtc3Rkb3V0ID0+IFwkb3V0cHV0ICk7CisgICAgICAgICMgRXhlY3V0ZSAiY3ZzIC1uIC1xIHVwZGF0ZSAuIiBjb21tYW5kLCBvdXRwdXQgaXMgc2F2ZWQKKyAgICAgICAgIyBpbiAkb3V0cHV0IHZhcmlhYmxlLgorCisgICAgbXkgQG91dHB1dDsKKyAgICBleGVjdXRlKCBbIHF3KCBjdnMgLW4gLXEgdXBkYXRlIC4gKSBdLCAtc3Rkb3V0ID0+IFxAb3V0cHV0LCAtc3RkZXJyID0+IHVuZGVmICk7CisgICAgICAgICMgRXhlY3V0ZSBzcGVjaWZpZWQgY29tbWFuZCwgIG91dHB1dCBpcyBzYXZlZCBpbiBAb3V0cHV0CisgICAgICAgICMgdmFyaWFibGUsIHN0ZGVyciBzdHJlYW0gaXMgcmVkaXJlY3RlZCB0byBudWxsIGRldmljZQorICAgICAgICAjICgvZGV2L251bGwgaW4gTGludXgqIE9TIGFuIG51bCBpbiBXaW5kb3dzKiBPUykuCisKKz1jdXQKKworc3ViIGV4ZWN1dGUoJEApIHsKKworICAgICMgISEhIEFkZCBzb21ldGhpbmcgdG8gY29tcGxhaW4gb24gdW5rbm93biBvcHRpb25zLi4uCisKKyAgICBteSAkY29tbWFuZCA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzICAgID0gQF87CisgICAgbXkgJHByZWZpeCAgPSAiQ291bGQgbm90IGV4ZWN1dGUgJGNvbW1hbmQtPlsgMCBdIjsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtc3RkaW4gLXN0ZG91dCAtc3RkZXJyIC1hcHBlbmQgLWlnbm9yZV9zdGF0dXMgLWlnbm9yZV9zaWduYWwgKSBdICk7CisKKyAgICBpZiAoIHJlZiggJGNvbW1hbmQgKSBuZSAiQVJSQVkiICkgeworICAgICAgICBDYXJwOjpjcm9hayggImV4ZWN1dGU6ICRjb21tYW5kIG11c3QgYmUgYSByZWZlcmVuY2UgdG8gYXJyYXkiICk7CisgICAgfTsgIyBpZgorCisgICAgbXkgJHN0ZGluICA9IHsgaGFuZGxlID0+IFwqU1RESU4sICBtb2RlID0+ICI8IiB9OworICAgIG15ICRzdGRvdXQgPSB7IGhhbmRsZSA9PiBcKlNURE9VVCwgbW9kZSA9PiAiPiIgfTsKKyAgICBteSAkc3RkZXJyID0geyBoYW5kbGUgPT4gXCpTVERFUlIsIG1vZGUgPT4gIj4iIH07CisgICAgbXkgJHN0cmVhbXMgPSB7CisgICAgICAgIHN0ZGluICA9PiAkc3RkaW4sCisgICAgICAgIHN0ZG91dCA9PiAkc3Rkb3V0LAorICAgICAgICBzdGRlcnIgPT4gJHN0ZGVycgorICAgIH07ICMgJHN0cmVhbXMKKworICAgIGZvciBteSAkc3RyZWFtICggcXcoIHN0ZGluIHN0ZG91dCBzdGRlcnIgKSApIHsKKyAgICAgICAgaWYgKCBleGlzdHMoICRvcHRzeyAiLSRzdHJlYW0iIH0gKSApIHsKKyAgICAgICAgICAgIGlmICggcmVmKCAkb3B0c3sgIi0kc3RyZWFtIiB9ICkgIX4gbS9cQSh8U0NBTEFSfEFSUkFZKVx6LyApIHsKKyAgICAgICAgICAgICAgICBDYXJwOjpjcm9hayggImV4ZWN1dGU6IC0kc3RyZWFtIG9wdGlvbjogbXVzdCBoYXZlIHZhbHVlIG9mIHNjYWxhciwgb3IgcmVmZXJlbmNlIHRvIChzY2FsYXIgb3IgYXJyYXkpLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICRzdHJlYW1zLT57ICRzdHJlYW0gfS0+eyByZWRpciB9ID0gJG9wdHN7ICItJHN0cmVhbSIgfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoICRvcHRzeyAtYXBwZW5kIH0gYW5kICggJHN0cmVhbXMtPnsgJHN0cmVhbSB9LT57IG1vZGUgfSApIGVxICI+IiApIHsKKyAgICAgICAgICAgICRzdHJlYW1zLT57ICRzdHJlYW0gfS0+eyBtb2RlIH0gPSAiPj4iOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRzdHJlYW0KKworICAgIF9wcmUoICRzdGRpbiAgKTsKKyAgICBfcHJlKCAkc3Rkb3V0ICk7CisgICAgaWYgKCBkZWZpbmVkKCAkc3RkZXJyLT57IHJlZGlyIH0gKSBhbmQgbm90IHJlZiggJHN0ZGVyci0+eyByZWRpciB9ICkgYW5kICggJHN0ZGVyci0+eyByZWRpciB9IGVxICIiICkgKSB7CisgICAgICAgIGlmICggZXhpc3RzKCAkc3Rkb3V0LT57IHJlZGlyIH0gKSApIHsKKyAgICAgICAgICAgICRzdGRlcnItPnsgcmVkaXIgfSA9ICRzdGRvdXQtPnsgdGVtcF9oYW5kbGUgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRzdGRlcnItPnsgcmVkaXIgfSA9ICR7ICRzdGRvdXQtPnsgaGFuZGxlIH0gfTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBfcHJlKCAkc3RkZXJyICk7CisgICAgbXkgJHJjID0gc3lzdGVtKCBAJGNvbW1hbmQgKTsKKyAgICBteSAkZXJybm8gPSAkITsKKyAgICBteSAkY2hpbGQgPSAkPzsKKyAgICBfcG9zdCggJHN0ZGVyciApOworICAgIF9wb3N0KCAkc3Rkb3V0ICk7CisgICAgX3Bvc3QoICRzdGRpbiAgKTsKKworICAgIG15ICRleGl0ID0gMDsKKyAgICBteSAkc2lnbmFsX251bSAgPSAkY2hpbGQgJiAxMjc7CisgICAgbXkgJGV4aXRfc3RhdHVzID0gJGNoaWxkID4+IDg7CisgICAgJEAgPSAiIjsKKworICAgIGlmICggJHJjID09IC0xICkgeworICAgICAgICAkQCA9ICJcIiRjb21tYW5kLT5bIDAgXVwiIGZhaWxlZDogJGVycm5vIjsKKyAgICAgICAgJGV4aXQgPSAtMjU2OworICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWlnbm9yZV9zaWduYWwgfSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRAICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2lmICggJHNpZ25hbF9udW0gIT0gMCApIHsKKyAgICAgICAgJEAgPSAiXCIkY29tbWFuZC0+WyAwIF1cIiBmYWlsZWQgZHVlIHRvIHNpZ25hbCAkc2lnbmFsX251bS4iOworICAgICAgICAkZXhpdCA9IC0gJHNpZ25hbF9udW07CisgICAgICAgIGlmICggbm90ICRvcHRzeyAtaWdub3JlX3NpZ25hbCB9ICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggJEAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzaWYgKCAkZXhpdF9zdGF0dXMgIT0gMCApIHsKKyAgICAgICAgJEAgPSAiXCIkY29tbWFuZC0+WyAwIF1cIiByZXR1cm5lZCBub24temVybyBzdGF0dXMgJGV4aXRfc3RhdHVzLiI7CisgICAgICAgICRleGl0ID0gJGV4aXRfc3RhdHVzOworICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWlnbm9yZV9zdGF0dXMgfSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRAICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gJGV4aXQ7CisKK307ICMgc3ViIGV4ZWN1dGUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8YmFja3RpY2tzKCBbIEBjb21tYW5kIF0sIEBvcHRpb25zICk+CisKK1J1biBzcGVjaWZpZWQgcHJvZ3JhbSBvciBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm4gb3V0cHV0LgorCitJbiBzY2FsYXIgY29udGV4dCBlbnRpcmUgb3V0cHV0IGlzIHJldHVybmVkIGluIGEgc2luZ2xlIHN0cmluZy4gSW4gbGlzdCBjb250ZXh0IGxpc3Qgb2Ygc3RyaW5ncworaXMgcmV0dXJuZWQuIEZ1bmN0aW9uIGlzc3VlcyBhbiBlcnJvciBhbmQgZXhpdHMgc2NyaXB0IGlmIGFueSBlcnJvciBvY2N1cnMuCisKKz1jdXQKKworCitzdWIgYmFja3RpY2tzKCRAKSB7CisKKyAgICBteSAkY29tbWFuZCA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzICAgID0gQF87CisgICAgbXkgQG91dHB1dDsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtY2hvbXAgKSBdICk7CisKKyAgICBleGVjdXRlKCAkY29tbWFuZCwgLXN0ZG91dCA9PiBcQG91dHB1dCApOworCisgICAgaWYgKCAkb3B0c3sgLWNob21wIH0gKSB7CisgICAgICAgIGNob21wKCBAb3V0cHV0ICk7CisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuICggd2FudGFycmF5KCkgPyBAb3V0cHV0IDogam9pbiggIiIsIEBvdXRwdXQgKSApOworCit9OyAjIHN1YiBiYWNrdGlja3MKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBwYWQoJCQkKSB7CisgICAgbXkgKCAkc3RyLCAkbGVuZ3RoLCAkcGFkICkgPSBAXzsKKyAgICBteSAkbHN0ciA9IGxlbmd0aCggJHN0ciApOyAgICAjIExlbmd0aCBvZiBzb3VyY2Ugc3RyaW5nLgorICAgIGlmICggJGxzdHIgPCAkbGVuZ3RoICkgeworICAgICAgICBteSAkbHBhZCAgPSBsZW5ndGgoICRwYWQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgcGFkLgorICAgICAgICBteSAkY291bnQgPSBpbnQoICggJGxlbmd0aCAtICRsc3RyICkgLyAkbHBhZCApOyAgICAgIyBOdW1iZXIgb2YgcGFkIHJlcGV0aXRpb25zLgorICAgICAgICBteSAkdGFpbCAgPSAkbGVuZ3RoIC0gKCAkbHN0ciArICRscGFkICogJGNvdW50ICk7CisgICAgICAgICRzdHIgPSAkc3RyIC4gKCAkcGFkIHggJGNvdW50ICkgLiBzdWJzdHIoICRwYWQsIDAsICR0YWlsICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkc3RyOworfTsgIyBzdWIgcGFkCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWJhY2sKKworPWN1dAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmV0dXJuIDE7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9Y3V0CisKKyMgRW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbCBiL3JjMy9ydW50aW1lL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyMmM5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbApAQCAtMCwwICsxLDc3NSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbGU6Okdsb2IgIjpnbG9iIjsKK3VzZSBFbmNvZGUgcXd7IGVuY29kZSB9OworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wNCI7CitteSAkZXNjYXBlICAgICAgPSBxcnslfTsKK215ICRwbGFjZWhvbGRlciA9IHFyeyhcZClcJChzfGw/W2R1XSl9OworbXkgJHRhcmdldF9vczsKKworbXkgJHNlY3Rpb25zID0KKyAgICB7CisgICAgICAgIG1ldGEgICAgID0+IHsgc2hvcnQgPT4gInBycCIgfSwgIyAicHJwIiBzdGFuZHMgZm9yICJwcm9wZXJ0eSIuCisgICAgICAgIHN0cmluZ3MgID0+IHsgc2hvcnQgPT4gInN0ciIgfSwKKyAgICAgICAgZm9ybWF0cyAgPT4geyBzaG9ydCA9PiAiZm10IiB9LAorICAgICAgICBtZXNzYWdlcyA9PiB7IHNob3J0ID0+ICJtc2ciIH0sCisgICAgICAgIGhpbnRzICAgID0+IHsgc2hvcnQgPT4gImhudCIgfSwKKyAgICB9OworbXkgQHNlY3Rpb25zID0gcXd7IG1ldGEgc3RyaW5ncyBmb3JtYXRzIG1lc3NhZ2VzIGhpbnRzIH07CisjIEFzc2lnbiBzZWN0aW9uIHByb3BlcnRpZXM6IGxvbmcgbmFtZSwgc2V0IG51bWJlciwgYmFzZSBudW1iZXIuCittYXAoICRzZWN0aW9ucy0+eyAkc2VjdGlvbnNbICRfIF0gfS0+eyBsb25nIH0gPSAkc2VjdGlvbnNbICRfIF0sICAgICAgKCAwIC4uIEBzZWN0aW9ucyAtIDEgKSApOworbWFwKCAkc2VjdGlvbnMtPnsgJHNlY3Rpb25zWyAkXyBdIH0tPnsgc2V0ICB9ID0gKCAkXyArIDEgKSwgICAgICAgICAgICggMCAuLiBAc2VjdGlvbnMgLSAxICkgKTsKK21hcCggJHNlY3Rpb25zLT57ICRzZWN0aW9uc1sgJF8gXSB9LT57IGJhc2UgfSA9ICggKCAkXyArIDEgKSA8PCAxNiApLCAoIDAgLi4gQHNlY3Rpb25zIC0gMSApICk7CisKKyMgUHJvcGVydGllcyBvZiBNZXRhIHNlY3Rpb24uCitteSBAcHJvcGVydGllcyA9IHF3eyBMYW5ndWFnZSBDb3VudHJ5IExhbmdJZCBWZXJzaW9uIFJldmlzaW9uIH07CisKKworc3ViIF9nZW5lcmF0ZV9jb21tZW50KCQkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJG9wZW4sICRjbG9zZSApID0gQF87CisgICAgbXkgJGJ1bGsgPQorICAgICAgICAkb3BlbiAuICIgRG8gbm90IGVkaXQgdGhpcyBmaWxlISAiIC4gJGNsb3NlIC4gIlxuIiAuCisgICAgICAgICRvcGVuIC4gIiBUaGUgZmlsZSB3YXMgZ2VuZXJhdGVkIGZyb20gIiAuIGdldF9maWxlKCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgc291cmNlIH0gKSAuCisgICAgICAgICAgICAiIGJ5ICIgLiAkdG9vbCAuICIgb24gIiAuIGxvY2FsdGltZSgpIC4gIi4gIiAuICRjbG9zZSAuICJcbiI7CisgICAgcmV0dXJuICRidWxrOworCit9OyAjIHN1YiBfZ2VuZXJhdGVfY29tbWVudAorCisKK3N1YiBtc2cyc2duKCQpIHsKKworICAgICMgQ29udmVydCBtZXNzYWdlIHN0cmluZyB0byBzaWduYXR1cmUuIFNpZ25hdHVyZSBpcyBhIGxpc3Qgb2YgcGxhY2Vob2xkZXJzIGluIHNvcnRlZCBvcmRlci4KKyAgICAjIEZvciBleGFtcGxlLCBzaWduYXR1cmUgb2YgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iIGlzICIlMSRzICUyJHMiLgorCisgICAgbXkgKCAkbXNnICkgPSBAXzsKKyAgICBteSBAcGxhY2Vob2xkZXJzOworICAgIHBvcyggJG1zZyApID0gMDsKKyAgICB3aGlsZSAoICRtc2cgPX4gbXtcRy4qPyRlc2NhcGUkcGxhY2Vob2xkZXJ9ZyApIHsKKyAgICAgICAgJHBsYWNlaG9sZGVyc1sgJDEgLSAxIF0gPSAiJSQxXCQkMiI7CisgICAgfTsgIyB3aGlsZQorICAgIGZvciAoIG15ICRpID0gMTsgJGkgPD0gQHBsYWNlaG9sZGVyczsgKysgJGkgKSB7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRwbGFjZWhvbGRlcnNbICRpIC0gMSBdICkgKSB7CisgICAgICAgICAgICAkcGxhY2Vob2xkZXJzWyAkaSAtIDEgXSA9ICIlJGlcJC0iOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3IgJGkKKyAgICByZXR1cm4gam9pbiggIiAiLCBAcGxhY2Vob2xkZXJzICk7CisKK307ICMgc3ViIG1zZzJzZ24KKworCitzdWIgbXNnMnNyYygkKSB7CisKKyAgICAjIENvbnZlcnQgbWVzc2FnZSBzdHJpbmcgdG8gYSBDIHN0cmluZyBjb25zdGFudC4KKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICAgICAkbXNnID1+IHN7JGVzY2FwZSRwbGFjZWhvbGRlcn17XCUkMSEkMiF9ZzsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRtc2c7CisKK307ICMgc3ViIG1zZzJzcmMKKworCitteSAkc3BlY2lhbCA9CisgICAgeworICAgICAgICAibiIgPT4gIlxuIiwKKyAgICAgICAgInQiID0+ICJcdCIsCisgICAgfTsKKworc3ViIG1zZzJtYygkKSB7CisgICAgbXkgKCAkbXNnICkgPSBAXzsKKyAgICAkbXNnID0gbXNnMnNyYyggJG1zZyApOyAjIEdldCB3aW5kb3dzIHN0eWxlIHBsYWNlaG9sZGVycy4KKyAgICAkbXNnID1+IHN7XFwoLil9eyBleGlzdHMoICRzcGVjaWFsLT57ICQxIH0gKSA/ICRzcGVjaWFsLT57ICQxIH0gOiAkMSB9Z2U7CisgICAgcmV0dXJuICRtc2c7Cit9OyAjIHN1YiBtc2cybWMKKworCisKK3N1YiBwYXJzZV9tZXNzYWdlKCQpIHsKKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgcG9zKCAkbXNnICkgPSAwOworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaWYgKCAkbXNnICF+IG17XEcuKj8kZXNjYXBlfWdjICkgeworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoICRtc2cgIX4gbXtcRyRwbGFjZWhvbGRlcn1nYyApIHsKKyAgICAgICAgICAgIHJldHVybiAiQmFkICUtc2VxdWVuY2UgbmVhciBcIiUiIC4gc3Vic3RyKCAkbXNnLCBwb3MoICRtc2cgKSwgNyApIC4gIlwiIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZXZlcgorICAgIHJldHVybiB1bmRlZjsKKworfTsgIyBzdWIgcGFyc2VfbWVzc2FnZQorCisKK3N1YiBwYXJzZV9zb3VyY2UoJCkgeworCisgICAgbXkgKCAkbmFtZSApID0gQF87CisKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggJG5hbWUsIC1sYXllciA9PiAiOnV0ZjgiICk7CisgICAgbXkgJGRhdGEgPSB7fTsKKworICAgIG15ICRsaW5lOworICAgIG15ICRuID0gMDsgICAgICAgICAjIExpbmUgbnVtYmVyLgorICAgIG15ICRvYnNvbGV0ZSA9IDA7ICAjIENvdW50ZXIgb2Ygb2Jzb2xldGUgZW50cmllcy4KKyAgICBteSAkbGFzdF9pZHg7CisgICAgbXkgJWlkZW50czsKKyAgICBteSAkc2VjdGlvbjsKKworICAgIG15ICRlcnJvciA9CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAoICRuLCAkbGluZSwgJG1zZyApID0gQF87CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiRXJyb3IgcGFyc2luZyAkbmFtZSBsaW5lICRuOiAiIC4gIiRtc2c6XG4iIC4gIiAgICAkbGluZSIgKTsKKyAgICAgICAgfTsgIyBzdWIKKworICAgIGZvcmVhY2ggJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgKysgJG47CisgICAgICAgICMgU2tpcCBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHMuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQVxzKihcbnwjKX0gKSB7CisgICAgICAgICAgICAkbGFzdF9pZHggPSB1bmRlZjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBzZWN0aW9uIGhlYWRlci4KKyAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBLVwqLVxzKihbQS1aX10qKVxzKi1cKi1ccypcblx6fWkgKSB7CisgICAgICAgICAgICAkc2VjdGlvbiA9ICggbGMoICQxICkgKTsKKyAgICAgICAgICAgIGlmICggbm90IGdyZXAoICRzZWN0aW9uIGVxICRfLCBAc2VjdGlvbnMgKSApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5rbm93biBzZWN0aW9uIFwiJHNlY3Rpb25cIiBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoIGV4aXN0cyggJGRhdGEtPnsgJHNlY3Rpb24gfSApICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJNdWx0aXBsZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICVpZGVudHMgPSAoKTsgICAgICMgQ2xlYW4gbGlzdCBvZiBrbm93biBtZXNzYWdlIGlkZW50aWZpZXJzLgorICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkc2VjdGlvbiApICkgeworICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlNlY3Rpb24gaGVhZGluZyBleHBlY3RlZCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIHNlY3Rpb24gYm9keS4KKyAgICAgICAgaWYgKCAkc2VjdGlvbiBlcSAibWV0YSIgKSB7CisgICAgICAgICAgICBpZiAoICRsaW5lID1+IG17XEEoW0EtWl9dW0EtWl8wLTldKilccysiKC4qKSJccyo/XG4/XHp9aSApIHsKKyAgICAgICAgICAgICAgICAjIFBhcnNlIG1ldGEgcHJvcGVydGllcyAoc3VjaCBhcyBMYW5ndWFnZSwgQ291bnRyeSwgYW5kIExhbmdJZCkuCisgICAgICAgICAgICAgICAgbXkgKCAkcHJvcGVydHksICR2YWx1ZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCBncmVwKCAkXyBlcSAkcHJvcGVydHkgLCBAcHJvcGVydGllcyApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5rbm93biBwcm9wZXJ0eSBcIiRwcm9wZXJ0eVwiIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRkYXRhLT57ICIlbWV0YSIgfS0+eyAkcHJvcGVydHkgfSApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiUHJvcGVydHkgXCIkcHJvcGVydHlcIiBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9ID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRsYXN0X2lkeCA9IHVuZGVmOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiUHJvcGVydHkgbGluZSBleHBlY3RlZCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIG1lc3NhZ2UuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQShbQS1aX11bQS1aXzAtOV0qKVxzKyIoLiopIlxzKj9cbj9cen1pICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsICRtZXNzYWdlICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgaWYgKCAkaWRlbnQgZXEgIk9CU09MRVRFIiApIHsKKyAgICAgICAgICAgICAgICAjIElmIGlkIGlzICJPQlNPTEVURSIsIGFkZCBhIHVuaXF1ZSBzdWZmaXguIEl0IHByb3ZpZGVzIGNvbnZlbmllbnQgd2F5IHRvIG1hcmsKKyAgICAgICAgICAgICAgICAjIG9ic29sZXRlIG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgICsrICRvYnNvbGV0ZTsKKyAgICAgICAgICAgICAgICAkaWRlbnQgLj0gJG9ic29sZXRlOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgaWYgKCBleGlzdHMoICRpZGVudHN7ICRpZGVudCB9ICkgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIklkZW50aWZpZXIgXCIkaWRlbnRcIiBpcyByZWRlZmluZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAjIENoZWNrICUtc2VxdWVuY2VzLgorICAgICAgICAgICAgbXkgJGVyciA9IHBhcnNlX21lc3NhZ2UoICRtZXNzYWdlICk7CisgICAgICAgICAgICBpZiAoICRlcnIgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgJGVyciApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBTYXZlIG1lc3NhZ2UuCisgICAgICAgICAgICBwdXNoKCBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0sIFsgJGlkZW50LCAkbWVzc2FnZSBdICk7CisgICAgICAgICAgICAkaWRlbnRzeyAkaWRlbnQgfSA9IDE7CisgICAgICAgICAgICAkbGFzdF9pZHggPSBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gLSAxOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIGNvbnRpbnVhdGlvbiBsaW5lLgorICAgICAgICBpZiAoICRsaW5lID1+IG17XEFccyoiKC4qKSJccypcen0gKSB7CisgICAgICAgICAgICBteSAkbWVzc2FnZSA9ICQxOworICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGxhc3RfaWR4ICkgICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJVbmV4cGVjdGVkIGNvbnRpbnVhdGlvbiBsaW5lIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBDaGVjayAlLXNlcXVlbmNlcy4KKyAgICAgICAgICAgIG15ICRlcnIgPSBwYXJzZV9tZXNzYWdlKCAkbWVzc2FnZSApOworICAgICAgICAgICAgaWYgKCAkZXJyICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICRlcnIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICMgU2F2ZSBjb250aW51YXRpb24uCisgICAgICAgICAgICAkZGF0YS0+eyAkc2VjdGlvbiB9LT5bICRsYXN0X2lkeCBdLT5bIDEgXSAuPSAkbWVzc2FnZTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIk1lc3NhZ2UgZGVmaW5pdGlvbiBleHBlY3RlZCIgKTsKKyAgICB9OyAjIGZvcmVhY2gKKyAgICAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgc291cmNlIH0gPSAkbmFtZTsKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBpZiAoIG5vdCBleGlzdHMoICRkYXRhLT57ICRzZWN0aW9uIH0gKSApIHsKKyAgICAgICAgICAgICRkYXRhLT57ICRzZWN0aW9uIH0gPSBbXTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkc2VjdGlvbgorCisgICAgZm9yZWFjaCBteSAkcHJvcGVydHkgKCBAcHJvcGVydGllcyApIHsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9ICkgKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nICRuYW1lOiAiIC4KKyAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVkIFwiJHByb3BlcnR5XCIgcHJvcGVydHkgaXMgbm90IHNwZWNpZmllZCIKKyAgICAgICAgICAgICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcHVzaCggQHsgJGRhdGEtPnsgbWV0YSB9IH0sIFsgJHByb3BlcnR5LCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgJHByb3BlcnR5IH0gXSApOworICAgIH07ICMgZm9yZWFjaAorCisgICAgcmV0dXJuICRkYXRhOworCit9OyAjIHN1YiBwYXJzZV9zb3VyY2UKKworCitzdWIgZ2VuZXJhdGVfZW51bSgkJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlLCAkcHJlZml4ICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworCisgICAgJGJ1bGsgPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICIvLyIsICIvLyIgKSAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiZW51bSAke3ByZWZpeH1faWQge1xuXG4iIC4KKyAgICAgICAgIiAgICAvLyBBIHNwZWNpYWwgaWQgZm9yIGFic2VuY2Ugb2YgbWVzc2FnZS5cbiIgLgorICAgICAgICAiICAgICR7cHJlZml4fV9udWxsID0gMCxcblxuIjsKKworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRwcm9wcyA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9OyAgICAjIFNlY3Rpb24gcHJvcGVydGllcy4KKyAgICAgICAgbXkgJHNob3J0ID0gJHByb3BzLT57IHNob3J0IH07ICAgICAgICAgICMgU2hvcnQgc2VjdGlvbiBuYW1lLCBmcmVxdWVudGx5IHVzZWQuCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgIC8vIFNldCAjJHByb3BzLT57IHNldCB9LCAkcHJvcHMtPnsgbG9uZyB9LlxuIiAuCisgICAgICAgICAgICAiICAgICR7cHJlZml4fV8ke3Nob3J0fV9maXJzdCA9ICRwcm9wcy0+eyBiYXNlIH0sXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsIHVuZGVmICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV8ke3Nob3J0fV8ke2lkZW50fSxcbiI7CisgICAgICAgIH07ICMgZm9yZWFjaAorICAgICAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV8ke3Nob3J0fV9sYXN0LFxuXG4iOworICAgIH07ICMgZm9yZWFjaCAkdHlwZQorICAgICRidWxrIC49ICIgICAgJHtwcmVmaXh9X3h4eF9sYXN0ZXN0XG5cbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAifTsgLy8gZW51bSAke3ByZWZpeH1faWRcbiIgLgorICAgICAgICAiXG4iIC4KKyAgICAgICAgInR5cGVkZWYgZW51bSAke3ByZWZpeH1faWQgICR7cHJlZml4fV9pZF90O1xuIiAuCisgICAgICAgICJcbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAiXG4iIC4KKyAgICAgICAgIi8vIGVuZCBvZiBmaWxlIC8vXG4iOworCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsayApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9lbnVtCisKKworc3ViIGdlbmVyYXRlX3NpZ25hdHVyZSgkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUgKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisKKyAgICAkYnVsayAuPSAiLy8gbWVzc2FnZSBjYXRhbG9nIHNpZ25hdHVyZSBmaWxlIC8vXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBteSAkcHJvcHMgPSAkc2VjdGlvbnMtPnsgJHNlY3Rpb24gfTsgICAgIyBTZWN0aW9uIHByb3BlcnRpZXMuCisgICAgICAgIG15ICRzaG9ydCA9ICRwcm9wcy0+eyBzaG9ydCB9OyAgICAgICAgICAjIFNob3J0IHNlY3Rpb24gbmFtZSwgZnJlcXVlbnRseSB1c2VkLgorICAgICAgICAkYnVsayAuPSAiLSotICIgLiB1YyggJHByb3BzLT57IGxvbmcgfSApIC4gIi0qLVxuXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsICRtc2cgKSA9IEAkaXRlbTsKKyAgICAgICAgICAgICRidWxrIC49IHNwcmludGYoICIlLTQwcyAlc1xuIiwgJGlkZW50LCBtc2cyc2duKCAkbXNnICkgKTsKKyAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgICRidWxrIC49ICJcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisKKyAgICAkYnVsayAuPSAiLy8gZW5kIG9mIGZpbGUgLy9cbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrICk7CisKK307ICMgc3ViIGdlbmVyYXRlX3NpZ25hdHVyZQorCisKK3N1YiBnZW5lcmF0ZV9kZWZhdWx0KCQkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUsICRwcmVmaXggKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICIvLyIsICIvLyIgKSAuCisgICAgICAgICJcbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgInN0YXRpYyBjaGFyIGNvbnN0ICpcbiIgLgorICAgICAgICAgICAgIl9fJHtwcmVmaXh9X2RlZmF1bHRfJHtzZWN0aW9ufSIgLiAiW10gPVxuIiAuCisgICAgICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAgICAgIiAgICAgICAgTlVMTCxcbiI7CisgICAgICAgIGZvcmVhY2ggbXkgJGl0ZW0gKCBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gKSB7CisgICAgICAgICAgICBteSAoIHVuZGVmLCAkbXNnICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSAiICAgICAgICBcIiIgLiBtc2cyc3JjKCAkbXNnICkgLiAiXCIsXG4iOworICAgICAgICB9OyAjIHdoaWxlCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgICAgICBOVUxMXG4iIC4KKyAgICAgICAgICAgICIgICAgfTtcbiIgLgorICAgICAgICAgICAgIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKworICAgICRidWxrIC49CisgICAgICAgICJzdHJ1Y3Qga21wX2kxOG5fc2VjdGlvbiB7XG4iIC4KKyAgICAgICAgIiAgICBpbnQgICAgICAgICAgIHNpemU7XG4iIC4KKyAgICAgICAgIiAgICBjaGFyIGNvbnN0ICoqIHN0cjtcbiIgLgorICAgICAgICAifTsgLy8gc3RydWN0IGttcF9pMThuX3NlY3Rpb25cbiIgLgorICAgICAgICAidHlwZWRlZiBzdHJ1Y3Qga21wX2kxOG5fc2VjdGlvbiAga21wX2kxOG5fc2VjdGlvbl90O1xuIiAuCisgICAgICAgICJcbiIgLgorICAgICAgICAic3RhdGljIGttcF9pMThuX3NlY3Rpb25fdFxuIiAuCisgICAgICAgICJfXyR7cHJlZml4fV9zZWN0aW9uc1tdID1cbiIgLgorICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAiICAgICAgICB7IDAsIE5VTEwgfSxcbiI7CisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICIgICAgICAgIHsgIiAuIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSAuICIsIF9fJHtwcmVmaXh9X2RlZmF1bHRfJHtzZWN0aW9ufSB9LFxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKyAgICAkYnVsayAuPQorICAgICAgICAiICAgICAgICB7IDAsIE5VTEwgfVxuIiAuCisgICAgICAgICIgICAgfTtcbiIgLgorICAgICAgICAiXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgInN0cnVjdCBrbXBfaTE4bl90YWJsZSB7XG4iIC4KKyAgICAgICAgIiAgICBpbnQgICAgICAgICAgICAgICAgICAgc2l6ZTtcbiIgLgorICAgICAgICAiICAgIGttcF9pMThuX3NlY3Rpb25fdCAqICBzZWN0O1xuIiAuCisgICAgICAgICJ9OyAvLyBzdHJ1Y3Qga21wX2kxOG5fdGFibGVcbiIgLgorICAgICAgICAidHlwZWRlZiBzdHJ1Y3Qga21wX2kxOG5fdGFibGUgIGttcF9pMThuX3RhYmxlX3Q7XG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJzdGF0aWMga21wX2kxOG5fdGFibGVfdCBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUgPVxuIiAuCisgICAgICAgICIgICAge1xuIiAuCisgICAgICAgICIgICAgICAgICIgLiBAc2VjdGlvbnMgLiAiLFxuIiAuCisgICAgICAgICIgICAgICAgIF9fa21wX2kxOG5fc2VjdGlvbnNcbiIgLgorICAgICAgICAiICAgIH07XG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICIvLyBlbmQgb2YgZmlsZSAvL1xuIjsKKworICAgIHdyaXRlX2ZpbGUoICRmaWxlLCBcJGJ1bGsgKTsKKworfTsgIyBzdWIgZ2VuZXJhdGVfZGVmYXVsdAorCisKK3N1YiBnZW5lcmF0ZV9tZXNzYWdlX3VuaXgoJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlICkgPSBAXzsKKyAgICBteSAkYnVsayAgICAgPSAiIjsKKworICAgICRidWxrIC49CisgICAgICAgIF9nZW5lcmF0ZV9jb21tZW50KCAkZGF0YSwgIlwkIiwgIlwkIiApIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJcJHF1b3RlIFwiXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgIlwkICIgLiAoICItIiB4IDc4ICkgLiAiXG5cJCAkc2VjdGlvblxuXCQgIiAuICggIi0iIHggNzggKSAuICJcblxuIiAuCisgICAgICAgICAgICAiXCRzZXQgJHNlY3Rpb25zLT57ICRzZWN0aW9uIH0tPnsgc2V0IH1cbiIgLgorICAgICAgICAgICAgIlxuIjsKKyAgICAgICAgbXkgJG4gPSAwOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgKysgJG47CisgICAgICAgICAgICAkYnVsayAuPSAiJG4gXCIiIC4gbXNnMnNyYyggJG1zZyApIC4gIlwiXG4iOworICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgJGJ1bGsgLj0gIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKworICAgICRidWxrIC49CisgICAgICAgICJcbiIgLgorICAgICAgICAiXCQgZW5kIG9mIGZpbGUgXCRcbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrLCAtbGF5ZXIgPT4gIjp1dGY4IiApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9tZXNzYWdlX2xpbnV4CisKKworc3ViIGdlbmVyYXRlX21lc3NhZ2Vfd2luZG93cygkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUgKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisgICAgbXkgJGxhbmd1YWdlID0gJGRhdGEtPnsgIiVtZXRhIiB9LT57IExhbmd1YWdlIH07CisgICAgbXkgJGxhbmdpZCAgID0gJGRhdGEtPnsgIiVtZXRhIiB9LT57IExhbmdJZCB9OworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgX2dlbmVyYXRlX2NvbW1lbnQoICRkYXRhLCAiOyIsICI7IiApIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJMYW5ndWFnZU5hbWVzID0gKCRsYW5ndWFnZT0kbGFuZ2lkOm1zZ18kbGFuZ2lkKVxuIiAuCisgICAgICAgICJcbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAiRmFjaWxpdHlOYW1lcz0oXG4iOworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRwcm9wcyA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9OyAgICAjIFNlY3Rpb24gcHJvcGVydGllcy4KKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICIgJHByb3BzLT57IHNob3J0IH09IiAuICRwcm9wcy0+eyBzZXQgfSAuIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKyAgICAkYnVsayAuPQorICAgICAgICAiKVxuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgbXkgJHNob3J0ID0gJHNlY3Rpb25zLT57ICRzZWN0aW9uIH0tPnsgc2hvcnQgfTsKKyAgICAgICAgbXkgJG4gPSAwOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgKysgJG47CisgICAgICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgICAgICJNZXNzYWdlSWQ9JG5cbiIgLgorICAgICAgICAgICAgICAgICJGYWNpbGl0eT0kc2hvcnRcbiIgLgorICAgICAgICAgICAgICAgICJMYW5ndWFnZT0kbGFuZ3VhZ2VcbiIgLgorICAgICAgICAgICAgICAgIG1zZzJtYyggJG1zZyApIC4gIlxuLlxuXG4iOworICAgICAgICB9OyAjIGZvcmVhY2ggJGl0ZW0KKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKworICAgICRidWxrIC49CisgICAgICAgICJcbiIgLgorICAgICAgICAiOyBlbmQgb2YgZmlsZSA7XG4iOworCisgICAgJGJ1bGsgPSBlbmNvZGUoICJVVEYtMTZMRSIsICRidWxrICk7ICMgQ29udmVydCB0ZXh0IHRvIFVURi0xNkxFIHVzZWQgaW4gV2luZG93cyogT1MuCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsaywgLWJpbmFyeSA9PiAxICk7CisKK307ICMgc3ViIGdlbmVyYXRlX21lc3NhZ2Vfd2luZG93cworCisKKyMKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIworCitteSAkaW5wdXRfZmlsZTsKK215ICRlbnVtX2ZpbGU7CitteSAkc2lnbmF0dXJlX2ZpbGU7CitteSAkZGVmYXVsdF9maWxlOworbXkgJG1lc3NhZ2VfZmlsZTsKK215ICRpZDsKK215ICRwcmVmaXggPSAiIjsKK2dldF9vcHRpb25zKAorICAgICJvcz1zIiAgICAgICAgICAgICA9PiBcJHRhcmdldF9vcywKKyAgICAiZW51bS1maWxlPXMiICAgICAgPT4gXCRlbnVtX2ZpbGUsCisgICAgInNpZ25hdHVyZS1maWxlPXMiID0+IFwkc2lnbmF0dXJlX2ZpbGUsCisgICAgImRlZmF1bHQtZmlsZT1zIiAgID0+IFwkZGVmYXVsdF9maWxlLAorICAgICJtZXNzYWdlLWZpbGU9cyIgICA9PiBcJG1lc3NhZ2VfZmlsZSwKKyAgICAiaWR8bGFuZy1pZCIgICAgICAgPT4gXCRpZCwKKyAgICAicHJlZml4PXMiCSAgICAgICA9PiBcJHByZWZpeCwKKyk7CitpZiAoIEBBUkdWID09IDAgKSB7CisgICAgY21kbGluZV9lcnJvciggIk5vIHNvdXJjZSBmaWxlIHNwZWNpZmllZCAtLSBub3RoaW5nIHRvIGRvIiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IHNvdXJjZSBmaWxlcyBzcGVjaWZpZWQiICk7Cit9OyAjIGlmCiskaW5wdXRfZmlsZSA9ICRBUkdWWyAwIF07CisKKworbXkgJGdlbmVyYXRlX21lc3NhZ2U7CitpZiAoICR0YXJnZXRfb3MgPX4gbXtcQSg/OmxpbnxtYWMpXHp9ICkgeworICAgICRnZW5lcmF0ZV9tZXNzYWdlID0gXCZnZW5lcmF0ZV9tZXNzYWdlX3VuaXg7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAkZ2VuZXJhdGVfbWVzc2FnZSA9IFwmZ2VuZXJhdGVfbWVzc2FnZV93aW5kb3dzOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgaXMgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworCisjCisjIERvIHRoZSB3b3JrLgorIworCitteSAkZGF0YSA9IHBhcnNlX3NvdXJjZSggJGlucHV0X2ZpbGUgKTsKK2lmICggZGVmaW5lZCggJGlkICkgKSB7CisgICAgcHJpbnQoICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5nSWQgfSwgIlxuIiApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZW51bV9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfZW51bSggJGRhdGEsICRlbnVtX2ZpbGUsICRwcmVmaXggKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJHNpZ25hdHVyZV9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfc2lnbmF0dXJlKCAkZGF0YSwgJHNpZ25hdHVyZV9maWxlICk7Cit9OyAjIGlmCitpZiAoIGRlZmluZWQoICRkZWZhdWx0X2ZpbGUgKSApIHsKKyAgICBnZW5lcmF0ZV9kZWZhdWx0KCAkZGF0YSwgJGRlZmF1bHRfZmlsZSwgJHByZWZpeCApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkbWVzc2FnZV9maWxlICkgKSB7CisgICAgJGdlbmVyYXRlX21lc3NhZ2UtPiggJGRhdGEsICRtZXNzYWdlX2ZpbGUgKTsKK307ICMgaWYKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxtZXNzYWdlLWNvbnZlcnRlci5wbD4gLS0gQ29udmVydCBtZXNzYWdlIGNhdGFsb2cgc291cmNlIGZpbGUgaW50byBhbm90aGVyIHRleHQgZm9ybXMuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPG1lc3NhZ2UtY29udmVydGVyLnBsPiBJPG9wdGlvbj4uLi4gPGZpbGU+CisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1lbnVtLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgZW51bSBmaWxlIG5hbWVkIEk8ZmlsZT4uCisKKz1pdGVtIEI8LS1kZWZhdWx0LWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgZGVmYXVsdCBtZXNzYWdlcyBmaWxlIG5hbWVkIEk8ZmlsZT4uCisKKz1pdGVtIEI8LS1sYW5nLWlkPgorCitQcmludCBsYW5ndWFnZSBpZGVudGlmaWVyIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2cgc291cmNlIGZpbGUuCisKKz1pdGVtIEI8LS1tZXNzYWdlLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgbWVzc2FnZSBmaWxlLgorCis9aXRlbSBCPC0tc2lnbmF0dXJlLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgc2lnbmF0dXJlIGZpbGUuCisKK1NpZ25hdHVyZXMgYXJlIHVzZWQgZm9yIGNoZWNraW5nIGNvbXBhdGliaWxpdHkuIEZvciBleGFtcGxlLCB0byBjaGVjayBhIHByaW1hcnkKK2NhdGFsb2cgYW5kIGl0cyB0cmFuc2xhdGlvbiB0byBhbm90aGVyIGxhbmd1YWdlLCBzaWduYXR1cmVzIG9mIGJvdGggY2F0YWxvZ3Mgc2hvdWxkIGJlIGdlbmVyYXRlZAorYW5kIGNvbXBhcmVkLiBJZiBzaWduYXR1cmVzIGFyZSBpZGVudGljYWwsIGNhdGFsb2dzIGFyZSBjb21wYXRpYmxlLgorCis9aXRlbSBCPC0tcHJlZml4PT5JPHByZWZpeD4KKworUHJlZml4IHRvIGJlIHVzZWQgZm9yIGFsbCBDIGlkZW50aWZpZXJzICh0eXBlIGFuZCB2YXJpYWJsZSBuYW1lcykgaW4gZW51bSBhbmQgZGVmYXVsdCBtZXNzYWdlcworZmlsZXMuCisKKz1pdGVtIEI8LS1vcz0+STxzdHI+CisKK1NwZWNpZnkgT1MgbmFtZSB0aGUgbWVzc2FnZSBmb3JtYXRzIHRvIGJlIGNvbnZlcnRlZCBmb3IuIElmIG5vdCBzcGVjaWZpZWQgZXhwb2xpY2l0bHksIHZhbHVlIG9mCitMSUJPTVBfT1MgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZC4gSWYgTElCT01QX09TIGlzIG5vdCBkZWZpbmVkLCBob3N0IE9TIGlzIGRldGVjdGVkLgorCitEZXBlbmRpbmcgb24gT1MsIEI8bWVzc2FnZS1jb252ZXJ0ZXIucGw+IGNvbnZlcnRzIG1lc3NhZ2UgZm9ybWF0cyB0byBHTlUgc3R5bGUgb3IgTVMgc3R5bGUuCisKKz1pdGVtIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBkb2N1bWVudGF0aW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBzdHJpbmcgYW5kIGV4aXQuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgaW5wdXQgZmlsZS4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKKz1oZWFkMiBNZXNzYWdlIENhdGFsb2cgRmlsZSBGb3JtYXQKKworSXQgaXMgcGxhaW4gdGV4dCBmaWxlIGluIFVURi04IGVuY29kaW5nLiBFbXB0eSBsaW5lcyBhbmQgbGluZXMgYmVnaW5uaW5nIHdpdGggc2hhcnAgc2lnbiAoQzwjPikgYXJlCitpZ25vcmVkLiBFQk5GIHN5bnRheCBvZiBjb250ZW50OgorCisgICAgY2F0YWxvZyAgICA9IHsgc2VjdGlvbiB9OworICAgIHNlY3Rpb24gICAgPSBoZWFkZXIgYm9keTsKKyAgICBoZWFkZXIgICAgID0gIi0qLSAiIHNlY3Rpb24taWQgIiAtKi0iICJcbiI7CisgICAgYm9keSAgICAgICA9IHsgbWVzc2FnZSB9OworICAgIG1lc3NhZ2UgICAgPSBtZXNzYWdlLWlkIHN0cmluZyAiXG4iIHsgc3RyaW5nICJcbiIgfTsKKyAgICBzZWN0aW9uLWlkID0gaWRlbnRpZmllcjsKKyAgICBtZXNzYWdlLWlkID0gIk9CU09MRVRFIiB8IGlkZW50aWZpZXI7CisgICAgaWRlbnRpZmllciA9IGxldHRlciB7IGxldHRlciB8IGRpZ2l0IHwgIl8iIH07CisgICAgc3RyaW5nICAgICA9ICIiIiB7IGNoYXJhY3RlciB9ICIiIjsKKworSWRlbnRpZmllciBzdGFydHMgd2l0aCBsZXR0ZXIsIHdpdGggZm9sbG93aW5nIGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzLiBJZGVudGlmaWVycyBhcmUKK2Nhc2Utc2Vuc2l0aXZlLiBTZXRpb24gaWRlbnRpZmllcnMgYXJlIGZpeGVkOiBDPE1FVEE+LCBDPFNUUklOR1M+LCBDPEZPUk1BVFM+LCBDPE1FU1NBR0VTPiBhbmQKK0M8SElOVFM+LiBNZXNzYWdlIGlkZW50aWZpZXJzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBzZWN0aW9uLiBTcGVjaWFsIEM8T0JTT0xFVEU+IHBzZXVkby1pZGVudGlmaWVyCittYXkgYmUgdXNlZCBtYW55IHRpbWVzLgorCitTdHJpbmcgaXMgYSBDIHN0cmluZyBsaXRlcmFsIHdoaWNoIG11c3Qgbm90IGNyb3NzIGxpbmUgYm91bmRhcmllcy4KK0xvbmcgbWVzc2FnZXMgbWF5IG9jY3VweSBtdWx0aXBsZSBsaW5lcywgYSBzdHJpbmcgcGVyIGxpbmUuCisKK01lc3NhZ2UgbWF5IGluY2x1ZGUgcHJpbnRmLWxpa2UgR05VLXN0eWxlIHBsYWNlaG9sZGVycyBmb3IgYXJndW1lbnRzOiBDPCVJPG4+JEk8dD4+LAord2hlcmUgSTxuPiBpcyBhcmd1bWVudCBudW1iZXIgKEM8MT4sIEM8Mj4sIC4uLiksCitJPHQ+IC0tIGFyZ3VtZW50IHR5cGUsIEM8cz4gKHN0cmluZykgb3IgQzxkPiAoMzItYml0IGludGVnZXIpLgorCitTZWUgYWxzbyBjb21tZW50cyBpbiBGPGkxOG4vZW5fVVMudHh0Pi4KKworPWhlYWQyIE91dHB1dCBGaWxlcworCitUaGlzIHNjcmlwdCBjYW4gZ2VuZXJhdGUgMyBkaWZmZXJlbnQgdGV4dCBmaWxlcyBmcm9tIHNpbmdsZSBzb3VyY2U6CisKKz1vdmVyCisKKz1pdGVtIEVudW0gZmlsZS4KKworRW51bSBmaWxlIGlzIGEgQyBpbmNsdWRlIGZpbGUsIGNvbnRhaW5pbmcgZGVmaW5pdGlvbnMgb2YgbWVzc2FnZSBpZGVudGlmaWVycywgZS4gZy46CisKKyAgICBlbnVtIGttcF9pMThuX2lkIHsKKworICAgICAgICAvLyBTZXQgIzEsIG1ldGEuCisgICAgICAgIGttcF9pMThuX3BycF9maXJzdCA9IDY1NTM2LAorICAgICAgICBrbXBfaTE4bl9wcnBfTGFuZ3VhZ2UsCisgICAgICAgIGttcF9pMThuX3BycF9Db3VudHJ5LAorICAgICAgICBrbXBfaTE4bl9wcnBfTGFuZ0lkLAorICAgICAgICBrbXBfaTE4bl9wcnBfVmVyc2lvbiwKKyAgICAgICAga21wX2kxOG5fcHJwX1JldmlzaW9uLAorICAgICAgICBrbXBfaTE4bl9wcnBfbGFzdCwKKworICAgICAgICAvLyBTZXQgIzIsIHN0cmluZ3MuCisgICAgICAgIGttcF9pMThuX3N0cl9maXJzdCA9IDEzMTA3MiwKKyAgICAgICAga21wX2kxOG5fc3RyX0Vycm9yLAorICAgICAgICBrbXBfaTE4bl9zdHJfVW5rbm93bkZpbGUsCisgICAgICAgIGttcF9pMThuX3N0cl9Ob3RBTnVtYmVyLAorICAgICAgICAuLi4KKworICAgICAgICAvLyBTZXQgIzMsIGZvdHJtYXRzLgorICAgICAgICAuLi4KKworICAgICAgICBrbXBfaTE4bl94eHhfbGFzdGVzdAorCisgICAgfTsgLy8gZW51bSBrbXBfaTE4bl9pZAorCisgICAgdHlwZWRlZiBlbnVtIGttcF9pMThuX2lkICBrbXBfaTE4bl9pZF90OworCis9aXRlbSBEZWZhdWx0IG1lc3NhZ2VzIGZpbGUuCisKK0RlZmF1bHQgbWVzc2FnZXMgZmlsZSBpcyBhIEMgaW5jbHVkZSBmaWxlIGNvbnRhaW5pbmcgZGVmYXVsdCBtZXNzYWdlcyB0byBiZSBlbWJlZGRlZCBpbnRvCithcHBsaWNhdGlvbiAoYW5kIHVzZWQgaWYgZXh0ZXJuYWwgbWVzc2FnZSBjYXRhbG9nIGRvZXMgbm90IGV4aXN0IG9yIGNvdWxkIG5vdCBiZSBvcGVuKToKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICoKKyAgICBfX2ttcF9pMThuX2RlZmF1bHRfbWV0YVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICJFbmdsaXNoIiwKKyAgICAgICAgICAgICJVU0EiLAorICAgICAgICAgICAgIjEwMzMiLAorICAgICAgICAgICAgIjIiLAorICAgICAgICAgICAgIjIwMDkwODA2IiwKKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgfTsKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICoKKyAgICBfX2ttcF9pMThuX2RlZmF1bHRfc3RyaW5nc1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgIkVycm9yIiwKKyAgICAgICAgICAgICIodW5rbm93biBmaWxlKSIsCisgICAgICAgICAgICAibm90IGEgbnVtYmVyIiwKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgTlVMTAorICAgICAgICB9OworCisgICAgLi4uCisKKz1pdGVtIE1lc3NhZ2UgZmlsZS4KKworTWVzc2FnZSBmaWxlIGlzIGFuIGlucHV0IGZvciBtZXNzYWdlIGNvbXBpbGVyLCBGPGdlbmNhdD4gb24gTGludXgqIE9TIGFuZCBPUyBYKiwgb3IgRjxtYy5leGU+IG9uCitXaW5kb3dzKiBPUy4KKworSGVyZSBpcyB0aGUgZXhhbXBsZSBvZiBMaW51eCogT1MgbWVzc2FnZSBmaWxlOgorCisgICAgJHF1b3RlICIKKyAgICAxICJKYXBhbmVzZSIKKyAgICAyICJKYXBhbiIKKyAgICAzICIxMDQxIgorICAgIDQgIjIiCisgICAgNSAiQmFzZWQgb24gRW5saXNoIG1lc3NhZ2UgY2F0YWxvZyByZXZpc2lvbiAyMDA5MDgwNiIKKyAgICAuLi4KKworRXhhbXBsZSBvZiBXaW5kb3dzKiBPUyBtZXNzYWdlIGZpbGU6CisKKyAgICBMYW5ndWFnZU5hbWVzID0gKEphcGFuZXNlPTEwMDQxOm1zZ18xMDQxKQorCisgICAgRmFjaWxpdHlOYW1lcyA9ICgKKyAgICAgcHJwPTEKKyAgICAgc3RyPTIKKyAgICAgZm10PTMKKyAgICAgLi4uCisgICAgKQorCisgICAgTWVzc2FnZUlkPTEKKyAgICBGYWNpbGl0eT1wcnAKKyAgICBMYW5ndWFnZT1KYXBhbmVzZQorICAgIEphcGFuZXNlCisgICAgLgorCisgICAgLi4uCisKKz1pdGVtIFNpZ25hdHVyZS4KKworU2lnbmF0dXJlIGlzIGEgcHJvY2Vzc2VkIHNvdXJjZSBmaWxlOiBjb21tZW50cyBzdHJpcHBlZCwgc3RyaW5ncyBkZWxldGVkLCBidXQgcGxhY2Vob2xkZXJzIGtlcHQgYW5kCitzb3J0ZWQuCisKKyAgICAtKi0gRk9STUFUUy0qLQorCisgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBXYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJGQgJTIkcworICAgIEZhdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkZCAlMiRzCisgICAgU3lzRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBIaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJC0gJTIkcworICAgIFByYWdtYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkcyAlMiRzICUzJHMgJTQkcworCitUaGUgcHVycG9zZSBvZiBzaWduYXR1cmVzIC0tIGNvbXBhcmUgdHdvIG1lc3NhZ2Ugc291cmNlIGZpbGVzIGZvciBjb21wYXRpYmlsaXR5LiBJZiBzaWduYXR1cmVzIG9mCit0d28gbWVzc2FnZSBzb3VyY2VzIGFyZSB0aGUgc2FtZSwgYmluYXJ5IG1lc3NhZ2UgY2F0YWxvZ3Mgd2lsbCBiZSBjb21wYXRpYmxlLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworR2VuZXJhdGUgaW5jbHVkZSBmaWxlIGNvbnRhaW5pbmcgbWVzc2FnZSBpZGVudGlmaWVyczoKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1lbnVtLWZpbGU9a21wX2kxOG5faWQuaW5jIGVuX1VTLnR4dAorCitHZW5lcmF0ZSBpbmNsdWRlIGZpbGUgY29udGF0aW5nIGRlZmF1bHQgbWVzc2FnZXM6CisKKyAgICAkIG1lc3NhZ2UtY29udmVydGVyLnBsIC0tZGVmYXVsdC1maWxlPWttcF9pMThuX2RlZmF1bHQuaW5jIGVuX1VTLnR4dAorCitHZW5lcmF0ZSBpbnB1dCBmaWxlIGZvciBtZXNzYWdlIGNvbXBpbGVyLCBMaW51eCogT1MgZXhhbXBsZToKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1tZXNzYWdlLWZpbGU9cnVfUlUuVVRGLTgubXNnIHJ1X1JVLnR4dAorCitHZW5lcmF0ZSBpbnB1dCBmaWxlIGZvciBtZXNzYWdlIGNvbXBpbGVyLCBXaW5kb3dzKiBPUyBleGFtcGxlOgorCisgICAgPiBtZXNzYWdlLWNvbnZlcnRlci5wbCAtLW1lc3NhZ2UtZmlsZT1ydV9SVS5VVEYtOC5tYyBydV9SVS50eHQKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9MSUNFTlNFIGIvcmMzL3Rlc3RzdWl0ZS9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOWZiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL0xJQ0VOU0UKQEAgLTAsMCArMSwzNCBAQAorICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgCisgIFVuaXZlcnNpdHkgb2YgSG91c3RvbiBTeXN0ZW0KKyAgCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisgIAorICBvIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAKKyAgbyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAKKyAgbyBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG9mIEhvdXN0b24gU3lzdGVtIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAKKwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC5jZmcgYi9yYzMvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTU3ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC5jZmcKQEAgLTAsMCArMSw3OCBAQAorIyAtKi0gUHl0aG9uIC0qLQorCisjIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlICdsaXQnIHRlc3QgcnVubmVyLgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IHBsYXRmb3JtCisKK3RyeToKKyAgIGltcG9ydCBsaXQudXRpbAorICAgaW1wb3J0IGxpdC5mb3JtYXRzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICBwYXNzCisKKyMgbmFtZTogVGhlIG5hbWUgb2YgdGhpcyB0ZXN0IHN1aXRlLgorY29uZmlnLm5hbWUgPSAnT3Blbk1QVmFsaWRhdGlvblN1aXRlJworCisjIHRlc3RGb3JtYXQ6IFRoZSB0ZXN0IGZvcm1hdCB0byB1c2UgdG8gaW50ZXJwcmV0IHRlc3RzLgorY29uZmlnLnRlc3RfZm9ybWF0ID0gbGl0LmZvcm1hdHMuU2hUZXN0KGV4ZWN1dGVfZXh0ZXJuYWw9RmFsc2UpCisKKyMgc3VmZml4ZXM6IEEgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgdG8gdHJlYXQgYXMgdGVzdCBmaWxlcworIyBOb3RlIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgbGl0LmxvY2FsLmNmZyBmaWxlcworY29uZmlnLnN1ZmZpeGVzID0gWycubGwnXQorCisjIHRlc3Rfc291cmNlX3Jvb3Q6IFRoZSByb290IHBhdGggd2hlcmUgdGVzdHMgYXJlIGxvY2F0ZWQuCisjY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgPSAiL2hvbWUvaWNob3lqeC9pbnN0YWxsL29wZW5tcC90ZXN0c3VpdGUvYmluIgorI29zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKworIyB0ZXN0X2V4ZWNfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBzaG91bGQgYmUgcnVuLgorI21wdnNfb2JqX3Jvb3QgPSBnZXRhdHRyKGNvbmZpZywgJ21wdnNfb2JqX3Jvb3QnLCBOb25lKQorI2lmIG1wdnNfb2JqX3Jvb3QgaXMgbm90IE5vbmU6Citjb25maWcudGVzdF9leGVjX3Jvb3QgPSAiLi8iCisjb3MucGF0aC5qb2luKG1wdnNfb2JqX3Jvb3QsICdzcmMnKQorCisjIERpc2NvdmVyIHRoZSAnY2xhbmcnIGFuZCAnY2xhbmdjYycgdG8gdXNlLgorCitpbXBvcnQgb3MKKworZGVmIGluZmVyQ2xhbmcoUEFUSCk6CisgICAgIyBEZXRlcm1pbmUgd2hpY2ggY2xhbmcgdG8gdXNlLgorICAgIGNsYW5nID0gb3MuZ2V0ZW52KCdDTEFORycpCisKKyAgICAjIElmIHRoZSB1c2VyIHNldCBjbGFuZyBpbiB0aGUgZW52aXJvbm1lbnQsIGRlZmluaXRlbHkgdXNlIHRoYXQgYW5kIGRvbid0CisgICAgIyB0cnkgdG8gdmFsaWRhdGUuCisgICAgaWYgY2xhbmc6CisgICAgICAgIHJldHVybiBjbGFuZworCisgICAgIyBPdGhlcndpc2UgbG9vayBpbiB0aGUgcGF0aC4KKyAgICBjbGFuZyA9IGxpdC51dGlsLndoaWNoKCdjbGFuZycsIFBBVEgpCisKKyAgICBpZiBub3QgY2xhbmc6CisgICAgICAgIGxpdF9jb25maWcuZmF0YWwoImNvdWxkbid0IGZpbmQgJ2NsYW5nJyBwcm9ncmFtLCB0cnkgc2V0dGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNMQU5HIGluIHlvdXIgZW52aXJvbm1lbnQiKQorCisgICAgcmV0dXJuIGNsYW5nCisKK2NvbmZpZy5jbGFuZyA9IGluZmVyQ2xhbmcoY29uZmlnLmVudmlyb25tZW50WydQQVRIJ10pLnJlcGxhY2UoJ1xcJywgJy8nKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCAoJyVjbGFuZycsICcgJyArIGNvbmZpZy5jbGFuZyArICcgJykgKQorCisjIFByb3BvZ2F0ZSBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRlc3QgZW52aXJvbm1lbnQuCitkZWYgYWRkRW52KG5hbWUpOgorICAgIGlmIG5hbWUgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgY29uZmlnLmVudmlyb25tZW50W25hbWVdID0gb3MuZW52aXJvbltuYW1lXQorCithZGRFbnYoJ0hPTUUnKQorYWRkRW52KCdQV0QnKQorCisKK2FkZEVudignQ19JTkNMVURFX1BBVEgnKQorYWRkRW52KCdDUExVU19JTkNMVURFX1BBVEgnKQorYWRkRW52KCdMSUJSQVJZX1BBVEgnKQorYWRkRW52KCdMRF9MSUJSQVJZX1BBVEgnKQorYWRkRW52KCdEWUxEX0xJQlJBUllfUEFUSCcpCisKKyMgQ2hlY2sgdGhhdCB0aGUgb2JqZWN0IHJvb3QgaXMga25vd24uCitpZiBjb25maWcudGVzdF9leGVjX3Jvb3QgaXMgTm9uZToKKyAgICBsaXQuZmF0YWwoJ3Rlc3QgZXhlY3V0aW9uIHJvb3Qgbm90IHNldCEnKQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC5zaXRlLmNmZy5pbiBiL3JjMy90ZXN0c3VpdGUvTExWTS1JUi9saXQuc2l0ZS5jZmcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4NjZkNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvTExWTS1JUi9saXQuc2l0ZS5jZmcuaW4KQEAgLTAsMCArMSwzMCBAQAorIyMgQXV0b2dlbmVyYXRlZCBieSBMTFZNL0NsYW5nIGNvbmZpZ3VyYXRpb24uCisjY29uZmlnLm1wdnNfc3JjX3Jvb3QgPSAiL2hvbWUvaWNob3lqeC9pbnN0YWxsL29wZW5tcC90ZXN0c3VpdGUvYmluL2MiCitjb25maWcubXB2c19vYmpfcm9vdCA9ICIvdG1wIgorY29uZmlnLmxsdm1fdG9vbHNfZGlyID0gIkBMTFZNX1RPT0xTX0RJUkAiCisKKworIyBOZWVkZWQgdG8gY2hlY2sgaWYgYSBoYWNrIG5lZWRzIHRvIGJlIGFwcGxpZWQKK2NvbmZpZy5sbHZtX3ZlcnNpb25fbWFqb3IgPSAiQExMVk1fVkVSU0lPTl9NQUpPUkAiCisKKyMgQ29tcGlsZXJzCisjIEZJWE1FOiB1c2UgbGx2bWNjIG5vdCBsbHZtZ2NjCitjb25maWcubGx2bWNsYW5nID0gImNsYW5nIgorCisjIEZlYXR1cmVzCitjb25maWcuZW5hYmxlX3VjbGliYyA9IFRydWUgaWYgQEVOQUJMRV9VQ0xJQkNAID09IDEgZWxzZSBGYWxzZQorY29uZmlnLmVuYWJsZV9wb3NpeF9ydW50aW1lID0gVHJ1ZSBpZiBARU5BQkxFX1BPU0lYX1JVTlRJTUVAID09IDEgZWxzZSBGYWxzZQorY29uZmlnLmhhdmVfc2VsaW51eCA9IFRydWUgaWYgQEhBVkVfU0VMSU5VWEAgPT0gMSBlbHNlIEZhbHNlCisKKyMgQ3VycmVudCB0YXJnZXQKK2NvbmZpZy50YXJnZXRfdHJpcGxlID0gIkBUQVJHRVRfVFJJUExFQCIKKworIyBMZXQgdGhlIG1haW4gY29uZmlnIGRvIHRoZSByZWFsIHdvcmsuCit0cnk6CisgIGxpdAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgIyBVc2UgbGl0X2NvbmZpZyBjbGFzcworICBsaXRfY29uZmlnLmxvYWRfY29uZmlnKGNvbmZpZywgIkBNUFZTX1NPVVJDRV9ESVJAL2xpdC5jZmciKQorZWxzZToKKyAgIyBVc2Ugb2xkIGxpdCBjbGFzcworICBsaXQubG9hZF9jb25maWcoY29uZmlnLCAiQE1QVlNfU09VUkNFX0RJUkAvbGl0LmNmZyIpCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnRtcCBiL3JjMy90ZXN0c3VpdGUvTExWTS1JUi9saXQudG1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDMwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnRtcApAQCAtMCwwICsxIEBACisuLi9MTFZNLUlSL2xpbl8zMmUvCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL01ha2VmaWxlIGIvcmMzL3Rlc3RzdWl0ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGJjM2RjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9NYWtlZmlsZQpAQCAtMCwwICsxLDI1NCBAQAorIyBHZW5lcmFsIE1ha2VmaWxlIGNvbnRhaW5pbmcgYWxsIHRoZSBuZWNlc3NhcnkgY29tcGlsZXIgZmxhZ3MgZm9yIHRoZSB0ZXN0cworCisjIG1vZGlmeSBDQyBhbmQgQ0ZMQUdTIGZvciBPcGVuTVAgQyBjb21waWxlcnMKKyMgbW9kaWZ5IEZDIGFuZCBGRkxBR1MgZm9yIE9wZW5NUCBGb3J0cmFuIGNvbXBpbGVycworCisKKyMgQ29udGVudDoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIDEuIEJhc2ljIHVzYWdlCisjIDIuIEdlbmVyYWwgdGVzdHN1aXRlIHNldHRpbmdzCisjIDMuIENvbXBpbGVyIHNlbGVjdGlvbiBhbmQgRmxhZ3MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDEuIEJhc2ljIHVzYWdlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgCW1ha2UgY3Rlc3QJCWdlbmVyYXRlIGMgdGVzdCAiY3Rlc3QiCisjIAltYWtlIGZ0ZXN0CQlnZW5lcmF0ZSBmb3J0cmFuIHRlc3QgImZ0ZXN0IgorIwltYWtlIGNsZWFuCQlyZW1vdmVzIGFsbCBzb3VyY2VzIGFuZCBiaW5hcmllcworIyAJbWFrZSBjbGVhbmFsbAlyZW1vdmVzIHNvdXJjZXMsYmluYXJpZXMgYW5kIGxvZ2ZpbGVzCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDIuIEdlbmVyYWwgdGVzdHN1aXRlIHNldHRpbmdzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBGb3IgZ2VuZXJhbCB0ZXN0c3VpdGUgc2V0dGluZ3Mgc2VlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKyMgb21wdHMuY29uZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMy4gQ29tcGlsZXIgc2VsZWN0aW9uIGFuZCBGbGFncworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ0xBTkcgQ29tcGlsZXIKK0NDICAgICA9IGNsYW5nCitDRkxBR1MgPSAtZm9wZW5tcCAtUyAtZW1pdC1sbHZtCitGQyAgICAgPSBnZm9ydHJhbgorRkZMQUdTID0gLWZvcGVubXAgLWxtCitGRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCisKKyMgR05VIENvbXBpbGVyCisjIENDICAgICA9IGdjYworIyBDRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCisjIEZDICAgICA9IGdmb3J0cmFuIAorIyBGRkxBR1MgPSAtZm9wZW5tcCAtbG0KKyMgRkZMQUdTID0gLWZvcGVubXAgLWxtIC1PMworCisjIEZ1aml0c3UgQ29tcGlsZXJzOgorI0NDID0gZmNjCisjQ0ZMQUdTID0gLUtPTVAsZmFzdF9HUDI9MgorI0ZDPWZydAorI0ZGTEFHUz0tS09NUCxmYXN0X0dQMj0yIC13IC1BbSAtWDkgLUZpeGVkCisKKworIyBQR0kgY29tcGlsZXJzCisjQ0MgPSBwZ2NjCisjQ0ZMQUdTID0gLW1wCisjQ0ZMQUdTID0gLW1wIC1EVkVSQk9TRQorI0NGTEFHUyA9IC1mYXN0IC1tcAorCisjRkMgPSBwZ2Y5MAorI0ZGTEFHUyA9IC1mYXN0IC1tcAorI0ZGTEFHUyA9IC1tcCAtZworCisKKyMgSW50ZWwgY29tcGlsZXJzOgorI0NDID0gaWNjCisjQ0ZMQUdTID0gLU8zIC1pcCAtb3Blbm1wCisjQ0ZMQUdTID0gLVdhbGwgLU8wIC1vcGVubXAKKyNDRkxBR1MgPSAgLW9wZW5tcCAtbG0KKyNDRkxBR1MgPSAgLW9wZW5tcCAtbG0gLURWRVJCT1NFCisKKyNGQyA9IGlmb3J0CisjRkZMQUdTID0gLW9wZW5tcCAtbG0gLWZwcAorCisjIE9tbmkgY29tcGlsZXJzOgorI0NDID0gb21wY2MKKyNDRkxBR1MgPSAtTzMgLWxtCisKKworIyBBc3N1cmUgY29tcGlsZXJzOgorI0NDID0gYXNzdXJlYworI0NGTEFHUyA9IC1PMyAtV0FwbmFtZT1wcm9qZWN0IC1EVVNFX0FTU1VSRT0xCisjRkMgPQorI0ZGTEFHUyA9CisKKyMgTkVDOgorI0NDID0gYysrCisjQ0MgPSBzeGMrKworI0NGTEFHUyA9IC1Qb3Blbm1wCisKKyNGQz1zeGY5MAorI0ZGTEFHUz0gLVBvcGVubXAKKworCisjIEhpdGFjaGk6CisjQ0MgPSB4Y2MKKyNDRkxBR1MgPSAtTzQgLXB2ZWMgK09wIC1wYXJhbGxlbCAtb21wCisjRkMgPQorI0ZGTEFHUyA9CisKKworIyBTR0k6CisjQ0MgPSBjYworI0NGTEFHUyA9IC1tcCAtbG0KKyNGQyA9CisjRkZMQUdTID0KKworCisjIElCTSBjb21waWxlcnM6CisjQ0MgPSB4bGNfcgorI0NGTEFHUyA9IC1xc21wPW9tcCAtbG0KKworCisjRkM9eGxmOTBfcgorI0ZGTEFHUz0tcXNtcD1vbXAgLXFmaXhlZD0xMzIgLXFsYW5nbHZsPWV4dGVuZGVkCisKKworIyBTVU4gY29tcGlsZXJzCisjQ0MgPSBjYworI0NGTEFHUyA9IC1mYXN0IC14b3Blbm1wIC1sbQorCisjRkMgPWY5MAorI0ZGTEFHUyA9IC14b3Blbm1wIC1mYXN0IC1sbQorCisKKyMgb3BlbjY0IGNvbXBpbGVycworIyByZW1hcms6IC1JLiB3YXMgYSB3b3JrYXJvdW5kIGJlY2F1c2UgdGhlIGluc3RhbGxhdGlvbiBjYW1lIHdpdGhvdXQgb21wLmggZmlsZQorI0NDID0gb3BlbmNjCisjQ0ZMQUdTID0gLU8wIC1vcGVubXAgLWxtIC1JLiAtbG9tcCAtbHB0aHJlYWQKKyNDRkxBR1MgPSAtTzAgLW9wZW5tcCAtbG0gLUkgL2hvbWUvbWF0dGhldy9vcHQvdXNyL2luY2x1ZGUgLWxwdGhyZWFkCisjQ0ZMQUdTID0gLW9wZW5tcCAtbG0KKworI0ZDID0gb3BlbmY5MAorI0ZGTEFHUyA9IC1PMCAtb3Blbm1wIC1sbSAgLWxvbXAgLWxwdGhyZWFkCisKKworI1BhdGhzY2FsZSBDb21waWxlcgorI0NDID0gcGF0aGNjCisjQ0ZMQUdTID0gLW1wIC1PZmFzdCAtbG0KKworI0ZDPXBhdGhmOTAKKyNGRkxBR1M9IC1tcCAtT2Zhc3QgLWxtCisKKworI09wZW5VSCBDb21waWxlcgorI0NDID0gdWhjYworI0NGTEFHUyA9IC1tcAorCisjRkMgPSB1aGY5MAorI0ZGTEFHUyA9IC1tcAorCisjIENoZWNrIHBhdGgKK0ZJTEU9TExWTS1JUi9saXQudG1wCitDSEVDS19QQVRIPWBjYXQgJChGSUxFKWAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitoZWxwOgorCUBlY2hvICJPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSwgdjMuMCIKKwlAZWNobyAiKEMpIFVuaXZlcnNpdHkgb2YgU3R1dHRnYXJ0LCBVbml2ZXJzaXR5IG9mIEhvdXN0b24iCisJQGVjaG8gIiIKKwlAZWNobyAiRG8gbWFrZSBbcnVsZV0sIHdoZXJlIHJ1bGUgbWF5IGJlIG9uZSBvZjoiCisJQGVjaG8gIiAgY3Rlc3QiCisJQGVjaG8gIiAgICBCdWlsZCBhbmQgcnVuIHRoZSBPcGVuTVAvQyB2YWxpZGF0aW9uIHRlc3RzLiIKKwlAZWNobyAiICBmdGVzdCIKKwlAZWNobyAiICAgIEJ1aWxkIGFuZCBydW4gdGhlIE9wZW5NUC9Gb3J0cmFuIHZhbGlkYXRpb24gdGVzdHMuIgorCUBlY2hvICIgIHByaW50X2NvbXBpbGVfb3B0aW9ucyIKKwlAZWNobyAiICAgIERpc3BsYXkgdGhlIGRlZmF1bHQgY29tcGlsZXIgYW5kIGNvbXBpbGVyIG9wdGlvbnMgYmVpbmcgdGVzdGVkIgorCUBlY2hvICIgIGNsZWFuc3JjcyIKKwlAZWNobyAiICAgIFJlbW92ZSBzb3VyY2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZXMiCisJQGVjaG8gIiAgY2xlYW5iaW5zIgorCUBlY2hvICIgICAgUmVtb3ZlIGV4ZWN1dGFibGVzIGZyb20gYmluLyBkaXJlY3RvcnkiCisJQGVjaG8gIiAgY2xlYW5vdXRzIgorCUBlY2hvICIgICAgUmVtb3ZlIGFsbCAqLm91dCBmaWxlcyBmcm9tIGJpbi8gZGlyZWN0b3J5IgorCUBlY2hvICIgIGNsZWFubG9ncyIKKwlAZWNobyAiICAgIFJlbW92ZSBhbGwgKi5sb2cgZmlsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbiIKKwlAZWNobyAiICAgIENsZWFuIG91dCBhbmQgbG9nIGZpbGVzIgorCUBlY2hvICIgIGRpc3RjbGVhbiIKKwlAZWNobyAiICAgIENsZWFuIGFyY2ggdGVzdCBkaXJlY3Rvcnkgd2l0aCBjbGVhbiIKKwlAZWNobyAiICB2ZXJ5Y2xlYW4iCisJQGVjaG8gIiAgICBSZW1vdmUgdGhlIGVudGlyZSBiaW4vYyBkaXJlY3Rvcnkgd2l0aCBkaXN0Y2xlYW4iCisKK29tcF9teV9zbGVlcDoKKwlta2RpciAtcCBiaW4vYworCWNwIG9tcF9teV9zbGVlcC5oIGJpbi9jLworb21wX3Rlc3RzdWl0ZTogb21wX3Rlc3RzdWl0ZS5oCisJbWtkaXIgLXAgYmluL2MKKwljcCBvbXBfdGVzdHN1aXRlLmggYmluL2MvCitvbXBfdGVzdHN1aXRlLmg6IG9tcHRzLWMuY29uZiBjLyoKKwkuL29tcHRzX21ha2VIZWFkZXIucGwgLWY9b21wdHMtYy5jb25mIC10PWMKKy5jLm86IG9tcF90ZXN0c3VpdGUgb21wX215X3NsZWVwCisJJChDQykgJChDRkxBR1MpIC1jICQ8CisKK2N0ZXN0OiBvbXBfbXlfc2xlZXAgb21wX3Rlc3RzdWl0ZQorCS4vcnVudGVzdC5wbCAtLWxhbmc9YyB0ZXN0bGlzdC1jLnR4dAorCWNkIGJpbi87IG1ha2UgLWoKKworZnRlc3Q6CisJbWtkaXIgLXAgYmluL2ZvcnRyYW4KKwljcCBvbXBfdGVzdHN1aXRlLmYgYmluL2ZvcnRyYW4KKwljcCBvbXBfbXlfc2xlZXAuZiBiaW4vZm9ydHJhbgorCS4vcnVudGVzdC5wbCAtLWxhbmc9Zm9ydHJhbiB0ZXN0bGlzdC1mLnR4dAorCitwcmludF9jb21waWxlX29wdGlvbnM6CisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gIkMgY29tcGlsZXIiCisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gImNvbXBpbGF0aW9uOiAkKENDKSAkKENGTEFHUykiCisJQCQoQ0MpIC0tdmVyc2lvbgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJGb3J0cmFuIGNvbXBpbGVyIgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJjb21waWxhdGlvbjogJChGQykgJChGRkxBR1MpIgorCUAkKEZDKSAtLXZlcnNpb24KKworCisKK3BhdGhfdG9fYXJjaD0kKHNoZWxsIC4uL3J1bnRpbWUvdG9vbHMvY2hlY2stb3Blbm1wLXRlc3QucGwpCisKK2NsZWFuc3JjczoKKwlmaW5kIGJpbi8gLWluYW1lICIqLltjZl0iIC1leGVjIHJtIC1yZiB7fSBcOworY2xlYW5iaW5zOgorCWZpbmQgYmluL2MgLXBlcm0gL2EreCAtdHlwZSBmIC1leGVjIHJtIC1yZiB7fSBcOworCWZpbmQgLi9iaW4vYyAtbm90IC1uYW1lICIqLmMiIC1hIC1ub3QgLW5hbWUgIioubGwiIC10eXBlIGYgLWV4ZWMgcm0gLXJmIHt9IFw7CitjbGVhbm91dHM6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5vdXQiIC1leGVjIHJtIC1yZiB7fSBcOworY2xlYW5sb2dzOgorCWZpbmQgYmluLyAtaW5hbWUgIioubG9nIiAtZXhlYyBybSAtcmYge30gXDsKKwlybSAtcmYgLi8kKHBhdGhfdG9fYXJjaCkKKworY2xlYW46IGNsZWFub3V0cyBjbGVhbmxvZ3MgY2xlYW5iaW5zIGNsZWFuc3JjcworCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLXJmIGJpbi9jLyoKKwlybSAtcmYgTExWTS1JUi8kKENIRUNLX1BBVEgpCisKK3ZlcnljbGVhbjogZGlzdGNsZWFuCisJcm0gLXJmIGJpbi9jLworCXJtIC1yZiBiaW4vZm9ydHJhbi8KKworCitjbGVhbmFsbDogCisJcm0gLXJmIC4vYmluL2MvCisJcm0gLXJmIC4vYmluL2ZvcnRyYW4vCisJcm0gLXJmIC4vTExWTS1JUi8kKHBhdGhfdG9fYXJjaCkKKwlybSAtcmYgLi8kKHBhdGhfdG9fYXJjaCkKKwlybSAtcmYgLi8qLmxvZworCisKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvUkVBRE1FX0xMVk1fT1BFTk1QIGIvcmMzL3Rlc3RzdWl0ZS9SRUFETUVfTExWTV9PUEVOTVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4Y2FkYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvUkVBRE1FX0xMVk1fT1BFTk1QCkBAIC0wLDAgKzEsNDYgQEAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8ICAgICAgICAgICAgICBUbyB1c2UgdGhlIE9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlIGZvciB0ZXN0aW5nICAgICAgICAgICAgICAgIHwgCit8IAkJCUxMVk0gT3Blbk1QIEltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAJICAgSGlnaCBQZXJmb3JtYW5jZSBDb21wdXRpbmcgYW5kIFRvb2xzLCAgICAgICAgICAgICAgICAgICAgIHwgCit8CQkJVW5pdmVyc2l0eSBvZiBIb3VzdG9uICAgICAgICAgIAkJCSAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFuLiAyMDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUd28gbmV3IGZpbGVzIGhhdmUgYmVlbiBhZGRlZCB0byBvcGVubXAvcnVudGltZTogY2hlY2stb3Blbm1wLnBsIGFuZCBjaGVjay1vcGVubXAtdGVzdC5wbCAKK0dvIHRvIC9vcGVubXAvcnVudGltZSwgcnVuOgorbWFrZSB0ZXN0IGNvbXBpbGVyPWNsYW5nCittYWtlIHRlc3QtY2xlYW4gIAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgT3Blbk1QLUxMVk0gUHJvamVjdCwgZm9sbG93aW5nIGFyZSB0aGUgRmlsZXMgYW5kIERpcmVjdG9yaWVzIHRvIGtub3cgYWJvdXQ6IAorCisKKyAgYyAgICAgICAgICAgICAgICAgICAgICAgICAJIERpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZXMgZm9yIHRoZSBjIHRlc3RzCisgIGZvcnRyYW4gICAgICAgICAgICAgICAgICAgCSBEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVtcGxhdGVzIGZvciB0aGUgRm9ydHJhbgorICBNYWtlZmlsZSAgICAgICAgICAgICAgICAgIAkgTWFrZWZpbGUgY29udGFpbmluZyBvcHRpb25zIGZvciBjb21waWxhdGlvbgorICBSRUFETUVfTExWTV9PUEVOTVAgICAgICAgICAgICAgUkVBRE1FIGZpbGUgZm9yIHRvIHVzZSB0aGUgT3Blbk1QIHRlc3Qtc3VpdGUgCisgIFJFQURNRV9PcGVuTVBfVmFsaWRhdGlvbl9TdWl0ZSBSRUFETUUgZmlsZSBvbiB0aGUgVmFsaWRhdGlvbiBTdWl0ZSwgdGVtcGxhdGVzLCBldGMuLCAKKwkJCQkgYXMgYSBiYXNpcyBmb3IgdGVzdGluZyB0aGUgTExWTSBPcGVuTVAgaW1wbGVtZW50YXRpb24uIAorICBMTFZNX0lSCQkJIERpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC1zcGVjaWZpYyBJUiBmaWxlcworICBiaW4vbGl0IGZpbGVzCQkgICAgICAgICBJbiB0aGUgbGl0IG1vZGVsLCBldmVyeSB0ZXN0IG11c3QgZXhpc3QgaW5zaWRlIHNvbWUgdGVzdCBzdWl0ZS4gCisJCQkJIGxpdCByZXNvbHZlcyB0aGUgaW5wdXRzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIAorCQkJCSB0ZXN0IHN1aXRlcyBieSBzZWFyY2hpbmcgdXB3YXJkcyBmcm9tIHRoZSBpbnB1dCBwYXRoIAorCQkJCSB1bnRpbCBpdCBmaW5kcyBhIGxpdC5jZmcgb3IgbGl0LnNpdGUuY2ZnIGZpbGUuIAorCQkJCSBUaGVzZSBmaWxlcyBzZXJ2ZSBhcyBib3RoIGEgbWFya2VyIG9mIHRlc3Qgc3VpdGVzIGFuZCAKKwkJCQkgYXMgY29uZmlndXJhdGlvbiBmaWxlcyB3aGljaCBsaXQgbG9hZHMgaW4gb3JkZXIgdG8gCisJCQkJIHVuZGVyc3RhbmQgaG93IHRvIGZpbmQgYW5kIHJ1biB0aGUgdGVzdHMgaW5zaWRlIHRoZSB0ZXN0IHN1aXRlLgkKKyAgYmluL2hlYWRlcgkJCSBIZWFkZXIgZm9yIHRoZSB0ZXN0cywgY2FsbHMgY2xhbmcgZHJpdmVyIGZvciB0aGUgdGVzdCwgCisJCQkJIGFuZCBleGVjdXRlcyB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUJCQkKKyAgYmluL01ha2VmaWxlIAkJCSBUbyBnZW5lcmF0ZSBMTFZNX0lSIGZpbGVzIAorICBiaW4vZGlzdHJpYnV0ZS5zaCAJCSBHZW5lcmF0ZXMgTExWTV9JUiBmaWxlcywgZmluZHMgdGhlIGFyY2hpdGVjdHVyZSBhbmQgT1MsIG1vdmVzIAorCQkJCSB0aGUgZ2VuZXJhdGVkIElSIGZpbGVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZvbGRlciAKKyAgcnVudGltZS90b29scy9jaGVjay1vcGVubXAucGwgIFJldHJpZXZpbmcgdGhlIHJpZ2h0IHBhdGggCisgIHJ1bnRpbWUvdG9vbHMvCisgIGNoZWNrLW9wZW5tcC10ZXN0LnBsCQkgUmV0dXJucyB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBPUywgZS5nLiBsaW5fMzJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29udGFjdCBhbmQgU3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRhY3Q6IGh0dHA6Ly93d3cuY3MudWguZWR1L35ocGN0b29scy8KK0VtYWlsOiBzdW5pdGFAY3MudWguZWR1CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL1JFQURNRV9PcGVuTVBfVmFsaWRhdGlvbl9TdWl0ZSBiL3JjMy90ZXN0c3VpdGUvUkVBRE1FX09wZW5NUF9WYWxpZGF0aW9uX1N1aXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTdjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL1JFQURNRV9PcGVuTVBfVmFsaWRhdGlvbl9TdWl0ZQpAQCAtMCwwICsxLDMzNCBAQAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3wgICAgICAgICAgICAgICAgICAgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgIFYgMy4wICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgSGlnaCBQZXJmb3JtYW5jZSBDb21wdXRpbmcgQ2VudGVyLCBTdHV0dGdhcnQgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgIEhpZ2ggUGVyZm9ybWFuY2UgQ29tcHV0aW5nIGFuZCBUb29scywgVW5pdmVyc2l0eSBvZiBIb3VzdG9uICAgICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYW4uIDIwMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitUQUJMRSBPRiBDT05URU5UUworCitJICAgIAlJTlRST0RVQ1RJT04KK0kuMS4JICBBaW1zIGFuZCBnZW5lcmFsIGZ1bmN0aW9uCitJLjIuIAkgIEZpbGVzIGFuZCBkaXJlY3RvcmllcworCitJSQkJVVNBR0UKK0lJLjEuCSAgRmlyc3QgcnVuIHdpdGggbWFrZQorSUkuMgkgIFdoZXJlIHRvIHNlYXJjaCBmb3IgcmVzdWx0cworSUkuMy4JICBVc2luZyB0aGUgcnVudGVzdCBzY3JpcHQKKworSUlJCQlBZGRpbmcgYW5kIG1vZGlmeWluZyB0ZXN0cworSUlJLjEuCSAgVGhlIHRlbXBsYXRlIHN0cnVjdHVyZQorCitJVgkJS25vd24gSXNzdWVzIGFuZCBXb3JrYXJvdW5kCisKK1YgICAgICAgQ29udGFjdCBhbmQgU3VwcG9ydAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSS4gIElOVFJPRFVDVElPTgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0kuMS4gIEFpbXMgYW5kIGdlbmVyYWwgZnVuY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBPcGVuTVAgdmFsaWRhdGlvbiBzdWl0ZSBpcyBkZXNpZ25lZCB0byB2ZXJpZnkgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24KK29mIE9wZW5NUCBpbiBjb21waWxlcnMuIEl0IGlzIGNhcGFibGUgb2YgY2hlY2tpbmcgRm9ydHJhbiBhcyB3ZWxsIGFzIGMKK2NvbXBpbGVyLgorCitUZXN0aW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBzdGF0aXN0aWNzLiBFYWNoIGRpcmVjdGl2ZSBpcyB0ZXN0ZWQKK2J5IGNvbXB1dGluZyBhbmQgdmVyaWZ5aW5nIHRoZSByZXN1bHQgd2l0aCB0aGUgYWxyZWFkeSBrbm93biB2YWx1ZS4gSW4gbW9zdAorY2FzZXMgYSB3cm9uZyBpbXBsZW1lbnRhdGlvbiBjYW4gcmVzdWx0IGluIHRoZSByaWdodCB2YWx1ZXMuIFNvIHRoZSB0ZXN0cyBhcmUKK3J1biBzZXZlcmFsIHRpbWVzLgorCitBZGRpdGlvbmFsbHksIHRoZSB2YWxpZGF0aW9uIHN1aXRlIGNyZWF0ZXMgc28gY2FsbGVkIGNyb3NzdGVzdHMgZm9yIGVhY2gKK2RpcmVjdGl2ZS4gVGhlc2UgYXJlIHRlc3RzIGluIHdoaWNoIGVpdGhlciB0aGUgZGlyZWN0aXZlIGlzIG1pc3Npbmcgb3IgdXNlZAord2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzLiBJZiB0aGlzIHNvIGNhbGxlZCBjcm9zc3Rlc3QgZmFpbHMsIHRoaXMgaW5kaWNhdGVzCitzdHJvbmdseSB0aGF0IHRoZSBwcmV2aW91cyB0ZXN0IGlzIGNhcGFibGUgb2YgdGVzdGluZyB0aGUgZGlyZWN0aXZlLgorCitMYXN0bHksIGFuIG9ycGhhbmVkIHRlc3QgaXMgYWxzbyBydW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXJlY3RpdmUgYmVpbmcKK3Rlc3RlZCBpcyBhYmxlIHRvIGNvcnJlY3RseSBydW4gd2hlbiAnb3JwaGFuZWQnIGZyb20gdGhlIG1haW4gZnVuY3Rpb24uCitFc3NlbnRpYWxseSwgdGhlIGRpcmVjdGl2ZSdzIGNvZGUgaXMgcGxhY2VkIGludG8gaXRzIG93biBmdW5jdGlvbiB3aGljaCBpcworY2FsbGVkIGR1cmluZyBleGVjdXRpb24gb2YgdGhlIG1haW4gZnVuY3Rpb24gYW5kIG9mdGVuIGluc2lkZSBhIHBhcmFsbGVsCityZWdpb24uCisKKworSS4yLiAgRmlsZXMgYW5kIGRpcmVjdG9yaWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZCBjICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZXMgZm9yIHRoZSBjIHRlc3RzCitkIGZvcnRyYW4gICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIEZvcnRyYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cworICBNYWtlZmlsZSAgICAgICAgICAgICAgICAgIE1ha2VmaWxlIGNvbnRhaW5pbmcgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24KKyAgY29tbW9uX3V0aWxpdHkuZgorICBvbXBfbXlfc2xlZXAuaCAgICAgICAgICAgIHRocmVhZCBzYXZlIHNsZWVwIGZ1bmN0aW9uCisgIG9tcF90ZXN0c3VpdGUuZiAgICAgICAgICAgRm9ydHJhbiBoZWFkZXIgZmlsZQorICBvbXBfdGVzdHN1aXRlLmggICAgICAgICAgIGF1dG9nZW5lcmF0ZWQgYy1oZWFkZXIgZmlsZQorICBvbXB0cy1jLmNvbmYgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGMgdGVzdHMgYWJvdXQgaG93IG9mdGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRlc3RzIHNoYWxsIGJlIGV4ZWN1dGVkIG9yIGhvdyBsYXJnZSB0aGUgbG9vcCBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMKKyAgb21wdHNfbWFrZUhlYWRlci5wbAkgICAgcGVybCBtb2R1bGUgZm9yIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGlvbiBvZiBhbiB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRhdGUgaGVhZGVyIGZpbGUKKyAgb21wdHNfcGFyc2VyRnVuY3Rpb25zLnBtCXBlcmwgbW9kdWxlIGNvbnRhaW5pbmcgZ2VuZXJhbCBmdW5jdGlvbnMgZm9yCisJCQkJICAgICAgICAgICAgdGhlIHBhcnNlci5wbCBzY3JpcHQKKyAgb21wdHNfcGFyc2VyLnBsCSAgICAgICAgc2NyaXB0IGZvciBnZW5lcmF0aW5nIHRoZSBzb3VyY2UgY29kZSBvdXQgb2YgdGhlIHRlbXBsYXRlcworICBvbXB0c19zdGFuZGFsb25lUHJvYy5jCWZyYW1ld29yayBmb3IgdGhlIGMgdGVzdHMKKyAgb21wdHNfc3RhbmRhbG9uZVByb2MuZglmcmFtZXdvcmsgZm9yIHRoZSBGb3J0cmFuIHRlc3RzCisgIFJFQURNRQkJICAgICAgICAgICAgdGhlIFJFQURNRSBmaWxlIHlvdSd2ZSBhbHJlYWR5IGZvdW5kIDstKQorICBMSUNFTlNFICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGxpY2Vuc2UgaW5mb3JtYXRpb24KKyAgcnVudGVzdC5wbAkJICAgICAgICB0aGUgZnJhbWUgcHJvZ3JhbSBvZiB0aGUgdGVzdCBzdWl0ZQorICB0ZXN0bGlzdC1mLnR4dAkgICAgICAgIHRlc3QgbGlzdCBjb250YWluaW5nIHRoZSBhdmFpbGFibGUgdGVzdHMgZm9yIEZvcnRyYW4KKyAgdGVzdGxpc3QtYy50eHQJICAgICAgICB0ZXN0IGxpc3QgY29udGFpbmluZyB0aGUgYXZhaWxhYmxlIHRlc3RzIGZvciBjCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lJLiAgVVNBR0UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0lJLjEuIEZpcnN0IHJ1biB3aXRoIG1ha2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworWW91IGNhbiBkbyBhIGZpcnN0IHNpbXBsZSBydW4gb2YgdGhlIHRlc3RzdWl0ZSBvbmx5IGFmdGVyIG9uZSBzdGVwIG9mCitjb25maWd1cmF0aW9uOgorCisxKSBNb2RpZnkgdGhlIG9tcHRzLmNvbmYgYW5kIG9tcHRzLWMuY29uZiBmaWxlLCBjaGFuZ2UgdGhlIG51bWJlciBvZiB0aHJlYWRzCithbmQgbnVtYmVyIG9mIHJlcGV0aXRpb25zIG9mIGVhY2ggdGVzdC4KKworMikgTW9kaWZ5IHRoZSBNYWtlZmlsZSwgdW5jb21tZW50aW5nIHRoZSBDQy9GQyBhbmQgQ0ZMQUdTL0ZGTEFHUyB2YXJpYWJsZXMgZm9yCit0aGUgY29tcGlsZXIgb2YgeW91ciBjaG9pY2UuCisKK0FuZCBub3cgeW91IGNhbiBydW4gdGhlIHRlc3RzdWl0ZSBlaXRoZXIgZm9yIGEgQyBjb21waWxlciB3aXRoOgorCis+CW1ha2UgY3Rlc3QKKworb3IgZm9yIGEgRm9ydHJhbiBjb21waWxlciB3aXRoOgorCis+CW1ha2UgZnRlc3QKKworCitJSS4yLiBSdW5uaW5nIGN1c3RvbSB0ZXN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitJbiBvcmRlciB0byBydW4gc2luZ2xlIHRlc3RzIG9yIGN1c3RvbSBncm91cHMgb2YgdGVzdHMsIHR3byBtYWtlIGNvbW1tYW5kcworYXJlIGRlZmluZWQ6IG1ha2Ugc3Rlc3QgYW5kIG1ha2UgZnN0ZXN0LiBUaGVzZSB0d28gY29tbWFuZCByZWZlcmVuY2UgdGhlIGZpbGUKK2N1c3RvbXRlc3QudHh0IHdoZW4gbG9va2luZyBmb3IgYSB0ZXN0bGlzdCB0byB1c2UuIFNpbXBseSBlZGl0IGN1c3RvbXRlc3QudHh0Cit0byBpbmNsdWRlIHRoZSBkZXNpcmVkIHRlc3Qgb3IgdGVzdHMuIElmIGN1c3RvbXRlc3QudHh0IGNvbnRhaW5zIGMgdGVzdHMsCisKKz4gICAgICBtYWtlIHN0ZXN0CisKK29yIGZvciBmb3J0cmFuIHRlc3RzCisKKz4gICAgICBtYWtlIGZzdGVzdAorCitJbiBvcmRlciB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIHVzZWQgaW4gdGhlIHRlc3RzLCBzaW1wbHkgZWRpdCB0aGUKK01ha2VmaWxlIHZhcmlhYmxlcyBNSU5USFJFQURTIGFuZCBNQVhUSFJFQURTLiBCeSBkZWZhdWx0LCB0aGV5IGFyZSBjb25maWd1cmVkCit0byB1c2UgMiB0aHJlYWRzLiBUbyBjaGFuZ2UgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRlc3QgaXMgcnVuLCBmb3IgYyB0ZXN0cworZWRpdCB0aGUgUkVQRVRJVElPTlMgdmFyaWFibGUgaW4gdGhlIGZpbGUgb21wdHMtYy5jb25mLiBUaGUgTE9PUENPVU5UIGFuZAorU0xFRVBUSU1FIHZhcmlhYmxlcyBjYW4gYWxzbyBiZSBjaGFuZ2VkIGhlcmUuIEZvciBmb3J0cmFuIHRlc3RzLCBlZGl0IHRoZSBmaWxlCitvbXBfdGVzdHN1aXRlLmYgdG8gY2hhbmdlIGJvdGggdGhlIExPT1BDT1VOVCBhbmQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRlc3QKK2lzIHJ1bi4KKworCisKK0lJLjMuIFVuZGVyc3RhbmRpbmcgdGhlIHJlc3VsdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1doZW4gcnVubmluZyB0aGUgdGVzdHN1aXRlIHRoZSByZXN1bHRzIHdpbGwgYmUgc2hvd24gb24gdGhlIHNjcmVlbi4KKworSWYgeW91IG5lZWQgdGhlIHJlc3VsdHMgZm9yIGZ1cnRoZXIgcHVycG9zZSB5b3UgY2FuIHVzZSB0aGUgcmVzdWx0cy50eHQsIHdoaWNoCitpcyBhIHNpbXBsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMgZm9yIGVhY2ggZGlyZWN0aXZlCitpbiBhIHNpbmdsZSBsaW5lLiBFYWNoIGxpbmUgc3RhcnRzIHdpdGggdGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4gVGhlbiBmb2xsb3dzCit0aGUgcmVzdWx0IG9mIHRoZSB0ZXN0IGdpdmVuIGluIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBwYXNzZWQgdGVzdHMuIElmIDEwMCUgb2YKK3RoZSB0ZXN0cyBwYXNzZWQgc3VjY2Vzc2Z1bGx5LCB0aGUgc2Vjb25kIG51bWJlciBnaXZlcyB0aGUgcmVzdWx0IG9mIHRoZQorY29ycmVzcG9uZGluZyBjcm9zc3Rlc3QuIENyb3NzdGVzdHMgd2lsbCBvbmx5IGJlIHJ1biBpZiB0aGUgbm9ybWFsIHRlc3QgcGFzc2VzCit3aXRoIDEwMCUgYWNjdXJhY3kuIElmIGEgY3Jvc3N0ZXN0IHdhcyBub3QgcnVuIG9yIGEgdGVzdCBkb2VzIG5vdCBleGlzdCwgaXQgaXMKK2Rlbm90YXRlZCBieSBhICItIi4KK0FmdGVyIHRoZSByZXN1bHRzIG9mIHRoZSBub3JtYWwgdGVzdHMsIHRoZXJlIGZvbGxvdyBhIHNlcmllcyBvZiB0ZXN0cyBpbiB0aGUKK29ycGhhbmVkIG1vZGUuIElmIHRoZXJlIHdlcmUgbm8gb3JwaGFuZWQgdGVzdHMgYXZhaWxhYmxlIHRoaXMgaXMgc2hvd24gYnkgYSAiLSIuCisKK0lmIHlvdSBydW4gdGhlIHRlc3RzdWl0ZSB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHRocmVhZHMgKGUuZy4gdXNpbmcgdGhlCitydW50ZXN0LnBsIHNjcmlwdCkgdGhlIHJlc3VsdHMgYXJlIHNob3duIGluIGJsb2NrcyBvZiA0IGNvbHVtbnMgZm9yIGVhY2ggbnVtYmVyCitvZiB0aHJlYWRzLgorCitJZiBhIHRlc3QgZmFpbHMgeW91IGNhbiBmaW5kIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gaW4gdGhlIG9tcHRzLmxvZywKK2Jpbi9jLyoub3V0IGFuZCAqLmxvZyBmaWxlcy4gV2hpbGUgdGhlIG9tcHRzLmxvZyBmaWxlIGNvbnRhaW5zIGFsbCBjb21waWxlcgorZXJyb3IgbWVzc2FnZXMgZm9yIGFsbCB0ZXN0cywgdGhlICoub3V0IGFuZCAqLmxvZyBmaWxlcyBjb250YWluIGRldGFpbGVkIGluZm9yYW10aW9uCitvbiB0aGUgZXhlY3V0aW9uIHByb2Nlc3Mgb2YgdGhlIHNpbmdsZSB0ZXN0cy4KK0luIHRoZSAqLm91dCBmaWxlcyB0aGVyZSBhcmUgbGlzdGVkIGFsbCB0aGUgcmVzdWx0cyBvZiB0aGUgc2luZ2xlIGV4ZWN1dGlvbnMgb2YKK3RoZSB0ZXN0cy4gSW4gdGhlICoubG9nIGZpbGVzIHRoZXJlIGFyZSBlcnJvciBtZXNzYWdlcyBvZiB0aGUgdGVzdHMgaXRzZWxmLgorCisKK0lJLjQuIENsZWFuaW5nIFVwCistLS0tLS0tLS0tLS0tLS0tLQorCisKK0JlY2F1c2UgbWFueSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIHRlc3RlZCBkaXJlY3RpdmUsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeQordG8gY2xlYW4gdGhlIG1haW4gZGlyZWN0b3J5IGFmdGVyIGEgYmF0dGVyeSBvZiB0ZXN0cy4gVG8gY2xlYW4gYWxsIGdlbmVyYXRlZCBmaWxlcworaW4gdGhlIG1haW4gZGlyZWN0b3J5IGluY2x1ZGluZyB0aGUgcmVzdWx0cyBhbmQgbG9nIGZpbGVzLAorCis+ICAgICBtYWtlIGNsZWFuCisKKworVG8gY2xlYW4gb25seSB0aGUgbG9ncyBhbmQgb3V0IGZpbGVzLAorCis+ICAgICBtYWtlIGNsZWFubG9ncworCitUbyBjbGVhbiBvbmx5IHRoZSByZXN1bHRzLAorCis+ICAgICBtYWtlIGNsZWFucmVzdWx0cworCisKKworSUkuNC4gVXNpbmcgdGhlIHJ1bnRlc3Qgc2NyaXB0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworU28gZm9yIHNwZWNpYWwgcHVycG9zZSB5b3UgY2FuIHVzZSB0aGUgcnVudGVzdC5wbCBzY3JpcHQsIHdoaWNoIGFsbG93cyBhIGxvdAorbW9yZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uIHByb2Nlc3MgdGhhbiB0aGUgZXhlY3V0aW9uIHdpdGggbWFrZS4KKworVXNpbmcgdGhlIHJ1bnRlc3QucGwgc2NyaXB0IGlzIHJhdGhlciBlYXN5LiBZb3UgY2FuIHVzZSB0aGUgdGhlIHRlc3Qgc3VpdGUgb25seQorYWZ0ZXIgdHdvIHN0ZXBzIG9mIG1vZGlmaWNhdGlvbnM6CisKKzEuKSBNb2RpZnkgdGhlIE1ha2VmaWxlIHRvIHlvdXIgd2lzaGVzIGNob29zaW5nIHlvdXIgY29tcGlsZXIgYW5kIHRoZSBuZWNlc3NhcnkKKyAgICBjb21waWxlciBmbGFncy4KKzIuKSBJZiBuZWNlc3NhcnkgZWRpdCBvbmUgb2YgdGhlIHRlc3QgbGlzdHMgKHRlc3RsaXN0LWMudHh0KSBhbmQgY29tbWVudCBvdXQgdGhlCisgICAgdGVzdHMgeW91IGRvIG5vdCB3YW50IHRvIHJ1biB1c2luZyAjIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiBUZXN0bGlzdHMgZm9yIEZvcnRyYW4gZW5kCisgICAgd2l0aCAtZi50eHQgd2hpbGUgdGVzdCBsaXN0cyBmb3IgYyB3aXRoIC1jLnR4dC4KKworQW5kIG5vdyB5b3UgY2FuIHJ1biB0aGUgdGVzdCBzdWl0ZSBlaXRoZXIgZm9yIEZvcnRyYW4gdXNpbmcKKwkjCT4gIC4vcnVudGVzdC5wbCAtbGFuZz1mb3J0cmFuIC1kPWZvcnRyYW4gdGVzdGxpc3QtZi50eHQKK29yIGZvciBjCisJIwk+ICAuL3J1bnRlc3QucGwgLWxhbmc9YyAtZD1jIHRlc3RsaXN0LWMudHh0CisKK1dpdGggdGhlIC0taGVscCBvcHRpb24geW91IGNhbiBzaG93IHRoZSBjb21wbGV0ZSBsaXN0IG9mIG9wdGlvbnMgYW5kIHRoZWlyCitleHBsYW5hdGlvbnMuCisKK1RoZSB0ZXN0IHJlc3VsdHMgYXJlIHN1bW1hcml6ZWQgaW4gY3Jlc3VsdHMgb3IgZnJlc3VsdHMudHh0IHdoaWxlICoubG9nIGtlZXAKK2RldGFpbHMgZm9yIGluZGl2aWR1YWwgdGVzdHMuIFRoZXJlIGlzIGFsc28gYSBmaWxlIChvbXB0cy5sb2cpIGtlZXBpbmcKK2NvbXBpbGF0aW9uIGluZm9ybWF0aW9uLiAoc2VlIHNlY3Rpb24gSUkuMiApCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHRlc3QgdGhlIGRpcmVjdGl2ZXMgaW4gb3JwaGFuZWQgbW9kZSB5b3UgY2FuIHVzZSB0aGUKKy1ub3JwaGFuIG9wdGlvbi4gWW91IGFsc28gY2FuIHVzZSB0aGUgcnVudGVzdC5wbCBzY3JpcHQgZWl0aGVyIHRvIGNvbXBpbGUgYWxsCit0ZXN0cyBvciBydW4gY29tcGlsZWQgdGVzdHMgZS5nLiBmb3IgY3Jvc3MgY29tcGlsYXRpb24gb24gb3RoZXIgcGxhdGZvcm1zLiBGb3IKK3RoaXMgdGhlcmUgYXJlIHRoZSBvcHRpb25zIC1ub3J1biBhbmQgLW5vY29tcGlsZS4KKworSGFwcHkgdGVzdGluZyEKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSUlJLglIb3cgdG8gYWRkIG5ldyB0ZXN0cyAvIFRoZSBzdHJ1Y3R1cmUgb2YgdGVzdCB0ZW1wbGF0ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJSUkuMSAgVGhlIHRlbXBsYXRlIHN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0ZXN0IHN1aXRlIGlzIGJhc2VkIG9uIHRlbXBsYXRlcyBzbyB0aGF0IHlvdSBvbmx5IGhhdmUgb25lIGZpbGUgZm9yIHRlc3QsCitjcm9zc3Rlc3QgYW5kIHRoZSBvcnBoYW5lZCB2ZXJzaW9ucyBvZiB0aGVtLgorCisJQSkgRGVzY3JpcHRpb24gb2YgdGhlIHRlbXBsYXRlIHN0cnVjdHVyZQorCitUaGUgc3ludGF4IG9mIHRoZSB0ZW1wbGF0ZXMgaXMgbXVjaCBsaWtlIHhtbC4gU28gZWFjaCB0ZXN0IGJlZ2lucyB3aXRoCisnPG9tcHRzOnRlc3Q+JyBhbmQgZW5kcyB3aXRoICc8L29tcHRzOnRlc3Q+Jy4KKworSW4gYmV0d2VlbiB0aGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBibG9ja3MgaG9sZGluZyBpbmZvcm1hdGlvbjoKKworLSA8b21wdHM6dGVzdGRlc2NyaXB0aW9uPiA8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4gSW4gYmV0d2VlbiB0aGlzIHRhZyB5b3UgY2FuCisgIGdpdmUgYSBkZXNjcmlwdGlvbiBvbiB3aGF0IHRoZSB0ZXN0IGNoZWNrcyBhbmQgaG93IGl0IHdvcmtzLgorCistIDxvbXB0czpvbXB2ZXJzaW9uPiA8L29tcHRzOnZlcnNpb24+IFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAgT3Blbk1QLXZlcnNpb24gd2hpY2ggaW5jbHVkZXMgdGhlIHRlc3RlZCBkaXJlY3RpdmUuCisKKy0gPG9tcHRzOmRpcmVjdGl2ZT4gPC9vbXB0czpkaXJlY3RpdmU+IFVzZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0aXZlIGhvdyBpdCBpcworICBjYWxsZWQgaW4gdGhlIHByb2dyYW1taW5nIGxhbmd1YWdlLgorCistIDxvbXB0czpkZXBlbmRlbmNlcz4gPC9vbXB0czpkZXBlbmRlbmNlcz4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIHNwZWNpZnkgb3RoZXIKKyAgb21wIGRpcmVjdGl2ZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSBmb3IgdGhlIGNvcnJlY3QgZXhlY3V0aW9uIG9mIHlvdXIgdGVzdC4KK1RoZSBkaXJlY3RpdmVzIGhhdmUgdG8gYmUgbGlzdGVkIGJ5IHRoZWlyIGRpcmVjdGl2ZSBuYW1lcyBhcyBpdCBpcyBjYWxsZWQgaW4KK3RoZSBwcm9ncmFtbWluZyBsYW5ndWFnZS4gTXVsdGlwbGUgZGlyZWN0aXZlcyBhcmUgc2VwYXJhdGVkIGJ5ICcsJy4KKworLSA8b21wdHM6dGVzdGNvZGU+IDwvb21wdHM6dGVzdGNvZGU+IEluIHRoaXMgdGFnIHN0YW5kcyB0aGUgd2hvbGUgc291cmNlIGNvZGUKK2ZvciB0aGUgdGVzdCAvIGNyb3NzdGVzdC4gIEVhY2ggdGVzdCBoYXMgdG8gYmUgd3JpdHRlbiBhcyBhIGZ1bmN0aW9uLiBUaGUKK3N5bnRheCBvZiB0aGUgZnVuY3Rpb25zIGRpZmZlcnMgYmV0d2VlbiBDIGFuZCBGb3J0cmFuOiBJbiBDIGl0IGhhcyB0byB0YWtlIGEKK2ZpbGUgcG9pbnRlciAnRklMRSAqIGxvZ0ZpbGUnIGFuZCByZXR1cm4gYW4gaW50LiBJZiB0aGUgdGVzdCBoYXMgYmVlbiBwYXNzZWQKK3N1Y2Nlc3NmdWwgaXQgaGFzIHRvIHJldHVybiBhIHZhbHVlIHVuZXF1YWwgdG8gMC4gVGhlIGZpbGUgcG9pbnRlciBjYW4gYmUgdXNlZAordG8gd3JpdGUgaW5mb3JtYXRpb24gaW50byBhIGxvZyBmaWxlLiAgSW4gRm9ydHJhbiB0aGUgZnVuY3Rpb24gdGFrZXMgbm8KK2FyZ3VtZW50IGFuZCB0aGUgZnVuY3Rpb24gbmFtZSBtdXN0IG5vdCBleGNlZWQgWFggY2hhcmFjdGVycy4gIFRoZSByZXR1cm4gdmFsdWUKK2hhcyB0byBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlICc8dGVzdGZ1bmN0aW9ubmFtZT4nIHRhZ3MuIEl0IGhhcyB0byBiZSAxIGlmIHRoZQordGVzdCBzdWNjZWVkZWQgYW5kIDAgaWYgdGhlIHRlc3QgZmFpbGVkLiBGb3IgZGV0YWlscyBzZWUgdGhlIGV4YW1wbGUuCisKK1RvIHRlbGwgdGhlIHRlc3Qgc3VpdGUgdGhlIG5hbWUgb2YgeW91ciB0ZXN0IGZ1bmN0aW9uIHlvdSBoYXZlIHRvIGVuY2xvc2UgaXQKK2ludG8gdGhlICc8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiA8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4nIHRhZy4KKworSWYgdGhlcmUgYXJlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGVzdCBhbmQgY3Jvc3N0ZXN0IHlvdSBjYW4gdXNlIHRoZQorPG9tcHRzOmNoZWNrPiA8L29tcHRzOmNoZWNrPiBhbmQgPG9tcHRzOmNyb3NzY2hlY2s+IDwvb21wdHM6Y3Jvc3NjaGVjaz4gdGFnLgorV2hlbiBnZW5lcmF0aW5nIHRoZSB0ZXN0IHRoZSBwYXJzZXIgd2lsbCB1c2UgdGhlIGNvZGUgZW5jbG9zZWQgaW4KKzxvbXB0czpjaGVjaz4gdGFncyBhbmQgY3V0IG91dCB0aGUgY29kZSB3cml0dGVuIGluIDxvbXB0czpjcm9zc2NoZWNrPiB0YWdzLiBTbworeW91IGhhdmUgdHdvIHBvc3NpYmlsaXRpZXMgdG8gd3JpdGUgeW91ciB0ZW1wbGF0ZSBmb3IgdGVzdCBhbmQgY3Jvc3N0ZXN0OiBUaGUKK2ZpcnN0IHdheSB5b3UgY2FuIHdyaXRlIHRoZSBjb21wbGV0ZSBjb2RlIGlzIHRvIHdyaXRlIHRoZSB0ZXN0IGluIG9uZQorPG9tcHRzOmNoZWNrPiB0YWcgYW5kIGxhdGVyIHRoZSBjcm9zc3Rlc3QgaW4gb25lIDxvbXB0czpjcm9zc2NoZWNrPiB0YWcuICBUaGUKK3NlY29uZCB3YXkgaXMgdG8gd3JpdGUgYm90aCB0ZXN0cyBvbmx5IGJ5IGVuY2xvc2luZyBkaWZmZXJpbmcgcGFydHMgaW4KK2NvcnJlc3BvbmRpbmcgdGFncy4KKworVGhlIGZpcnN0IG1ldGhvZCBzaG91bGQgYmUgcHJlZmVycmVkIGlmIHRlc3QgYW5kIGNyb3NzdGVzdCBkaWZmZXIgbXVjaCBmcm9tCitlYWNoIG90aGVyLiBUaGUgc2Vjb25kIGUuZy4gaWYgeW91IG9ubHkgd2FudCB0byBjaGFuZ2UgYSBmZXcgb3B0aW9ucyBsaWtlCityZXBsYWNpbmcgYW4gb21wIHNpbmdsZXByaXZhdGUgY2xhdXNlIGJ5IGFuIG9tcCBwcml2YXRlIGNsYXVzZSBvciB0byBjdXQgb3V0CithIGRpcmVjdGl2ZSBsaWtlIG9tcCBmbHVzaC4gIFdoZW4geW91IHVzZSB0aGUgZmlyc3Qgd2F5IHlvdSBoYXZlIHRvIHRha2UgY2FyZQorb2YgdGhlIGZ1bmN0aW9uIG5hbWUhIFlvdSBoYXZlIHRvIGRlY2xhcmUgaXQgdHdpY2Ugd2l0aAorPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4hCisKKy0gPG9tcHRzOm9ycGhhbj4gPC9vbXB0czpvcnBoYW4+IFRoaXMgdGFnIGNhbiBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIGVuYWJsZQorICB5b3VyIHRlc3QgdG8gY2hlY2sgdGhlIGRpcmVjdGl2ZSBpbiBvcnBoYW4gcmVnaW9ucywgdG9vLiAgVGhlIGNvZGUgZW5jbG9zZWQKK2luIHRoaXMgcGFydCB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZAoraW5zdGVhZC4gIElmIHlvdSBoYXZlIHZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBvdXRzaWRlIHRoaXMgcmVnaW9uIHlvdSBoYXZlIHRvCitkZWNsYXJlIHRoZW0gYXMgZ2xvYmFsIHZhcmlhYmxlcyBlbmNsb3NlZCBpbiBhbiA8b21wdHM6b3JwaGFuOnZhcnM+IHRhZy4gRm9yCitmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIDxvbXB0czpvcnBoYW46dmFycz4gdGFnLgorCistIDxvbXB0czpvcnBoYW46dmFycz4gPC9vbXB0czpvcnBoYW46dmFycz4gVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IGdsb2JhbAorICB2YXJpYWJsZXMgZm9yIGFuIG9ycGhhbiByZWdpb24gd2hpY2ggYWxsb3cgdGhlIGV4Y2hhbmdlIG9mIHZhbHVlcyBiZXR3ZWVuCit0aGUgbWFpbiBwcm9ncmFtIGFuZCB0aGUgb3JwaGFuZWQgZnVuY3Rpb25zLiBUaGUgdXNhZ2UgZGlmZmVycyBiZXR3ZWVuIEMgYW5kCitGb3J0cmFuLiAgSW4gQyB5b3UgaGF2ZSB0byB1c2UgYSBzaW5nbGUgZGVjbGFyYXRpb24gZm9yIGVhY2ggdmFyaWFibGUuIFlvdSBjYW4KK2VpdGhlciBkZWNsYXJlIGFsbCB2YXJpYWJsZXMgaW4gb25lIHNpbmdsZSBvciBpbiBzZXZlcmFsIGRpZmZlcmVudCByZWdpb25zLiBZb3UKK211c3Qgbm90IGluaXRpYWxpemUgdGhlIHZhcmlhYmxlcyBpbnNpZGUhICBJbiBGb3J0cmFuIHlvdSBoYXZlIHRvIHB1dCBhbGwKK2RlY2xhcmF0aW9ucyBpbiBvbmUgc2luZ2xlIHRhZy4gQmVjYXVzZSB0aGVyZSBleGlzdCBubyBnbG9iYWwgdmFyaWFibGVzIGFzIGluCitDIHlvdSBoYXZlIHRvIHVzZSBjb21tb24gYmxvY2tzLiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgdGhlIGV4YW1wbGVzLgorCitJSUkuMi4gIEFkZGluZyB0ZXN0cyB0byB0aGUgdGVzdCBsaXN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIG5ldyB0ZXN0IHlvdSBoYXZlIHRvIGFkZCB0aGVtIHRvIGEgdGVzdGxpc3QuIFNpbXBseQorYWRkIHRoZSBmdW5jdGlvbiBuYW1lIGluIGEgbmV3IExpbmUgaW50byBhIGZpbGUuCisKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitJVi4gICBLbm93biBJc3N1ZXMgYW5kIFdvcmthcm91bmQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgU3VuIE9TIGhhcyBhIHByb2JsZW0gd2l0aCB0aGUgLW1heGRlcHRoIG9wdGlvbiBvbiB0aGUgJ21ha2UgY2xlYW5hbGwnCitjb21tYW5kLiBUaGlzIHByZXZlbnRzIHRoZSB0ZXN0cyBmcm9tIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkKK2FuZCBjYW4gY2F1c2UgcHJvYmxlbXMgd2l0aCBmdXR1cmUgdGVzdHMuIFRvIHJlbWVkeSwgZWRpdCB0aGUgbWFrZWZpbGUgbGluZQordW5kZXIgdGhlIGNsZWFuIGNvbW1hbmQ6CisKKyAgICAgLXJtIFtjZl10ZXN0Ki5bY2ZdIFtjZl1jcm9zc3Rlc3QqLltjZl0gW2NmXWN0ZXN0Ki5bY2ZdIFtjZl1vcnBoYW4qLltjZl0KKworQ2hhbmdlIHRvOgorCisgICAgIC1ybSBbY2ZddGVzdCogW2NmXWNyb3NzdGVzdCogW2NmXWN0ZXN0KiBbY2Zdb3JwaGFuKgorCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1YuICAgQ29udGFjdCBhbmQgU3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRhY3Q6IGh0dHA6Ly93d3cuY3MudWguZWR1L35ocGN0b29scwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9hZGRpbmdfeGZhaWxzLnB5IGIvcmMzL3Rlc3RzdWl0ZS9hZGRpbmdfeGZhaWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhZDQ4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2FkZGluZ194ZmFpbHMucHkKQEAgLTAsMCArMSwzMiBAQAorCitpbXBvcnQgb3MKK2ltcG9ydCBjb21tYW5kcworCitwZXJsID0gIi91c3IvYmluL3BlcmwiCitMTFZNID0gIi4vTExWTS1JUi8iCit0ZW1wX2ZpbGVuYW1lID0gInRlbXAiCitYRkFJTF90ZXh0ID0gIjsgWEZBSUw6ICpcbiIKKworCithcmNoX2ZpbGVfbGlzdCA9IGRpY3QoKQorYXJjaF9maWxlX2xpc3RbJ2xpbl8zMmUnXSA9IFsndGVzdF9vbXBfdGFza19maW5hbC5sbCcsICd0ZXN0X29tcF90YXNrX3VudGllZC5sbCddCisKKworYXJjaF9zY3JpcHQgPSAiLi4vcnVudGltZS90b29scy9jaGVjay1vcGVubXAtdGVzdC5wbCIKK2FyY2hfY21kID0gcGVybCArICIgIiArIGFyY2hfc2NyaXB0CithcmNoID0gY29tbWFuZHMuZ2V0b3V0cHV0KGFyY2hfY21kKQorYXJjaCA9IGFyY2hbOmxlbihhcmNoKS0xXQorCitwcmludCAiQWRkaW5nIFhGQUlMUyAuLi4iCisKK2ZvciBmIGluIGFyY2hfZmlsZV9saXN0W2FyY2hdOgorCWZpbGVuYW1lID0gTExWTSArIGFyY2ggKyAiLyIgKyBmCisJbGluZXMgPSBvcGVuKGZpbGVuYW1lKS5yZWFkbGluZXMoKQorCWxpbmVzLmluc2VydCgxLCBYRkFJTF90ZXh0KQorCWYyID0gb3Blbih0ZW1wX2ZpbGVuYW1lLCAidyIpCisJZm9yIGwgaW4gbGluZXM6CisJCWYyLndyaXRlKGwpCisJZjIuY2xvc2UoKQorCisJb3Muc3lzdGVtKCJtdiAiICsgdGVtcF9maWxlbmFtZSArICIgIiArIGZpbGVuYW1lKQorCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Jpbi9NYWtlZmlsZSBiL3JjMy90ZXN0c3VpdGUvYmluL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYmQzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Jpbi9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACitDQyAgICAgPSBjbGFuZworQ0ZMQUdTID0gLWZvcGVubXAgLVMgLWVtaXQtbGx2bQorSU5DTCA9CitMSUJTID0KKworQklOID0KK1NSQ19ESVIgPSAuL2MKK1NSQ19GSUxFUyA6PSAkKGZvcmVhY2ggRElSLCAkKFNSQ19ESVIpLCAkKHdpbGRjYXJkICQoU1JDX0RJUikvKi5jKSkKK09CSlMgOj0gJChwYXRzdWJzdCAlLmMsICUubywgJChTUkNfRklMRVMpKQorVEFSR0VUTElTVCA6PSAkKHBhdHN1YnN0ICUuYywgJSwgJChTUkNfRklMRVMpKQorCithbGw6JChUQVJHRVRMSVNUKQorCS4vZGlzdHJpYnV0ZS5zaAorCUAgZWNobyBhbGwgZG9uZQorCisuUEhPTlk6IGNsZWFuCisKKyQoVEFSR0VUTElTVCk6ICQoU1JDX0ZJTEVTKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExJQlMpICQoSU5DTCkgJEAuYyAtbyAkQC5sbAorCitjbGVhbjoKKwlAIHJtIC1yZiBjLyoKKwlAIGVjaG8gY2xlYW4gYmluIGRvbmUKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYmluL2Rpc3RyaWJ1dGUuc2ggYi9yYzMvdGVzdHN1aXRlL2Jpbi9kaXN0cmlidXRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiYjBmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Jpbi9kaXN0cmlidXRlLnNoCkBAIC0wLDAgKzEsMTI1IEBACisjIS9iaW4vYmFzaAorCisjIGFkZCBoZWFkZXIgZm9yIC5sbCBmaWxlcworCisjIGdldCB0bXAgaGVhZGVyCitjcCBoZWFkZXIgL3RtcC90bXAuaGVhZGVyCitlY2hvID4+IC90bXAvdG1wLmhlYWRlcgorCisjIGNyZWF0ZSB0ZW1wb3JhcnkgdGVzdCBwYWNrYWdlCitta2RpciBjLSRNQUNIVFlQRSRPU1RZUEUKK2BjcCBjLyoubGwgYy0kTUFDSFRZUEUkT1NUWVBFL2AKKworIyBhZGQgbmV3IGhlYWRlciBpbnRvIC5sbCBmaWxlcworZm9yIGZpbGUgaW4gYy0kTUFDSFRZUEUkT1NUWVBFLyoKK2RvCisgICAgY3AgJGZpbGUgL3RtcC90bXAubGwuYmYKKyAgICBjYXQgL3RtcC90bXAuaGVhZGVyIC90bXAvdG1wLmxsLmJmID4gL3RtcC90bXAubGwKKyAgICBtdiAvdG1wL3RtcC5sbCAkZmlsZQorZG9uZQorCisKKyMgaW4gYmluLywgdGFyZ2V0IGlzIC4uL0xMVk0tSVIvQVJDSC9PUworTEVWRUw9Li4vTExWTS1JUi8KK0FSQ0hfUEFUSD0uLi9MTFZNLUlSLworT1NfUEFUSD0uLi9MTFZNLUlSLworCisjIGZvciBsaW51eCBzeXN0ZW0sIGFkZCB5b3VyIGFyY2ggYW5kIG9zIGhlcmUKK2RlY2xhcmUgLWEgQVJDSGVzPSh4ODYgeDg2XzY0IHBvd2VycGMgYXJtIG1pcHMgZGFyd2luKQorZGVjbGFyZSAtYSBPU2VzPShsaW51eCBtYWNvc3ggd2luZG93cyBkYXJ3aW4pCisKK2RlY2xhcmUgbG93ZXJBUkNICitkZWNsYXJlIGxvd2VyT1MKKworIyB0YXJnZXQgZGlyZWN0b3J5IG5hbWUKK2RlY2xhcmUgdXBwZXJBUkNICitkZWNsYXJlIHVwcGVyT1MKKworbG93ZXJBUkNIPSQoZWNobyAiJE1BQ0hUWVBFIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQorbG93ZXJPUz0kKGVjaG8gIiRPU1RZUEUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCisKKyMgQVJDSAorZm9yIGkgaW4gJHtBUkNIZXNbQF19CitkbworICAgIHJlc3VsdD0kKGVjaG8gIiR7bG93ZXJBUkNIfSIgfCBncmVwICRpKQorICAgIGlmIFtbICIkcmVzdWx0IiAhPSAiIiBdXQorICAgIHRoZW4KKyAgICAgICAgIyB1cHBlckFSQ0g9JGkKKwkJdXBwZXJBUkNIPSQoZWNobyAiJGkiIHwgdHIgJ1s6bG93ZXI6XScgJ1s6dXBwZXI6XScpCisgICAgZmkKK2RvbmUKKworaWYgW1sgIiR1cHBlckFSQ0giID09ICIiIF1dCit0aGVuCisgICAgZWNobyAiTm90IGZvdW5kICR7bG93ZXJBUkNIfSBpbiB0aGUgWyR7QVJDSGVzW0BdfV0hIgorICAgIGV4aXQKK2ZpCisKKyMgT1MKK2ZvciBpIGluICR7T1Nlc1tAXX0KK2RvCisgICAgcmVzdWx0PSQoZWNobyAiJHtsb3dlck9TfSIgfCBncmVwICRpKQorICAgIGlmIFtbICIkcmVzdWx0IiAhPSAiIiBdXQorICAgIHRoZW4KKyAgICAgICAgIyB1cHBlck9TPSRpCisJCXVwcGVyT1M9JChlY2hvICIkaSIgfCB0ciAnWzpsb3dlcjpdJyAnWzp1cHBlcjpdJykKKyAgICBmaQorZG9uZQorCitpZiBbWyAiJHVwcGVyT1MiID09ICIiIF1dCit0aGVuCisgICAgZWNobyAiTm90IGZvdW5kICR7bG93ZXJPU30gaW4gdGhlIFske09TZXNbQF19XSEiCisgICAgZXhpdAorZmkKKworIyBzdXJ2aXZlZCwgYXNzZW1ibGUgdGhlIHBhdGgKKyMgQVJDSF9QQVRIKz0kdXBwZXJBUkNILworIyBPU19QQVRIKz0kdXBwZXJBUkNILyR1cHBlck9TLworQVJDSF9uZXdGb3JtYXQ9LgoraWYgWyAkdXBwZXJBUkNIID0gIlg4NiIgXTsgdGhlbgorICAgIEFSQ0hfbmV3Rm9ybWF0PTMyCitlbHNlCisgICAgQVJDSF9uZXdGb3JtYXQ9MzJlCitmaQorT1NfbmV3Rm9ybWF0PS4KK2lmIFsgJHVwcGVyT1MgPSAiTElOVVgiIF07IHRoZW4KKyAgICBPU19uZXdGb3JtYXQ9bGluCitlbGlmIFsgJHVwcGVyT1MgPSAiTUFDT1NYIiBdOyB0aGVuCisgICAgT1NfbmV3Rm9ybWF0PW1hYworZWxpZiBbICR1cHBlck9TID0gIldJTkRPV1MiIF07IHRoZW4KKyAgICBPU19uZXdGb3JtYXQ9d2luCitlbGlmIFsgJHVwcGVyT1MgPSAiREFSV0lOIiBdOyB0aGVuCisgICAgT1NfbmV3Rm9ybWF0PWRhcgorZWxzZQorICAgIE9TX25ld0Zvcm1hdD11bmtub3duCitmaQorT1NfUEFUSCs9JE9TX25ld0Zvcm1hdCJfIiRBUkNIX25ld0Zvcm1hdAorCisjIHRlc3QgYW5kIGNyZWF0ZSBkaXJlY3RvcnkKK2lmIFsgISAtZCAiJExFVkVMIiBdOyB0aGVuCisgICAgbWtkaXIgJExFVkVMCisgICAgbWtkaXIgJE9TX1BBVEgKK2Vsc2UKKyAgICBpZiBbICEgLWQgIiRPU19QQVRIIiBdOyB0aGVuCisgICAgICAgIG1rZGlyICRPU19QQVRICisgICAgZmkKK2ZpCisKKyMgcmVzZXJ2ZSB0aGUgdG1wIHBhdGggdG8gTExWTS1JUi9BUkNIL09TCitlY2hvICRPU19QQVRIIi8iID4gbGl0LnRtcAorCisjIE9TX0FSQ0g9JE9TX25ld0Zvcm1hdCJfIiRBUkNIX25ld0Zvcm1hdAorIyBlY2hvIC1lICJpZiBub3QgJyRPU19BUkNIJyBpbiBjb25maWcucm9vdC50YXJnZXRzOiIgPiAkT1NfUEFUSCcvJ2xpdC5sb2NhbC5jZmcKKyMgZWNobyAtZSAiXHRjb25maWcudW5zdXBwb3J0ZWQgPSBUcnVlIiA+PiAkT1NfUEFUSCcvJ2xpdC5sb2NhbC5jZmcKKworIyBjb3B5ICoubGwgZmlsZXMgdG8gQVJDSC9PUworYGNwIGxpdC4qICRMRVZFTGAKKworIyBvbWl0IG9ycGggdGVzdAorYHJtIGMtJE1BQ0hUWVBFJE9TVFlQRS9jdGVzdF8qLmxsYAorYHJtIGMtJE1BQ0hUWVBFJE9TVFlQRS9vcnBoX2N0ZXN0XyoubGxgCitgY3AgYy0kTUFDSFRZUEUkT1NUWVBFLyoubGwgJE9TX1BBVEhgCisKKyMgY2xlYW4KK2BybSAvdG1wL3RtcC4qYAorcm0gLXJmIGMtJE1BQ0hUWVBFJE9TVFlQRS8KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYmluL2hlYWRlciBiL3JjMy90ZXN0c3VpdGUvYmluL2hlYWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzQxZTYyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9iaW4vaGVhZGVyCkBAIC0wLDAgKzEsNiBAQAorOyBSVU46ICVjbGFuZyAtbG9tcCAtbG0gJXMgLW8gJXQgJiYgJXQgMj4mMSB8IEZpbGVDaGVjayAlcworOyBDSEVDSy1OT1Q6IFRlc3QgZmFpbGVkCis7IENIRUNLOiBEaXJlY3RpdmUgd29ya2VkIHdpdGhvdXQgZXJyb3JzCisKKworCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Jpbi9saXQuY2ZnIGIvcmMzL3Rlc3RzdWl0ZS9iaW4vbGl0LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTU3ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9iaW4vbGl0LmNmZwpAQCAtMCwwICsxLDc4IEBACisjIC0qLSBQeXRob24gLSotCisKKyMgQ29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgJ2xpdCcgdGVzdCBydW5uZXIuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHJlCitpbXBvcnQgcGxhdGZvcm0KKwordHJ5OgorICAgaW1wb3J0IGxpdC51dGlsCisgICBpbXBvcnQgbGl0LmZvcm1hdHMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgIHBhc3MKKworIyBuYW1lOiBUaGUgbmFtZSBvZiB0aGlzIHRlc3Qgc3VpdGUuCitjb25maWcubmFtZSA9ICdPcGVuTVBWYWxpZGF0aW9uU3VpdGUnCisKKyMgdGVzdEZvcm1hdDogVGhlIHRlc3QgZm9ybWF0IHRvIHVzZSB0byBpbnRlcnByZXQgdGVzdHMuCitjb25maWcudGVzdF9mb3JtYXQgPSBsaXQuZm9ybWF0cy5TaFRlc3QoZXhlY3V0ZV9leHRlcm5hbD1GYWxzZSkKKworIyBzdWZmaXhlczogQSBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyB0byB0cmVhdCBhcyB0ZXN0IGZpbGVzCisjIE5vdGUgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBsaXQubG9jYWwuY2ZnIGZpbGVzCitjb25maWcuc3VmZml4ZXMgPSBbJy5sbCddCisKKyMgdGVzdF9zb3VyY2Vfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBhcmUgbG9jYXRlZC4KKyNjb25maWcudGVzdF9zb3VyY2Vfcm9vdCA9ICIvaG9tZS9pY2hveWp4L2luc3RhbGwvb3Blbm1wL3Rlc3RzdWl0ZS9iaW4iCisjb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorCisjIHRlc3RfZXhlY19yb290OiBUaGUgcm9vdCBwYXRoIHdoZXJlIHRlc3RzIHNob3VsZCBiZSBydW4uCisjbXB2c19vYmpfcm9vdCA9IGdldGF0dHIoY29uZmlnLCAnbXB2c19vYmpfcm9vdCcsIE5vbmUpCisjaWYgbXB2c19vYmpfcm9vdCBpcyBub3QgTm9uZToKK2NvbmZpZy50ZXN0X2V4ZWNfcm9vdCA9ICIuLyIKKyNvcy5wYXRoLmpvaW4obXB2c19vYmpfcm9vdCwgJ3NyYycpCisKKyMgRGlzY292ZXIgdGhlICdjbGFuZycgYW5kICdjbGFuZ2NjJyB0byB1c2UuCisKK2ltcG9ydCBvcworCitkZWYgaW5mZXJDbGFuZyhQQVRIKToKKyAgICAjIERldGVybWluZSB3aGljaCBjbGFuZyB0byB1c2UuCisgICAgY2xhbmcgPSBvcy5nZXRlbnYoJ0NMQU5HJykKKworICAgICMgSWYgdGhlIHVzZXIgc2V0IGNsYW5nIGluIHRoZSBlbnZpcm9ubWVudCwgZGVmaW5pdGVseSB1c2UgdGhhdCBhbmQgZG9uJ3QKKyAgICAjIHRyeSB0byB2YWxpZGF0ZS4KKyAgICBpZiBjbGFuZzoKKyAgICAgICAgcmV0dXJuIGNsYW5nCisKKyAgICAjIE90aGVyd2lzZSBsb29rIGluIHRoZSBwYXRoLgorICAgIGNsYW5nID0gbGl0LnV0aWwud2hpY2goJ2NsYW5nJywgUEFUSCkKKworICAgIGlmIG5vdCBjbGFuZzoKKyAgICAgICAgbGl0X2NvbmZpZy5mYXRhbCgiY291bGRuJ3QgZmluZCAnY2xhbmcnIHByb2dyYW0sIHRyeSBzZXR0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xBTkcgaW4geW91ciBlbnZpcm9ubWVudCIpCisKKyAgICByZXR1cm4gY2xhbmcKKworY29uZmlnLmNsYW5nID0gaW5mZXJDbGFuZyhjb25maWcuZW52aXJvbm1lbnRbJ1BBVEgnXSkucmVwbGFjZSgnXFwnLCAnLycpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoICgnJWNsYW5nJywgJyAnICsgY29uZmlnLmNsYW5nICsgJyAnKSApCisKKyMgUHJvcG9nYXRlIHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGVzdCBlbnZpcm9ubWVudC4KK2RlZiBhZGRFbnYobmFtZSk6CisgICAgaWYgbmFtZSBpbiBvcy5lbnZpcm9uOgorICAgICAgICBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0gPSBvcy5lbnZpcm9uW25hbWVdCisKK2FkZEVudignSE9NRScpCithZGRFbnYoJ1BXRCcpCisKKworYWRkRW52KCdDX0lOQ0xVREVfUEFUSCcpCithZGRFbnYoJ0NQTFVTX0lOQ0xVREVfUEFUSCcpCithZGRFbnYoJ0xJQlJBUllfUEFUSCcpCithZGRFbnYoJ0xEX0xJQlJBUllfUEFUSCcpCithZGRFbnYoJ0RZTERfTElCUkFSWV9QQVRIJykKKworIyBDaGVjayB0aGF0IHRoZSBvYmplY3Qgcm9vdCBpcyBrbm93bi4KK2lmIGNvbmZpZy50ZXN0X2V4ZWNfcm9vdCBpcyBOb25lOgorICAgIGxpdC5mYXRhbCgndGVzdCBleGVjdXRpb24gcm9vdCBub3Qgc2V0IScpCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Jpbi9saXQuc2l0ZS5jZmcuaW4gYi9yYzMvdGVzdHN1aXRlL2Jpbi9saXQuc2l0ZS5jZmcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4NjZkNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYmluL2xpdC5zaXRlLmNmZy5pbgpAQCAtMCwwICsxLDMwIEBACisjIyBBdXRvZ2VuZXJhdGVkIGJ5IExMVk0vQ2xhbmcgY29uZmlndXJhdGlvbi4KKyNjb25maWcubXB2c19zcmNfcm9vdCA9ICIvaG9tZS9pY2hveWp4L2luc3RhbGwvb3Blbm1wL3Rlc3RzdWl0ZS9iaW4vYyIKK2NvbmZpZy5tcHZzX29ial9yb290ID0gIi90bXAiCitjb25maWcubGx2bV90b29sc19kaXIgPSAiQExMVk1fVE9PTFNfRElSQCIKKworCisjIE5lZWRlZCB0byBjaGVjayBpZiBhIGhhY2sgbmVlZHMgdG8gYmUgYXBwbGllZAorY29uZmlnLmxsdm1fdmVyc2lvbl9tYWpvciA9ICJATExWTV9WRVJTSU9OX01BSk9SQCIKKworIyBDb21waWxlcnMKKyMgRklYTUU6IHVzZSBsbHZtY2Mgbm90IGxsdm1nY2MKK2NvbmZpZy5sbHZtY2xhbmcgPSAiY2xhbmciCisKKyMgRmVhdHVyZXMKK2NvbmZpZy5lbmFibGVfdWNsaWJjID0gVHJ1ZSBpZiBARU5BQkxFX1VDTElCQ0AgPT0gMSBlbHNlIEZhbHNlCitjb25maWcuZW5hYmxlX3Bvc2l4X3J1bnRpbWUgPSBUcnVlIGlmIEBFTkFCTEVfUE9TSVhfUlVOVElNRUAgPT0gMSBlbHNlIEZhbHNlCitjb25maWcuaGF2ZV9zZWxpbnV4ID0gVHJ1ZSBpZiBASEFWRV9TRUxJTlVYQCA9PSAxIGVsc2UgRmFsc2UKKworIyBDdXJyZW50IHRhcmdldAorY29uZmlnLnRhcmdldF90cmlwbGUgPSAiQFRBUkdFVF9UUklQTEVAIgorCisjIExldCB0aGUgbWFpbiBjb25maWcgZG8gdGhlIHJlYWwgd29yay4KK3RyeToKKyAgbGl0CitleGNlcHQgTmFtZUVycm9yOgorICAjIFVzZSBsaXRfY29uZmlnIGNsYXNzCisgIGxpdF9jb25maWcubG9hZF9jb25maWcoY29uZmlnLCAiQE1QVlNfU09VUkNFX0RJUkAvbGl0LmNmZyIpCitlbHNlOgorICAjIFVzZSBvbGQgbGl0IGNsYXNzCisgIGxpdC5sb2FkX2NvbmZpZyhjb25maWcsICJATVBWU19TT1VSQ0VfRElSQC9saXQuY2ZnIikKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYmluL2xpdC50bXAgYi9yYzMvdGVzdHN1aXRlL2Jpbi9saXQudG1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDMwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Jpbi9saXQudG1wCkBAIC0wLDAgKzEgQEAKKy4uL0xMVk0tSVIvbGluXzMyZS8KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9oYXNfb3Blbm1wLmMgYi9yYzMvdGVzdHN1aXRlL2MvaGFzX29wZW5tcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4M2E5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2MvaGFzX29wZW5tcC5jCkBAIC0wLDAgKzEsMzAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgT3Blbk1wIHN1cHBvcnQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPl9PUEVOTVA8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5oYXNfb3Blbm1wPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHJ2YWx1ZSA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIDxvbXB0czpvcnBoYW4+CisgICAgPG9tcHRzOmNoZWNrPgorI2lmZGVmIF9PUEVOTVAKKwlydmFsdWUgPSAxOworI2VuZGlmCisgICAgPC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6Y3Jvc3NjaGVjaz4KKyNpZiAwCisJcnZhbHVlID0gMTsKKyNlbmRpZgorICAgIDwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgIDwvb21wdHM6b3JwaGFuPgorCXJldHVybiAocnZhbHVlKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2F0b21pYy5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9hdG9taWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzJkMWFhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9hdG9taWMuYwpAQCAtMCwwICsxLDQzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgYXRvbWljIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3Agd2l0aCBhbiBhdG9taWMgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgYXRvbWljPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9hdG9taWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworICAgICAgICBpbnQgZGlmZjsKKyAgICAgICAgZG91YmxlIGRzdW0gPSAwOworICAgICAgICBkb3VibGUgZHQgPSAwLjU7CS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgICAgICAgZG91YmxlIGRkaWZmOworICAgICAgICBpbnQgcHJvZHVjdDsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGludCAqbG9naWNzOworICAgICAgICBpbnQgYml0X2FuZCA9IDE7CisgICAgICAgIGludCBiaXRfb3IgPSAwOworICAgICAgICBpbnQgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAJLyogZHReRE9VQkxFX0RJR0lUUyAqLworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKyAgICBpbnQgajsKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCBrbm93bl9kaWZmOworICAgIGludCBrbm93bl9wcm9kdWN0OworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBsb2dpY19hbmQgPSAxOworICAgIGludCBsb2dpY19vciA9IDA7CisgICAgZG91YmxlIGRrbm93bl9zdW07CisgICAgZG91YmxlIHJvdW5kaW5nX2Vycm9yID0gMS5FLTk7CisgICAgZG91YmxlIGRwdCwgZGl2OworICAgIGludCBsb2dpY3NBcnJheVtMT09QQ09VTlRdOworICAgIGxvZ2ljcyA9IGxvZ2ljc0FycmF5OworICAgIAorICAgIHN1bSA9IDA7CisgICAgZGlmZiA9IDA7CisgICAgcHJvZHVjdCA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisJICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJICAgIHsKKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisJCXN1bSArPSBpOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICBpZiAoa25vd25fc3VtICE9IHN1bSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsIAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsIAorICAgICAgICAgICAgICAgICBzdW0sIGtub3duX3N1bSk7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKyAgICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPiAgIAorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgIGRpZmYgLT0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGtub3duX2RpZmYgPSAoKExPT1BDT1VOVCAtIDEpICogTE9PUENPVU5UKSAvIDIgKiAtMTsKKyAgICBpZiAoZGlmZiAhPSBrbm93bl9kaWZmKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLAorICAgICAgICAgICAgICAgZGlmZik7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKworICAgIC8qIFRlc3RzIGZvciBkb3VibGVzICovCisgICAgZHN1bSA9IDA7CisgICAgZHB0ID0gMTsKKworICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisgICAgICB7CisgICAgICAgIGRwdCAqPSBkdDsKKyAgICAgIH0KKyAgICBka25vd25fc3VtID0gKDEgLSBkcHQpIC8gKDEgLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgZHN1bSArPSBwb3cgKGR0LCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGRzdW0gIT0gZGtub3duX3N1bSAmJiAoZmFicyAoZHN1bSAtIGRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IpKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZjogJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgICAgICAgICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bSAtIGRrbm93bl9zdW0pOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICBkcHQgPSAxOworCisgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikKKyAgICB7CisgICAgICAgIGRwdCAqPSBkdDsKKyAgICB9CisgICAgZGRpZmYgPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICB7CisgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgZGRpZmYgLT0gcG93IChkdCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9IAorICAgIGlmIChmYWJzIChkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIiwKKyAgICAgICAgICAgICAgICAgZGRpZmYpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgCisgICAga25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisgICAgaWYgKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBwcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgcHJvZHVjdCwga25vd25fcHJvZHVjdCk7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKworICAgIHByb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBwcm9kdWN0IC89IGk7CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAocHJvZHVjdCAhPSAxKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHByb2R1Y3QgZGl2aXNpb24gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDFcbiIsCisgICAgICAgICAgICAgICAgIHByb2R1Y3QpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisgICAgCisgICAgZGl2ID0gNS4wRSs1OworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgZGl2IC89IGk7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZhYnMoZGl2LTAuMTM3Nzg3KSA+PSAxLjBFLTQgKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBkaXZpc2lvbiB3aXRoIGRvdWJsZTogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mIDAuMTM3Nzg3XG4iLCBkaXYpOworICAgIH0KKworICAgIHggPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHggIT0gTE9PUENPVU5UKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiArK1xuIik7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeC0tOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoeCAhPSAwKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiAtLVxuIik7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorICAgIHsKKyAgICAgICAgbG9naWNzW2pdID0gMTsKKyAgICB9CisgICAgYml0X2FuZCA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9hbmQgJj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKCFiaXRfYW5kKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgYml0X2FuZCA9IDE7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9hbmQgJj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoYml0X2FuZCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDA7CisgICAgfQorICAgIGJpdF9vciA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfb3IgfD0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoYml0X29yKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisgICAgYml0X29yID0gMDsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgYml0X29yIHw9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIWJpdF9vcikKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgaisrKQorICAgIHsKKyAgICAgICAgbG9naWNzW2pdID0gMDsKKyAgICB9CisgICAgZXhjbHVzaXZfYml0X29yID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+IAorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciBePSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKGV4Y2x1c2l2X2JpdF9vcikgCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKyAgICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmICghZXhjbHVzaXZfYml0X29yKSAKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisgICAgeCA9IDE7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgIHggPDw9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICggeCAhPSAxMDI0KQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiA8PFxuIik7CisgICAgICAgIHggPSAxMDI0OworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeCA+Pj0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHggIT0gMSkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gPj5cbiIpOworICAgIH0KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfYmFycmllci5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9iYXJyaWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2NjllMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfYmFycmllci5jCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGJhcnJpZXIgZGlyZWN0aXZlLiBUaGUgdGVzdCBjcmVhdGVzIHNldmVyYWwgdGhyZWFkcyBhbmQgc2VuZHMgb25lIG9mIHRoZW0gc2xlZXBpbmcgYmVmb3JlIHNldHRpbmcgYSBmbGFnLiBBZnRlciB0aGUgYmFycmllciB0aGUgb3RoZXIgb25lcyBkbyBzb21lIGxpdHRsZSB3b3JrIGRlcGVuZGluZyBvbiB0aGUgZmxhZy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGJhcnJpZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYmFycmllcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCByZXN1bHQxOworCWludCByZXN1bHQyOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICByZXN1bHQxID0gMDsKKyAgICByZXN1bHQyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgPG9tcHRzOm9ycGhhbj4KKwlpbnQgcmFuazsKKwlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCWlmIChyYW5rID09MSkgeworICAgICAgICBteV9zbGVlcChTTEVFUFRJTUVfTE9ORyk7CisgICAgICAgIHJlc3VsdDIgPSAzOworCX0KKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBiYXJyaWVyPC9vbXB0czpjaGVjaz4KKwlpZiAocmFuayA9PSAyKSB7CisJICAgIHJlc3VsdDEgPSByZXN1bHQyOworCX0KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgcHJpbnRmKCJyZXN1bHQxPSVkXG4iLHJlc3VsdDEpOworICAgIHJldHVybiAocmVzdWx0MSA9PSAzKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2NyaXRpY2FsLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2NyaXRpY2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzZjI2NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfY3JpdGljYWwuYwpAQCAtMCwwICsxLDQyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBjcml0aWNhbCBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGhpbiBhIGNyaXRpY2FsIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBjcml0aWNhbDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9jcml0aWNhbDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBzdW09MDsKKyAgICBpbnQga25vd25fc3VtOworCSAgCisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgIGludCBteXN1bT0wOworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgICNwcmFnbWEgb21wIGZvcgorCSAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorCSAgICAgIG15c3VtID0gbXlzdW0gKyBpOworCisgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGNyaXRpY2FsPC9vbXB0czpjaGVjaz4KKwkgICAgc3VtID0gbXlzdW0gK3N1bTsKKyAgICAgICAgCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAKKyAgICBwcmludGYoInN1bT0lZFxuIixzdW0pOworICAgIGtub3duX3N1bSA9IDk5OSAqIDEwMDAgLyAyOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2ZsdXNoLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2ZsdXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhYmY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZmx1c2guYwpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmbHVzaCBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmbHVzaDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBiYXJyaWVyPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZmx1c2g8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0MTsKKwlpbnQgcmVzdWx0MjsKKwlpbnQgZHVtbXk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworCXJlc3VsdDEgPSAwOworCXJlc3VsdDIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwlpbnQgcmFuazsKKwlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBiYXJyaWVyCisJaWYgKHJhbmsgPT0gMSkgeworCSAgICByZXN1bHQyID0gMzsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGZsdXNoIChyZXN1bHQyKTwvb21wdHM6Y2hlY2s+CisJCWR1bW15ID0gcmVzdWx0MjsKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorCisJaWYgKHJhbmsgPT0gMCkgeworCSAgICA8b21wdHM6Y2hlY2s+bXlfc2xlZXAoU0xFRVBUSU1FX0xPTkcpOzwvb21wdHM6Y2hlY2s+CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0Mik8L29tcHRzOmNoZWNrPgorCQlyZXN1bHQxID0gcmVzdWx0MjsKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICByZXR1cm4gKChyZXN1bHQxID09IHJlc3VsdDIpICYmIChyZXN1bHQyID09IGR1bW15KSAmJiAocmVzdWx0MiA9PSAzKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3JfY29sbGFwc2UuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX2NvbGxhcHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxNmY0MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX2NvbGxhcHNlLmMKQEAgLTAsMCArMSw1NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2l0aCBvbXAgZm9yIGNvbGxhcHNlIGNsYXVzZS4gQmluZCB3aXRoIHR3byBsb29wcy4gV2l0aG91dCB0aGUgY29sbGFwc2UgY2xhdXNlLCB0aGUgZmlyc3QgbG9vcCB3aWxsIG5vdCBiZSBvcmRlcmVkPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgY29sbGFwc2U8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGZvciBzY2hlZHVsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayB0aGF0IGkgaXMgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5IAorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgICAgc3RhdGljIGludCBsYXN0X2k7CisgICAgaW50IGlzbGFyZ2VyOworICAgIGlmIChpPT0xKQorICAgICAgbGFzdF9pPTA7CisgICAgaXNsYXJnZXIgPSAoKGkgPj0gbGFzdF9pKSYmKGkgLSBsYXN0X2k8PTEpKTsKKyAgICBsYXN0X2kgPSBpOworICAgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2NvbGxhcHNlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGlzX2xhcmdlciA9IDE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICBpbnQgaSxqOworCSAgaW50IG15X2lzbGFyZ2VyID0gMTsKKyAgICAgICNwcmFnbWEgb21wIGZvciBwcml2YXRlKGksaikgc2NoZWR1bGUoc3RhdGljLDEpIDxvbXB0czpjaGVjaz5jb2xsYXBzZSgyKTwvb21wdHM6Y2hlY2s+IG9yZGVyZWQKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKXsKKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz5teV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkmJiBteV9pc2xhcmdlcjs8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgZm9yIChqID0xOyBqIDwxMDA7IGorKykKKyAgICAgICAgICB7CisgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisJCSAgICAjcHJhZ21hIG9tcCBvcmRlcmVkCisJCSAgICAgIG15X2lzbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcihpKSYmbXlfaXNsYXJnZXI7CisgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCSAgICAgIH0JLyogZW5kIG9mIGZvciAqLworICAgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorCQlpc19sYXJnZXIgPSBpc19sYXJnZXIgJiYgbXlfaXNsYXJnZXI7CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgcmV0dXJuIChpc19sYXJnZXIpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3JfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3MjAxNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciBmaXJzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGZvciBmaXJzdHByaXZhdGUuIEZpcnN0IGl0IHN0b3JlcyB0aGUgcmVzdWx0IG9mIGl0cyBsYXN0IGl0ZXJhdGlvbiBpbiB2YXJpYWJsZSAoMikuIFRoZW4gaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBmaXJzdHByaXZhdGUgdmFyaWFibGUgKDEpLiBBdCB0aGUgZW5kIGFsbCBmaXJzdHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IHN1bTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCBrbm93bl9zdW07CisgICAgaW50IHRocmVhZHNudW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTAgPSAxMjM0NTsKKyAgICBzdW0xID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZWFkc251bT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgICAgIH0KKwkvKiBzdW0wID0gMDsgKi8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkgICAgc3VtMSA9IHN1bTA7CisJfQkvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKwl9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCisgICAga25vd25fc3VtID0gMTIzNDUqIHRocmVhZHNudW0rIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX2xhc3Rwcml2YXRlLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMDgwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciBsYXN0cHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBzYXZlcyB0aGUgbmV4dCBzdW1tYW5kIGluIGEgbGFzdHByaXZhdGUgdmFyaWFibGUgaTAuIEF0IHRoZSBlbmQgaTAgaXMgY29tcGFyZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBleHBlY3RlZCBsYXN0IHN1bW1hbmQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSxvbXAgc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMCkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisJaW50IHN1bSA9IDA7CisJaW50IGtub3duX3N1bTsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJICAgIGludCBpMDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCisJaTAgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJICAgIHN1bTAgPSAwOworCSAgICB7CS8qIEJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisJICAgIDxvbXB0czpvcnBoYW4+CisJCWludCBpOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYyw3KSA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkJeworCQkgICAgc3VtMCA9IHN1bTAgKyBpOworCQkgICAgaTAgPSBpOworCQl9CS8qIGVuZCBvZiBmb3IgKi8KKwkgICAgPC9vbXB0czpvcnBoYW4+CisJICAgIH0JLyogZW5kIG9mIG9ycGhhbmVkIGJsb2NrICovCisKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICAgIHsKKwkJc3VtID0gc3VtICsgc3VtMDsKKwkgICAgfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKwl9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiBrbm93bl9zdW0gPSAlZCAsIHN1bSA9ICVkIFxuIixrbm93bl9zdW0sc3VtKTsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiBMT09QQ09VTlQgPSAlZCAsIGkwID0gJWQgXG4iLExPT1BDT1VOVCxpMCk7CisJcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IExPT1BDT1VOVCkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9ub3dhaXQuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZWM0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9ub3dhaXQuYwpAQCAtMCwwICsxLDU3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czpkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBub3dhaXQgZGlyZWN0aXZlLiBJdCBmaWxscyBhbiBhcnJheSB3aXRoIHZhbHVlcyBhbmQgb3BlcmF0ZXMgb24gdGhlc2UgaW4gdGhlIGZvbGxvd2luZy48L29tcHRzOmRlc2NyaXB0aW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnZlcnNpb24+MS4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmb3IsIG9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9ub3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworCTxvbXB0czpvcnBoYW46dmFycz4KKwkJaW50IHJlc3VsdDsKKwkJaW50IGNvdW50OworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGo7CisJaW50IG15YXJyYXlbTE9PUENPVU5UXTsKKworCXJlc3VsdCA9IDA7CisJY291bnQgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisJPG9tcHRzOm9ycGhhbj4KKwkJaW50IHJhbms7CisJCWludCBpOworCisJCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5ub3dhaXQ8L29tcHRzOmNoZWNrPiAKKwkJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBlbnRlcmluZyBmb3IgbG9vcCBhbmQgZ29pbmcgdG8gc2xlZXAuXG4iLCByYW5rKTsKKwkJCQlteV9zbGVlcChTTEVFUFRJTUUpOworCQkJCWNvdW50ID0gMTsKKyNwcmFnbWEgb21wIGZsdXNoKGNvdW50KQorCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgd29rZSB1cCBhbmQgc2V0IGNvdW50ID0gMS5cbiIsIHJhbmspOworCQkJfQorCQl9CisJCQorCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4aXRlZCBmaXJzdCBmb3IgbG9vcCBhbmQgZW50ZXJzIHRoZSBzZWNvbmQuXG4iLCByYW5rKTsKKyNwcmFnbWEgb21wIGZvcgorCQlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIAorCQl7CisjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKwkJCWlmIChjb3VudCA9PSAwKQorCQkJCXJlc3VsdCA9IDE7CisJCX0KKwk8L29tcHRzOm9ycGhhbj4KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9vcmRlcmVkLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9vcmRlcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5N2QwNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX29yZGVyZWQuYwpAQCAtMCwwICsxLDYwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBvcmRlcmVkIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhbiB2YXJpYWJsZSBpbiBhbiBwYXJhbGxlbGl6ZWQgbG9vcCBhbmQgd2F0Y2hpbmcgZWFjaCBpdGVyYXRpb24gaWYgdGhlIHN1bWFuZCBpcyBsYXJnZXIgYXMgdGhlIGxhc3Qgb25lLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGZvciBzY2hlZHVsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgbGFzdF9pID0gMDsKKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayB0aGF0IGkgaXMgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5IAorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgICAgaW50IGlzbGFyZ2VyOworICAgIGlzbGFyZ2VyID0gKGkgPiBsYXN0X2kpOworICAgIGxhc3RfaSA9IGk7CisgICAgcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisJaW50IGlzX2xhcmdlciA9IDE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgbGFzdF9pID0gMDsKKyAgICBzdW0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKwkgICAgaW50IG15X2lzbGFyZ2VyID0gMTsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgb3JkZXJlZAorCSAgICBmb3IgKGkgPSAxOyBpIDwgMTAwOyBpKyspCisJICAgIHsKKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG9yZGVyZWQ8L29tcHRzOmNoZWNrPgorCQl7CisJCSAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkgJiYgbXlfaXNsYXJnZXI7CisJCSAgICBzdW0gPSBzdW0gKyBpOworCQl9CS8qIGVuZCBvZiBvcmRlcmVkICovCisJICAgIH0JLyogZW5kIG9mIGZvciAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgICAgeworCQlpc19sYXJnZXIgPSBpc19sYXJnZXIgJiYgbXlfaXNsYXJnZXI7CisJICAgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAga25vd25fc3VtPSg5OSAqIDEwMCkgLyAyOworICAgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIGlzX2xhcmdlcik7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjUxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9wcml2YXRlLmMKQEAgLTAsMCArMSw2NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZm9yIHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgcHJpdmF0ZSB2YXJpYWJsZSAoMSkgYW5kIGEgdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGZvciBwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIHRoaXMgdGhyZWFkIHdhaXRzIHNvbWUgdGltZSBiZWZvcmUgaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpdGVyYXRpb24gdGhlIHZhbHVlIG9mICgxKSBpcyBhc3NpZ25lZCB0byAoMikuIEF0IHRoZSBlbmQgYWxsIHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsLG9tcCBmbHVzaCxvbXAgY3JpdGljYWwsb21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitzdGF0aWMgdm9pZCBkb19zb21lX3dvcmsgKCl7CisgICAgaW50IGk7CisgICAgZG91YmxlIHN1bSA9IDA7CisgICAgZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKXsKKwlzdW0gKz0gc3FydCAoKGRvdWJsZSkgaSk7CisgICAgfQorfQorCitpbnQgc3VtMTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgc3VtID0gMDsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0wID0gMDsJLyogc2V0dGluZyAoZ2xvYmFsKSBzdW0wID0gMCAqLworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwlzdW0xID0gMDsJLyogc2V0dGluZyBzdW0xIGluIGVhY2ggdGhyZWFkIHRvIDAgKi8KKworCXsJLyogYmVnaW4gb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+IHNjaGVkdWxlKHN0YXRpYywxKQorCSAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCSAgICB7CisJCXN1bTAgPSBzdW0xOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJc3VtMCA9IHN1bTAgKyBpOworCQlkb19zb21lX3dvcmsgKCk7CisjcHJhZ21hIG9tcCBmbHVzaAorCQlzdW0xID0gc3VtMDsKKwkgICAgfQkvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisJfQkvKiBlbmQgb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKmVuZCBvZiBjcml0aWNhbCovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKworICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcmVkdWN0aW9uLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQxOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSw0MjkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpY2ggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJZG91YmxlIGR0OworCWludCBzdW07CisJaW50IGRpZmY7CisJaW50IHByb2R1Y3QgPSAxOworCWRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgbG9naWNfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X2FuZDsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50ICpsb2dpY3M7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisKKyAgICBpbnQgaTsKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCBrbm93bl9wcm9kdWN0OworICAgIGRvdWJsZSByb3VuZGluZ19lcnJvciA9IDEuRS05OwkvKiBvdmVyIGFsbCByb3VuZGluZyBlcnJvciB0byBiZSBpZ25vcmVkIGluIHRoZSBkb3VibGUgdGVzdHMgKi8KKyAgICBkb3VibGUgZHB0OworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBsb2dpY3NBcnJheVtMT09QQ09VTlRdOworCisgICAgLyogVmFyaWFibGVzIGZvciBpbnRlZ2VyIHRlc3RzICovCisgICAgc3VtID0gMDsKKyAgICBwcm9kdWN0ID0gMTsKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgLyogdmFyaWFiZWxzIGZvciBkb3VibGUgdGVzdHMgKi8KKyAgICBkdCA9IDEuIC8gMy47CS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgICBkc3VtID0gMC47CisgICAgLyogVmFyaWFiZWxlcyBmb3IgbG9naWMgIHRlc3RzICovCisgICAgbG9naWNzID0gbG9naWNzQXJyYXk7CisgICAgbG9naWNfYW5kID0gMTsKKyAgICBsb2dpY19vciA9IDA7CisgICAgLyogVmFyaWFiZWxlcyBmb3IgYml0IG9wZXJhdG9ycyB0ZXN0cyAqLworICAgIGJpdF9hbmQgPSAxOworICAgIGJpdF9vciA9IDA7CisgICAgLyogVmFyaWFibGVzIGZvciBleGNsdXNpdiBiaXQgb3IgKi8KKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFRlc3RzIGZvciBpbnRlZ2VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgYWRkaXRpb24gKioqKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkgICAgZm9yIChqID0gMTsgaiA8PSBMT09QQ09VTlQ7IGorKykKKwkgICAgeworCQlzdW0gPSBzdW0gKyBqOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsIHN1bSwga25vd25fc3VtKTsgCisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgaW50ZWdlciBzdWJ0cmFjdG9uICoqKiovCisKKyAgICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspCisJICAgIHsKKwkJZGlmZiA9IGRpZmYgLSBqOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGRpZmYgIT0gMCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIiwgZGlmZik7CisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgaW50ZWdlciBtdWx0aXBsaWNhdGlvbiAqKioqLworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkgICAgZm9yIChqID0gMTsgaiA8PSBNQVhfRkFDVE9SOyBqKyspCisJICAgIHsKKwkJcHJvZHVjdCAqPSBqOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAga25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisgICAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorICAgIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICAgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgZG91YmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBkb3VibGUgYWRkaXRpb24gKioqKi8KKworICAgIGRzdW0gPSAwLjsKKyAgICBkcHQgPSAxLjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgeworCWRwdCAqPSBkdDsKKyAgICB9CisgICAgZGtub3duX3N1bSA9ICgxIC0gZHB0KSAvICgxIC0gZHQpOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgaisrKQorCSAgICB7CQorCQlkc3VtICs9IHBvdyAoZHQsIGopOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisJcmVzdWx0Kys7IAorCWZwcmludGYgKGxvZ0ZpbGUsICJcbkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZjogJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgICB9CisKKyNpZiAwCisgICAgZHB0ID0gMS47CisgICAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkKKyAgICB7CisJZHB0ICo9IGR0OworICAgIH0KKyNlbmRpZgorCisKKy8qKioqIFRlc3RpbmcgZG91YmxlIHN1YnRyYWN0aW9uICoqKiovCisKKyAgICBkZGlmZiA9ICgxIC0gZHB0KSAvICgxIC0gZHQpOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikKKwkgICAgeworCQlkZGlmZiAtPSBwb3cgKGR0LCBqKTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChmYWJzIChkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIiwgZGRpZmYpOworICAgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgbG9naWNhbCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBsb2dpYyBhbmQgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJbG9naWNzW2ldID0gMTsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tqXSk7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZighbG9naWNfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGxvZ2ljX2FuZCA9IDE7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19hbmQgPSBsb2dpY19hbmQgJiYgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYobG9naWNfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGxvZ2ljIG9yICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDA7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKSAgPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGxvZ2ljX29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgbG9naWNfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYoIWxvZ2ljX29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFRlc3RzIGZvciBiaXQgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKiBUZXN0aW5nIGJpdCBhbmQgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICB7CisJbG9naWNzW2ldID0gMTsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKSAgPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tqXSk7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoIWJpdF9hbmQpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGJpdF9hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoYml0X2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgYml0IG9yICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDA7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGJpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGlmICghYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGV4Y2x1c2l2ZSBiaXQgb3IgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJbG9naWNzW2ldID0gMDsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoZXhjbHVzaXZfYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGlmICghZXhjbHVzaXZfYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIC8qZnByaW50ZiAoIlxuUmVzdWx0OiVkXG4iLCByZXN1bHQpOyovCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7CisKKyAgICBmcmVlIChsb2dpY3MpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjFhMWM0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jCkBAIC0wLDAgKzEsNTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBzY2hlZHVsZSBhdXRvPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgYXV0bzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfYXV0bzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IHN1bTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCBrbm93bl9zdW07CisgICAgaW50IHRocmVhZHNudW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTAgPSAxMjM0NTsKKyAgICBzdW0xID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZWFkc251bT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgICAgIH0KKwkvKiBzdW0wID0gMDsgKi8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCkgc2NoZWR1bGUoYXV0byk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkgICAgc3VtMSA9IHN1bTA7CisJfQkvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKwl9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCisgICAga25vd25fc3VtID0gMTIzNDUqIHRocmVhZHNudW0rIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmNkYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYy5jCkBAIC0wLDAgKzEsMTExIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGR5bmFtaWMgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoLG9tcCBmb3Igbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKworLyoKKyogVGVzdCBmb3IgZHluYW1pYyBzY2hlZHVsaW5nIHdpdGggY2h1bmsgc2l6ZQorKiBNZXRob2Q6IGNhY3VsYXRlIGhvdyBtYW55IHRpbWVzIHRoZSBpdGVyYXRpb24gc3BhY2UgaXMgZGlzcGF0Y2hlZAorKiAgICAgICAgIGFuZCBqdWRnZSBpZiBlYWNoIGRpc3BhdGNoIGhhcyB0aGUgcmVxdWVzdGVkIGNodW5rIHNpemUKKyogICAgICAgICB1bmxlc3MgaXQgaXMgdGhlIGxhc3Qgb25lLgorKiBJdCBpcyBwb3NzaWJsZSBmb3IgdHdvIGFkamFjZW50IGNodW5rcyBhcmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgdGhyZWFkCisqIE1vZGlmeWllZCBieSBDaHVuaHVhIExpYW8KKyovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBDRkRNQVhfU0laRSAxMDAKK2NvbnN0IGludCBjaHVua19zaXplID0gNzsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9keW5hbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IHRpZDsKKzxvbXB0czpvcnBoYW46dmFycz4gIAorICBpbnQgKnRpZHM7CisgIGludCBpOworPC9vbXB0czpvcnBoYW46dmFycz4KKworICBpbnQgdGlkc0FycmF5W0NGRE1BWF9TSVpFXTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHRtcF9jb3VudCA9IDA7IC8qZGlzcGF0Y2ggdGltZXMqLworICBpbnQgKnRtcDsgIC8qc3RvcmUgY2h1bmsgc2l6ZSBmb3IgZWFjaCBkaXNwYXRjaCovCisgIGludCByZXN1bHQgPSAwOworICAKKyAgdGlkcyA9IHRpZHNBcnJheTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpIHNoYXJlZCh0aWRzKQorICB7CQkJCS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICBpbnQgdGlkOworCisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5zY2hlZHVsZShkeW5hbWljLGNodW5rX3NpemUpPC9vbXB0czpjaGVjaz4KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkU7IGkrKykKKyAgICAgIHsKKwl0aWRzW2ldID0gdGlkOworICAgICAgfQorICAgICA8L29tcHRzOm9ycGhhbj4KKyAgfQkJCQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkUgLSAxOyArK2kpCisgICAgeworICAgICAgaWYgKHRpZHNbaV0gIT0gdGlkc1tpICsgMV0pCisJeworCSAgY291bnQrKzsKKwl9CisgICAgfQorCisgIHRtcCA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoY291bnQgKyAxKSk7CisgIHRtcFswXSA9IDE7CisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKQorICAgIHsKKyAgICAgIGlmICh0bXBfY291bnQgPiBjb3VudCkKKwl7CisJICBwcmludGYgKCItLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGVzdGludGVybmFsIEVycm9yOiBMaXN0IHRvbyBzbWFsbCEhIVxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwkvKiBFcnJvciBoYW5kbGluZyAqLworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKHRpZHNbaV0gIT0gdGlkc1tpICsgMV0pCisJeworCSAgdG1wX2NvdW50Kys7CisJICB0bXBbdG1wX2NvdW50XSA9IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHRtcFt0bXBfY291bnRdKys7CisJfQorICAgIH0KKy8qCitwcmludGYoImRlYnVnLS0tLVxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyArK2kpCisJcHJpbnRmKCIlZCAiLHRpZHNbaV0pOworcHJpbnRmKCJkZWJ1Zy0tLS1cbiIpOworKi8KKy8qIGlzIGR5bmFtaWMgc3RhdGVtZW50IHdvcmtpbmc/ICovCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGlmICgodG1wW2ldJWNodW5rX3NpemUpIT0wKSAKKy8qaXQgaXMgcG9zc2libGUgZm9yIDIgYWRqYWNlbnQgY2h1bmtzIGFzc2lnbmVkIHRvIGEgc2FtZSB0aHJlYWQqLworCXsKKyAgICAgICAgIHJlc3VsdCsrOworICBmcHJpbnRmKGxvZ0ZpbGUsIlRoZSBpbnRlcm1lZGlhdGUgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworCSAgLypyZXN1bHQgKz0gKCh0bXBbaV0gLyBjaHVua19zaXplKSAtIDEpOyovCisJfQorICAgIH0KKyAgaWYgKCh0bXBbY291bnRdJWNodW5rX3NpemUpIT0oQ0ZETUFYX1NJWkUlY2h1bmtfc2l6ZSkpCisgICB7IAorICAgcmVzdWx0Kys7CisgIGZwcmludGYobG9nRmlsZSwidGhlIGxhc3QgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworICAgfQorICAvKiBmb3IgKGludCBpPTA7aTxjb3VudCsxOysraSkgcHJpbnRmKCIlZFx0Oj1cdCVkXG4iLGkrMSx0bXBbaV0pOyAqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzU2NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKQEAgLTAsMCArMSwyMjUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZ3VpZGVkIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3Igc2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZm9yIG5vd2FpdCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisvKiBUZXN0IGZvciBndWlkZWQgc2NoZWR1bGluZworICogRW5zdXJlIHRocmVhZHMgZ2V0IGNodW5rcyBpbnRlcmxlYXZlbHkgZmlyc3QKKyAqIFRoZW4ganVkZ2UgdGhlIGNodW5rIHNpemVzIGFyZSBkZWNyZWFzaW5nIHRvIGEgc3RhYmxlIHZhbHVlCisgKiBNb2RpZmllZCBieSBDaHVuaHVhIExpYW8KKyAqIEZvciBleGFtcGxlLCAxMDAgaXRlcmF0aW9uIG9uIDIgdGhyZWFkcywgY2h1bmtzaXplIDcKKyAqIG9uZSBsaW5lIGZvciBlYWNoIGRpc3BhdGNoLCAwLzEgbWVhbnMgdGhyZWFkIGlkCisgKiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAgMjQKKyAqIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAxOAorICogMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgIDE0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyAqIDAgMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorICogMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisgKiAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyAqIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworICogMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX1RIUkVBRFMgMTAKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAgMC4wMDUKKworI2lmZGVmIFNMRUVQVElNRQorI3VuZGVmIFNMRUVQVElNRQorI2RlZmluZSBTTEVFUFRJTUUgMC4wMDAxCisjZW5kaWYKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgKiB0aWRzOworCWludCAqIGNodW5rc2l6ZXM7CisJaW50IG5vdG91dDsKKwlpbnQgbWF4aXRlcjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IHRocmVhZHM7CisgICAgaW50IGk7CisgICAgaW50IHJlc3VsdDsKKworICAgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworCW1heGl0ZXIgPSAwOworICAgIHJlc3VsdCA9IDE7CisgICAgbm90b3V0ID0gMTsKKworLyogVGVzdGluZyBpZiBlbm91Z2h0IHRocmVhZHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGVjay4gKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2luZ2xlCisJICB7CisJCXRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworCSAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisJfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworCWlmICh0aHJlYWRzIDwgMikgeworCSAgcHJpbnRmICgiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyAuXG4iKTsKKwkgIGZwcmludGYgKGxvZ0ZpbGUsICJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzLiBBdmFpbGFibGUgd2VyZSBvbmx5ICVkIHRocmVhZChzKS5cbiIsIHRocmVhZHMpOworCSAgcmV0dXJuICgwKTsKKwl9IC8qIGVuZCBpZiAqLworCisKKyAgICAvKiBOb3cgdGhlIHJlYWwgcGFyYWxsZWwgd29yazogIAorICAgICAqCisJICogRWFjaCB0aHJlYWQgd2lsbCBzdGFydCBpbW1lZGlhdGVseSB3aXRoIHRoZSBmaXJzdCBjaHVuay4KKyAgICAgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzLG1heGl0ZXIpCisgICAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIGRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShndWlkZWQpPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvcihqID0gMDsgaiA8IENGU01BWF9TSVpFOyArK2opCisgICAgICB7CisJY291bnQgPSAwLjsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisJaWYgKGogPiBtYXhpdGVyKQorCXsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICB7CisJICAgIG1heGl0ZXIgPSBqOworCSAgfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8gCisJfQorCS8qcHJpbnRmICgidGhyZWFkICVkIHNsZWVwaW5nXG4iLCB0aWQpOyovCisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkJCisJd2hpbGUgKG5vdG91dCAmJiAoY291bnQgPCBNQVhfVElNRSkgJiYgKG1heGl0ZXIgPT0gaikpCisJeworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisJICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKwkgIGNvdW50ICs9IFNMRUVQVElNRTsKKyNpZmRlZiBWRVJCT1NFCisJICBwcmludGYoIi4iKTsKKyNlbmRpZgorCX0KKyNpZmRlZiBWRVJCT1NFCisJaWYgKGNvdW50ID4gMC4pIHByaW50ZigiIHdhaXRlZCAlbGYgc1xuIiwgY291bnQpOworI2VuZGlmCisJLypwcmludGYgKCJ0aHJlYWQgJWQgYXdha2VcbiIsIHRpZCk7Ki8KKwl0aWRzW2pdID0gdGlkOworI2lmZGVmIFZFUkJPU0UKKwlwcmludGYoIiVkIGZpbmlzaGVkIGJ5ICVkXG4iLGosdGlkKTsKKyNlbmRpZgorICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisKKyAgICAgIG5vdG91dCA9IDA7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldmFsdWF0aW9uIG9mIHRoZSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJeworCSAgaW50IGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkgIGludCBsYXN0X3RocmVhZG5yID0gdGlkc1swXTsKKwkgIGludCBnbG9iYWxfY2h1bmtuciA9IDA7CisJICBpbnQgbG9jYWxfY2h1bmtucltOVU1CRVJfT0ZfVEhSRUFEU107CisJICBpbnQgb3BlbndvcmsgPSBDRlNNQVhfU0laRTsKKwkgIGludCBleHBlY3RlZF9jaHVua19zaXplOworCSAgZG91YmxlIGMgPSAxOworCisJICBmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX1RIUkVBRFM7IGkrKykKKwkJbG9jYWxfY2h1bmtucltpXSA9IDA7CisKKwkgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7CisKKyAgICAgIC8qCisJICAgKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBnbG9iYWwgY2h1bmtzCisJICAgKi8KKwkgIC8qZnByaW50Zihsb2dGaWxlLCIjIGdsb2JhbF9jaHVua25yIHRocmVhZCBsb2NhbF9jaHVua25yIGNodW5rc2l6ZVxuIik7ICovCisJICBmb3IoaSA9IDE7IGkgPD0gQ0ZTTUFYX1NJWkU7ICsraSkKKwkgIHsKKwkJaWYgKGxhc3RfdGhyZWFkbnI9PXRpZHNbaV0pIHsgCisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUrKzsgCisJCX0KKwkJZWxzZQorCQl7CisJCSAgLyogZnByaW50ZiAobG9nRmlsZSwgIiVkXHQlZFx0JWRcdCVkXG4iLCBnbG9iYWxfY2h1bmtucixsYXN0X3RocmVhZG5yLCBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdLCBtKTsgKi8KKwkJICBnbG9iYWxfY2h1bmtucisrOworCQkgIGxvY2FsX2NodW5rbnJbbGFzdF90aHJlYWRucl0rKzsKKwkJICBsYXN0X3RocmVhZG5yID0gdGlkc1tpXTsKKwkJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJCX0KKwkgIH0KKwkgIC8qIG5vdyBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciBzYXZpbmcgdGhlIHNpemVzIG9mIHRoZSBnbG9iYWwgY2h1bmtzICovCisJICBjaHVua3NpemVzID0gKGludCopbWFsbG9jKGdsb2JhbF9jaHVua25yICogc2l6ZW9mKGludCkpOworCisgICAgICAvKgorCSAgICogRXZhbHVhdGUgdGhlIHNpemVzIG9mIHRoZSBnbG9iYWwgY2h1bmtzCisJICAgKi8KKwkgIGdsb2JhbF9jaHVua25yID0gMDsKKwkgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkgIGxhc3RfdGhyZWFkbnIgPSB0aWRzWzBdOwkgICAgCisJICBmb3IgKGkgPSAxOyBpIDw9IENGU01BWF9TSVpFOyArK2kpCisJICB7CisJCS8qIElmIHRoZSB0aHJlYWRudW1iZXIgd2FzIHRoZSBzYW1lIGFzIGJlZm9yZSBpbmNyZWFzZSB0aGUgZGV0ZWN0ZWQgY2h1bmtzaXplIGZvciB0aGlzIGNodW5rCisJCSAqIG90aGVyd2lzZSBzZXQgdGhlIGRldGVjdGVkIGNodW5rc2l6ZSBhZ2FpbiB0byBvbmUgYW5kIHNhdmUgdGhlIG51bWJlciBvZiB0aGUgbmV4dCB0aHJlYWQgaW4gbGFzdF90aHJlYWRuci4gCisJCSAqLworCQlpZiAobGFzdF90aHJlYWRuciA9PSB0aWRzW2ldKSB7IAorCQkgIGRldGVybWluZWRfY2h1bmtzaXplKys7IAorCQl9CisJCWVsc2UgeworCQkgIGNodW5rc2l6ZXNbZ2xvYmFsX2NodW5rbnJdID0gZGV0ZXJtaW5lZF9jaHVua3NpemU7CisJCSAgZ2xvYmFsX2NodW5rbnIrKzsKKwkJICBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdKys7CisJCSAgbGFzdF90aHJlYWRuciA9IHRpZHNbaV07CisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworCQl9CisJICB9CisKKyNpZmRlZiBWRVJCT1NFCisJICBmcHJpbnRmIChsb2dGaWxlLCAiZm91bmRcdGV4cGVjdGVkXHRjb25zdGFudFxuIik7CisjZW5kaWYKKworCSAgLyogaWRlbnRpZnkgdGhlIGNvbnN0YW50IGMgZm9yIHRoZSBleHBvbmVudGlhbCBkZWNyZWFzZSBvZiB0aGUgY2h1bmtzaXplICovCisJICBleHBlY3RlZF9jaHVua19zaXplID0gb3BlbndvcmsgLyB0aHJlYWRzOworCSAgYyA9IChkb3VibGUpIGNodW5rc2l6ZXNbMF0gLyBleHBlY3RlZF9jaHVua19zaXplOworCSAgCisJICBmb3IgKGkgPSAwOyBpIDwgZ2xvYmFsX2NodW5rbnI7IGkrKykKKwkgIHsKKwkJLyogY2FsY3VsYXRlIHRoZSBuZXcgZXhwZWN0ZWQgY2h1bmtzaXplICovCisJCWlmIChleHBlY3RlZF9jaHVua19zaXplID4gMSkgCisJCSAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IGMgKiBvcGVud29yayAvIHRocmVhZHM7CisJCQorI2lmZGVmIFZFUkJPU0UKKwkJZnByaW50ZiAobG9nRmlsZSwgIiU4ZFx0JThkXHQlbGZcbiIsIGNodW5rc2l6ZXNbaV0sIGV4cGVjdGVkX2NodW5rX3NpemUsIGMgKiBjaHVua3NpemVzW2ldL2V4cGVjdGVkX2NodW5rX3NpemUpOworI2VuZGlmCisJCQorCQkvKiBjaGVjayBpZiBjaHVua3NpemUgaXMgaW5zaWRlIHRoZSByb3VuZGluZyBlcnJvcnMgKi8KKwkJaWYgKGFicyAoY2h1bmtzaXplc1tpXSAtIGV4cGVjdGVkX2NodW5rX3NpemUpID49IDIpIHsKKwkJICByZXN1bHQgPSAwOworI2lmbmRlZiBWRVJCT1NFCisJCSAgZnByaW50ZiAobG9nRmlsZSwgIkNodW5rc2l6ZSBkaWZmZXJlZCBmcm9tIGV4cGVjdGVkIHZhbHVlOiAlZCBpbnN0ZWFkIG9mICVkXG4iLCBjaHVua3NpemVzW2ldLCBleHBlY3RlZF9jaHVua19zaXplKTsKKwkJICByZXR1cm4gMDsKKyNlbmRpZgorCQl9IC8qIGVuZCBpZiAqLworCisjaWZuZGVmIFZFUkJPU0UKKwkJaWYgKGV4cGVjdGVkX2NodW5rX3NpemUgLSBjaHVua3NpemVzW2ldIDwgMCApCisJCSAgZnByaW50ZiAobG9nRmlsZSwgIkNodW5rc2l6ZSBkaWQgbm90IGRlY3JlYXNlOiAlZCBpbnN0ZWFkIG9mICVkXG4iLCBjaHVua3NpemVzW2ldLGV4cGVjdGVkX2NodW5rX3NpemUpOworI2VuZGlmCisKKwkJLyogY2FsY3VsYXRpbmcgdGhlIHJlbWFpbmluZyBhbW91bnQgb2Ygd29yayAqLworCQlvcGVud29yayAtPSBjaHVua3NpemVzW2ldOworCSAgfQkKKwl9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CisKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxZDdkNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jCkBAIC0wLDAgKzEsMTY1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHN0YXRpYyBvcHRpb24gb2YgdGhlIG9tcCBmb3Igc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG5vd2FpdCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX1RIUkVBRFMgMTAKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAwLjAxCisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwNQorI2VuZGlmCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9zdGF0aWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgdGhyZWFkczsKKyAgaW50IGksbGFzdHRpZDsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgKiB0aWRzOworICBpbnQgbm90b3V0OworICBpbnQgbWF4aXRlcjsKKyAgaW50IGNodW5rX3NpemU7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBjb3VudGVyID0gMDsKKyAgaW50IHRtcF9jb3VudD0xOworICBpbnQgbGFzdHRocmVhZHNzdGFydHRpZCA9IC0xOworICBpbnQgcmVzdWx0ID0gMTsKKyAgY2h1bmtfc2l6ZSA9IDc7CisKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG5vdG91dCA9IDE7CisgIG1heGl0ZXIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsKi8KKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0JLyogZW5kIG9mIHNpbmdsZSAqLworICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGlmICh0aHJlYWRzIDwgMikKKyAgeworICAgIHByaW50ZiAoIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiKTsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSAKKyAgeworICAgIGZwcmludGYgKGxvZ0ZpbGUsIlVzaW5nIGFuIGludGVybmFsIGNvdW50IG9mICVkXG5Vc2luZyBhIHNwZWNpZmllZCBjaHVua3NpemUgb2YgJWRcbiIsIENGU01BWF9TSVpFLCBjaHVua19zaXplKTsKKyAgICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOwkvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzKQorICAgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgIDxvbXB0czpvcnBoYW4+CisJZG91YmxlIGNvdW50OworICAgICAgaW50IHRpZDsKKyAgICAgIGludCBqOworCisgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyNwcmFnbWEgb21wIGZvciBub3dhaXQgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKQorICAgICAgeworCWNvdW50ID0gMC47CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorCWlmIChqID4gbWF4aXRlcikKKwl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICBtYXhpdGVyID0gajsKKwkgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovIAorCX0KKwkvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworCXdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKQorCXsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorCSAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisJICBjb3VudCArPSBTTEVFUFRJTUU7CisJICBwcmludGYoIi4iKTsKKwl9CisjaWZkZWYgVkVSQk9TRQorCWlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorCS8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisJdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisJcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICAgIH0JLyogZW5kIG9mIGZvciAqLworCisgICAgICBub3RvdXQgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgLyoqKiogYW5hbHlzaW5nIHRoZSBkYXRhIGluIGFycmF5IHRpZHMgKioqKi8KKworICAgIGxhc3R0aWQgPSB0aWRzWzBdOworICAgIHRtcF9jb3VudCA9IDA7IAorCisgICAgZm9yIChpID0gMDsgaSA8IENGU01BWF9TSVpFICsgMTsgKytpKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSB3b3JrICB3YXMgZG9uZSBieSB0aGUgc2FtZSB0aHJlYWQgaW5jcmVhc2UgdG1wX2NvdW50IGJ5IG9uZS4gKi8KKyAgICAgIGlmICh0aWRzW2ldID09IGxhc3R0aWQpIHsKKwl0bXBfY291bnQrKzsKKyNpZmRlZiBWRVJCT1NFCisJZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLiBXaGVuIGZpbmRpbmcgCisgICAgICAgKiB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4gCisgICAgICAgKi8JICAKKyAgICAgIGlmICh0aWRzW2ldID09IChsYXN0dGlkICsgMSkgJSB0aHJlYWRzIHx8IHRpZHNbaV0gPT0gLTEpIHsKKwkvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKwlpZiAodG1wX2NvdW50ID09IGNodW5rX3NpemUpIHsKKwkgIHRtcF9jb3VudCA9IDE7CisJICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisJICBmcHJpbnRmIChsb2dGaWxlLCAiT0tcbiIpOworI2VuZGlmCisJfQorCS8qIElmIHRoZSBjaHVuayBzaXplIHdhcyB3cm9uZywgY2hlY2sgaWYgdGhlIGVuZCB3YXMgcmVhY2hlZCAqLworCWVsc2UgeworCSAgaWYgKHRpZHNbaV0gPT0gLTEpIHsKKwkgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKwkgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiTGFzdCB0aHJlYWQgaGFkIGNodW5rIHNpemUgJWRcbiIsIHRtcF9jb3VudCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGggbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKwkgICAgICByZXN1bHQgPSAwOworCSAgICB9CisJICB9CisJICBlbHNlIHsKKwkgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIHdhcyAlZClcbiIsIHRtcF9jb3VudCwgY2h1bmtfc2l6ZSk7CisJICAgIHJlc3VsdCA9IDA7CisJICB9CisJfQorICAgICAgfQorICAgICAgZWxzZSB7CisJZnByaW50Zihsb2dGaWxlLCAiRVJST1I6IEZvdW5kIHRocmVhZCB3aXRoIG51bWJlciAlZCAoc2hvdWxkIGJlIGluYmV0d2VlbiAwIGFuZCAlZCkuIiwgdGlkc1tpXSwgdGhyZWFkcyAtIDEpOworCXJlc3VsdCA9IDA7CisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg2NjdmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYwpAQCAtMCwwICsxLDIxMiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBzdGF0aWMgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZSBjb25zaWRlcmluZyB0aGUgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBjaHVuayBkaXN0cmlidXRpb24gb2Ygc2V2ZXJhbCBsb29wIHJlZ2lvbnMgaXMgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuIE1QIHN0YW5kYXJkIHZlcnNpb24gMy4wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG5vd2FpdCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX1RIUkVBRFMgMTAKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAwLjAxCisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwNQorI2VuZGlmCisKKyNkZWZpbmUgVkVSQk9TRSAwCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIGludCB0aHJlYWRzOworICBpbnQgaSxsYXN0dGlkOworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCAqIHRpZHM7CisgIGludCAqIHRpZHMyOworICBpbnQgbm90b3V0OworICBpbnQgbWF4aXRlcjsKKyAgaW50IGNodW5rX3NpemU7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBjb3VudGVyID0gMDsKKyAgaW50IHRtcF9jb3VudD0xOworICBpbnQgbGFzdHRocmVhZHNzdGFydHRpZCA9IC0xOworICBpbnQgcmVzdWx0ID0gMTsKKyAgY2h1bmtfc2l6ZSA9IDc7CisKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG5vdG91dCA9IDE7CisgIG1heGl0ZXIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsKi8KKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0JLyogZW5kIG9mIHNpbmdsZSAqLworICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGlmICh0aHJlYWRzIDwgMikKKyAgeworICAgIHByaW50ZiAoIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiKTsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSAKKyAgeworICAgIGZwcmludGYgKGxvZ0ZpbGUsIlVzaW5nIGFuIGludGVybmFsIGNvdW50IG9mICVkXG5Vc2luZyBhIHNwZWNpZmllZCBjaHVua3NpemUgb2YgJWRcbiIsIENGU01BWF9TSVpFLCBjaHVua19zaXplKTsKKyAgICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOwkvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzKQorICAgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgIDxvbXB0czpvcnBoYW4+CisJZG91YmxlIGNvdW50OworICAgICAgaW50IHRpZDsKKyAgICAgIGludCBqOworCisgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyNwcmFnbWEgb21wIGZvciBub3dhaXQgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKQorICAgICAgeworCWNvdW50ID0gMC47CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorCWlmIChqID4gbWF4aXRlcikKKwl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICBtYXhpdGVyID0gajsKKwkgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovIAorCX0KKwkvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworCXdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKQorCXsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorCSAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisJICBjb3VudCArPSBTTEVFUFRJTUU7CisJICBwcmludGYoIi4iKTsKKwl9CisjaWZkZWYgVkVSQk9TRQorCWlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorCS8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisJdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisJcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICAgIH0JLyogZW5kIG9mIGZvciAqLworCisgICAgICBub3RvdXQgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgLyoqKiogYW5hbHlzaW5nIHRoZSBkYXRhIGluIGFycmF5IHRpZHMgKioqKi8KKworICAgIGxhc3R0aWQgPSB0aWRzWzBdOworICAgIHRtcF9jb3VudCA9IDA7IAorCisgICAgZm9yIChpID0gMDsgaSA8IENGU01BWF9TSVpFICsgMTsgKytpKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSB3b3JrICB3YXMgZG9uZSBieSB0aGUgc2FtZSB0aHJlYWQgaW5jcmVhc2UgdG1wX2NvdW50IGJ5IG9uZS4gKi8KKyAgICAgIGlmICh0aWRzW2ldID09IGxhc3R0aWQpIHsKKwl0bXBfY291bnQrKzsKKyNpZmRlZiBWRVJCT1NFCisJZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLiBXaGVuIGZpbmRpbmcgCisgICAgICAgKiB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4gCisgICAgICAgKi8JICAKKyAgICAgIGlmICh0aWRzW2ldID09IChsYXN0dGlkICsgMSkgJSB0aHJlYWRzIHx8IHRpZHNbaV0gPT0gLTEpIHsKKwkvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKwlpZiAodG1wX2NvdW50ID09IGNodW5rX3NpemUpIHsKKwkgIHRtcF9jb3VudCA9IDE7CisJICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisJICBmcHJpbnRmIChsb2dGaWxlLCAiT0tcbiIpOworI2VuZGlmCisJfQorCS8qIElmIHRoZSBjaHVuayBzaXplIHdhcyB3cm9uZywgY2hlY2sgaWYgdGhlIGVuZCB3YXMgcmVhY2hlZCAqLworCWVsc2UgeworCSAgaWYgKHRpZHNbaV0gPT0gLTEpIHsKKwkgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKwkgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiTGFzdCB0aHJlYWQgaGFkIGNodW5rIHNpemUgJWRcbiIsIHRtcF9jb3VudCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGggbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKwkgICAgICByZXN1bHQgPSAwOworCSAgICB9CisJICB9CisJICBlbHNlIHsKKwkgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIHdhcyAlZClcbiIsIHRtcF9jb3VudCwgY2h1bmtfc2l6ZSk7CisJICAgIHJlc3VsdCA9IDA7CisJICB9CisJfQorICAgICAgfQorICAgICAgZWxzZSB7CisJZnByaW50Zihsb2dGaWxlLCAiRVJST1I6IEZvdW5kIHRocmVhZCB3aXRoIG51bWJlciAlZCAoc2hvdWxkIGJlIGluYmV0d2VlbiAwIGFuZCAlZCkuIiwgdGlkc1tpXSwgdGhyZWFkcyAtIDEpOworCXJlc3VsdCA9IDA7CisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisgICAgfQorICB9CisKKyAgLyogTm93IHdlIGNoZWNrIGlmIHNldmVyYWwgbG9vcCByZWdpb25zIGluIG9uZSBwYXJhbGxlbCByZWdpb24gaGF2ZSB0aGUgc2FtZSAKKyAgICogbG9naWNhbCBhc3NpZ25lbWVudCBvZiBjaHVua3MgdG8gdGhyZWFkcy4KKyAgICogV2UgdXNlIHRoZSBub3dhaXQgY2xhdXNlIHRvIGluY3JlYXNlIHRoZSBwcm9iYWJpbGl0eSB0byBnZXQgYW4gZXJyb3IuICovCisKKyAgLyogRmlyc3Qgd2UgYWxsb2NhdGUgc29tZSBtb3JlIG1lbW1vcnkgKi8KKyBmcmVlICh0aWRzKTsKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiBMT09QQ09VTlQpOworICB0aWRzMiA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiBMT09QQ09VTlQpOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIHsKKyAgICAgICAgICBpbnQgbjsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoc3RhdGljKTwvb21wdHM6Y2hlY2s+IG5vd2FpdAorICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBMT09QQ09VTlQ7IG4rKykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChMT09QQ09VTlQgPT0gbiArIDEgKQorICAgICAgICAgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKworICAgICAgICAgICAgICB0aWRzW25dID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgeworICAgICAgICAgIGludCBtOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMpPC9vbXB0czpjaGVjaz4gbm93YWl0CisgICAgICAgICAgZm9yIChtID0gMTsgbSA8PSBMT09QQ09VTlQ7IG0rKykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHRpZHMyW20tMV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHMyW2ldKSB7CisgICAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkNodW5rIG5vLiAlZCB3YXMgYXNzaWduZWQgb25jZSB0byB0aHJlYWQgJWQgYW5kIGxhdGVyIHRvIHRocmVhZCAlZC5cbiIsIGksIHRpZHNbaV0sdGlkczJbaV0pOworICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICB9CisKKyAgZnJlZSAodGlkcyk7CisgIGZyZWUgKHRpZHMyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2dldF9udW1fdGhyZWFkcy5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9nZXRfbnVtX3RocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjA5MmJhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9nZXRfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDM5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhhdCB0aGUgb21wX2dldF9udW1fdGhyZWFkcyByZXR1cm5zIHRoZSBjb3JyZWN0IG51bWJlciBvZiB0aHJlYWRzLiBUaGVyZWZvciBpdCBjb3VudHMgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBzZWN0aW9uIGFuZCBjb21wYXJzIHRoaXMgdmFsdWUgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X251bV90aHJlYWRzPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgLyogY2hlY2tzIHRoYXQgb21wX2dldF9udW1fdGhyZWFkcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mCisgICAgICAgdGhyZWFkcyAqLworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHNfbGliOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IG50aHJlYWRzID0gMDsKKworICAgIG50aHJlYWRzX2xpYiA9IC0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgbnRocmVhZHMrKzsKKwl9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworI3ByYWdtYSBvbXAgc2luZ2xlCisJeyAKKzxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz5udGhyZWFkc19saWIgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKwl9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisJZnByaW50ZiAobG9nRmlsZSwgIkNvdW50ZWQgJWQgdGhyZWFkcy4gZ2V0X251bV90aHJlYWRzIHJldHVybmVkICVkLlxuIiwgbnRocmVhZHMsIG50aHJlYWRzX2xpYik7CisgICAgcmV0dXJuIChudGhyZWFkcyA9PSBudGhyZWFkc19saWIpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aWNrLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2dldF93dGljay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MmI1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2dldF93dGljay5jCkBAIC0wLDAgKzEsMjQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX2dldF93dGljayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGljazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGU8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF93dGljazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJZG91YmxlIHRpY2s7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICB0aWNrID0gLTEuOworCisgICAgPG9tcHRzOm9ycGhhbj4KKwk8b21wdHM6Y2hlY2s+dGljayA9IG9tcF9nZXRfd3RpY2sgKCk7PC9vbXB0czpjaGVjaz4KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICBmcHJpbnRmIChsb2dGaWxlLCAiV29yayB0b29rICVsZiBzZWMuIHRpbWUuXG4iLCB0aWNrKTsKKyAgICByZXR1cm4gKCh0aWNrID4gMC4wKSAmJiAodGljayA8IDAuMDEpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2dldF93dGltZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAyMjZkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpbWUuYwpAQCAtMCwwICsxLDM4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpbWUgZnVuY3Rpb24uIEl0IGNvbXBhcmVzIHRoZSB0aW1lIHdpdGggd2hpY2ggaXMgY2FsbGVkIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCB0aGUgdGltZSBpdCB0b29rIGJ5IG1lc3N1cmluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjYWxsIG9mIHRoZSBzbGVlcCBmdW5jdGlvbiBhbmQgaXRzIGVuZC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGltZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGU8c3RkaW8uaD4KKyNpbmNsdWRlPHN0ZGxpYi5oPgorI2luY2x1ZGU8dW5pc3RkLmg+CisKKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF93dGltZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJZG91YmxlIHN0YXJ0OworCWRvdWJsZSBlbmQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBkb3VibGUgbWVhc3VyZWRfdGltZTsKKyAgICBpbnQgd2FpdF90aW1lID0gMTsgCisKKyAgICBzdGFydCA9IDA7CisgICAgZW5kID0gMDsKKworICAgIDxvbXB0czpvcnBoYW4+CisJPG9tcHRzOmNoZWNrPnN0YXJ0ID0gb21wX2dldF93dGltZSAoKTs8L29tcHRzOmNoZWNrPgorICAgIDwvb21wdHM6b3JwaGFuPgorCW15X3NsZWVwICh3YWl0X3RpbWUpOyAKKyAgICA8b21wdHM6b3JwaGFuPgorCTxvbXB0czpjaGVjaz5lbmQgPSBvbXBfZ2V0X3d0aW1lICgpOzwvb21wdHM6Y2hlY2s+CisgICAgPC9vbXB0czpvcnBoYW4+CisJbWVhc3VyZWRfdGltZSA9IGVuZC1zdGFydDsKKyAgICBmcHJpbnRmKGxvZ0ZpbGUsICJXb3JrIHRvb2sgJWxmIHNlYy4gdGltZS5cbiIsIG1lYXN1cmVkX3RpbWUpOworICAgIHJldHVybiAoKG1lYXN1cmVkX3RpbWUgPiAwLjk5ICogd2FpdF90aW1lKSAmJiAobWVhc3VyZWRfdGltZSA8IDEuMDEgKiB3YWl0X3RpbWUpKSA7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9pbl9wYXJhbGxlbC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9pbl9wYXJhbGxlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YjYxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2luX3BhcmFsbGVsLmMKQEAgLTAsMCArMSw1MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgb21wX2luX3BhcmFsbGVsIHJldHVybnMgZmFsc2Ugd2hlbiBjYWxsZWQgZnJvbSBhIHNlcmlhbCByZWdpb24gYW5kIHRydWUgd2hlbiBjYWxsZWQgd2l0aGluIGEgcGFyYWxsZWwgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfaW5fcGFyYWxsZWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKy8qCisgKiBDaGVja3MgdGhhdCBmYWxzZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24KKyAqIGFuZCB0cnVlIGlzIHJldHVybmVkIHdoZW4gY2FsbGVkIHdpdGhpbiBwYXJhbGxlbCByZWdpb24uIAorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9pbl9wYXJhbGxlbDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzZXJpYWw7CisJaW50IGlzcGFyYWxsZWw7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHNlcmlhbCA9IDE7CisgICAgaXNwYXJhbGxlbCA9IDA7CisKKyAgICA8b21wdHM6Y2hlY2s+CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgc2VyaWFsID0gb21wX2luX3BhcmFsbGVsICgpOworCTwvb21wdHM6b3JwaGFuPgorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJaXNwYXJhbGxlbCA9IG9tcF9pbl9wYXJhbGxlbCAoKTsKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorICAgIH0KKyAgICA8L29tcHRzOmNoZWNrPgorCisgICAgPG9tcHRzOmNyb3NzY2hlY2s+CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNpbmdsZQorCSAgICB7CisKKwkgICAgfQorCX0KKyAgICA8L29tcHRzOmNyb3NzY2hlY2s+CisKKwlyZXR1cm4gKCEoc2VyaWFsKSAmJiBpc3BhcmFsbGVsKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2xvY2suYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MjljMDcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2xvY2suYwpAQCAtMCwwICsxLDQ1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9zZXRfbG9jayAgYW5kIHRoZSBvbXBfdW5zZXRfbG9jayBmdW5jdGlvbiBieSBjb3VudGluZyB0aGUgdGhyZWFkcyBlbnRlcmluZyBhbmQgZXhpdGluZyBhIHNpbmdsZSByZWdpb24gd2l0aCBsb2Nrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbG9ja190IGxjazsKKyAgICAKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKyAgb21wX2luaXRfbG9jayAoJmxjayk7CisgIAorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykKKyAgeworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvcihpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz5vbXBfc2V0X2xvY2sgKCZsY2spOzwvb21wdHM6Y2hlY2s+CisJPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCW5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJbnJfaXRlcmF0aW9ucysrOworCW5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPm9tcF91bnNldF9sb2NrKCZsY2spOzwvb21wdHM6Y2hlY2s+CisJPC9vbXB0czpvcnBoYW4+CisgICAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbG9jayAoJmxjayk7CisgIAorICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7CisgIAorfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjJmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX21hc3Rlci5jCkBAIC0wLDAgKzEsMzcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9tYXN0ZXI8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBudGhyZWFkczsKKwlpbnQgZXhlY3V0aW5nX3RocmVhZDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgbnRocmVhZHMgPSAwOworICAgIGV4ZWN1dGluZ190aHJlYWQgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG1hc3RlciA8L29tcHRzOmNoZWNrPgorCSAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBudGhyZWFkcysrOworCQl9CisJCWV4ZWN1dGluZ190aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKwkgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgICAgcmV0dXJuICgobnRocmVhZHMgPT0gMSkgJiYgKGV4ZWN1dGluZ190aHJlYWQgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyXzMuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyXzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTk4MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXJfMy5jCkBAIC0wLDAgKzEsNDQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi4gSXQgYWxzbyBjaGVja3MgdGhhdCB0aGUgbWFzdGVyIHRocmVhZCBoYXMgdGhlIHRocmVhZCBudW1iZXIgMCBhcyBzcGVjaWZpZWQgaW4gdGhlIE9wZW4gTVAgc3RhbmRhcmQgdmVyc2lvbiAzLjAuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBtYXN0ZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbWFzdGVyXzM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBudGhyZWFkczsKKwlpbnQgZXhlY3V0aW5nX3RocmVhZDsKKyAgICAgICAgaW50IHRpZF9yZXN1bHQgPSAwOyAvKiBjb3VudHMgdXAgdGhlIG51bWJlciBvZiB3cm9uZyB0aHJlYWQgbm8uIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXN0ZXIgdGhyZWFkLiAoTXVzdCBiZSAwKSAqLworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBudGhyZWFkcyA9IDA7CisgICAgZXhlY3V0aW5nX3RocmVhZCA9IC0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgbWFzdGVyIDwvb21wdHM6Y2hlY2s+CisJICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdGlkID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgICAgICAgaWYgKHRpZCAhPSAwKSB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICAgICAgICAgICAgICB7IHRpZF9yZXN1bHQrKzsgfQorICAgICAgICAgICAgICAgIH0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIG50aHJlYWRzKys7CisJCX0KKwkJZXhlY3V0aW5nX3RocmVhZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworCSAgICB9IC8qIGVuZCBvZiBtYXN0ZXIqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8KKyAgICByZXR1cm4gKChudGhyZWFkcyA9PSAxKSAmJiAoZXhlY3V0aW5nX3RocmVhZCA9PSAwKSAmJiAodGlkX3Jlc3VsdCA9PSAwKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9uZXN0X2xvY2suYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfbmVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkZTM4OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfbmVzdF9sb2NrLmMKQEAgLTAsMCArMSw0NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X25lc3RfbG9jayBhbmQgdGhlIG9tcF91bnNldF9uZXN0X2xvY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9uZXN0X2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbmVzdF9sb2NrX3QgbGNrOworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbmVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbmVzdF9sb2NrICgmbGNrKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgIAorICAgIHsKKyNwcmFnbWEgb21wIGZvcgorCWZvcihpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPm9tcF9zZXRfbmVzdF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCSAgICA8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJCW5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbmVzdF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X25lc3RfbG9jayAoJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9uZXN0ZWQuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfbmVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1N2JjOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfbmVzdGVkLmMKQEAgLTAsMCArMSw0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfbmVzdGVkIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfbmVzdGVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKy8qCisgKiBUZXN0IGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBuZXN0ZWQgcGFyYWxsZWxpc20KKyAqIEJ5IENodW5odWEgTGlhbywgVW5pdmVyc2l0eSBvZiBIb3VzdG9uCisgKiBPY3QuIDIwMDUKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbmVzdGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworCisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI2lmZGVmIF9PUEVOTVAKKyAgICA8b21wdHM6Y2hlY2s+b21wX3NldF9uZXN0ZWQoMSk7PC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6Y3Jvc3NjaGVjaz5vbXBfc2V0X25lc3RlZCgwKTs8L29tcHRzOmNyb3NzY2hlY2s+CisjZW5kaWYKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGNvdW50ZXIpCit7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICBjb3VudGVyICsrOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICBjb3VudGVyIC0tOworICAgIH0KKzwvb21wdHM6b3JwaGFuPgorfQorICAgIHJldHVybiAoY291bnRlciAhPSAwKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2NvcHlpbi5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9jb3B5aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJiZmEyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9jb3B5aW4uYwpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBjb3B5aW4gZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgY29weWluPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIGludCBzdW0xID0gNzg5OworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfY29weWluPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtLCBudW1fdGhyZWFkczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTEgPSA3OworICAgIG51bV90aHJlYWRzID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmNvcHlpbihzdW0xKTwvb21wdHM6Y2hlY2s+CisgICAgeworCS8qcHJpbnRmKCJzdW0xPSVkXG4iLHN1bTEpOyovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciAKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykKKwkgICAgeworCQlzdW0xID0gc3VtMSArIGk7CisJICAgIH0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgICAgICAgbnVtX3RocmVhZHMrKzsKKwl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4NzM3MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jCkBAIC0wLDAgKzEsNDQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZGVmYXVsdCBvcHRpb24gb2YgdGhlIHBhcmFsbGVsIGNvbnN0cnVjdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGRlZmF1bHQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZGVmYXVsdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBteXN1bTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgCisgIGludCBrbm93bl9zdW07CisgIHN1bSA9MDsKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyIDsKKworICA8b21wdHM6b3JwaGFuPgorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+ZGVmYXVsdChzaGFyZWQpPC9vbXB0czpjaGVjaz4gcHJpdmF0ZShpKSBwcml2YXRlKG15c3VtPG9tcHRzOmNyb3NzY2hlY2s+LHN1bTwvb21wdHM6Y3Jvc3NjaGVjaz4pCisgIHsKKwlteXN1bSA9IDA7CisgICNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgbXlzdW0gPSBteXN1bSArIGk7CisJfSAKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgc3VtID0gc3VtICsgbXlzdW07CisJfSAgIC8qIGVuZCBvZiBjcml0aWNhbCAqLworICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIDwvb21wdHM6b3JwaGFuPgorICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworICAJZnByaW50Zihsb2dGaWxlLCAiS05PV05fU1VNID0gJWQ7IFNVTSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE1YjRjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvL3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTE9NzsKKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0xKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0xKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICB7CisKKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjQ5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDM2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbixvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bSA7CisgICAgaW50IGkyOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgCisgICAgc3VtPTA7CisgICAgaTI9MzsKKyAgICBpbnQga25vd25fc3VtOworCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKGkyKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwkgIHN1bSA9IHN1bSArIChpICsgaTIpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgKyBpMiAqIExPT1BDT1VOVDsKKyAgICAKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfZmlzdHByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9pZi5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg4NmJhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfaWYuYwpAQCAtMCwwICsxLDM4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgaWYgZGlyZWN0aXZlLiBOZWVkcyBhdCBsZWFzdCB0d28gdGhyZWFkcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX2lmPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICBpbnQga25vd25fc3VtOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgbnVtX3RocmVhZHM7CisgICAgaW50IHN1bSwgc3VtMjsKKyAgICBpbnQgaTsKKyAgICBpbnQgY29udHJvbDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGNvbnRyb2wgPSAwOworICAgIG51bV90aHJlYWRzPTA7CisgICAgc3VtID0gMDsKKyAgICBzdW0yID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmlmIChjb250cm9sPT0xKTwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBmb3IgKGk9MDsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIG51bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCXN1bSA9IHN1bSArIGk7CisgICAgfSAvKmVuZCBvZiBmb3IqLworCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIGZwcmludGYgKGxvZ0ZpbGUsICJOdW1iZXIgb2YgdGhyZWFkcyBkZXRlcm1pbmVkIGJ5IG9tcF9nZXRfbnVtX3RocmVhZHM6ICVkXG4iLCBudW1fdGhyZWFkcyk7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtICYmIG51bV90aHJlYWRzID09IDEpOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDlkZWJhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDM0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisgICAgaW50IGk7CisgICAgaW50IGkwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBzdW0gPTA7CisgICAgaTAgPSAtMTsKKyAgICBpbnQga25vd25fc3VtOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsNykgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICA8b21wdHM6b3JwaGFuPgorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisgICAgeworCXN1bSA9IHN1bSArIGk7CisJaTAgPSBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYTRiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMKQEAgLTAsMCArMSw2MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQgZGlyZWN0aXZlPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIGludCBsYXN0X2kgPSAwOworaW50IGk7CisKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaSkKKworLyogVmFyaWFibGUgaWkgaXMgdXNlZCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGEgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZSB1c2VkIGFzIGEgbG9vcAorICogaW5kZXguIFNlZSB0ZXN0IG9tcF90aHJlYWRwcml2YXRlX2Zvci4KKyAqLworc3RhdGljIGludCBpaTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaWkpCisKKy8qISAKKyAgVXRpbGl0eSBmdW5jdGlvbjogcmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgbGFyZ2VyIHRoYW4gCisgIHRoZSBhcmd1bWVudCBvZiB0aGUgbGFzdCBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uCisgICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIyIChpbnQgaSl7CisJaW50IGlzbGFyZ2VyOworCWlzbGFyZ2VyID0gKGkgPiBsYXN0X2kpOworCWxhc3RfaSA9IGk7CisJcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisJaW50IGlzX2xhcmdlcjsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCisJaW50IGtub3duX3N1bTsKKwlpbnQgaTsKKwkKKwlzdW0gPSAwOworCWlzX2xhcmdlciA9IDE7CisJbGFzdF9pID0gMDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+b3JkZXJlZDwvb21wdHM6Y2hlY2s+CisJZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKQorCXsKKwkJaWkgPSBpOworCTxvbXB0czpvcnBoYW4+Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgb3JkZXJlZDwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisJCQlpc19sYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyMiAoaWkpICYmIGlzX2xhcmdlcjsKKwkJCXN1bSAgPSBzdW0gKyBpaTsKKwkJfQorCTwvb21wdHM6b3JwaGFuPgorCX0KKwlrbm93bl9zdW0gPSAoOTkgKiAxMDApIC8gMjsKKwlmcHJpbnRmIChsb2dGaWxlLCIga25vd25fc3VtID0gJWQgLCBzdW0gPSAlZCBcbiIsIGtub3duX3N1bSwgc3VtKTsKKwlmcHJpbnRmIChsb2dGaWxlLCIgaXNfbGFyZ2VyID0gJWRcbiIsIGlzX2xhcmdlcik7CisJcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXI7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjgwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKQEAgLTAsMCArMSw0OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbixvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyohIFV0aWxpdHkgZnVuY3Rpb24gdG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrICh2b2lkKXsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgc3VtID0gMDsKKyAgICBmb3IoaSA9IDA7IGkgPCAxMDAwOyBpKyspeworCXN1bSArPSBzcXJ0IChpKTsKKyAgICB9Cit9CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisgICAgaW50IGk7CisgICAgaW50IGkyOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgCisgICAgc3VtID0wOworICAgIGkyPTA7CisgICAgaW50IGtub3duX3N1bTsKKyAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgCisgICAgZm9yIChpPTE7aTw9TE9PUENPVU5UO2krKykKKyAgICB7CisJaTIgPSBpOworI3ByYWdtYSBvbXAgZmx1c2gKKwlkb19zb21lX3dvcmsgKCk7CisjcHJhZ21hIG9tcCBmbHVzaAorCXN1bSA9IHN1bSArIGkyOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICA8L29tcHRzOm9ycGhhbj4KKworICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTkxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI4MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKwlpbnQga25vd25fc3VtOworCWRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCQkvKiBkdF5ET1VCTEVfRElHSVRTICovCisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKwlpbnQgbG9naWNfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X2FuZDsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1tMT09QQ09VTlRdOworCWludCBpOworCWRvdWJsZSBkcHQ7CisJaW50IHJlc3VsdDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgc3VtID0wOworICAgIGRzdW09MDsKKwlkdCA9IDEuLzMuOworICAgIHJlc3VsdCA9IDA7CisgICAgcHJvZHVjdCA9IDE7CisJbG9naWNfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfYW5kPTE7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisJeworCQlzdW09c3VtK2k7CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHN1bSxrbm93bl9zdW0pOyAKKwl9CisKKwlkaWZmID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKQorCXsKKwkJZGlmZj1kaWZmLWk7CisJfQorCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCisJLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKwlkc3VtPTA7CisJZHB0PTE7CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRzdW0gKz0gcG93KGR0LGkpOworCX0KKworCWlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApCisJeworCQlyZXN1bHQrKzsgCisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworCX0KKworCWRwdD0xOworCisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwl9CisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTE7aTw9TUFYX0ZBQ1RPUjtpKyspCisJeworCQlwcm9kdWN0ICo9IGk7CisJfQorCisJa25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcblxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCX0KKwlpZighbG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKwl9CisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKCFsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMi5cbiIpOworCX0KKworCisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKzwvb21wdHM6b3JwaGFuPgorCS8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisJcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfaWYuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y0NWIxCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9pZi5jCkBAIC0wLDAgKzEsNDAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgb3B0aW9uIG9mIHRoZSBwYXJhbGxlbCBjb25zdHJ1Y3QuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7Cis8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworICBpbnQgbXlzdW07CisgIGludCBjb250cm9sPTE7Cis8L29tcHRzOm9ycGhhbjp2YXJzPgorICBzdW0gPTA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5pZihjb250cm9sPT0wKTwvb21wdHM6Y2hlY2s+CisgIHsKKwk8b21wdHM6b3JwaGFuPgorICAgIG15c3VtID0gMDsKKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgIG15c3VtID0gbXlzdW0gKyBpOworCX0gCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bSA9IHN1bSArIG15c3VtOworCX0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgPC9vbXB0czpvcnBoYW4+CisgIH0gICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTdmZWQyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcy5jCkBAIC0wLDAgKzEsNDYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3BhcmFsbGVsX251bV90aHJlYWRzIGRpcmVjdGl2ZSBieSBjb3VudGluZyB0aGUgdGhyZWFkcyBpbiBhIHBhcmFsbGVsIHJlZ2lvbiB3aGljaCB3YXMgc3RhcnRlZCB3aXRoIGFuIGV4cGxpY2l0bHkgc3RhdGVkIG51bWJlciBvZiB0aHJlYWRzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyZWxsZWwgbnVtX3RocmVhZHM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgbWFzdGVyLG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24sb21wIGF0b21pYzwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBmYWlsZWQ7CisJaW50IHRocmVhZHM7CisJaW50IG50aHJlYWRzOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQgbWF4X3RocmVhZHMgPSAwOworCisgICAgZmFpbGVkID0gMDsKKworICAgIC8qIGZpcnN0IHdlIGNoZWNrIGhvdyBtYW55IHRocmVhZHMgYXJlIGF2YWlsYWJsZSAqLworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBtYXN0ZXIKKwltYXhfdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfQorCisgICAgLyogd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIGZyb20gb25lIHRvIG1heGltdW06Ki8KKyAgICBmb3IgKHRocmVhZHMgPSAxOyB0aHJlYWRzIDw9IG1heF90aHJlYWRzOyB0aHJlYWRzKyspCisgICAgeworCW50aHJlYWRzID0gMDsKKworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24oKzpmYWlsZWQpIDxvbXB0czpjaGVjaz5udW1fdGhyZWFkcyh0aHJlYWRzKTwvb21wdHM6Y2hlY2s+CisJICAgIHsKKwkJZmFpbGVkID0gZmFpbGVkICsgISh0aHJlYWRzID09IG9tcF9nZXRfbnVtX3RocmVhZHMgKCkpOworI3ByYWdtYSBvbXAgYXRvbWljCisJICAgIG50aHJlYWRzICs9IDE7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKwlmYWlsZWQgPSBmYWlsZWQgKyAhKG50aHJlYWRzID09IHRocmVhZHMpOworICAgIH0KKyAgICByZXR1cm4gKCFmYWlsZWQpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjY2MwOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmb3Igb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtLCBudW1fdGhyZWFkcyxzdW0xOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIHN1bSA9IDA7CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+IHN1bTE9MDsgPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIG51bV90aHJlYWRzID0gMDsKKworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0xKTwvb21wdHM6Y2hlY2s+CisgICAgeworCTxvbXB0czpjaGVjaz4KKwlzdW0xID0gNzsKKwk8L29tcHRzOmNoZWNrPgorCS8qcHJpbnRmKCJzdW0xPSVkXG4iLHN1bTEpOyovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciAKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykKKwkgICAgeworCQlzdW0xID0gc3VtMSArIGk7CisJICAgIH0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgICAgICAgbnVtX3RocmVhZHMrKzsKKwl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZjgzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsMjc4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CisJZG91YmxlIGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAJCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKwlpbnQgZGlmZjsKKwlkb3VibGUgZGRpZmY7CisJaW50IHByb2R1Y3Q7CisJaW50IGtub3duX3Byb2R1Y3Q7CisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwCS8qIDEwISAqLworCWludCBsb2dpY19hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfYW5kOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzW0xPT1BDT1VOVF07CisJaW50IGk7CisJZG91YmxlIGRwdDsKKwlpbnQgcmVzdWx0OworPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBzdW0gPTA7CisgICAgZHN1bT0wOworICAgIHByb2R1Y3Q9MTsKKwlsb2dpY19hbmQ9MTsKKwlsb2dpY19vcj0wOworCWJpdF9hbmQ9MTsKKwliaXRfb3I9MDsKKwlleGNsdXNpdl9iaXRfb3I9MDsKKyAgICByZXN1bHQ9MDsKKwlkdCA9IDEuLzMuOworCWtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTE7aTw9TE9PUENPVU5UO2krKykKKwl7CisJCXN1bT1zdW0raTsKKwl9CisKKwlpZihrbm93bl9zdW0hPXN1bSkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIsc3VtLGtub3duX3N1bSk7IAorCX0KKworCWRpZmYgPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDsrK2kpCisJeworCQlkaWZmPWRpZmYtaTsKKwl9CisKKwlpZihkaWZmICE9IDApCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKwl9CisKKwkvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworCWRzdW09MDsKKwlkcHQ9MTsKKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHN1bSArPSBwb3coZHQsaSk7CisJfQorCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZnByaW50Zihsb2dGaWxlLCJcbiIpOworCWRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZGRpZmYgLT0gcG93KGR0LGkpOworCX0KKwlpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MTtpPD1NQVhfRkFDVE9SO2krKykKKwl7CisJCXByb2R1Y3QgKj0gaTsKKwl9CisKKwlrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKwlpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJfQorCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxLlxuIik7CisJfQorCisJbG9naWNfYW5kID0gMTsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19hbmQgPSBsb2dpY19hbmQgJiYgbG9naWNzW2ldOworCX0KKwlpZihsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyLlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworCX0KKwlpZihsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMS5cbiIpOworCX0KKwlsb2dpY19vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyLlxuIik7CisJfQorCisKKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJfQorCWlmKCFiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDEuXG4iKTsKKwl9CisKKwliaXRfYW5kID0gMTsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyLlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwl9CisJaWYoYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisJfQorCWJpdF9vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCX0KKwlpZihleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisKKwlleGNsdXNpdl9iaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCX0KKwlpZighZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisJfQorICAgIDwvb21wdHM6b3JwaGFuPgorCS8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisJcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MzM4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID03OworICBzdW0wPTExOworCis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgeworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAKKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgICAgICAgICAgICAgCisgICAgfSAgICAgIC8qZW5kIG9mIHBhcmFsbGVsIHNlY3Rpb25zKi8KKzwvb21wdHM6b3JwaGFuPgora25vd25fc3VtPTExKjMrNzsKK3JldHVybiAoa25vd25fc3VtPT1zdW0pOyAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9maXJzdHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWFlNWYwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNzAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIGludCBpMDsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID0wOworICBzdW0wID0gMDsKKyAgaTAgPSAtMTsKKyAgCisgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGksc3VtMCkgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgeworI3ByYWdtYSBvbXAgc2VjdGlvbiAgCisgICAgICB7CisJc3VtMD0wOworCWZvciAoaT0xO2k8NDAwO2krKykKKwkgIHsKKwkgICAgc3VtMD1zdW0wK2k7CisJICAgIGkwPWk7CisJICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bT0gc3VtK3N1bTA7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9LyogZW5kIG9mIHNlY3Rpb24gKi8KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgICB7CisJc3VtMD0wOworCWZvcihpPTQwMDtpPDcwMDtpKyspCisJICB7CisJICAgIHN1bTA9c3VtMCtpOyAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgZm9yKi8KKwkgICAgaTA9aTsKKwkgIH0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgc3VtPSBzdW0rc3VtMDsKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgICB7CisJc3VtMD0wOworCWZvcihpPTcwMDtpPDEwMDA7aSsrKQorCSAgeworCSAgICBzdW0wPXN1bTAraTsKKyAgICAgIGkwPWk7CisJICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bT0gc3VtK3N1bTA7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9CisgICAgfS8qIGVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCisgIDwvb21wdHM6b3JwaGFuPiAKKyAga25vd25fc3VtPSg5OTkqMTAwMCkvMjsKKyAgcmV0dXJuICgoa25vd25fc3VtPT1zdW0pICYmIChpMD09OTk5KSApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmZTQxNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9IDc7CisgIHN1bTA9MDsKKworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoPG9tcHRzOmNoZWNrPnN1bTAsPC9vbXB0czpjaGVjaz4gaSkKKyAgeworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICB7CisgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICBzdW0wPTA7CisgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgZm9yIChpPTE7aTw0MDA7aSsrKQorCXN1bTA9c3VtMCtpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgc3VtMD0wOworICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvcihpPTQwMDtpPDcwMDtpKyspCisJc3VtMD1zdW0wK2k7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgIHN1bTA9MDsKKyAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaT03MDA7aTwxMDAwO2krKykKKwlzdW0wPXN1bTAraTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgICAgICAgICAgICAgCisgIH0gICAgICAgIC8qZW5kIG9mIHBhcmFsbGVsIHNlY3Rpb25zKi8KKzwvb21wdHM6b3JwaGFuPgora25vd25fc3VtPSg5OTkqMTAwMCkvMis3OworcmV0dXJuIChrbm93bl9zdW09PXN1bSk7IAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX3ByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGVhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNTY4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsJCisJZG91YmxlIGRwdDsKKyAgICBkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZHQ9MC41OwkJCQkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisJZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtNTsKKwlpbnQgZGlmZjsKKwlkb3VibGUgZGRpZmY7CisJaW50IHByb2R1Y3Q7CisJaW50IGtub3duX3Byb2R1Y3Q7CisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgYml0X2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCBsb2dpY3NbMTAwMF07CisJaW50IGk7CisJaW50IHJlc3VsdDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bSA9IDc7CisgICAgZHN1bT0wOworICAgIHByb2R1Y3QgPTE7CisgICAgZHB0ID0gMTsKKwlsb2dpY19hbmQ9MTsKKwliaXRfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfb3I9MDsKKwlleGNsdXNpdl9iaXRfb3I9MDsKKyAgICByZXN1bHQgPTA7CisJLyogIGludCBteV9pc2xhcmdlcjsqLworCS8qaW50IGlzX2xhcmdlcj0xOyovCisJa25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzc7CisKKyAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCXN1bT1zdW0raTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCXN1bT1zdW0raTsKKwkJCX0KKwkJfQorCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsc3VtLCBrbm93bl9zdW0pOworCX0KKworCWRpZmYgPSAoOTk5KjEwMDApLzI7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWRpZmY9ZGlmZi1pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWRpZmY9ZGlmZi1pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQl7CisJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQl7CisJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisJfQorCisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZnByaW50Zihsb2dGaWxlLCJcbiIpOworCWRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQl7CisJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQl7CisJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisJa25vd25fcHJvZHVjdCA9IDM2Mjg4MDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTE7aTwzO2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MztpPDc7aSsrKQorCQkJeworCQkJCXByb2R1Y3QgKj0gaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03O2k8MTE7aSsrKQorCQkJeworCQkJCXByb2R1Y3QgKj0gaTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzWzUwMV0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIiKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZihsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisJfQorCisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzWzUwMV09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorCX0KKwlpZihleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisKKwlleGNsdXNpdl9iaXRfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKzwvb21wdHM6b3JwaGFuPgorCS8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisJcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2hhcmVkLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NoYXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjhlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc2hhcmVkIG9wdGlvbiBvZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2hhcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NoYXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBzdW07CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIHN1bSA9IDA7CisgIGludCBrbm93bl9zdW07CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnNoYXJlZChzdW0pPC9vbXB0czpjaGVjaz4gPG9tcHRzOmNyb3NzY2hlY2s+Zmlyc3Rwcml2YXRlKHN1bSk8L29tcHRzOmNyb3NzY2hlY2s+CisgIHsKKyAgICA8b21wdHM6b3JwaGFuPgorICAgIGludCBteXN1bSA9IDA7CisjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgIG15c3VtID0gbXlzdW0gKyBpOworCX0gCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bSA9IHN1bSArIG15c3VtOworCX0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKzwvb21wdHM6b3JwaGFuPgorCisgIH0gICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgCWZwcmludGYobG9nRmlsZSwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzVkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbiBmaXJzdHByaXZhdGUgZGlyZWN0aXZlIGJ5IGFkZGluZyBhIHZhcmlhYmxlIHdoaWNoIGlzIGRlZmluZWQgYmVmb3JlIHRoZSBwYXJhbGxlbCByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKwkgICAgaW50IHN1bTsKKwkgICAgaW50IHN1bTA7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKwlpbnQga25vd25fc3VtOworCisJc3VtMCA9IDExOworCXN1bSA9IDc7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKwkJCXsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCQkJeworCQkJCQlzdW0gPSBzdW0gKyBzdW0wOworCQkJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkJCX0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQkJCXsKKwkJCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQkJCXsKKwkJCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJCQl9ICAgICAgICAgICAgICAgCisJCX0gLyplbmQgb2Ygc2VjdGlvbnMqLworPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKwlrbm93bl9zdW0gPSAxMSAqIDMgKyA3OworCXJldHVybiAoa25vd25fc3VtID09IHN1bSk7IAorfSAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9maXJzdHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhZTBkZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNzMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGkwID0gLTE7CisJaW50IHN1bSA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgc3VtMCA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgaTAgPSAtMTsKKyAgICBzdW0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+IHByaXZhdGUoaSxzdW0wKQorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24gIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IgKGkgPSAxOyBpIDwgNDAwOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJICAgIH0gLyogZW5kIG9mIHNlY3Rpb24gKi8KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJICAgIHsKKwkJc3VtMCA9IDA7CisJCWZvcihpID0gNDAwOyBpIDwgNzAwOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJICAgIHsKKwkJc3VtMCA9IDA7CisJCWZvcihpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9CisJfSAvKiBlbmQgb2Ygc2VjdGlvbnMqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMjsKKyAgICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiAoaTAgPT0gOTk5KSApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9wcml2YXRlLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OWEyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gcHJpdmF0ZSBkaXJlY3RpdmUgYnkgdXBjb3VudGluZyBhIHZhcmlhYmxlIGluIGEgdG8gc2V2ZXJhbCBzZWN0aW9ucyBzcGxpdHRlZCBsb29wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbiBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25fcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisJaW50IHN1bTA7CisgICAgaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gNzsKKyAgICBzdW0wID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wICBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0wLGkpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkpPC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJICAgIHsKKwkJPG9tcHRzOmNoZWNrPgorICAgICAgICBzdW0wID0gMDsKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gMTsgaSA8IDQwMDsgaSsrKQorCQkgICAgc3VtMCA9IHN1bTAgKyBpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCSAgICB9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorCSAgICB7CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorCQlzdW0wID0gMDsKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCQlmb3IgKGkgPSA0MDA7IGkgPCA3MDA7IGkrKykKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCSAgICB7CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorCQlzdW0wID0gMDsKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCQlmb3IgKGkgPSA3MDA7IGkgPCAxMDAwOyBpKyspCisJCSAgICBzdW0wID0gc3VtMCArIGk7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJICAgIH0gICAgICAgICAgICAgICAKKwl9IC8qZW5kIG9mIHNlY3Rpb25zKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3OworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7IAorfSAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9wcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX25vd2FpdC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTFhMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19ub3dhaXQuYwpAQCAtMCwwICsxLDY2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czpkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBub3dhaXQgZGlyZWN0aXZlLiBJdCBmaWxscyBhbiBhcnJheSB3aXRoIHZhbHVlcyBhbmQgb3BlcmF0ZXMgb24gdGhlc2UgaW4gdGhlIGZvbGxvd2luZy48L29tcHRzOmRlc2NyaXB0aW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dmVyc2lvbj4xLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHNlY3Rpb25zLCBvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uc19ub3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworCTxvbXB0czpvcnBoYW46dmFycz4KKwkJaW50IHJlc3VsdDsKKwkJaW50IGNvdW50OworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGo7CisKKwlyZXN1bHQgPSAwOworCWNvdW50ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworCTxvbXB0czpvcnBoYW4+CisJaW50IHJhbms7CisKKwlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQorI3ByYWdtYSBvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPm5vd2FpdDwvb21wdHM6Y2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGVudGVycyBmaXJzdCBzZWN0aW9uIGFuZCBnZXRzIHNsZWVwaW5nLlxuIiwgcmFuayk7CisJCQkJbXlfc2xlZXAoU0xFRVBUSU1FKTsKKwkJCQljb3VudCA9IDE7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCB3b2tlIHVwIGFuIHNldCBjb3VudCB0byAxLlxuIiwgcmFuayk7CisjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4ZWN1dGVkIHdvcmsgaW4gdGhlIGZpcnN0IHNlY3Rpb24uXG4iLCByYW5rKTsKKwkJCX0KKwkJfQorLyogQmVnaW4gb2Ygc2Vjb25kIHNlY3Rpb25zIGVudmlyb25tZW50ICovCisjcHJhZ21hIG9tcCBzZWN0aW9ucworCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGVjdXRlZCB3b3JrIGluIHRoZSBzZWNvbmQgc2VjdGlvbi5cbiIsIHJhbmspOworCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZXhlY3V0ZWQgd29yayBpbiB0aGUgc2Vjb25kIHNlY3Rpb24gYW5kIGNvbnRyb2xzIHRoZSB2YWx1ZSBvZiBjb3VudFxuIiwgcmFuayk7CisJCQkJaWYgKGNvdW50ID09IDApCisJCQkJCXJlc3VsdCA9IDE7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgImNvdXQgd2FzICVkIiwgY291bnQpOworCQkJfQorCQl9CisJPC9vbXB0czpvcnBoYW4+CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19yZWR1Y3Rpb24uYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3ODI5YQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSw2MTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb25zIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25zX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsKKwlkb3VibGUgZHB0LGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworCWludCBsb2dpY19hbmQ7CisJaW50IGJpdF9hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzWzEwMDBdOworCWludCBpOworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKwkvKiAgaW50IG15X2lzbGFyZ2VyOyovCisJLyppbnQgaXNfbGFyZ2VyPTE7Ki8KKworICAgIHN1bSA9NzsKKyAgICBkcHQgPTE7CisgICAgZHN1bT0wOworICAgIHByb2R1Y3QgPTE7CisJbG9naWNfYW5kPTE7CisJYml0X2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0ID0gMDsKKwlkdCA9IDEuLzMuOworCWtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3OworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworCisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlzdW09c3VtK2k7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlzdW09c3VtK2k7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQkrK3Jlc3VsdDsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLCBzdW0sa25vd25fc3VtKTsKKwl9CisKKwlkaWZmID0gKDk5OSoxMDAwKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJZGlmZj1kaWZmLWk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJZGlmZj1kaWZmLWk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKworCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTA7aTw2OysraSkKKwkJCQl7CisJCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NjtpPDEyOysraSkKKwkJCQl7CisJCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZnByaW50Zihsb2dGaWxlLCJcbiIpOworCWRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTA7aTw2OysraSkKKwkJCQl7CisJCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xMjtpPDIwOysraSkKKwkJCQl7CisJCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKwl9CisKKworCWtub3duX3Byb2R1Y3QgPSAzNjI4ODAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTE7aTwzO2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MztpPDc7aSsrKQorCQkJCXsKKwkJCQkJcHJvZHVjdCAqPSBpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03O2k8MTE7aSsrKQorCQkJCXsKKwkJCQkJcHJvZHVjdCAqPSBpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzWzUwMV0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJcbkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisJfQorCisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworCX0KKworCisJZm9yKGk9MDtpPDEwMDA7KytpKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwliaXRfYW5kID0gMTsKKwlsb2dpY3NbNTAxXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzJiMGQyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGUuYwpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgZGlyZWN0aXZlIGJ5IGNvbnRyb2xsaW5nIGhvdyBvZnRlbiBhIGRpcmVjdGl2ZSBpcyBjYWxsZWQgaW4gYW4gb21wIHNpbmdsZSByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJaW50IHJlc3VsdDsKKwlpbnQgbnJfaXRlcmF0aW9uczsKKwlpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgIHJlc3VsdCA9IDA7CisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHNpbmdsZSA8L29tcHRzOmNoZWNrPgorCQl7ICAKKyNwcmFnbWEgb21wIGZsdXNoCisJCSAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgCisJCSAgICBucl9pdGVyYXRpb25zKys7CisJCSAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworCQkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJCX0gLyogZW5kIG9mIHNpbmdsZSAqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfY29weXByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzdjZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfY29weXByaXZhdGUuYwpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgY29weXByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlIGNvcHlwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmxsZWwsb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBqOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShqKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlX2NvcHlwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCByZXN1bHQ7CisJaW50IG5yX2l0ZXJhdGlvbnM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHJlc3VsdCA9IDA7CisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwkgICAgeworCQkvKgorCQkgICBpbnQgdGhyZWFkOworCQkgICB0aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCSAqLworI3ByYWdtYSBvbXAgc2luZ2xlIDxvbXB0czpjaGVjaz5jb3B5cHJpdmF0ZShqKTwvb21wdHM6Y2hlY2s+CisJCXsKKwkJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkJICAgIGogPSBpOworCQkgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgYXNzaWducywgaiA9ICVkLCBpID0gJWRcbiIsIHRocmVhZCwgaiwgaSk7Ki8KKwkJfQorCQkvKgkjcHJhZ21hIG9tcCBiYXJyaWVyKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIC8qcHJpbnRmICgidGhyZWFkID0gJWQsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOyovCisJCSAgICByZXN1bHQgPSByZXN1bHQgKyBqIC0gaTsKKwkJfQorI3ByYWdtYSBvbXAgYmFycmllcgorCSAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9ub3dhaXQuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2EyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9ub3dhaXQuYwpAQCAtMCwwICsxLDYwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBhdG9taWM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgbXlfaXRlcmF0aW9uczsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlfaXRlcmF0aW9ucykKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZV9ub3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQgdG90YWxfaXRlcmF0aW9ucyA9IDA7CisgICAgaW50IGk7CisKKyAgICBucl9pdGVyYXRpb25zID0gMDsKKyAgICBteV9pdGVyYXRpb25zID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6Y2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIGF0b21pYyAgCisJCSAgICBucl9pdGVyYXRpb25zKys7CisJCX0gLyogZW5kIG9mIHNpbmdsZSovICAgIAorCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9IC8qIGVuZCBvZiBmb3IgICovCisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSAKKyAgICB7CisJbXlfaXRlcmF0aW9ucyA9IDA7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisJCSAgICBteV9pdGVyYXRpb25zKys7CisJCX0gLyogZW5kIG9mIHNpbmdsZSovICAgIAorCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9IC8qIGVuZCBvZiBmb3IgICovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgdG90YWxfaXRlcmF0aW9ucyArPSBteV9pdGVyYXRpb25zOworCX0KKworICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgcmV0dXJuICgobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpICYmICh0b3RhbF9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlX25vd2FpdCovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfcHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTAyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9wcml2YXRlLmMKQEAgLTAsMCArMSw1NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2VsIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGZsdXNoLG9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IG15aXQgPSAwOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteWl0KQoraW50IG15cmVzdWx0ID0gMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlyZXN1bHQpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGVfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworCWludCByZXN1bHQ7CisJaW50IG5yX2l0ZXJhdGlvbnM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgaTsKKworICAgIG15aXQgPSAwOworICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICBucl9pdGVyYXRpb25zID0gMDsKKyAgICByZXN1bHQgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgICAgeworCW15cmVzdWx0ID0gMDsKKwlteWl0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBzaW5nbGUgPG9tcHRzOmNoZWNrPnByaXZhdGUobnJfdGhyZWFkc19pbl9zaW5nbGUpIDwvb21wdHM6Y2hlY2s+bm93YWl0CisJICAgIHsgIAorCQlucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisjcHJhZ21hIG9tcCBmbHVzaAorCQlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgCisJCW15aXQrKzsKKwkJbXlyZXN1bHQgPSBteXJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8gICAgCisJPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKyAgICAgICAgICAgIHJlc3VsdCArPSBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgbnJfaXRlcmF0aW9ucyArPSBteWl0OworCX0KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSBwcml2YXRlICovIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFzay5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU4OTc5MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFzay5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2sgZGlyZWN0aXZlLiBUaGUgaWRlYSBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBsZXQgcGF1c2UgdGhlIHRhc2tzIGdlbmVyYXRlZCBzbyB0aGF0IG90aGVyIHRocmVhZHMgZ2V0IHNoZWR1bGVkIHRvIHRoZSBuZXdseSBvcGVuZWQgdGFza3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHRpZHNbTlVNX1RBU0tTXTsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKK3sKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4KKyAgICAgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvIAorICAgICAgICAgICAgICogZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IG15aTsKKyAgICAgICAgICAgIG15aSA9IGk7CisKKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0YXNrPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKworICAgICAgICAgICAgICAgIHRpZHNbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KK30gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworLyogTm93IHdlIGNrZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSB0YXNrcy4gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKHRpZHNbMF0gIT0gdGlkc1tpXSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpbmFsLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmluYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTAwYzVmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpbmFsLmMKQEAgLTAsMCArMSw1MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGxldCBwYXVzZSB0aGUgdGFza3MgZ2VuZXJhdGVkIHNvIHRoYXQgb3RoZXIgdGhyZWFkcyBnZXQgc2hlZHVsZWQgdG8gdGhlIG5ld2x5IG9wZW5lZCB0YXNrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgZmluYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfZmluYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgdGlkc1tOVU1fVEFTS1NdOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGVycm9yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCit7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0byAKKyAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICBteWkgPSBpOworCisgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5maW5hbChpPj0xMCk8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCisgICAgICAgICAgICAgICAgdGlkc1tteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisvKiBOb3cgd2UgY2tlY2sgaWYgbW9yZSB0aGFuIG9uZSB0aHJlYWQgZXhlY3V0ZWQgdGhlIHRhc2tzLiAqLworICAgIGZvciAoaSA9IDEwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKHRpZHNbMTBdICE9IHRpZHNbaV0pCisgICAgICAgICAgICBlcnJvcisrOworICAgIH0KKyAgICByZXR1cm4gKGVycm9yPT0wKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTA3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBmaXJzdHByaXZhdGUgY2xhdXNlIG9mIHRoZSB0YXNrIGRpcmVjdGl2ZS4gV2UgY3JlYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgZGVmaW5lcyBhIHZhcmlhYmxlIG5hbWVkIHN1bSB1bmVxdWFsIHplcm8gd2hpY2ggZ2V0cyBkZWNsYXJlZCBmaXJzdHByaXZhdGUgZm9yIGVhY2ggdGFzay4gTm93IGVhY2ggdGFzayBjYWxjdWFsdGVzIGEgc3VtIHVzaW5nIHRoaXMgcHJpdmF0ZSB2YXJpYWJsZS4gQmVmb3JlIGVhY2ggY2FsY3VhbGF0aW9uIHN0ZXAgd2UgaW50cm9kdWNlIGEgZmx1c2ggY29tbWFuZCBzbyB0aGF0IG1heWJlIHRoZSBwcml2YXRlIHZhcmlhYmVsIGdldHMgYmFkLiBBdCB0aGUgZW5kIHdlIGNoZWNrIGlmIHRoZSBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBpOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtID0gMTIzNDsKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCByZXN1bHQgPSAwOyAvKiBjb3VudHMgdGhlIHdyb25nIHN1bXMgZnJvbSB0YXNrcyAqLworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBrbm93bl9zdW0gPSAxMjM0ICsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IExPT1BDT1VOVDsgaisrKSB7CisjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGo7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsIAorICAgICAgICAgICAgICAgICAgICAgIHsgcmVzdWx0Kys7IH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwqLworCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2lmLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDdhYjJmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2lmLmMKQEAgLTAsMCArMSw0MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBpZiBjbGF1c2Ugb2YgdGhlIG9tcCB0YXNrIGRpcmVjdGl2ZS4gVGhlIGlkZWFyIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbiBhbmQgcGF1c2UgaXQgaW1tZWRpYXRlbHkuIFRoZSBwYXJlbnQgdGhyZWFkIG5vdyBzaGFsbCBzZXQgYSBjb3VudGVyIHZhcmlhYmxlIHdoaWNoIHRoZSBwYXVzZWQgdGFzayBzaGFsbCBldmFsdWF0ZSB3aGVuIHdva2UgdXAuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGlmPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBjb25kaXRpb25fZmFsc2U7CisgICAgaW50IGNvdW50OworICAgIGludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBjb3VudD0wOworICAgIGNvbmRpdGlvbl9mYWxzZSA9IChsb2dGaWxlID09IE5VTEwpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCit7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5pZiAoY29uZGl0aW9uX2ZhbHNlKTwvb21wdHM6Y2hlY2s+IHNoYXJlZChjb3VudCwgcmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FX0xPTkcpOworLy8jcHJhZ21hIG9tcCBmbHVzaCAoY291bnQpCisgICAgICAgICAgICByZXN1bHQgPSAoMCA9PSBjb3VudCk7CisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorCisgICAgICAgIGNvdW50ID0gMTsKKy8vI3ByYWdtYSBvbXAgZmx1c2ggKGNvdW50KQorCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCit9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICByZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOGYwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBwcml2YXRlIHdvcmtzIHByb3Blcmx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKKworCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ltcF9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBpPTU7CisgICAgaW50IGsgPSAwOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCB0YXNrX3Jlc3VsdCA9IDE7CisgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoaSkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgIHsKKyAgICAgCisgICAgICAgIAorICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykKKwkgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBzaGFyZWQocmVzdWx0ICwgdGFza19yZXN1bHQ8b21wdHM6Y3Jvc3NjaGVjaz4sIGk8L29tcHRzOmNyb3NzY2hlY2s+KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgajsKKwkJCSAgLy9jaGVjayBpZiBpIGlzIHByaXZhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSAhPSA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfcmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IE5VTV9UQVNLUzsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIGZpcnN0cHJpdmF0ZSBpbXBsaWNpdGx5CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKworCSAgI3ByYWdtYSBvbXAgdGFza3dhaXQKKwkgIHJlc3VsdCA9ICh0YXNrX3Jlc3VsdCAmJiBpPT01KTsKKyAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3ByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllMjZkZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19wcml2YXRlLmMKQEAgLTAsMCArMSw1MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gd2hpY2ggZ2V0cyBkZWNsYXJlZCBwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgZmx1c2gsb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IGk7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisgICAgaW50IHN1bSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7IC8qIGNvdW50cyB0aGUgd3Jvbmcgc3VtcyBmcm9tIHRhc2tzICovCisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bSk8L29tcHRzOmNoZWNrPiBzaGFyZWQocmVzdWx0LCBrbm93bl9zdW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKwkJICAgIC8vaWYgc3VtIGlzIHByaXZhdGUsIGluaXRpYWxpemUgdG8gMAorCQkgICAgPG9tcHRzOmNoZWNrPnN1bSA9IDA7PC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBMT09QQ09VTlQ7IGorKykgeworI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBqOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3VtICE9IGtub3duX3N1bSkgeworI3ByYWdtYSBvbXAgY3JpdGljYWwgCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwqLworCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3NoYXJlZC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3NoYXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YzIxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfc2hhcmVkLmMKQEAgLTAsMCArMSw0NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPiBUZXN0IHRvIHNlZSBpZiBpbXBsaWVkIHNoYXJlZCB3b3JrcyBjb3JyZWN0bHk8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLCBvbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCisKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pbXBfc2hhcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgaTsKKyAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaT0wOworICAgIGludCBrID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgICAgZm9yIChrID0gMDsgayA8IE5VTV9UQVNLUzsgaysrKSAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNyb3NzY2hlY2s+IGZpcnN0cHJpdmF0ZShpKSA8L29tcHRzOmNyb3NzY2hlY2s+IDxvbXB0czpjaGVjaz4gc2hhcmVkKGkpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIHNoYXJlZCBpbXBsaWNpdGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+IAorICAgICAgICAgICAgICAgICAgfQorCisgICAgfQorCityZXN1bHQgPSBpOworcmV0dXJuICgocmVzdWx0ID09IE5VTV9UQVNLUykpOworICAgICAKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfdW50aWVkLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfdW50aWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2ZWJlMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza191bnRpZWQuYwpAQCAtMCwwICsxLDY5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCBmb3IgdW50aWVkIGNsYXVzZS4gRmlyc3QgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGVuIHdlIHJlc3VtZSBoYWxmIG9mIHRoZW0gYW5kIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgc2NoZWR1bGVkIGJ5IGRpZmZlcmVudCB0aHJlYWRzPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIHVudGllZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCB0YXNrd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza191bnRpZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgaW50IHN0YXJ0X3RpZFtOVU1fVEFTS1NdOworICBpbnQgY3VycmVudF90aWRbTlVNX1RBU0tTXTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgY291bnQgPSAwOworICAKKyAgLyppbml0aWFsaXphdGlvbiovCisgIGZvciAoaT0wOyBpPCBOVU1fVEFTS1M7IGkrKyl7CisgICAgc3RhcnRfdGlkW2ldPTA7CisgICAgY3VycmVudF90aWRbaV09MDsKKyAgfQorICAKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKGkpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgaW50IG15aSA9IGk7CisgICAgICAgICNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNoZWNrPnVudGllZDwvb21wdHM6Y2hlY2s+CisgICAgICAgIHsKKyAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgIHN0YXJ0X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIAorICAgICAgICAgICNwcmFnbWEgb21wIHRhc2t3YWl0CisgICAgICAgICAgCisgICAgICAgICAgPG9tcHRzOmNoZWNrPmlmKChzdGFydF90aWRbbXlpXSAlMikgIT0wKXs8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICAgIGN1cnJlbnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgfSAvKiBlbmQgb2YgaWYgKi8gCisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfQorICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisKKyAgICAgICAgfSAvKmVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGZvciAoaT0wO2k8TlVNX1RBU0tTOyBpKyspCisgIHsKKyAgICBwcmludGYoInN0YXJ0X3RpZFslZF09JWQsIGN1cnJlbnRfdGlkWyVkXT0lZFxuIixpLCBzdGFydF90aWRbaV0sIGkgLCBjdXJyZW50X3RpZFtpXSk7CisgICAgaWYgKGN1cnJlbnRfdGlkW2ldID09IHN0YXJ0X3RpZFtpXSkKKyAgICAgIGNvdW50Kys7CisgIH0KKyAgcmV0dXJuIChjb3VudDxOVU1fVEFTS1MpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKworPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrd2FpdC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzYxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2t3YWl0LmMKQEAgLTAsMCArMSw3NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFza3dhaXQgZGlyZWN0aXZlLiBGaXJzdCB3ZSBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcywgd2hpY2ggc2V0IHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheSB0byBhIHNwZWNpZmljIHZhbHVlLiBUaGVuIHdlIGRvIGEgdGFza3dhaXQgYW5kIGNoZWNrIGlmIGFsbCB0YXNrcyBmaW5pc2hlZCBtZWFuaW5nIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZS4gVGhlbiB3ZSBnZW5lcmF0ZSBhIHNlY29uZCBzZXQgc2V0dGluZyB0aGUgYXJyYXkgZWxlbWVudHMgdG8gYW5vdGhlciB2YWx1ZS4gQWZ0ZXIgdGhlIHBhcmFsbGVsIHJlZ2lvbiB3ZSBjaGVjayBpZiBhbGwgdGFza3Mgb2YgdGhlIHNlY29uZCBzZXQgZmluaXNoZWQgYW5kIHdlcmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRhc2tzIG9mIHRoZSBmaXJzdCBzZXQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIHRhc2s8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIGludCByZXN1bHQxID0gMDsgICAgIC8qIFN0b3JlcyBudW1iZXIgb2Ygbm90IGZpbmlzaGVkIHRhc2tzIGFmdGVyIHRoZSB0YXNrd2FpdCAqLworICAgIGludCByZXN1bHQyID0gMDsgICAgIC8qIFN0b3JlcyBudW1iZXIgb2Ygd3JvbmcgYXJyYXkgZWxlbWVudHMgYXQgdGhlIGVuZCAqLworCisgICAgaW50IGFycmF5W05VTV9UQVNLU107CisgICAgaW50IGk7CisKKyAgICAvKiBmaWxsIGFycmF5ICovCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSAKKyAgICAgICAgYXJyYXlbaV0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8gCisgICAgICAgICAgICAgICAgICogZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgICAgIG15aSA9IGk7CisjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbbXlpXSA9IDE7CisgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIH0gLyogZW5kIG9mIGZvciAqLworCis8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRhc2t3YWl0PC9vbXB0czpjaGVjaz4KKzwvb21wdHM6b3JwaGFuPgorCisgICAgICAgICAgICAvKiBjaGVjayBpZiBhbGwgdGFza3Mgd2VyZSBmaW5pc2hlZCAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSAKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0gIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0MSsrOworCisgICAgICAgICAgICAvKiBnZW5lcmF0ZSBzb21lIG1vcmUgdGFza3Mgd2hpY2ggbm93IHNoYWxsIG92ZXJ3cml0ZSAKKyAgICAgICAgICAgICAqIHRoZSB2YWx1ZXMgaW4gdGhlIHRpZHMgYXJyYXkgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICAgICAgbXlpID0gaTsKKyNwcmFnbWEgb21wIHRhc2sKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5W215aV0gPSAyOworICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICAvKiBmaW5hbCBjaGVjaywgaWYgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlczogKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKGFycmF5W2ldICE9IDIpCisgICAgICAgICAgICByZXN1bHQyKys7CisgICAgfQorCisgICAgcmV0dXJuICgocmVzdWx0MSA9PSAwKSAmJiAocmVzdWx0MiA9PSAwKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNreWllbGQuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza3lpZWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxMjcxZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza3lpZWxkLmMKQEAgLTAsMCArMSw1OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3QgdGFza3lpZWxkIGRpcmVjdGl2ZS4gRmlyc3QgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGVuIHdlIHJlc3VtZSBoYWxmIG9mIHRoZW0gYW5kIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgc2NoZWR1bGVkIGJ5IGRpZmZlcmVudCB0aHJlYWRzPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNreWllbGQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgdGFza3dhaXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2t5aWVsZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgaTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHN0YXJ0X3RpZFtOVU1fVEFTS1NdOworICBpbnQgY3VycmVudF90aWRbTlVNX1RBU0tTXTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgZm9yIChpPTA7IGk8IE5VTV9UQVNLUzsgaSsrKXsKKyAgICBzdGFydF90aWRbaV09MDsKKyAgICBjdXJyZW50X3RpZFtpXT0wOworICB9CisgIAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIGludCBteWkgPSBpOworICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGFzayB1bnRpZWQ8L29tcHRzOmNoZWNrPgorICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICBzdGFydF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIAorICAgICAgICAgICNwcmFnbWEgb21wIHRhc2t5aWVsZAorICAgICAgICAgIAorICAgICAgICAgIGlmKChzdGFydF90aWRbbXlpXSAlMikgPT0wKXsKKyAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfSAvKmVuZCBvZiBpZiovCisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgZm9yIChpPTA7aTxOVU1fVEFTS1M7IGkrKykKKyAgeworICAgIC8vcHJpbnRmKCJzdGFydF90aWRbJWRdPSVkLCBjdXJyZW50X3RpZFslZF09JWRcbiIsaSwgc3RhcnRfdGlkW2ldLCBpICwgY3VycmVudF90aWRbaV0pOworICAgIGlmIChjdXJyZW50X3RpZFtpXSA9PSBzdGFydF90aWRbaV0pCisgICAgICBjb3VudCsrOworICB9CisgIHJldHVybiAoY291bnQ8TlVNX1RBU0tTKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+CisKKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGVzdF9sb2NrLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODlkZmIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbG9jay5jCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3Rsb2NrIGZ1bmN0aW9uLiBUaGUgdGVzdCBjb3VudHMgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdoaWNoIGlzIGJ1aWxkIHdpdGggYSB0ZXN0X2xvY2sgaW4gYW4gZW5kbGVzcyBsb29wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90ZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgaW50IGk7CisKKyAgICBvbXBfaW5pdF9sb2NrICgmbGNrKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgIAorICAgIHsKKworI3ByYWdtYSBvbXAgZm9yCisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgLypvbXBfc2V0X2xvY2soJmxjayk7Ki8KKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPndoaWxlICghb21wX3Rlc3RfbG9jayAoJmxjaykpCisJCXt9Ozwvb21wdHM6Y2hlY2s+CisJICAgIDwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgZmx1c2gKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAKKwkgICAgbnJfaXRlcmF0aW9ucysrOworCSAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworCSAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgPG9tcHRzOmNoZWNrPm9tcF91bnNldF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCX0KKyAgICB9CisgICAgb21wX2Rlc3Ryb3lfbG9jaygmbGNrKTsKKworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGVzdF9uZXN0X2xvY2suYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGVzdF9uZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQ2YTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3RfbmVzdF9sb2NrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK3N0YXRpYyBvbXBfbmVzdF9sb2NrX3QgbGNrOworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgCisgICAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgaW50IGk7CisKKyAgICBvbXBfaW5pdF9uZXN0X2xvY2sgKCZsY2spOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKSAKKyAgICB7CisKKyNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIC8qb21wX3NldF9sb2NrKCZsY2spOyovCis8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+d2hpbGUoIW9tcF90ZXN0X25lc3RfbG9jayAoJmxjaykpCisJICAgIHt9Ozwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbmVzdF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCX0KKyAgICB9CisgICAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICgmbGNrKTsKKworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNGQ3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGUuYwpAQCAtMCwwICsxLDk3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0aHJlYWRwcml2YXRlIGRpcmVjdGl2ZSBieSBmaWxsaW5nIGFuIGFycmF5IHdpdGggcmFuZG9tIG51bWJlcnMgaW4gYW4gcGFyYWxsZWxpc2VkIHJlZ2lvbi4gRWFjaCB0aHJlYWQgZ2VuZXJhdGVzIG9uZSBudW1iZXIgb2YgdGhlIGFycmF5IGFuZCBzYXZlcyB0aGlzIGluIGEgdGVtcG9yYXJ5IHRocmVhZHByaXZhdGUgdmFyaWFibGUuIEluIGEgc2Vjb25kIHBhcmFsbGVsaXNlZCByZWdpb24gdGhlIHRlc3QgY29udHJvbHMsIHRoYXQgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZSBjb250YWlucyBzdGlsbCB0aGUgZm9ybWVyIHZhbHVlIGJ5IGNvbXBhcmluZyBpdCB3aXRoIHRoZSBvbmUgaW4gdGhlIGFycmF5Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXBfc2V0X2R5bmFtaWMsb21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogVGhyZWFkcHJpdmF0ZSBpcyB0ZXN0ZWQgaW4gMiB3YXlzOgorICogMS4gVGhlIGdsb2JhbCB2YXJpYWJsZSBkZWNsYXJlZCBhcyB0aHJlYWRwcml2YXRlIHNob3VsZCBoYXZlCisgKiAgICBsb2NhbCBjb3B5IGZvciBlYWNoIHRocmVhZC4gT3RoZXJ3aXNlIHJhY2UgY29uZGl0aW9uIGFuZCAKKyAqICAgIHdyb25nIHJlc3VsdC4KKyAqIDIuIElmIHRoZSB2YWx1ZSBvZiBsb2NhbCBjb3B5IGlzIHJldGFpbmVkIGZvciB0aGUgdHdvIGFkamFjZW50CisgKiAgICBwYXJhbGxlbCByZWdpb25zCisgKi8KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBzdW0wPTA7CitzdGF0aWMgaW50IG15dmFsdWUgPSAwOworCis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteXZhbHVlKTwvb21wdHM6Y2hlY2s+CisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3RocmVhZHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisJaW50IHN1bSA9IDA7CisJaW50IGtub3duX3N1bTsKKwlpbnQgaTsgCisJaW50IGl0ZXI7CisJaW50ICpkYXRhOworCWludCBzaXplOworCWludCBmYWlsZWQgPSAwOworCWludCBteV9yYW5kb207CisJb21wX3NldF9keW5hbWljKDApOworCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSAKKyAgICB7CisJICBzdW0wID0gMDsKKyAgICAgICNwcmFnbWEgb21wIGZvciAKKwkgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkJeworCQkJc3VtMCA9IHN1bTAgKyBpOworCQl9IC8qZW5kIG9mIGZvciovCisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisJICB9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8gICAgCisJa25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCWlmIChrbm93bl9zdW0gIT0gc3VtICkgeworCQlmcHJpbnRmIChsb2dGaWxlLCAiIGtub3duX3N1bSA9ICVkLCBzdW0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworCX0KKworCS8qIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiBpcyBqdXN0IHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyovCisJb21wX3NldF9keW5hbWljKDApOworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworICAgICAgI3ByYWdtYSBvbXAgbWFzdGVyCisJICB7CisJCQlzaXplPW9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwkJCWRhdGE9KGludCopIG1hbGxvYyhzaXplKnNpemVvZihpbnQpKTsKKwkgIH0KKwl9LyogZW5kIHBhcmFsbGVsKi8KKworCisJc3JhbmQoNDUpOworCWZvciAoaXRlciA9IDA7IGl0ZXIgPCAxMDA7IGl0ZXIrKyl7CisJCW15X3JhbmRvbSA9IHJhbmQoKTsJLyogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgY2FsbGVkIGluc2lkZSBzZXJpYWwgcmVnaW9uKi8KKworCS8qIHRoZSBmaXJzdCBwYXJhbGxlbCByZWdpb24gaXMgdXNlZCB0byBpbml0aWFsaXllIG15dmFsdWUgYW5kIHRoZSBhcnJheSB3aXRoIG15X3JhbmRvbStyYW5rKi8KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKwkgICAgaW50IHJhbms7CisJCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCW15dmFsdWUgPSBkYXRhW3JhbmtdID0gbXlfcmFuZG9tICsgcmFuazsKKwl9CisKKwkvKiB0aGUgc2Vjb25kIHBhcmFsbGVsIHJlZ2lvbiB2ZXJpZmllcyB0aGF0IHRoZSB2YWx1ZSBvZiAibXl2YWx1ZSIgaXMgcmV0YWluZWQgKi8KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24oKzpmYWlsZWQpCisJeworCSAgICBpbnQgcmFuazsKKwkJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwkJZmFpbGVkID0gZmFpbGVkICsgKG15dmFsdWUgIT0gZGF0YVtyYW5rXSk7CisJCWlmKG15dmFsdWUgIT0gZGF0YVtyYW5rXSl7CisJCSAgZnByaW50ZiAobG9nRmlsZSwgIiBteXZhbHVlID0gJWQsIGRhdGFbcmFua109ICVkXG4iLCBteXZhbHVlLCBkYXRhW3JhbmtdKTsKKwkJfQorCX0KKyAgfQorICBmcmVlIChkYXRhKTsKKworCXJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgIWZhaWxlZDsKKworfSAvKiBlbmQgb2YgY2hlY2tfdGhyZWFkcHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlX2Zvci5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlX2Zvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDM1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGVfZm9yLmMKQEAgLTAsMCArMSw0NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIGlmIGEgdmFyaWFibGUgZGVjbGFyZWQgYXMgdGhyZWFkcHJpdmF0ZSBjYW4gYmUgdXNlZCBhcyBhIGxvb3BpbmRleC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IGk7Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpKTwvb21wdHM6Y2hlY2s+CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlX2Zvcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKwkJaW50IGtub3duX3N1bTsKKwkJaW50IHN1bTsKKwkJa25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCQlzdW0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKwkJaW50IHN1bTAgPSAwOworI3ByYWdtYSBvbXAgZm9yCisJCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJCXN1bTAgPSBzdW0wICsgaTsKKwkJfSAvKmVuZCBvZiBmb3IqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCQorCWlmIChrbm93bl9zdW0gIT0gc3VtICkgeworCQlmcHJpbnRmIChsb2dGaWxlLCAiIGtub3duX3N1bSA9ICVkLCBzdW0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworCX0KKworCXJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30gLyogZW5kIG9mIGNoZWNrX3RocmVhZHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KKwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jb21tb25fdXRpbGl0eS5mIGIvcmMzL3Rlc3RzdWl0ZS9jb21tb25fdXRpbGl0eS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDEwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2NvbW1vbl91dGlsaXR5LmYKQEAgLTAsMCArMSw1NyBAQAorICAgICAgc3Vicm91dGluZSBwcmludF9yZXN1bHQocyxjcm9zc2ZhaWxlZCxNLG5hbWUpICAgICAKKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGNoYXJhY3RlciAobGVuPSopOjpuYW1lCisJICAgcmVhbCBjZXJ0CisJICAgaW50ZWdlciBNLGNyb3NzZmFpbGVkCisJICAgaW50ZWdlciBzCisJICAgY2hhcmFjdGVyIChsZW49MTEpIDo6IGMKKyAJICAgY2hhcmFjdGVyIChsZW49MTgpIDo6IGMyCisJICAgY2VydD0xMDAuMCpjcm9zc2ZhaWxlZC9NCishICAgICAgICAgICBwcmludCAqLCAiY2VydCIsIGNlcnQsICJjcm9zcyAiLCBjcm9zc2ZhaWxlZAorIQl0ZXN0MT1odW5kcmVkKmNyb3NzZmFpbGVkCisJICAgYz0iJSBjZXJ0YWludHkiCisJICAgYzI9IiAuLi4gdmVyaWZpZWQgd2l0aCAiCisgICAgICBpZihzLmVxLjEpIHRoZW4KKyAgICAgICAgIHdyaXRlICgqLCIoQSwgQSwgRjcuMiwgQSkiKSBuYW1lLCBjMiwgY2VydCwgYworICAgICAgZWxzZQorICAgICAgICAgd3JpdGUgKCosIihBLEEpIikgbmFtZSwiIC4uLiBGQUlMRUQiCisgICAgICBlbmRpZgorCSAgIGVuZAorCisgICAgICBzdWJyb3V0aW5lIGRvX3Rlc3QodGVzdF9mdW5jLGNyb3NzX3Rlc3RfZnVuYyxuYW1lLE4sZmFpbGVkLAorICAgICB4ICBudW1fdGVzdHMsY3Jvc3NjaGVja2VkKQorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlciBzdWNjZWVkCisgICAgICBpbnRlZ2VyIGNyb3NzZmFpbAorICAgICAgaW50ZWdlciBmYWlsZWQKKyAgICAgIGludGVnZXIsIGV4dGVybmFsOjp0ZXN0X2Z1bmMKKyAgICAgIGludGVnZXIsIGV4dGVybmFsOjpjcm9zc190ZXN0X2Z1bmMKKyAgICAgIGNoYXJhY3RlciAobGVuPSopOjpuYW1lCisgICAgICBpbnRlZ2VyIGZhaWwKKyAgICAgIGludGVnZXIgTixpCisgICAgICBpbnRlZ2VyIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQKKyAgICAgIG51bV90ZXN0cz1udW1fdGVzdHMrMQorICAgICAgc3VjY2VlZD0xCisgICAgICBjcm9zc2ZhaWw9MAorICAgICAgZmFpbD0wCisgICAgICBkbyBpPTEsTgorICAgICAgICAgaWYodGVzdF9mdW5jKCkuZXEuMCkgdGhlbgorICAgICAgICAgICAgc3VjY2VlZD0wCisgICAgICAgICAgICBmYWlsPWZhaWwrMQorICAgICAgICAgICAgZXhpdAorICAgICAgICAgZW5kIGlmCisgICAgICAgICBpZihjcm9zc190ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCishICAgICAgICAgICAgcHJpbnQgKiwgY3Jvc3NmYWlsCisgICAgICAgICAgICBjcm9zc2ZhaWw9Y3Jvc3NmYWlsKzEuMCAKKyAgICAgICAgIGVuZCBpZgorICAgICAgZW5kZG8KKyAgICAgIAorICAgICAgaWYgKGZhaWwgLm5lLiAwKSB0aGVuCisgICAgICAgICBmYWlsZWQ9ZmFpbGVkKzEKKyAgICAgIGVsc2UKKyAgICAgICAgIGlmKGNyb3NzZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgICAgIGNyb3NzY2hlY2tlZD1jcm9zc2NoZWNrZWQrMQorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRpZgorICAgICAgY2FsbCBwcmludF9yZXN1bHQoc3VjY2VlZCxjcm9zc2ZhaWwsTixuYW1lKQorICAgICAgZW5kCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMV9URVNUIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTY0Y2UwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVApAQCAtMCwwICsxLDM2IEBACitoYXNfb3Blbm1wCitvbXBfbmVzdGVkCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK2RvX29yZGVyZWQKK2RvX3JlZHVjdGlvbgorZG9fcHJpdmF0ZQorZG9fZmlyc3Rwcml2YXRlCitkb19sYXN0cHJpdmF0ZQorc2VjdGlvbl9yZWR1Y3Rpb24KK3NlY3Rpb25fcHJpdmF0ZQorc2VjdGlvbl9maXJzdHByaXZhdGUKK3NlY3Rpb25fbGFzdHByaXZhdGUKK3NpbmdsZQorc2luZ2xlX3ByaXZhdGUKK3NpbmdsZV9ub3dhaXQKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcmVkdWN0aW9uCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX2ZpcnN0cHJpdmF0ZQorcGFyX2RvX2xhc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9yZWR1Y3Rpb24KK3Bhcl9zZWN0aW9uX3ByaXZhdGUKK3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUKK29tcF9tYXN0ZXJfdGhyZWFkCitvbXBfY3JpdGljYWwKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfZmx1c2gKK29tcF90aHJlYWRwcml2YXRlCitvbXBfY29weWluCitvbXBfbG9jaworb21wX3Rlc3Rsb2NrCitvbXBfbmVzdF9sb2NrCitvbXBfbmVzdF90ZXN0bG9jawpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDJfVEVTVCBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU0NzY2NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QKQEAgLTAsMCArMSw1IEBACitvbXBfbnVtX3RocmVhZHMKK29tcF93b3Jrc2hhcmUKK29tcF90aW1lCitvbXBfdGlja3NfdGltZQorc2luZ2xlX2NvcHlwcml2YXRlCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9jb21tb25fdXRpbGl0eS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDEwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpAQCAtMCwwICsxLDU3IEBACisgICAgICBzdWJyb3V0aW5lIHByaW50X3Jlc3VsdChzLGNyb3NzZmFpbGVkLE0sbmFtZSkgICAgIAorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKwkgICByZWFsIGNlcnQKKwkgICBpbnRlZ2VyIE0sY3Jvc3NmYWlsZWQKKwkgICBpbnRlZ2VyIHMKKwkgICBjaGFyYWN0ZXIgKGxlbj0xMSkgOjogYworIAkgICBjaGFyYWN0ZXIgKGxlbj0xOCkgOjogYzIKKwkgICBjZXJ0PTEwMC4wKmNyb3NzZmFpbGVkL00KKyEgICAgICAgICAgIHByaW50ICosICJjZXJ0IiwgY2VydCwgImNyb3NzICIsIGNyb3NzZmFpbGVkCishCXRlc3QxPWh1bmRyZWQqY3Jvc3NmYWlsZWQKKwkgICBjPSIlIGNlcnRhaW50eSIKKwkgICBjMj0iIC4uLiB2ZXJpZmllZCB3aXRoICIKKyAgICAgIGlmKHMuZXEuMSkgdGhlbgorICAgICAgICAgd3JpdGUgKCosIihBLCBBLCBGNy4yLCBBKSIpIG5hbWUsIGMyLCBjZXJ0LCBjCisgICAgICBlbHNlCisgICAgICAgICB3cml0ZSAoKiwiKEEsQSkiKSBuYW1lLCIgLi4uIEZBSUxFRCIKKyAgICAgIGVuZGlmCisJICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgZG9fdGVzdCh0ZXN0X2Z1bmMsY3Jvc3NfdGVzdF9mdW5jLG5hbWUsTixmYWlsZWQsCisgICAgIHggIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQpCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIHN1Y2NlZWQKKyAgICAgIGludGVnZXIgY3Jvc3NmYWlsCisgICAgICBpbnRlZ2VyIGZhaWxlZAorICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OnRlc3RfZnVuYworICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OmNyb3NzX3Rlc3RfZnVuYworICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKyAgICAgIGludGVnZXIgZmFpbAorICAgICAgaW50ZWdlciBOLGkKKyAgICAgIGludGVnZXIgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZAorICAgICAgbnVtX3Rlc3RzPW51bV90ZXN0cysxCisgICAgICBzdWNjZWVkPTEKKyAgICAgIGNyb3NzZmFpbD0wCisgICAgICBmYWlsPTAKKyAgICAgIGRvIGk9MSxOCisgICAgICAgICBpZih0ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCisgICAgICAgICAgICBzdWNjZWVkPTAKKyAgICAgICAgICAgIGZhaWw9ZmFpbCsxCisgICAgICAgICAgICBleGl0CisgICAgICAgICBlbmQgaWYKKyAgICAgICAgIGlmKGNyb3NzX3Rlc3RfZnVuYygpLmVxLjApIHRoZW4KKyEgICAgICAgICAgICBwcmludCAqLCBjcm9zc2ZhaWwKKyAgICAgICAgICAgIGNyb3NzZmFpbD1jcm9zc2ZhaWwrMS4wIAorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRkbworICAgICAgCisgICAgICBpZiAoZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgIGZhaWxlZD1mYWlsZWQrMQorICAgICAgZWxzZQorICAgICAgICAgaWYoY3Jvc3NmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgICAgY3Jvc3NjaGVja2VkPWNyb3NzY2hlY2tlZCsxCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGlmCisgICAgICBjYWxsIHByaW50X3Jlc3VsdChzdWNjZWVkLGNyb3NzZmFpbCxOLG5hbWUpCisgICAgICBlbmQKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2NvbGxhcHNlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxNzI1MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBjb2xsYXBzZSBjbGF1c2UuIEJpbmQgd2l0aCB0d28gbG9vcHMuIFdpdGhvdXQgdGhlIGNvbGxhcHNlIGNsYXVzZSwgdGhlIGZpcnN0IGxvb3Agd2lsbCBub3QgYmUgb3JkZXJlZDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gY29sbGFwc2U8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGRvIHNjaGVkdWxlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gY2hlY2tfaXNfbGFyZ2VyKGkpCisgICAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgICAgSU5URUdFUiA6OiBpCisgICAgICAgIElOVEVHRVIsIHNhdmUgOjogbGFzdF9pCisgICAgICAgIExPR0lDQUwgOjogaXNfbGFyZ2VyCisKKyAgICAgICAgaWYgKGkgLmVxLiAxKSBsYXN0X2kgPSAwCisKKyAgICAgICAgaXNfbGFyZ2VyID0gKGkgLmdlLiBsYXN0X2kpIC5hbmQuICgoaS1sYXN0X2kpIC5sZS4gMSkKKyAgICAgICAgbGFzdF9pID0gaQorCisgICAgICAgIGNoZWNrX2lzX2xhcmdlciA9IGlzX2xhcmdlcgorCisgICAgICBFTkQgRlVOQ1RJT04gY2hlY2tfaXNfbGFyZ2VyCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19jb2xsYXBzZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBpLCBqCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIExPR0lDQUwgY2hlY2tfaXNfbGFyZ2VyCisgICAgICAgIExPR0lDQUwgbXlfaXNfbGFyZ2VyCisgICAgICAgIExPR0lDQUwgaXNfbGFyZ2VyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGlzX2xhcmdlcgorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgaXNfbGFyZ2VyID0gLnRydWUuCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlfaXNfbGFyZ2VyKQorPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgbXlfaXNfbGFyZ2VyID0gLnRydWUuCishJG9tcCBkbyBwcml2YXRlKGksaikgc2NoZWR1bGUoc3RhdGljLDEpIDxvbXB0czpjaGVjaz5jb2xsYXBzZSgyKTwvb21wdHM6Y2hlY2s+CishJG9tcCsgICBvcmRlcmVkCisgICAgICAgIERPIGk9MSwxMDAKKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgICAgICBteV9pc19sYXJnZXIgPSBjaGVja19pc19sYXJnZXIoaSkgLmFuZC4gbXlfaXNfbGFyZ2VyCisgICAgICAgICAgPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgIERPIGo9MSwwMAorICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKyAgICAgICAgICAgIG15X2lzX2xhcmdlciA9IGNoZWNrX2lzX2xhcmdlcihpKSAuYW5kLiBteV9pc19sYXJnZXIKKyEkb21wIGVuZCBvcmRlcmVkCisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBFTkQgRE8KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIGlzX2xhcmdlciA9IGlzX2xhcmdlciAuYW5kLiBteV9pc19sYXJnZXIKKyEkb21wIGVuZCBjcml0aWNhbAorPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgaWYgKGlzX2xhcmdlcikgdGhlbgorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgZWxzZQorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgZW5kIGlmCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fZmlyc3Rwcml2YXRlLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5MjM2MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDU2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBkbyBmaXJzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGRvIGZpcnN0cHJpdmF0ZS4gRmlyc3QgaXQgc3RvcmVzIHRoZSByZXN1bHQgb2YgaXRzIGxhc3QgaXRlcmF0aW9uIGluIHZhcmlhYmxlICgyKS4gVGhlbiBpdCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAoMikgaW4gaXRzIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZSAoMSkuIEF0IHRoZSBlbmQgYWxsIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZXMgKDEpIGFyZSBhZGRlZCB0byBhIHRvdGFsIHN1bSBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIGNvbXBhcmVkIHdpdGggdGhlIGNvcnJlY3QgcmVzdWx0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHByaXZhdGUsIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgbnVtdGhyZWFkcworICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0wLCBzdW0xLCBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bTAsIHN1bTEsIGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgIAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgIAorICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTAgPSAxMjM0NQorICAgICAgICBzdW0xID0gMAorICAKKyAgCishJG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoc3VtMSkKKyEkb21wIHNpbmdsZQorICAgICAgICBudW10aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpCishJG9tcCBlbmQgc2luZ2xlCisKKworPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUgKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgc3VtMSA9IHN1bTAKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorCisKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIFdSSVRFICgxLCopIHN1bTAKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMQorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKworCisgICAgICAgIGtub3duX3N1bT0xMjM0NSpudW10aHJlYWRzKyAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIFdSSVRFICgxLCopICJGb3VuZCBzdW0gd2FzIiwgc3VtLCAiaW5zdGVhZCBvZiIsIGtub3duX3N1bQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2xhc3Rwcml2YXRlLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fbGFzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjAyZTUwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2xhc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwzOSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gbGFzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgc2F2ZXMgdGhlIG5leHQgc3VtbWFuZCBpbiBhIGxhc3Rwcml2YXRlIHZhcmlhYmxlIGkwLiBBdCB0aGUgZW5kIGkwIGlzIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgbGFzdCBzdW1tYW5kLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUsIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLGtub3duX3N1bQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bTAsaTAsaQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0wLGkwLGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCishJG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoc3VtMCkKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworPG9tcHRzOmNoZWNrPiEkb21wIGVuZCBkbzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiBMT09QQ09VTlQgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX29yZGVyZWQuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19vcmRlcmVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4N2Y4MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19vcmRlcmVkLmYKQEAgLTAsMCArMSw3MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGlyZWN0aXZlPmRvIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXJhbGxlbCBwcml2YXRlLCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIGlfaXNsYXJnZXIoaSkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGksIGlzbGFyZ2VyCisgICAgICAgIElOVEVHRVIgbGFzdF9pCisgICAgICAgIENPTU1PTiAvbXljb20vIGxhc3RfaQorICAgICAgICBJRiAoIGkgLkdULiBsYXN0X2kpIFRIRU4KKyAgICAgICAgICBpc2xhcmdlciA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIGlzbGFyZ2VyID0gMAorICAgICAgICBFTkQgSWYKKyAgICAgICAgbGFzdF9pID0gaQorICAgICAgICBpX2lzbGFyZ2VyID0gaXNsYXJnZXIKKyAgICAgIEVORAorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0sIGlzX2xhcmdlcgorICAgICAgICBJTlRFR0VSIGxhc3RfaQorICAgICAgICBJTlRFR0VSIGlfaXNsYXJnZXIKKyAgICAgICAgQ09NTU9OIC9teWNvbS8gbGFzdF9pCisKKzxvbXB0czpvcnBoYW46cGFybXM+IGkgPC9vbXB0czpvcnBoYW46cGFybXM+CisKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sIGksIG15X2lzbGFyZ2VyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG15X2lzbGFyZ2VyLCBzdW0KKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gMAorICAgICAgICBpc19sYXJnZXIgPSAxCisgICAgICAgIGxhc3RfaSA9IDAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlfaXNsYXJnZXIpCisgICAgICAgIG15X2lzbGFyZ2VyID0gMQorISRvbXAgZG8gc2NoZWR1bGUoc3RhdGljLDEpIG9yZGVyZWQKKyAgICAgICAgRE8gaT0xLCA5OQorPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgSUYgKGlfaXNsYXJnZXIoaSkgLkVRLiAxIC5BTkQuIG15X2lzbGFyZ2VyIC5FUS4gMSkgVEhFTgorICAgICAgICAgICAgbXlfaXNsYXJnZXIgPSAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgbXlfaXNsYXJnZXIgPSAwCisgICAgICAgICAgRU5EIElGCisgICAgICAgICAgc3VtID0gc3VtICsgaQorPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIG9yZGVyZWQKKzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIElGIChpc19sYXJnZXIgLkVRLiAxIC5BTkQuIG15X2lzbGFyZ2VyIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICBpc19sYXJnZXIgPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBpc19sYXJnZXIgPSAwCisgICAgICAgIEVORCBJRgorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAga25vd25fc3VtID0gKDk5KjEwMCkvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSAuQU5ELiBpc19sYXJnZXIgLkVRLiAxKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3ByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1ODdjZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19wcml2YXRlLmYKQEAgLTAsMCArMSw2NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gcHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBoYXMgYSBwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGZvciBwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIHRoaXMgdGhyZWFkIHdhaXRzIHNvbWUgdGltZSBiZWZvcmUgaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpdGVyYXRpb24gdGhlIHZhbHVlIG9mICgxKSBpcyBhc3NpZ25lZCB0byAoMikuIEF0IHRoZSBlbmQgYWxsIHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSwgb21wIGZsdXNoLCBvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgU1VCUk9VVElORSBkb19zb21lX3dvcmsoKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRSSU5TSUMgc3FydAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN1bQorCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtPTAuMAorICAgICAgICBETyBpPTAsIExPT1BDT1VOVC0xCisgICAgICAgICAgc3VtID0gc3VtICsgc3FydChSRUFMKGkpKQorICAgICAgICBFTkRETworCisgICAgICBFTkQKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0wLCBzdW0xLCBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bTAsIHN1bTEsIGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+ICAgICAgICAKKworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgc3VtICA9IDAKKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgc3VtMSA9IDAKKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShzdW0xKQorICAgICAgICBzdW0wID0gMAorICAgICAgICBzdW0xID0gMAorCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0wID0gc3VtMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBDQUxMIGRvX3NvbWVfd29yaygpCishJG9tcCBmbHVzaAorISAgICAgICAgICBwcmludCAqLCBzdW0wCisgICAgICAgICAgc3VtMSA9IHN1bTAKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0xCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMgorISAgICAgICAgcHJpbnQgKiwgInN1bToiLCBzdW0sICJrbm93bl9zdW0iLCBrbm93bl9zdW0KKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0pIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcmVkdWN0aW9uLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcmVkdWN0aW9uLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyNWE0NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19yZWR1Y3Rpb24uZgpAQCAtMCwwICsxLDUxNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aWNoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0yLCBrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiBrbm93bl9wcm9kdWN0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRwdAorICAgICAgICBJTlRFR0VSIGRvdWJsZV9ESUdJVFMKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBka25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgUEFSQU1FVEVSIChrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtLGRpZmYscHJvZHVjdCxpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZHN1bSxkZGlmZixkdAorICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIExPR0lDQUwgbG9naWNzKExPT1BDT1VOVCkKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0scHJvZHVjdCxkaWZmLGksZHN1bSxkZGlmZixkdCxsb2dpY19hbmQsCisgICAgICYgICAgbG9naWNfb3IsbG9naWNfZXF2LGxvZ2ljX25lcXYsbG9naWNzLGJpdF9hbmQsYml0X29yLGludF9hcnJheSwKKyAgICAgJiAgICBleGNsdXNpdl9iaXRfb3IsbWluX3ZhbHVlLGRtaW4sZG1heCxkX2FycmF5LG1heF92YWx1ZQorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgUEFSQU1FVEVSIChkb3VibGVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGR0ID0gMS4vMy4KKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisgICAgICAgIHByb2R1Y3QgPSAxCisgICAgICAgIHN1bTIgPSAwCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIHJlc3VsdCA9MCAKKyAgICAgICAgbG9naWNfYW5kID0gLnRydWUuCisgICAgICAgIGxvZ2ljX29yID0gLmZhbHNlLgorICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiAoLTogZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgc3VtLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGZvciBkb3VibGVzCisgICAgICAgIGRzdW0gPTAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgCisgICAgICAgIElGKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgICBBQlMoZHN1bSAtIGRrbm93bl9zdW0pIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERpZmZlcmVuY2U6ICIsCisgICAgICYgICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKworICAgICAgCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRkaWZmID0gKCAxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCwgRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgZGRpZmYgPSBkZGlmZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZGRpZmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxNQVhfRkFDVE9SCisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICguTk9ULiBsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX29yKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigubmVxdi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMQorICAgICAgICBFTkQgRE8KKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLkxULiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgYml0X2FuZCA9IElBTkQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJT1I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLmdlLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOm1pbl92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtYXhfdmFsdWUgPSAtMzI3NjgKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBkb3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46ZG1pbik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOmRtYXgpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgZG1heD0gTUFYKGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZG1heCAuTFQuIExPT1BDT1VOVCpkdCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9keW5hbWljLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZHluYW1pYy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjhiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZHluYW1pYy5mCkBAIC0wLDAgKzEsOTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZHluYW1pYyBvcHRpb24gb2YgdGhlIG9tcCBkbyBzY2hlZHVsZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyBzY2hlZHVsZShkeW5hbWljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZG8gbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKworCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fc2NoZWR1bGVfZHluYW1pYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgQ0hBUkFDVEVSKjMwIGxvZ2ZpbGUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0sb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBJTlRFR0VSIHRocmVhZHMKKyAgICAgICAgSU5URUdFUiBjb3VudCwgdG1wX2NvdW50CisgICAgICAgIElOVEVHRVIsQUxMT0NBVEFCTEU6OiB0bXAoOikKKyAgICAgICAgSU5URUdFUiBpaQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgQ0ZETUFYX1NJWkUKKyAgICAgICAgUEFSQU1FVEVSIChDRkRNQVhfU0laRSA9IDEwMDApCisgICAgICAgIElOVEVHRVIgaSx0aWRzKDA6Q0ZETUFYX1NJWkUtMSksdGlkLGNodW5rX3NpemUKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaSx0aWRzLHRpZCxjaHVua19zaXplCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNodW5rX3NpemUgPSA3CisgICAgICAgIGNvdW50ID0gMAorICAgICAgICB0bXBfY291bnQgPSAwCisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgaWkgPSAwCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUodGlkKQorICAgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIDxvbXB0czpjaGVjaz5zY2hlZHVsZShkeW5hbWljLGNodW5rX3NpemUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0wLCBDRkRNQVhfU0laRS0xCisgICAgICAgICAgdGlkcyhpKSA9IHRpZAorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBETyBpPTAsIENGRE1BWF9TSVpFIC0gMgorICAgICAgICAgIElGICggdGlkcyhpKSAubmUuIHRpZHMoaSsxKSApIFRIRU4KKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworIAorICAgICAgICBBTExPQ0FURSggdG1wKDA6Y291bnQpICkKKyAgICAgICAgdG1wKDApID0gMQorIAorICAgICAgICBETyBpID0gMCwgQ0ZETUFYX1NJWkUgLSAyCisgICAgICAgICAgSUYgKCB0bXBfY291bnQgLkdULiBjb3VudCApIFRIRU4KKyAgICAgICAgICAgIFdSSVRFKCosKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgV1JJVEUoKiwqKSAiVGVzdGludGVybmFsIEVycm9yOiBMaXN0IHRvbyBzbWFsbCEhISIKKyAgICAgICAgICAgIFdSSVRFKCosKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgR09UTyAxMAorICAgICAgICAgIEVORCBJZgorICAgICAgICAgIElGICggdGlkcyhpKSAuTkUuIHRpZHMoaSsxKSApIHRoZW4KKyAgICAgICAgICAgIHRtcF9jb3VudCA9IHRtcF9jb3VudCArIDEKKyAgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gdG1wKHRtcF9jb3VudCkgKzEKKyAgICAgICAgICBFTkQgSUYgCisgICAgICAgIEVORCBETyAgICAgICAgICAKKworIS4uLiBpcyBkeW5hbWljIHN0YXRlbWVudCB3b3JraW5nPyAKKworIDEwICAgICBETyBpPTAsIGNvdW50IC0xCisgICAgICAgICAgSUYgKCBNT0QodG1wKGkpLGNodW5rX3NpemUpIC5uZS4gMCApIFRIRU4KKyEgLi4uIGl0IGlzIHBvc3NpYmxlIGZvciAyIGFkamFjZW50IGNodW5rcyBhc3NpZ25lZCB0byBhIHNhbWUgdGhyZWFkIAorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICAgV1JJVEUoMSwqKSAiVGhlIGludGVybWVkaWF0ZSBkaXNwYXRjaCBoYXMgd3JvbmcgY2h1bmtzaXplLiIKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgSUYgKCBNT0QodG1wKGNvdW50KSwgY2h1bmtfc2l6ZSkgLk5FLiAKKyAgICAgJiAgICAgTU9EIChDRkRNQVhfU0laRSwgY2h1bmtfc2l6ZSkgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgInRoZSBsYXN0IGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuIgorICAgICAgICBFTkQgSUYKKyAgICAgICAgIAorICAgICAgICBJRiAoIHJlc3VsdCAuZXEuIDApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZ3VpZGVkLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZ3VpZGVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwZTdlZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9ndWlkZWQuZgpAQCAtMCwwICsxLDE3NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBndWlkZWQgb3B0aW9uIG9mIHRoZSBvbXAgZG8gc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gc2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZG8gbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgISBUT0RPOgorICAhIEMuIE5pZXRoYW1tZXI6CisgICEgICAgICAgRmluZCBjaGVjayB0byBkZWNpZGUgaWYgdGhlIHRlc3Qgd2FzIHJ1biBhcyBzY2hlZHVsZShzdGF0aWMpIGJlY2F1c2UKKyAgISAgICAgICB0aGlzIGFsc28gY2FuIHBhc3MgdGhlIHRlc3QgaWYgdGhlIHdvcmsgaXMgZGl2aWRlZCBpbnRvIHRocmVhZC1jb3VudHMgCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fc2NoZWR1bGVfZ3VpZGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bSxvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIENIQVJBQ1RFUioyMCBsb2dmaWxlCisgICAgICAgIElOVEVHRVIgdGhyZWFkcworICAgICAgICBJTlRFR0VSIHRtcF9jb3VudAorICAgICAgICBJTlRFR0VSLCBhbGxvY2F0YWJsZSA6OiB0bXAoOikKKyAgICAgICAgSU5URUdFUiBpaSwgZmxhZworICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTlRFR0VSIGV4cGVjdGVkCisgICAgICAgIElOVEVHRVIgb3BlbndvcmsKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBjCisKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRFR0VSIHRpZAorICAgICAgICBJTlRFR0VSIGNvdW50CisKKyAgICAgICAgSU5URUdFUiBERUxBWSAKKyAgICAgICAgSU5URUdFUiBNQVhfVElNRQorICAgICAgICBJTlRFR0VSIENGU01BWF9TSVpFCisKKyEgLi4uIGNob29zZSBzbWFsbCBpdGVyYXRpb24gc3BhY2UgZm9yIHNtYWxsIHN5bmMuIG92ZXJoZWFkCisgICAgICAgIFBBUkFNRVRFUiAoREVMQVkgPSAxKQorICAgICAgICBQQVJBTUVURVIgKE1BWF9USU1FID0gNSkKKyAgICAgICAgUEFSQU1FVEVSIChDRlNNQVhfU0laRSA9IDE1MCkKKworICAgICAgICBJTlRFR0VSIG5vdG91dAorICAgICAgICBJTlRFR0VSIG1heGl0ZXIKKyAgICAgICAgSU5URUdFUiB0aWRzKDA6Q0ZTTUFYX1NJWkUtMSkKKworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBub3RvdXQsbWF4aXRlcix0aWRzCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIG5vdG91dCA9IDEKKyAgICAgICAgbWF4aXRlciA9IDAKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHRtcF9jb3VudCA9IDAKKyAgICAgICAgb3BlbndvcmsgPSBDRlNNQVhfU0laRQorPG9tcHRzOmNoZWNrPgorCishIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB0aHJlYWRzCishJG9tcCBwYXJhbGxlbCAKKyEkb21wIHNpbmdsZQorICAgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKCB0aHJlYWRzIC5MVC4gMikgVEhFTgorICAgICAgICAgIFBSSU5UICosIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiCisgICAgICAgICAgV1JJVEUoMSwqKSAiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICAgIFNUT1AKKyAgICAgICAgRU5EIElGCisKKyEgLi4uIE5vdyB0aGUgcmVhbCBwYXJhbGxlbCB3b3JrOgorISAuLi4gRWFjaCB0aHJlYWQgd2lsbCBzdGFydCBpbW1lZGlhdGVseSB3aXRoIHRoZSBmaXJzdCBjaHVuay4KKyAgICAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUodGlkLGNvdW50KSBzaGFyZWQodGlkcyxtYXhpdGVyKQorICAgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZ3VpZGVkKQorICAgICAgICBETyBpID0gMCAsIENGU01BWF9TSVpFLTEKKyAgICAgICAgICBjb3VudCA9IDAKKyEkb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICAgICAgSUYgKCBpIC5HVC4gbWF4aXRlciApIFRIRU4gICAgICAgICAgICAgICAgIAorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICAgIG1heGl0ZXIgPSBpCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBFTkQgSUYKKworIS4uICAgICAgICAgaWYgaXQgaXMgbm90IG91ciB0dXJuIHdlIHdhaXQKKyEgICAgICAgICAgIGEpIHVudGlsIGFub3RoZXIgdGhyZWFkIGV4ZWN1dGVkIGFuIGl0ZXJhdGlvbgorISAgICAgICAgICAgd2l0aCBhIGhpZ2hlciBpdGVyYXRpb24gY291bnQKKyEgICAgICAgICAgIGIpIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsb29wIChmaXJzdCB0aHJlYWQgZmluaXNoZWQKKyEgICAgICAgICAgICAgYW5kIHNldCBub3RvdXQ9MCBPUgorISAgICAgICAgICAgYykgdGltZW91dCBhcnJpdmVkIAorCishJG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgICAgICBJRiAoIG5vdG91dCAuR0UuIDEgLkFORC4gY291bnQgLkxULiBNQVhfVElNRQorICAgICAmICAgICAgICAgLkFORC4gbWF4aXRlciAuRVEuIGkgKSBUSEVOCisgICAgICAgICAgICAgIERPIFdISUxFICggbm90b3V0IC5HRS4gMSAuQU5ELiBjb3VudCAuTFQuIE1BWF9USU1FCisgICAgICYgICAgICAgICAgLkFORC4gbWF4aXRlciAuRVEuIGkgKQorICAgICAgICAgICAgICAgIENBTEwgc2xlZXAoREVMQVkpCisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIERFTEFZCisgICAgICAgICAgICAgIEVORCBETyAgICAgICAgIAorICAgICAgICAgIEVORCBJRgorICAgICAgICAgICB0aWRzKGkpID0gdGlkCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvIG5vd2FpdAorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKworICAgICAgICBub3RvdXQgPSAwCishJG9tcCBmbHVzaChub3RvdXQpCisKKyEkb21wIGVuZCBwYXJhbGxlbCAKKworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohCishIGV2YWx1YXRpb24gb2YgdGhlIHZhbHVlcworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohCisgICAgICAgIGNvdW50ID0gMAorCisgICAgICAgIERPIGk9MCwgQ0ZTTUFYX1NJWkUgLSAyCisgICAgICAgICAgSUYgKCB0aWRzKGkpIC5ORS4gdGlkcyhpKzEpICkgVEhFTgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgQUxMT0NBVEUoIHRtcCgwOmNvdW50KSAgKQorICAgICAgICB0bXBfY291bnQgPSAwCisgICAgICAgIHRtcCgwKSA9IDEKKyEgLi4uIGNhbGN1bGF0ZSB0aGUgY2h1bmtzaXplIGZvciBlYWNoIGRpc3BhdGNoCisKKyAgICAgICAgRE8gaT0wLCBDRlNNQVhfU0laRSAtIDIKKyAgICAgICAgICBJRiAoIHRpZHMoaSkgLkVRLiB0aWRzKGkrMSkgKSBUSEVOCisgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gdG1wKHRtcF9jb3VudCkgKyAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgdG1wX2NvdW50ID0gdG1wX2NvdW50ICsgMQorICAgICAgICAgICAgdG1wKHRtcF9jb3VudCkgPSAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworCishIC4uLiBDaGVjayBpZiBjaHVuayBzaXplcyBhcmUgZGVjcmVhc2VkIHVudGlsIGVxdWFscyB0byAKKyEgLi4uIHRoZSBzcGVjaWZpZWQgb25lLCBpZ25vcmUgdGhlIGxhc3QgZGlzcGF0Y2ggCishIC4uLiBmb3IgcG9zc2libGUgc21hbGxlciByZW1haW5kZXIKKworISBEZXRlcm1pbmUgdGhlIGNvbnN0YW50IAorICAgICAgICBleHBlY3RlZCA9IG9wZW53b3JrIC8gdGhyZWFkcworICAgICAgICBjID0gcmVhbCh0bXAoMCkpIC8gcmVhbChleHBlY3RlZCkKKyAgICAgICAgV1JJVEUoMSwqKSAiRm91bmQgY29uc3RhbnQgdG8gYmUgIiwgYworCisgICAgICAgIERPIGkgPSAwLCBjb3VudCAtIDIKKyAgICAgICAgICBXUklURSgxLCopICJvcGVuOiIsIG9wZW53b3JrLCAic2l6ZToiLCB0bXAoaSkKKyAgICAgICAgICBJRiAoZXhwZWN0ZWQgLkdULiAxKSBUSEVOCisgICAgICAgICAgICBleHBlY3RlZCA9IGMgKiBvcGVud29yayAvIHRocmVhZHMKKyAgICAgICAgICBFTkQgSUYKKworICAgICAgICAgIElGIChhYnModG1wKGkpIC0gZXhwZWN0ZWQpIC5HRS4gMiApIFRIRU4KKyAgICAgICAgICAgIHJlc3VsdCA9IDEKKyAgICAgICAgICAgIFdSSVRFKDEsKikgIkNodW5rc2l6ZSBkaWZmZXJlZCBmcm9tIGV4cGVjdGVkICIsCisgICAgICYgICAgICAgICAidmFsdWU6ICIsdG1wKGkpLCAiaW5zdGVhZCAiLCBleHBlY3RlZAorICAgICAgICAgIEVORCBJRgorCisgICAgICAgICAgSUYgKGkgLkdULiAwIC5BTkQuICh0bXAoaS0xKSAtIHRtcChpKSkgLkxULiAwKSBUSEVOCisgICAgICAgICAgICBXUklURSgxLCopICJDaHVua3NpemUgZGlkIG5vdCBkZWNyZWFzZTogIiwgdG1wKGkpLAorICAgICAmICAgICAgICAgImluc3RlYWQiLHRtcChpLTEpCisgICAgICAgICAgRU5EIElGCisKKyAgICAgICAgICBvcGVud29yayA9IG9wZW53b3JrIC0gdG1wKGkpICAKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMSAKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czpjaGVjaz4KKzxvbXB0czpjcm9zc2NoZWNrPgorICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgIEVORAorPC9vbXB0czpjcm9zc2NoZWNrPgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb210cHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9zdGF0aWMuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9zdGF0aWMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIwMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX3N0YXRpYy5mCkBAIC0wLDAgKzEsNzAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc3RhdGljIG9wdGlvbiBvZiB0aGUgb21wIGRvIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZG8gbm93YWl0LG9tcCBmbHVzaCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19zY2hlZHVsZV9zdGF0aWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtLG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgQ0hBUkFDVEVSKjMwIGxvZ2ZpbGUKKyAgICAgICAgSU5URUdFUiB0aHJlYWRzCisgICAgICAgIElOVEVHRVIgY291bnQKKyAgICAgICAgSU5URUdFUiBpaQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIENGU01BWF9TSVpFCisgICAgICAgIFBBUkFNRVRFUiAoQ0ZTTUFYX1NJWkUgPSAxMDAwKQorICAgICAgICBJTlRFR0VSIGksdGlkcygwOkNGU01BWF9TSVpFLTEpLCB0aWQsIGNodW5rX3NpemUKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaSx0aWQsdGlkcyxjaHVua19zaXplCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNodW5rX3NpemUgPSA3CisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgaWkgPSAwCisKKyEkb21wIHBhcmFsbGVsIAorISRvbXAgc2luZ2xlCisgICAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggdGhyZWFkcyAuTFQuIDIpIFRIRU4KKyAgICAgICAgICBQUklOVCAqLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIgorICAgICAgICAgIFdSSVRFKDEsKikgIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgICBTVE9QCisgICAgICAgIEVMU0UKKyAgICAgICAgICBXUklURSgxLCopICJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAiLENGU01BWF9TSVpFCisgICAgICAgICAgV1JJVEUoMSwqKSAiVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICIsY2h1bmtfc2l6ZQorICAgIAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpIHNoYXJlZCh0aWRzKQorICAgICAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgRE8gaSA9IDAgLENGU01BWF9TSVpFIC0xCisgICAgICAgICAgICB0aWRzKGkpID0gdGlkCisgICAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgICBETyBpID0gMCwgQ0ZTTUFYX1NJWkUtMQorIS4uLiByb3VuZC1yb2JpbiBmb3Igc3RhdGljIGNodW5rCisgICAgICAgICAgICBpaSA9IG1vZCggaS9jaHVua19zaXplLHRocmVhZHMpCisgICAgICAgICAgICBJRiAodGlkcyhpKSAuTkUuIGlpICkgVEhFTgorICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgICAgIFdSSVRFKDEsKikiSXRlcmF0aW9uICIsaSwic2hvdWxkIGJlIGFzc2lnbmVkIHRvICIsCisgICAgICYgICAgICAgICAgIGlpLCJpbnN0ZWFkIG9mICIsdGlkcyhpKQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIERPCisgICAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwIClUSEVOCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2hhc19vcGVubXAuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9oYXNfb3Blbm1wLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4NWVmMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9oYXNfb3Blbm1wLmYKQEAgLTAsMCArMSwyNSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dmVyc2lvbj4yLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3RpbmcgaWYgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGlzIHN1cHBvcnRlZCBvciBub3QuICAKK1lpIFdlbiBhdCAwNTAzMjAwNDogRG8gd2Ugd2FudCB0byB3cml0ZSB0d28gdmVyc2lvbnMgb2YgaGFzX29tcD8gIGJvdGggQzIzNDU2Nzg5IAorYW5kICNpZmRlZiBmb3JtYXRzIGFyZSBzdXBwb3NlZCB0byB3b3JrLiBBdCBsZWFzdCBTdW4ncyBjb21waWxlciBjYW5ub3QgZGVhbCB3aXRoIAordGhlIHNlY29uZCBmb3JtYXQgKCNpZmRlZik8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKworPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmhhc19vcGVubXA8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCis8b21wdHM6Y2hlY2s+CishdmVyc2lvbiAxLgorIUMyMzQ1Njc4OSAKKyEkICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorCishIHZlcnNpb24gMi4KKyEjaWZkZWYgX09QRU5NUAorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorISNlbmRpZgorPC9vbXB0czpjaGVjaz4KKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9hdG9taWMuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYXRvbWljLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3NDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYXRvbWljLmYKQEAgLTAsMCArMSw1ODggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGF0b21pYyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGggYW4gYXRvbWljIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGF0b21pYzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIEZ1bmN0aW9uczogb21wX2F0b21pYworISBjaGFuZ2UgImNoYXJhY3RlcioyMCIgaW50byAiY2hhcmFjdGVyIChMRU49MjApOjoiCishIGdldCByaWQgb2YgdGhlICJ0YWIiIGtleSBieSBaaGVueWluZyBMaXUsIG9uIE9jdC4gMTYsIDIwMDUuCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYXRvbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIElOVEVHRVIgc3VtMiwga25vd25fc3VtCisgICAgICAgIElOVEVHRVIga25vd25fcHJvZHVjdCwgaW50X2NvbnN0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRwdAorICAgICAgICBJTlRFR0VSIGRvdWJsZV9ESUdJVFMKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBka25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtMikKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0saSxkaWZmLHByb2R1Y3QKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGR0LGRkaWZmCisgICAgICAgIExPR0lDQUwgbG9naWNfYW5kLCBsb2dpY19vciwgbG9naWNfZXF2LGxvZ2ljX25lcXYKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRtaW4sIGRtYXgKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSxwcm9kdWN0LGRpZmYsaSxkc3VtLGRkaWZmLGR0LGxvZ2ljX2FuZCwKKyAgICAgJiAgICBsb2dpY19vcixsb2dpY19lcXYsbG9naWNfbmVxdixsb2dpY3MsYml0X2FuZCxiaXRfb3IsaW50X2FycmF5LAorICAgICAmICAgIGV4Y2x1c2l2X2JpdF9vcixtaW5fdmFsdWUsZG1pbixkbWF4LGRfYXJyYXksbWF4X3ZhbHVlCisgICAgICAgIElOVEVHRVIgTUFYX0ZBQ1RPUgorICAgICAgICBQQVJBTUVURVIgKGRvdWJsZV9ESUdJVFM9MjAsTUFYX0ZBQ1RPUj0xMCkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSWYKKworICAgICAgICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgZGlmZiwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBmb3IgZG91YmxlcworICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgZHB0ID0gMQorCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgIGRwdD0gZHB0ICogZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KQorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0wLERPVUJMRV9ESUdJVFMtMQorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgCisgICAgICAgIElGIChkc3VtIC5ORS4gZGtub3duX3N1bSAuQU5ELiAKKyAgICAgJiAgICAgQUJTKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERpZmZlcmVuY2U6ICIsCisgICAgICYgICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKyAgICAgIAorICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRkaWZmID0gKCAxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTAsIERPVUJMRV9ESUdJVFMtMQorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIEFCUyhkZGlmZikgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRkaWZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxNQVhfRkFDVE9SCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19vcikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX29yID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX29yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgRVFWLCB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX25lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLkxULiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElmCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGKCBiaXRfYW5kIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGJpdF9vciA9IElvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLmxlLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEwIC0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtaW5fdmFsdWUgPSA2NTUzNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBtaW5fdmFsdWUgPSBtaW4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBtYXhfdmFsdWUgPSBtYXgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWF4X3ZhbHVlIC5MVC4gTE9PUENPVU5UIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUFYIgorICAgICAgICBFTkQgSUYKKworIS4uLiB0ZXN0IGRvdWJsZSBtaW4sIG1heAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWF4IC5MVC4gTE9PUENPVU5UKmR0IClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PSAgMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYmFycmllci5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9iYXJyaWVyLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyNTk5NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYmFycmllci5mCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGJhcnJpZXIgZGlyZWN0aXZlLiBUaGUgdGVzdCAgICBjcmVhdGVzIHNldmVyYWwgdGhyZWFkcyBhbmQgc2VuZHMgb25lIG9mIHRoZW0gc2xlZXBpbmcgYmVmb3JlIHNldHRpbmcgYSBmbGFnLiAgQWZ0ZXIgdGhlIGJhcnJpZXIgdGhlIG90aGVyIG9uZXMgZG8gc29tZSBsaXR0bGUgd29yayBkZXBlbmRpbmcgb24gdGhlIGZsYWcuPC8gICBvbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBiYXJyaWVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisKKyAgICAgIFNVQlJPVVRJTkUgZG9fc29tZV93b3JrMygpCisgICAgICAgIFJFQUwgaQorICAgICAgICBJTlRSSU5TSUMgc3FydAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN1bQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAuMAorICAgICAgICBETyBXSElMRSAoaSA8IExPT1BDT1VOVC0xKQorICAgICAgICAgIHN1bSA9IHN1bSArIHNxcnQoaSkKKyAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgRU5EIERPCisgICAgICBFTkQKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9iYXJyaWVyPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHNsZWVwdGltZQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIHJlc3VsdDIsIHJhbmsKKyAgICAgICAgcmVzdWx0MSA9IDAKKyAgICAgICAgcmVzdWx0MiA9IDAKKyAgICAgICAgc2xlZXB0aW1lID0gMQorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyEgICAgICAgIFBSSU5UICosICJyYW5rIiwgcmFuaworICAgICAgICBJRiAoIHJhbmsgLkVRLiAxICkgVEhFTgorICAgICAgICAgIENBTEwgc2xlZXAoc2xlZXB0aW1lKQorICAgICAgICAgIHJlc3VsdDIgPSAzCisgICAgICAgIEVORCBJRgorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBiYXJyaWVyCisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBJRiAoIHJhbmsgLkVRLiAwICkgVEhFTgorICAgICAgICAgIHJlc3VsdDEgPSByZXN1bHQyCisgICAgICAgIEVORCBJRgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGICggcmVzdWx0MSAuRVEuIDMgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2NvcHlpbi5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jb3B5aW4uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTRmMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jb3B5aW4uZgpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBjb3B5aW4gZGlyZWN0aXZlLjwvICAgb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgY29weWluPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyEgQ2hhbmdlbG9nOgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9jb3B5aW48L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyEgICAgICAgIElOVEVHRVIsIFNBVkU6OnN1bTEgCishICAgICAgICBpbXBsaWNpdGx5IGJ5IG9tcF90aHJlYWRwcml2YXRlLCBzZWUgc3BlYzI1IENoYXAuIDIuOC4yCisgICAgICAgIElOVEVHRVIgc3VtMQorICAgICAgICBDT01NT04gL2NzdW0xLyBzdW0xCisgICAgICAgIElOVEVHRVIgc3VtLCBpLCB0aHJlYWRzCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSwgaSwgdGhyZWFkcworISAgIEMuIE5pZXRoYW1tZXIgMzAuMTEuMDY6IG1vdmVkIHRocmVhZHByaXZhdGUgc3RhdGVtZW50IGludG8gdGhlIG9ycGhhbmVkCishICAgICAgZnVuY3Rpb24KKyEkb21wIHRocmVhZHByaXZhdGUoL2NzdW0xLykKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTEgPSA3CisgICAgICAgIHRocmVhZHMgPSAwCisJCTxvbXB0czpvcnBoYW4+CishJG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+Y29weWluKHN1bTEpPC9vbXB0czpjaGVjaz4KKyEgICAgICAgIHByaW50ICosInN1bTEiLHN1bTEKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSwgOTk5CisgICAgICAgICAgc3VtMSA9IHN1bTEgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMQorICAgICAgICB0aHJlYWRzID0gdGhyZWFkcyArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisJCTwvb21wdHM6b3JwaGFuPgorICAgICAgICBrbm93bl9zdW0gPSA5OTkqMTAwMC8yICsgNyp0aHJlYWRzCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jcml0aWNhbC5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jcml0aWNhbC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MmRkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2NyaXRpY2FsLmYKQEAgLTAsMCArMSw1OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgY3JpdGljYWwgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgcmVnaW9uIHdpdGhpbiBhIGNyaXRpY2FsIHNlY3Rpb24uCisKKzwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgY3JpdGljYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfY3JpdGljYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpLGosbXlpLG15aiwgc3VtCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSwgbXlpLCBteWoKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgc3VtID0gMAorICAgICAgICBteWkgPSAwCisgICAgICAgIG15aiA9IDUwMAorISRvbXAgcGFyYWxsZWwKKyEkb21wIHNlY3Rpb25zCisKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDAgLCA0OTkKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgc3VtID0gc3VtICsgbXlpCisgICAgICAgICAgIG15aSA9IG15aSArIDEKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBqID0gNTAwICwgOTk5CisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIHN1bSA9IHN1bSArIG15agorICAgICAgICAgICBteWogPSBteWogKyAxCisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgc2VjdGlvbnMKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSA5OTkqMTAwMC8yCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBXUklURSAoMSwqKSAiRm91bmQgc3VtIHdhcyIsIHN1bSwgImluc3RlYWQiLCBrbm93bl9zdW0KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZmx1c2guZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZmx1c2guZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGRhZjUwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9mbHVzaC5mCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZsdXNoIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZsdXNoPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGJhcnJpZXI8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2ZsdXNoPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIGR1bW15LCByYW5rCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByZXN1bHQyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHJlc3VsdDIKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgcmVzdWx0MT0wCisgICAgICAgIHJlc3VsdDI9MAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyEkb21wIGJhcnJpZXIKKyAgICAgICAgSUYgKCByYW5rIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQyID0gMworICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZmx1c2gocmVzdWx0MikKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgIGR1bW15ID0gcmVzdWx0MgorICAgICAgICBFTkQgSUYKKyAgICAgICAgSUYgKCByYW5rIC5FUS4gMCApIFRIRU4KKyAgICAgICAgICBjYWxsIHNsZWVwKDEpCisgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBmbHVzaChyZXN1bHQyKQorICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgcmVzdWx0MSA9IHJlc3VsdDIKKyAgICAgICAgRU5EIElGCishJG9tcCBlbmQgcGFyYWxsZWwKKworISAgICAgICAgUFJJTlQgKiwiMToiLCByZXN1bHQxLCAiMjoiLCByZXN1bHQyLCAiZHVtbXkiLCBkdW1teQorICAgICAgICBJRiAoIChyZXN1bHQxIC5FUS4gcmVzdWx0MikgLkFORC4gKHJlc3VsdDIgLkVRLiBkdW1teSkgLkFORC4KKyAgICAgJiAgICAgICAocmVzdWx0MiAuRVEuIDMpICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfbnVtX3RocmVhZHMuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X251bV90aHJlYWRzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3YWQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X251bV90aHJlYWRzLmYKQEAgLTAsMCArMSwzNyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgcmV0dXJucyB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGhyZWFkcy4gVGhlcmVmb3IgaXQgY291bnRzIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgc2VjdGlvbiBhbmQgY29tcGFycyB0aGlzIHZhbHVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb21wX2dldF9udW1fdGhyZWFkcyBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxzb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElOVEVHRVIgbnRocmVhZHMKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBudGhyZWFkc19saWIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnRocmVhZHNfbGliCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIG50aHJlYWRzPTAKKyAgICAgICAgbnRocmVhZHNfbGliPS0xCisKKyEkb21wIHBhcmFsbGVsCishc2hhcmVkKG50aHJlYWRzLG50aHJlYWRzX2xpYikKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNpbmdsZQorCQk8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CisgICAgICAgIG50aHJlYWRzX2xpYj1vbXBfZ2V0X251bV90aHJlYWRzKCkKKwkJPC9vbXB0czpjaGVjaz4KKwkJPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKG50aHJlYWRzIC5FUS4gbnRocmVhZHNfbGliKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfd3RpY2tzLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF93dGlja3MuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjJkMDNkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfd3RpY2tzLmYKQEAgLTAsMCArMSwyOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfZ2V0X3d0aWNrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X3d0aWNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF93dGlja3M8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gdGljaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyB0aWNrCisgICAgICAgIGluY2x1ZGUgIm9tcF9saWIuaCIKKzwvb21wdHM6b3JwaGFuOnZhcnM+CishICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgdGljayA9IDEKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPgorICAgICAgICB0aWNrPW9tcF9nZXRfd3RpY0soKQorPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgV1JJVEUoMSwqKSAid29yayB0b29rIix0aWNrLCJzZWMuIHRpbWUuIgorICAgICAgICBJRih0aWNrIC5HVC4gMC4gLkFORC4gdGljayAuTFQuIDAuMDEpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfaW5fcGFyYWxsZWwuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfaW5fcGFyYWxsZWwuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVkZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9pbl9wYXJhbGxlbC5mCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IG9tcF9pbl9wYXJhbGxlbCByZXR1cm5zIGZhbHNlIHdoZW4gY2FsbGVkIGZyb20gYSBzZXJpYWwgcmVnaW9uIGFuZCB0cnVlIHdoZW4gY2FsbGVkIHdpdGhpbiBhIHBhcmFsbGVsIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2luX3BhcmFsbGVsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2luX3BhcmFsbGVsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyEgICBjaGVja3MgdGhhdCBmYWxzZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24KKyEgICBhbmQgdHJ1ZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCB3aXRoaW4gcGFyYWxsZWwgcmVnaW9uCisgICAgICAgIExPR0lDQUwgb21wX2luX3BhcmFsbGVsCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyEgICAgICAgIExPR0lDQUwgb21wX2luX3BhcmFsbGVsCisgICAgICAgIExPR0lDQUwgc2VyaWFsLCBwYXJhbGxlbAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzZXJpYWwsIHBhcmFsbGVsCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIHNlcmlhbD0uVFJVRS4KKyAgICAgICAgcGFyYWxsZWw9LkZBTFNFLgorCisJCTxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgc2VyaWFsPW9tcF9pbl9wYXJhbGxlbCgpCisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorCishJG9tcCBwYXJhbGxlbAorISRvbXAgc2luZ2xlCisJCTxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgcGFyYWxsZWw9b21wX2luX3BhcmFsbGVsKCk7CisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAoLk5PVC4gc2VyaWFsKSAuQU5ELiAocGFyYWxsZWwpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9sb2NrLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2xvY2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAyNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9sb2NrLmYKQEAgLTAsMCArMSw1OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X2xvY2sgIGFuZCB0aGUgb21wX3Vuc2V0X2xvY2sgZnVuY3Rpb24gYnkgY291bnRpbmcgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdpdGggbG9ja3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICBJTlRFR0VSIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSU5URUdFUiBpCishbG9jayB2YXJpYWJsZQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX2xpYi5oIgorICAgICAgICBJTlRFR0VSIChLSU5EPU9NUF9MT0NLX0tJTkQpIDo6IGxvY2sKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbG9jaworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworIXJlc3VsdCBpczoKKyEgIDAgLS0gaWYgdGhlIHRlc3QgZmFpbHMKKyEgIDEgLS0gaWYgdGhlIHRlc3Qgc3VjY2VlZHMKKyAgICAgICAgQ0FMTCBvbXBfaW5pdF9sb2NrKGxvY2spCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCishJG9tcCBwYXJhbGxlbCBzaGFyZWQobG9jayxucl90aHJlYWRzX2luX3NpbmdsZSxucl9pdGVyYXRpb25zLHJlc3VsdCkKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBvbXBfc2V0X2xvY2sobG9jaykKKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUrMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlLTEKKyAgICAgICAgICByZXN1bHQ9cmVzdWx0K25yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIENBTEwgb21wX3Vuc2V0X2xvY2sobG9jaykKKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBDQUxMIG9tcF9kZXN0cm95X2xvY2sobG9jaykKKyAgICAgICAgSUYocmVzdWx0LkVRLjAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESWYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbWFzdGVyLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlci5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTFmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlci5mCkBAIC0wLDAgKzEsMzkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKwkJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG50aHJlYWRzLCBleGVjdXRpbmdfdGhyZWFkCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG50aHJlYWRzLCBleGVjdXRpbmdfdGhyZWFkCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIG50aHJlYWRzPTAKKyAgICAgICAgZXhlY3V0aW5nX3RocmVhZD0tMQorCishJG9tcCBwYXJhbGxlbAorCQk8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBtYXN0ZXIKKwkJPC9vbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgZXhlY3V0aW5nX3RocmVhZD1vbXBfZ2V0X3RocmVhZF9udW0oKQorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgbWFzdGVyCisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAobnRocmVhZHMgLkVRLiAxKSAuQU5ELiAoZXhlY3V0aW5nX3RocmVhZCAuRVEuIDApICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbWFzdGVyXzMuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbWFzdGVyXzMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjIyYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXJfMy5mCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi4gSXQgYWxzbyBjaGVja3MgdGhhdCB0aGUgbWFzdGVyIHRocmVhZCBoYXMgdGhlIHRocmVhZCBudW1iZXIgMCBhcyBzcGVjaWZpZWQgaW4gdGhlIE9wZW5NUCBzdGFuZGFyZCB2ZXJzaW9uIDMuMC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcl8zPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnRocmVhZHMsIGV4ZWN1dGluZ190aHJlYWQKKyAgICAgICAgSU5URUdFUiB0aWRfcmVzdWx0ICEgY291bnRzIHVwIHRoZSBudW1iZXIgb2Ygd3JvbmcgdGhyZWFkIG5vLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgISBmb3IgdGhlIG1hc3RlciB0aHJlYWQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnRocmVhZHMsIGV4ZWN1dGluZ190aHJlYWQsIHRpZF9yZXN1bHQKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgdGlkX3Jlc3VsdCA9IDAKKyAgICAgICAgbnRocmVhZHM9MAorICAgICAgICBleGVjdXRpbmdfdGhyZWFkPS0xCisKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIG1hc3RlcgorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICBpZiAob21wX2dldF90aHJlYWRfbnVtKCkgLm5lLiAwKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgdGlkX3Jlc3VsdCA9IHRpZF9yZXN1bHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgZW5kIGlmCishJG9tcCBjcml0aWNhbAorICAgICAgICBudGhyZWFkcyA9IG50aHJlYWRzICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgIGV4ZWN1dGluZ190aHJlYWQ9b21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIG1hc3RlcgorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggKG50aHJlYWRzIC5FUS4gMSkgLkFORC4gKGV4ZWN1dGluZ190aHJlYWQgLkVRLiAwKSAuQU5ELgorICAgICAmICAgICAgICh0aWRfcmVzdWx0IC5FUS4gMCkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgorCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RfbG9jay5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0X2xvY2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjllM2FhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0X2xvY2suZgpAQCAtMCwwICsxLDU5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9zZXRfbmVzdF9sb2NrIGFuZCB0aGUgb21wX3Vuc2V0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX25lc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyFyZXN1bHQgaXM6CishICAwIC0tIGlmIHRoZSB0ZXN0IGZhaWxzCishICAxIC0tIGlmIHRoZSB0ZXN0IHN1Y2NlZWRzCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX2xpYi5oIgorICAgICAgICBJTlRFR0VSIChLSU5EPU9NUF9ORVNUX0xPQ0tfS0lORCkgOjogbG9jaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBsb2NrCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIENBTEwgb21wX2luaXRfbmVzdF9sb2NrKGxvY2spCisgICAgICAgIHJlc3VsdD0wCisKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChsb2NrLG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0KQorISRvbXAgZG8KKyAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgQ0FMTCBvbXBfc2V0X25lc3RfbG9jayhsb2NrKQorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBmbHVzaAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZS0xCisgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgQ0FMTCBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2spCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgIENBTEwgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2spCishICAgICAgICAgICAgICAgUFJJTlQgKiwgcmVzdWx0LCBucl9pdGVyYXRpb25zCisgICAgICAgIElGKHJlc3VsdC5FUS4wIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbmVzdGVkLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzUxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RlZC5mCkBAIC0wLDAgKzEsNTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IGlmIHRoZSBjb21waWxlciBzdXBwb3J0IG5lc3RlZCBwYXJhbGxlbGlzbS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czp2ZXJzaW9uPjIuNTwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+bmVzdGVkdGVzdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGNvdW50ZXIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gY291bnRlcgorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBjb3VudGVyID0wCisgICAgICAgIAorICAgICAgICA8b21wdHM6Y2hlY2s+CishJCAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLlRSVUUuKQorISNpZmRlZiBfT1BFTk1QCishICAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLlRSVUUuKSAKKyEjZW5kaWYKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+CishJCAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLkZBTFNFLikKKyEjaWZkZWYgX09QRU5NUAorISAgICAgICBDQUxMIE9NUF9TRVRfTkVTVEVEKC5GQUxTRS4pCishI2VuZGlmCisgICAgICAgIDwvb21wdHM6Y3Jvc3NjaGVjaz4KKworISRvbXAgcGFyYWxsZWwKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKworISRvbXAgcGFyYWxsZWwKKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgLSAxCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICAKKyAgICAgICAgSUYgKGNvdW50ZXIgLkVRLiAwICkgVEhFTgorICAgICAgICAgICBXUklURSAoMSwqKSAiQ291bnRlciB3YXMgMCIKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRUxTRQorICAgICAgICAgICBXUklURSAoMSwqKSAiQ291bnRlciB3YXMiLCBjb3VudGVyCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVORCBJRiAKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbnVtX3RocmVhZHMuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbnVtX3RocmVhZHMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWVkZTczCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9udW1fdGhyZWFkcy5mCkBAIC0wLDAgKzEsNjAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIHJldHVybnMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHRocmVhZHMuIFRoZXJlZm9yIGl0IGNvdW50cyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIHNlY3Rpb24gYW5kIGNvbXBhcnMgdGhpcyB2YWx1ZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaSwgbWF4X3RocmVhZHMKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgZmFpbGVkLHRocmVhZHMsbnRocmVhZHMsdG1wCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGZhaWxlZCx0aHJlYWRzLG50aHJlYWRzCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGZhaWxlZCA9IDAKKyAgICAgICAgbWF4X3RocmVhZHMgPSAwCisgICAgICAgICAKKyEkb21wIHBhcmFsbGVsCishJG9tcCBtYXN0ZXIKKyAgICAgICAgbWF4X3RocmVhZHMgPSBPTVBfR0VUX05VTV9USFJFQURTKCkgICAgICAgCishJG9tcCBlbmQgbWFzdGVyCishJG9tcCBlbmQgcGFyYWxsZWwKKyEgICAgICAgICBwcmludCAqLCAibWF4IHRocmVhZHM6IixtYXhfdGhyZWFkcworCishWWkgV2VuIGFkZGVkIG9tcF9TZXRfZHluYW1pY3MgaGVyZSB0byBtYWtlIHN1cmUgbnVtX3RocmVhZHMgY2xhdXNlIHdvcmsKKyFUaGFua3MgdG8gRHIuIFlpbiBNYSBpbiBBYnNvZnQuIHNob3VsZCBiZSBub3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgdGVzdCBsb29wCishYmVjYXVzZSBpdCBhbGxvd3MgdGhlIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgYXQgcnVudGltZQorIWluc3RlYWQgb2YgdXNpbmcgdGhlIG1heF90aHJlYWRzIHNldC4gCisKKyAgICAgICAgIUNBTEwgT01QX1NFVF9EWU5BTUlDKC5UUlVFLikKKyAgICAgICAgRE8gdGhyZWFkcyA9IDEsIG1heF90aHJlYWRzCisgICAgICAgICAgbnRocmVhZHMgPSAwCisgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyh0aHJlYWRzKSByZWR1Y3Rpb24oKzpmYWlsZWQpCishICAgICAgICAgIHByaW50ICosIHRocmVhZHMsIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIHRtcCA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIElGICggdGhyZWFkcyAuTkUuIHRtcCApIFRIRU4KKyAgICAgICAgICAgIGZhaWxlZCA9IGZhaWxlZCArIDEKKyAgICAgICAgICAgIFdSSVRFICgxLCopICJFcnJvcjogZm91bmQgIiwgdG1wLCAiIGluc3RlYWQgb2YgIiwKKyAgICAgJiAgICAgICAgICB0aHJlYWRzLCAiIHRocmVhZHMiCisgICAgICAgICAgRU5EIElGCishJG9tcCBhdG9taWMKKyAgICAgICAgICBudGhyZWFkcyA9IG50aHJlYWRzICsgMQorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishICAgICAgICAgICAgcHJpbnQgKiwgdGhyZWFkcywgbnRocmVhZHMKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+SUYgKCBudGhyZWFkcyAuTkUuIHRocmVhZHMgKSBUSEVOPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz5JRiAoIG50aHJlYWRzIC5FUS4gdGhyZWFkcyApIFRIRU48L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgICBmYWlsZWQgPSBmYWlsZWQgKyAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworCisgICAgICAgIElGKGZhaWxlZCAuTkUuIDApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3NpbmdsZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9zaW5nbGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgyMWNhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9zaW5nbGUuZgpAQCAtMCwwICsxLDQwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgZGlyZWN0aXZlIGJ5IGNvbnRyb2xsaW5nIGhvdyBvZnRlbiBhIGRpcmVjdGl2ZSBpcyBjYWxsZWQgaW4gYW4gb21wIHNpbmdsZSByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorCQk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQtMQorCQk8b21wdHM6b3JwaGFuPgorISRvbXAgc2luZ2xlCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gbnJfdGhyZWFkc19pbl9zaW5nbGUgKyAxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnMgPSBucl9pdGVyYXRpb25zICsgMQorICAgICAgICAgIDxvbXB0czpjaGVjaz5ucl90aHJlYWRzX2luX3NpbmdsZSA9IG5yX3RocmVhZHNfaW5fc2luZ2xlIC0gMTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+bnJfdGhyZWFkc19pbl9zaW5nbGUgPSBucl90aHJlYWRzX2luX3NpbmdsZSArIDE8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyEkb21wIGVuZCBzaW5nbGUKKwkJPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzNkN2IwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrLmYKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGxldCBwYXVzZSB0aGUgdGFza3MgZ2VuZXJhdGVkIHNvIHRoYXQgb3RoZXIgdGhyZWFkcyBnZXQgc2hlZHVsZWQgdG8gdGhlIG5ld2x5IG9wZW5lZCB0YXNrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMsIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBFWFRFUk5BTCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIG15agorICAgICAgICBJTlRFR0VSIGksagorICAgICAgICBJTlRFR0VSIHRpZHMoTlVNX1RBU0tTKQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBqLHRpZHMKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlqKSBzaGFyZWQoaikKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICBqID0gaQorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBteWogPSBqCisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIHRhc2sKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRSkKKyAgICAgICAgICB0aWRzKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCisgICAgICAgICEgY2hlY2sgaWYgbW9yZSB0aGFuIG9uZSB0aHJlYWQgZXhlY3V0ZWQgdGhlIHRhc2tzLgorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmICh0aWRzKDEpIC5uZS4gdGlkcyhpKSkgdGhlbgorICAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgICBlbmQgaWYKKyAgICAgICAgZW5kIGRvCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19maXJzdHByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc3NTllCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZmlyc3Rwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gdW5lcXVhbCB6ZXJvIHdoaWNoIGdldHMgZGVjbGFyZWQgZmlyc3Rwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIGosaQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgbXlfc3VtCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBteV9zdW0sIGtub3duX3N1bSwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIG15X3N1bSA9IDEyMzQKKyAgICAgICAga25vd25fc3VtID0gMTIzNCArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKGopCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHRhc2sgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShteV9zdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkbyBqID0gMCwgTE9PUENPVU5UCishJG9tcCBmbHVzaAorICAgICAgICAgICAgbXlfc3VtID0gbXlfc3VtICsgagorICAgICAgICAgIGVuZCBkbworCisgICAgICAgICAgISBjaGVjayBpZiBjYWxjdWxhdGVkIG15X3N1bSB3YXMgcmlnaHQKKyAgICAgICAgICBpZiAobXlfc3VtIC5uZS4ga25vd25fc3VtKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgcnNsdCA9IHJzbHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGlmIChyc2x0IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19pZi5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2lmLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5ZjQ1NwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19pZi5mCkBAIC0wLDAgKzEsNDUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgY2xhdXNlIG9mIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhciBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24gYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGUgcGFyZW50IHRocmVhZCBub3cgc2hhbGwgc2V0IGEgY291bnRlciB2YXJpYWJsZSB3aGljaCB0aGUgcGF1c2VkIHRhc2sgc2hhbGwgZXZhbHVhdGUgd2hlbiB3b2tlIHVwLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBleHRlcm5hbCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIGR1bW15CisgICAgICAgIExPR0lDQUwgY29uZGl0aW9uX2ZhbHNlCisgICAgICAgIElOVEVHRVIgY250CisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBjb25kaXRpb25fZmFsc2UsIGNudCwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNudCA9IDAKKyAgICAgICAgY29uZGl0aW9uX2ZhbHNlID0gKGR1bW15IC5lcS4gMzE0MTU5KQorCishJG9tcCBwYXJhbGxlbAorISRvbXAgc2luZ2xlCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCB0YXNrIDxvbXB0czpjaGVjaz5pZiAoY29uZGl0aW9uX2ZhbHNlKTwvb21wdHM6Y2hlY2s+IHNoYXJlZChjbnQscnNsdCkKKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRV9MT05HKQorISRvbXAgZmx1c2gKKyAgICAgICAgICBpZiAoY250IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgICByc2x0ID0gMQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcnNsdCA9IDAKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBjbnQgPSAxCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gcnNsdAorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfcHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3ByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ0YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3ByaXZhdGUuZgpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHByaXZhdGUgY2xhdXNlIG9mIHRoZSB0YXNrIGRpcmVjdGl2ZS4gV2UgY3JlYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgZGVmaW5lcyBhIHZhcmlhYmxlIG5hbWVkIHN1bSB3aGljaCBnZXRzIGRlY2xhcmVkIHByaXZhdGUgZm9yIGVhY2ggdGFzay4gTm93IGVhY2ggdGFzayBjYWxjdWFsdGVzIGEgc3VtIHVzaW5nIHRoaXMgcHJpdmF0ZSB2YXJpYWJsZS4gQmVmb3JlIGVhY2ggY2FsY3VhbGF0aW9uIHN0ZXAgd2UgaW50cm9kdWNlIGEgZmx1c2ggY29tbWFuZCBzbyB0aGF0IG1heWJlIHRoZSBwcml2YXRlIHZhcmlhYmVsIGdldHMgYmFkLiBBdCB0aGUgZW5kIHdlIGNoZWNrIGlmIHRoZSBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIGosaQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgbXlfc3VtCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBteV9zdW0sIGtub3duX3N1bSwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIG15X3N1bSA9IDAKKyAgICAgICAgcnNsdCA9IDAKKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaikKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgdGFzayA8b21wdHM6Y2hlY2s+cHJpdmF0ZShteV9zdW0pPC9vbXB0czpjaGVjaz4gc2hhcmVkKHJzbHQsIGtub3duX3N1bSkKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+bXlfc3VtID0gMDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZG8gaiA9IDAsIExPT1BDT1VOVAorICAgICAgICAgICAgbXlfc3VtID0gbXlfc3VtICsgagorICAgICAgICAgIGVuZCBkbworCisgICAgICAgICAgISBjaGVjayBpZiBjYWxjdWxhdGVkIG15X3N1bSB3YXMgcmlnaHQKKyAgICAgICAgICBpZiAobXlfc3VtIC5uZS4ga25vd25fc3VtKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgcnNsdCA9IHJzbHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGlmIChyc2x0IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19zaGFyZWQuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19zaGFyZWQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU2NGIzCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3NoYXJlZC5mCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBzaGFyZWQgd29ya3MgY29ycmVjdGx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSwgb21wIHRhc2sgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfc2hhcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGkKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByc2x0CisgICAgICAgIElOVEVHRVIgaworCisgICAgICAgIGkgPSAwCisgICAgICAgIGsgPSAwCisgICAgICAgIHJzbHQgPSAwCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaykgc2hhcmVkKGkpCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaz0xLCBOVU1fVEFTS1MKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHRhc2sgPG9tcHRzOmNyb3NzY2hlY2s+Zmlyc3Rwcml2YXRlKGkpPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXArICAgICA8b21wdHM6Y2hlY2s+c2hhcmVkKGkpPC9vbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworICAgICAgICAgICAgaSA9IGkgKyAxCishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICByc2x0ID0gaQorICAgICAgICBpZiAocnNsdCAuZXEuIE5VTV9UQVNLUykgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza191bnRpZWQuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza191bnRpZWQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNThlOTM1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3VudGllZC5mCkBAIC0wLDAgKzEsNjMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IGZvciB1bnRpZWQgY2xhdXNlLiBGaXJzdCBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBhbmQgcGF1c2UgaXQgaW1tZWRpYXRlbHkuIFRoZW4gd2UgcmVzdW1lIGhhbGYgb2YgdGhlbSBhbmQgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBzY2hlZHVsZWQgYnkgZGlmZmVyZW50IHRocmVhZHM8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgdW50aWVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHRhc2t3YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfdW50aWVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgRVhURVJOQUwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzLCBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgSU5URUdFUiBteWoKKyAgICAgICAgSU5URUdFUiBpLGoKKyAgICAgICAgSU5URUdFUiBjbnQKKyAgICAgICAgSU5URUdFUiBzdGFydF90aWQoTlVNX1RBU0tTKQorICAgICAgICBJTlRFR0VSIGN1cnJlbnRfdGlkKE5VTV9UQVNLUykKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaiwgY250LCBzdGFydF90aWQsIGN1cnJlbnRfdGlkCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgY250ID0gMAorICAgICAgICBkbyBpID0gMSwgTlVNX1RBU0tTCisgICAgICAgICAgc3RhcnRfdGlkKGkpID0gMAorICAgICAgICAgIGN1cnJlbnRfdGlkKGkpID0gMAorICAgICAgICBlbmQgZG8KKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShteWopIHNoYXJlZChqKQorISRvbXAgc2luZ2xlCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgIGogPSBpCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIG15aiA9IGoKKyEkb21wIHRhc2sgPG9tcHRzOmNoZWNrPnVudGllZDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgY2FsbCBteV9zbGVlcChTTEVFUFRJTUUpCisgICAgICAgICAgc3RhcnRfdGlkKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorISRvbXAgdGFza3dhaXQKKyAgICAgIDxvbXB0czpjaGVjaz5pZiAoTU9EKHN0YXJ0X3RpZChteWopLDIpIC5uZS4gMCkgdGhlbjwvb21wdHM6Y2hlY2s+CisgICAgICAgIGNhbGwgbXlfc2xlZXAoU0xFRVBUSU1FKQorICAgICAgICBjdXJyZW50X3RpZChteWopID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICBlbHNlCisgICAgICAgIGN1cnJlbnRfdGlkKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgIGVuZCBpZjwvb21wdHM6Y2hlY2s+CishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCisgICAgICAgICEgY2hlY2sgaWYgYXQgbGVhc3Qgb25lIHVudGllZCB0YXNrIHN3aXRjaGVkIHRocmVhZHMKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICBpZiAoY3VycmVudF90aWQoaSkgLm5lLiBzdGFydF90aWQoaSkpIHRoZW4KKyAgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZCBkbworCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2t3YWl0LmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2t3YWl0LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhOTRjNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza3dhaXQuZgpAQCAtMCwwICsxLDgzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrd2FpdCBkaXJlY3RpdmUuIEZpcnN0IHdlIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzLCB3aGljaCBzZXQgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdmFsdWUuIFRoZW4gd2UgZG8gYSB0YXNrd2FpdCBhbmQgY2hlY2sgaWYgYWxsIHRhc2tzIGZpbmlzaGVkIG1lYW5pbmcgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlLiBUaGVuIHdlIGdlbmVyYXRlIGEgc2Vjb25kIHNldCBzZXR0aW5nIHRoZSBhcnJheSBlbGVtZW50cyB0byBhbm90aGVyIHZhbHVlLiBBZnRlciB0aGUgcGFyYWxsZWwgcmVnaW9uIHdlIGNoZWNrIGlmIGFsbCB0YXNrcyBvZiB0aGUgc2Vjb25kIHNldCBmaW5pc2hlZCBhbmQgd2VyZSBleGVjdXRlZCBhZnRlciB0aGUgdGFza3Mgb2YgdGhlIGZpcnN0IHNldC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2t3YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgdGFzazwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIHJlc3VsdDIKKyAgICAgICAgSU5URUdFUiBhcnJheShOVU1fVEFTS1MpCisgICAgICAgIElOVEVHRVIgaSwgbXlpCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQxID0gMAorICAgICAgICByZXN1bHQyID0gMAorCisgICAgICAgICEgZmlsbCBhcnJheQorICAgICAgICBkbyBpID0gMSwgTlVNX1RBU0tTCisgICAgICAgICAgYXJyYXkoaSkgPSAwCisgICAgICAgIGVuZCBkbworCishJG9tcCBwYXJhbGxlbCBzaGFyZWQoaSkgcHJpdmF0ZShteWkpCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICEgRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICEgd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgICAgICAgISBvdmVyd3JpdHRlbiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lCisgICAgICAgICAhIHdoaWNoIGlzIG5lZWRlZCB0byBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorCisgICAgICAgICBteWkgPSBpCisKKyEkb21wIHRhc2sKKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRSkKKyAgICAgICAgICBhcnJheShteWkpID0gMQorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgZW5kIGRvCisKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgdGFza3dhaXQKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisKKyAgICAgICAgISBjaGVjayBpZiBhbGwgdGFza3Mgd2VyZSBmaW5pc2hlZAorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmIChhcnJheShpKSAubmUuIDEpIHRoZW4KKyAgICAgICAgICAgICAgcmVzdWx0MSA9IHJlc3VsdDEgKyAxCisgICAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZCBkbworCisgICAgICAgICEgZ2VuZXJhdGUgc29tZSBtb3JlIHRhc2tzIHdoaWNoIG5vdyBzaGFsbCBvdmVyd3JpdGUgdGhlIHZhbHVlc2luIHRoZQorICAgICAgICAhIGFycmF5CisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgICAgbXlpID0gaQorISRvbXAgdGFzaworICAgICAgICAgIGFycmF5KG15aSkgPSAyCishJG9tcCBlbmQgdGFzaworICAgICAgICBlbmQgZG8KKworISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgISBmaW5hbCBjaGVjaywgaWYgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlcworICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmIChhcnJheShpKSAubmUuIDIpIHRoZW4KKyAgICAgICAgICAgIHJlc3VsdDIgPSByZXN1bHQyICsgMQorICAgICAgICAgIGVuZCBpZgorICAgICAgICBlbmQgZG8KKworICAgICAgICBpZiAoIChyZXN1bHQxIC5lcS4gMCkgLmFuZC4gKHJlc3VsdDIgLmVxLiAwKSApIHRoZW4KKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIGVuZCBpZgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RfbmVzdF9sb2NrLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RfbmVzdF9sb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5NmQyNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdF9uZXN0X2xvY2suZgpAQCAtMCwwICsxLDYxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0CishcmVzdWx0IGlzOgorISAgICAgIDAgLS0gaWYgdGhlIHRlc3QgZmFpbHMKKyEgICAgICAxIC0tIGlmIHRoZSB0ZXN0IHN1Y2NlZWRzCisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBpbmNsdWRlICJvbXBfbGliLmgiCisgICAgICAgIElOVEVHRVIgKEtJTkQ9T01QX05FU1RfTE9DS19LSU5EKSA6OiBsb2NrCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGxvY2sKKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CishICAgICAgICBJTlRFR0VSICBsY2sKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIENBTEwgT01QX0lOSVRfTkVTVF9MT0NLKGxvY2spCisgICAgICAgIHJlc3VsdD0wCisKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChsb2NrLG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0KQorISRvbXAgZG8KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgICBETyBXSElMRShPTVBfVEVTVF9ORVNUX0xPQ0sobG9jaykgLkVRLiAwKQorICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUtMQorICAgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBPTVBfVU5TRVRfTkVTVF9MT0NLKGxvY2spCisgICAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgQ0FMTCBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9jaykKKyEgICAgICAgICAgICAgICBwcmludCAqLCByZXN1bHQsIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSUYocmVzdWx0LkVRLjAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdGxvY2suZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdGxvY2suZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjEzMDRkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0bG9jay5mCkBAIC0wLDAgKzEsNTcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3Rsb2NrIGZ1bmN0aW9uLiBUaGUgdGVzdCBjb3VudHMgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdoaWNoIGlzIGJ1aWxkIHdpdGggYSB0ZXN0X2xvY2sgaW4gYW4gZW5kbGVzcyBsb29wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdGxvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGluY2x1ZGUgIm9tcF9saWIuaCIKKyAgICAgICAgSU5URUdFUiAoS0lORD1PTVBfTE9DS19LSU5EKTo6bG9jaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBsb2NrCisgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBucl9pdGVyYXRpb25zPTAKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9MAorICAgICAgICBDQUxMIE9NUF9JTklUX0xPQ0sobG9jaykKKyAgICAgICAgcmVzdWx0PTAKKworISRvbXAgcGFyYWxsZWwgc2hhcmVkKGxvY2ssbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQpCishJG9tcCBkbworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIERPIFdISUxFICguTk9ULiBPTVBfVEVTVF9MT0NLKGxvY2spKQorICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUtMQorICAgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBPTVBfVU5TRVRfTE9DSyhsb2NrKQorICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIENBTEwgT01QX0RFU1RST1lfTE9DSyhsb2NrKQorISAgICAgICAgICAgICAgIHByaW50ICosIHJlc3VsdCwgbnJfaXRlcmF0aW9ucworICAgICAgICBJRihyZXN1bHQuRVEuMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdHN1aXRlLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RzdWl0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDQ4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RzdWl0ZS5mCkBAIC0wLDAgKzEsMiBAQAorCWludGVnZXIgTE9PUENPVU5UCisJcGFyYW1ldGVyIChMT09QQ09VTlQ9MTAwMCkKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGhyZWFkcHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90aHJlYWRwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMDQ5OAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGhyZWFkcHJpdmF0ZS5mCkBAIC0wLDAgKzEsODkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRocmVhZHByaXZhdGUgZGlyZWN0aXZlIGJ5IGZpbGxpbmcgYW4gYXJyYXkgd2l0aCByYW5kb20gbnVtYmVycyBpbiBhbiBwYXJhbGxlbGlzZWQgcmVnaW9uLiBFYWNoIHRocmVhZCBnZW5lcmF0ZXMgb25lIG51bWJlciBvZiB0aGUgYXJyYXkgYW5kIHNhdmVzIHRoaXMgaW4gYSB0ZW1wb3JhcnkgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZS4gSW4gYSBzZWNvbmQgcGFyYWxsZWxpc2VkIHJlZ2lvbiB0aGUgdGVzdCBjb250cm9scywgdGhhdCB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGNvbnRhaW5zIHN0aWxsIHRoZSBmb3JtZXIgdmFsdWUgYnkgY29tcGFyaW5nIGl0IHdpdGggdGhlIG9uZSBpbiB0aGUgYXJyYXkuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcF9zZXRfZHluYW1pYyxvbXBfZ2V0X251bV90aHJlYWRzLG9tcCBtYXN0ZXI8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorIVlpIFdlbiBtb2RpZmllZCB0aGlzIGZ1bmN0aW9uIGZyb20gaGlzIG93biB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzZW1hbnRpY3MKKyFvZiBDIHZlcnNpb24gYXQgMDUwNDIwMDQKKyFUaGUgdW5kZWVzdGFuZGluZyBpcyB0aGF0IHN1bTAgYW5kIG15dmFsdWUgY2FuIGJlIGxvY2FsIHN0YXRpYyB2YXJpYWJsZXMKKyFvZiB0aGUgY2hrX29tcF90aHJlYWRwcml2YXRlIGZ1bmN0aW9uLiBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSBjb21tb24KKyFibG9jaworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtLCBpICwgaXRlciwgcmFuayxzaXplLCBmYWlsZWQKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzLCBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgUkVBTCBteV9yYW5kb20KKyAgICAgICAgUkVBTCwgQUxMT0NBVEFCTEU6OiBkYXRhKDopCisgICAgICAgIElOVEVHRVIgcmFuZG9tX3NpemUKKyAgICAgICAgSU5UUklOU0lDIHJhbmRvbV9udW1iZXIKKyAgICAgICAgSU5UUklOU0lDIHJhbmRvbV9zZWVkCisgICAgICAgIEVYVEVSTkFMIG9tcF9zZXRfZHluYW1pYworCishWWkgV2VuIG1vZGlmaWVkIGF0IDA1MDQyMDA0IDogYWRkICJzYXZlIgorICAgICAgICBJTlRFR0VSLCBTQVZFOjogc3VtMAorICAgICAgICBSRUFMLCBTQVZFOjpteXZhbHVlCishWWkgV2VuIGNvbW1lbnRlZCB0d28gY29tbW9uIGJsb2NrcworIQljb21tb24vY3N1bTAvIHN1bTAKKyEJY29tbW9uL2NteXZhbHVlLyBteXZhbHVlCishISEhISEhISEhJG9tcCB0aHJlYWRwcml2YXRlKC9jc3VtMC8sL2NteXZhbHVlLykKKwkJPG9tcHRzOmNoZWNrPgorISRvbXAgdGhyZWFkcHJpdmF0ZShzdW0wLG15dmFsdWUpCisJCTwvb21wdHM6Y2hlY2s+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBzdW0gPSAwCisgICAgICAgIGZhaWxlZCA9IDAKKyAgICAgICAgc3VtMD0wCisgICAgICAgIG15dmFsdWU9MAorICAgICAgICByYW5kb21fc2l6ZT00NQorICAgICAgICBDQUxMIG9tcF9zZXRfZHluYW1pYyguRkFMU0UuKQorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLk5FLiBzdW0gKSBUSEVOCisgICAgICAgICAgUFJJTlQgKiwgJyBrbm93bl9zdW0gPScsIGtub3duX3N1bSwgJywgc3VtID0nLHN1bQorICAgICAgICBFTkQgSUYKKworICAgICAgICBDQUxMIG9tcF9zZXRfZHluYW1pYyguRkFMU0UuKQorCishJG9tcCBwYXJhbGxlbAorISRvbXAgbWFzdGVyCisgICAgICAgIHNpemUgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgQUxMT0NBVEUgKCBkYXRhKHNpemUpICkKKyEkb21wIGVuZCBtYXN0ZXIKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBDQUxMIFJBTkRPTV9TRUVEKFNJWkU9cmFuZG9tX3NpemUpCisgICAgICAgIERPIGl0ZXIgPSAwLCA5OQorICAgICAgICAgIENBTEwgUkFORE9NX05VTUJFUihIQVJWRVNUPW15X3JhbmRvbSkKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUocmFuaykKKyAgICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkrMQorICAgICAgICAgIG15dmFsdWUgPSBteV9yYW5kb20gKyByYW5rCisgICAgICAgICAgZGF0YShyYW5rKSA9IG15dmFsdWUKKyEkb21wIGVuZCBwYXJhbGxlbAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKSsxCisgICAgICAgICAgSUYgKCBteXZhbHVlIC5ORS4gZGF0YShyYW5rKSApIFRIRU4KKyAgICAgICAgICAgIGZhaWxlZCA9IGZhaWxlZCArIDEKKyAgICAgICAgICAgIFBSSU5UICosICcgbXl2YWx1ZSA9JyxteXZhbHVlLCcgZGF0YShyYW5rKT0nLCBkYXRhKHJhbmspCisgICAgICAgICAgRU5EIElGCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgRU5EIERPCisgICAgICAgIERFQUxMT0NBVEUoIGRhdGEpCisgICAgICAgIElGICggKGtub3duX3N1bSAuRVEuIHN1bSkgLkFORC4gKGZhaWxlZCAuTkUuIDEpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMCAKKyAgICAgICAgZW5kIGlmCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3dvcmtzaGFyZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZhYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmUuZgpAQCAtMCwwICsxLDE0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIGlmIFdPUktTSEFSRSBpcyBwcmVzZW50Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgd29ya3NoYXJlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorISBGdW5jdGlvbjogb21wX3dvcmtzaGFyZQorISAKKyEgYnkgQ2h1bmh1YSBMaWFvLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24KKyEgT2N0LiAyMDA1IC0gRmlyc3QgdmVyc2lvbgorISAKKyEgVGhlIGlkZWEgZm9yIHRoZSB0ZXN0IGlzIHRoYXQgaWYgV09SS1NIQVJFIGlzIG5vdCBwcmVzZW50LAorISB0aGUgYXJyYXkgYXNzaWdubWVudCBpbiBQQVJBTExFTCByZWdpb24gd2lsbCBiZSBleGVjdXRlZCBieSBlYWNoIAorISB0aHJlYWQgYW5kIHRoZW4gd3JvbmdmdWxseSByZXBlYXRlZCBzZXZlcmFsIHRpbWVzLgorIQorISBUT0RPOkRvIHdlIG5lZWQgdGVzdCBmb3IgV0hFUkUgYW5kIEZPUkFMTD8KKyEgQSBzaW1wbGUgdGVzdCBmb3IgV0hFUkUgYW5kIEZPUkFMTCBpcyBhZGRlZCBieSBaaGVueWluZyBMaXUKKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3dvcmtzaGFyZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQsaQorICAgICAgICBJTlRFR0VSIHNjYWxhcjAyLHNjYWxhcjEyLHNjYWxhcjIyLHNjYWxhcjMyLGNvdW50CisgICAgICAgIFJFQUwsIERJTUVOU0lPTigxMDAwKTo6RkYKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzY2FsYXIwLHNjYWxhcjEsc2NhbGFyMixzY2FsYXIzCisgICAgICAgIElOVEVHRVIsIERJTUVOU0lPTigxMDAwKTo6QUEsQkIsQ0MKKyAgICAgICAgUkVBTCwgRElNRU5TSU9OKDEwMDApOjpERAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzY2FsYXIwLHNjYWxhcjEsc2NhbGFyMixzY2FsYXIzLAorICAgICAmICAgICAgQUEsQkIsQ0MsREQKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgc2NhbGFyMD0wCisgICAgICAgIHNjYWxhcjAyPTAKKyAgICAgICAgc2NhbGFyMT0wCisgICAgICAgIHNjYWxhcjEyPTAKKyAgICAgICAgc2NhbGFyMj0wCisgICAgICAgIHNjYWxhcjIyPTAKKyAgICAgICAgc2NhbGFyMz0wCisgICAgICAgIHNjYWxhcjMyPTAKKyAKKyAgICAgICAgY291bnQgPSAwCisKKyAgICAgICAgQUE9MAorICAgICAgICBCQj0wCisKKyAgICAgICAgZG8gaT0xLDEwMDAKKyAgICAgICAgICBDQyhpKSA9IGkKKyAgICAgICAgICBGRihpKSA9IDEuMC9pCisgICAgICAgIGVuZCBkbworCishJE9NUCBQQVJBTExFTAorPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4hJE9NUCAgIFdPUktTSEFSRTwvb21wdHM6Y2hlY2s+CisKKyEgdGVzdCBpZiB3b3JrIGlzIGRpdmlkZWQgb3Igbm90IGZvciBhcnJheSBhc3NpZ25tZW50CisgICAgICAgIEFBPUFBKzEKKworISB0ZXN0IGlmIHNjYWxhciBhc3NpZ25tZW50IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCisgICAgICAgIHNjYWxhcjA9c2NhbGFyMCsxIAorCishIHRlc3QgaWYgYXRvbWljIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCishJE9NUCBBVE9NSUMKKyAgICAgICAgc2NhbGFyMT1zY2FsYXIxKzEgCishIHRlc3QgaWYgY3JpdGljYWwgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IG9mIHdvcmsKKyEkT01QIENSSVRJQ0FMCisgICAgICAgIHNjYWxhcjI9c2NhbGFyMisxCishJE9NUCBFTkQgQ1JJVElDQUwKKworISB0ZXN0IGlmIFBBUkFMTEVMIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCishJE9NUCBQQVJBTExFTAorICAgICAgICBzY2FsYXIzPXNjYWxhcjMrMQorISRPTVAgRU5EIFBBUkFMTEVMCisKKyAgICAgICAgV0hFUkUgKCBDQyAubmUuIDAgKSBERCA9IDEuMC9DQworCisgICAgICAgIEZPUkFMTCAoST0xOjEwMDApIENDKGkpID0gLWkKKworPG9tcHRzOmNoZWNrPiEkT01QICAgRU5EIFdPUktTSEFSRTwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyEkT01QIEVORCBQQVJBTExFTAorCishc2VxdWVudGlhbCBlcXVpdmFsZW50IHN0YXRlbWVudHMgZm9yIGNvbXBhcmlzb24gCisgICAgICAgQkI9QkIrMQorICAgICAgIHNjYWxhcjAyPXNjYWxhcjAyKzEKKyAgICAgICBzY2FsYXIxMj1zY2FsYXIxMisxCisgICAgICAgc2NhbGFyMjI9c2NhbGFyMjIrMQorICAgICAgIHNjYWxhcjMyPXNjYWxhcjMyKzEKKworISAgICAgIHdyaXRlICgxLCopICJjazpzdW0gb2YgQUEgaXMiLFNVTShBQSksIiBzdW0gb2YgQkIgaXMgIixzdW0oQkIpCisgICAgICAgaWYgKFNVTShBQSkvPVNVTShCQikpIHRoZW4KKyAgICAgICAgICAgIHdyaXRlKDEsKikgIkFycmF5IGFzc2lnbm1lbnQgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICAgICAgIHJlc3VsdD1yZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGlmIChzY2FsYXIwLz1zY2FsYXIwMikgdGhlbgorICAgICAgICAgIHdyaXRlKDEsKikgIlNjYWxhciBhc3NpZ25tZW50IGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBpZiAoc2NhbGFyMS89c2NhbGFyMTIpIHRoZW4KKyAgICAgICAgICB3cml0ZSgxLCopICJBdG9taWMgaW5zaWRlIFdPUktTSEFSRSBoYXMgc29tZSBwcm9ibGVtIgorICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBpZiAoc2NhbGFyMi89c2NhbGFyMjIpIHRoZW4KKyAgICAgICAgICB3cml0ZSgxLCopICJDUklUSUNBTCBpbnNpZGUgV09SS1NIQVJFIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICByZXN1bHQgPSByZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGlmIChzY2FsYXIzLz1zY2FsYXIzMikgdGhlbgorICAgICAgICAgICB3cml0ZSgxLCopICJQQVJBTExFTCBpbnNpZGUgV09SS1NIQVJFIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArMQorICAgICAgIGVuZGlmCisgICAgICAgZG8gaT0xLDEwMDAKKyAgICAgICAgIGlmICggYWJzKCBERChpKS0gRkYoaSkpIC5ndC4gMS4wRS00ICkgdGhlbgorCSAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgZW5kIGlmCisgICAgICAgZW5kIGRvCisgICAgICAgaWYgKCBjb3VudCAubmUuIDAgKSB0aGVuCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgd3JpdGUoMSwqKSAiV0hFUkUgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICBlbmQgaWYKKworICAgICAgIGNvdW50ID0gMAorICAgICAgIGRvIGk9MSwxMDAwCisgICAgICAgICBpZiAoIENDKGkpIC5uZS4gLWkgKSB0aGVuCisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgZW5kIGlmCisgICAgICAgZW5kIGRvCisgICAgICAgaWYgKCBjb3VudCAubmUuIDAgKSB0aGVuCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgd3JpdGUoMSwqKSAiRk9SQUxMIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgZW5kIGlmCisKKworIWlmIGFueXRoaW5nIGlzIHdyb25nLCBzZXQgcmV0dXJuIHZhbHVlIHRvIDAKKyAgICAgICBpZiAocmVzdWx0PT0wKSB0aGVuCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICBlbHNlCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICBlbmQgaWYKKyAgICAgICBlbmQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3dvcmtzaGFyZV9kZWZhdWx0LmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3dvcmtzaGFyZV9kZWZhdWx0LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3NGM0MwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlX2RlZmF1bHQuZgpAQCAtMCwwICsxLDM2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB3b3Jrc2hhcmUgZGVmYXVsdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3dvcmtzaGFyZV9kZWZhdWx0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIG15c3VtCisgICAgICAgIElOVEVHRVIgaQorCisgICAgICAgIGtub3duX3N1bSA9IDk5OSoxMDAwLzIKKworISRvbXAgcGFyYWxsZWwgZGVmYXVsdChwcml2YXRlKSBzaGFyZWQoc3VtKQorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCA5OTkKKyAgICAgICAgICAgbXlzdW0gPSBteXN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8gCisKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIG15c3VtCishJG9tcCBlbmQgY3JpdGljYWwKKworISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAoa25vd25fc3VtIC5FUS4gc3VtKSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3d0aW1lLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3d0aW1lLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3MzM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd3RpbWUuZgpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpbWUgZnVuY3Rpb24uIEl0IGNvbXBhcmVzIHRoZSB0aW1lIHdpdGggd2hpY2ggaXMgY2FsbGVkIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCB0aGUgdGltZSBpdCB0b29rIGJ5IG1lc3N1cmluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjYWxsIG9mIHRoZSBzbGVlcCBmdW5jdGlvbiBhbmQgaXRzIGVuZC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGltZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF93dGltZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN0YXJ0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZW5kdGltZQorICAgICAgICBDT01NT04gc3RhcnQsIGVuZHRpbWUKKyAgICAgICAgaW5jbHVkZSAib21wX2xpYi5oIgorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHdhaXRfdGltZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIG1lYXN1cmVkX3RpbWUKKyAgICAgICAgSU5URUdFUiBmaWxldW5pdAorICAgICAgICB3YWl0X3RpbWU9MQorCisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgZW5kdGltZSA9IDA7CisKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgc3RhcnQ9b21wX2dldF93dGltZSgpCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgQ0FMTCBzbGVlcCh3YWl0X3RpbWUpCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgIGVuZHRpbWU9b21wX2dldF93dGltZSgpCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgbWVhc3VyZWRfdGltZT1lbmR0aW1lLXN0YXJ0CisgICAgICAgIFdSSVRFKDEsKikgIndvcmsgdG9vayIsbWVhc3VyZWRfdGltZSwic2VjLiB0aW1lLiIKKyAgICAgICAgSUYobWVhc3VyZWRfdGltZS5HVC4wLjk5KndhaXRfdGltZSAuQU5ELgorICAgICAmIG1lYXN1cmVkX3RpbWUgLkxULiAxLjAxKndhaXRfdGltZSkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2ZpcnN0cHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWFlNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDI2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBkbyBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhciBkbyByZWR1Y3Rpb24scGFyIGRvIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLGtub3duX3N1bSwgaTIsIGkKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPTAKKyAgICAgICAgaTIgPSAzCishJG9tcCBwYXJhbGxlbCBkbyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKGkyKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNyb3NzY2hlY2s+IHJlZHVjdGlvbigrOnN1bSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyAoIGkrIGkyKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIrMypMT09QQ09VTlQKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19pZi5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19pZi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiN2ZjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2lmLmYKQEAgLTAsMCArMSwzMiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGlmIGRpcmVjdGl2ZS4gTmVlZHMgYXQgbGVhc3QgdHdvIHRocmVhZHMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX2lmPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgSU5URUdFUiBzdW0sa25vd25fc3VtLCBpLCBudW1fdGhyZWFkcworICAgICAgICBJTlRFR0VSIGNvbnRyb2wKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwCisKKyAgICAgICAgY29udHJvbCA9IDAKKyEkb21wIHBhcmFsbGVsIGRvIDxvbXB0czpjaGVjaz5pZiAoY29udHJvbCA9PSAxKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICAgIG51bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBXUklURSAoMSwqKSAiTnVtYmVyIG9mIHRocmVhZHMgZGV0ZXJtaW5lZCBieToiXAorICAgICAgICAgICAgICAgICAgICAib21nX2dldF9udW1fdGhyZWFzZDoiLCBudW1fdGhyZWFkcworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gbnVtX3RocmVhZHMgLkVRLiAxKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19sYXN0cHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19sYXN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDIxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2xhc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwyOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZG8gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXIgZG8gcmVkdWN0aW9uLCBwYXIgZG8gcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtLCBpICwgaTAKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwCisgICAgICAgIGkwID0gLTEKKworISRvbXAgcGFyYWxsZWwgZG8gcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCAoa25vd25fc3VtIC5FUS4gc3VtKSAuQU5ELiAoaTAgLkVRLiBMT09QQ09VTlQpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCAgIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fb3JkZXJlZC5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19vcmRlcmVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkNGNkMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fb3JkZXJlZC5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIG9yZGVyZWQgZGlyZWN0aXZlPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyBvcmRlcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+cGFyIHNjaGVkdWxlIHN0YXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIEhlbHBlciBmdW5jdGlvbiBpc19sYXJnZXIKKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgSU5URUdFUiBGVU5DVElPTiBpX2lzbGFyZ2VyMihpKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRFR0VSIGxhc3RfaSxpc2xhcmdlcgorICAgICAgICBDT01NT04gL2NvbS8gbGFzdF9pCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyEgICAgICAgIHByaW50ICosICJsYXN0X2kiLGxhc3RfaSwgImkiLCBpCishIGxhc3RfaSBpcyBhIGdsb2JhbCB2YXJpYWJsZQorICAgICAgICBJRiAoIGkgLkdULiBsYXN0X2kgKSBUSEVOCisgICAgICAgICAgaXNsYXJnZXIgPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBpc2xhcmdlciA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICAgIGxhc3RfaSA9IGkKKyAgICAgICAgaV9pc2xhcmdlcjIgPSBpc2xhcmdlcgorICAgICAgRU5EIEZVTkNUSU9OCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgQ09NTU9OIC9jb20vIGxhc3RfaQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bSxpLCBsYXN0X2kKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpc19sYXJnZXIsc3VtLGlfaXNsYXJnZXIyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGlzX2xhcmdlcixzdW0saQorPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgCisgICAgICAgIHN1bT0wCisgICAgICAgIGlzX2xhcmdlcj0xCisgICAgICAgIGxhc3RfaT0wCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShzdGF0aWMsIDEpIG9yZGVyZWQKKyAgICAgICAgRE8gaT0xLCA5OQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKwkJPC9vbXB0czpjaGVjaz4KKyAgICAgICAgSUYoIGlfaXNsYXJnZXIyKGkpIC5FUS4gMSAuQU5ELiBpc19sYXJnZXIgLkVRLiAxICkgVEhFTiAgCisgICAgICAgICAgaXNfbGFyZ2VyID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgaXNfbGFyZ2VyID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgICAgc3VtID0gc3VtICsgaQorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgb3JkZXJlZAorCQk8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoOTkqMTAwKS8yCishWWkgV2VuOyBTdW4gY29tcGlsZXIgd2lsbCBmYWlsIHNvbWV0aW1lcworISAgICAgICAgcHJpbnQgKiwgInN1bSIsIHN1bSwgImtzIiwga25vd25fc3VtLCAibGEiLCBpc19sYXJnZXIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaXNfbGFyZ2VyIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzOWFiOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNDYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhciBkbyByZWR1Y3Rpb24sb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIFNVQlJPVVRJTkUgZG9fc29tZV93b3JrMigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgUkVBTCBpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gc3VtCisgICAgICAgIElOVFJJTlNJQyBzcXJ0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMC4wCisgICAgICAgIGkgPSAwCisgICAgICAgIERPIFdISUxFIChpIDwgTE9PUENPVU5UKQorICAgICAgICAgICBzdW0gPSBzdW0gKyBzcXJ0KGkpCisgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICBFTkQgRE8KKyAgICAgIEVORAorCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSxrbm93bl9zdW0sIGksIGkyLCBpMworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAKKworISRvbXAgcGFyYWxsZWwgZG8gcmVkdWN0aW9uKCs6c3VtKSA8b21wdHM6Y2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpMiA9IGkKKyEkb21wIGZsdXNoCisgICAgICAgICAgQ0FMTCBkb19zb21lX3dvcmsyKCkKKyEkb21wIGZsdXNoCisgICAgICAgICAgc3VtID0gc3VtICsgaTIKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19yZWR1Y3Rpb24uZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcmVkdWN0aW9uLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzZjQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcmVkdWN0aW9uLmYKQEAgLTAsMCArMSw0MTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMiwga25vd25fc3VtLCBpLCBpMixkaWZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdCxrbm93bl9wcm9kdWN0LGludF9jb25zdAorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGRrbm93bl9zdW0sZHQsZHB0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRkaWZmCisgICAgICAgIElOVEVHRVIgZG91YmxlX0RJR0lUUworICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChkb3VibGVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGtub3duX3N1bSAuTkUuIHN1bSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCisKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiAoLTogZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0xLCBMT09QQ09VTlQKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgCisgICAgICAgIElGICggZGlmZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHN1bSwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBmb3IgZG91YmxlcworICAgICAgICBkc3VtID0wLgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0PSBkcHQgKiBkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgCisgICAgICAgIElGKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgIGFicyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgZHN1bSwiaW5zdGVhZCBvZiAiLGRrbm93bl9zdW0sIihEaWZmZXJlbmNlOiAiLAorICAgICAmICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworICAgICAgICBkZGlmZiA9ICggMS1kcHQpLygxLWR0KQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTAsIERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRkaWZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLE1BWF9GQUNUT1IKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGtub3duX3Byb2R1Y3QgLk5FLiBwcm9kdWN0KSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgcHJvZHVjdCwiIGluc3RlYWQgb2YiLGtub3duX3Byb2R1Y3QgCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgbG9naWNfYW5kID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXNzIDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLm9yLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggLk5PVC4gbG9naWNfb3IgKSBUSEVuCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBFUVYsIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5FUVYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGxvZ2ljX2VxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBORVFWLCB3aGljaCBpcyB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLm5lcXYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIGlhbmQoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIEFORCBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBiaXRfYW5kIC5MVC4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAwCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oSU9SOmJpdF9vcikKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSU9SOmJpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSB0aGVuCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5sZS4gMCkgdGhlbgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1JTjptaW5fdmFsdWUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBtYXhfdmFsdWUgPSBNQVgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBtYXhfdmFsdWUgLkxULiBMT09QQ09VTlQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgZG91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOmRtaW4pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZG1pbiAuR1QuICgxMC1kdCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtYXg6ZG1heCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZG1heD0gbWF4KGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBkbWF4IC5MVC4gTE9PUENPVU5UKmR0IClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMAorICAgICAgICBFTkQgSUYKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMmI4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlIGNsYXVzZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMCwga25vd25fc3VtCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDExCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPiAgCishJG9tcCBzZWN0aW9uCishJG9tcCBjcml0aWNhbCAKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCis8b21wdHM6Y3Jvc3NjaGVjaz4hJG9tcCBzZWN0aW9uPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCis8b21wdHM6Y3Jvc3NjaGVjaz4hJG9tcCBzZWN0aW9uPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgICAgICAga25vd25fc3VtID0gMTEqMyArIDcKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2xhc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljNzIxZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIHN1bTAsIGtub3duX3N1bSwgaSAsaTAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4gcHJpdmF0ZShpLHN1bTApCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTA9aQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIKKyEgICAgICAgIHByaW50ICosICJzdW0iLCBzdW0sICJrcyIsIGtub3duX3N1bSwgaTAKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiA5OTkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX3ByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwYWMwZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9wcml2YXRlLmYKQEAgLTAsMCArMSw4NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBwYXJhbGxlbCBzZWN0aW9uIHByaXZhdGUgY2xhdXNlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbiBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfc2VjdGlvbl9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMCwga25vd25fc3VtLCBpCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCxpKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3CisgICAgICAgIElGICgga25vd25fc3VtIC5lcS4gc3VtICkgdGhlbgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KKworICAgICAgICBpbnRlZ2VyIGZ1bmN0aW9uIGNyc2Noa19wYXJfc2VjdGlvbl9wcml2YXRlKCkKKyAgICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgICBpbnRlZ2VyIHN1bSwgc3VtMCwga25vd25fc3VtLCBpCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgZG8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgZG8gaT00MDAsIDY5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBkbyBpPTcwMCwgOTk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIGVuZCBkbworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgICAgICAga25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzcKKyAgICAgICAgaWYgKCBrbm93bl9zdW0gLmVxLiBzdW0gKSB0aGVuCisgICAgICAgICAgY3JzY2hrX3Bhcl9zZWN0aW9uX3ByaXZhdGUgPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjcnNjaGtfcGFyX3NlY3Rpb25fcHJpdmF0ZSA9IDAKKyAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZAorCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcmVkdWN0LmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcmVkdWN0LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkZTMwNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9yZWR1Y3QuZgpAQCAtMCwwICsxLDYzMSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX3NlY3Rpb25fcmVkdWN0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMiwga25vd25fc3VtLCBpLCBpMixkaWZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdCxrbm93bl9wcm9kdWN0LGludF9jb25zdAorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGRrbm93bl9zdW0sZHQsZHB0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRkaWZmCisgICAgICAgIElOVEVHRVIgRE9VQkxFX0RJR0lUUworICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChET1VCTEVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCisKKyAgICAgICAgSU5URUdFUiBjdXQxLCBjdXQyLCBjdXQzLCBjdXQ0CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBjdXQxID0gTklOVChMT09QQ09VTlQgLyAzLikKKyAgICAgICAgY3V0MiA9IGN1dDEgKyAxCisgICAgICAgIGN1dDMgPSAyICogY3V0MQorICAgICAgICBjdXQ0ID0gY3V0MyArIDEKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQyLCBjdXQzCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChrbm93bl9zdW0gLk5FLiBzdW0pIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBzdW0sImluc3RlYWQgb2YgIiwga25vd25fc3VtCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uICgtOiBkaWZmKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDIsIGN1dDMKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRpZmYgPSBkaWZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgc3VtLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGZvciBkb3VibGVzCisgICAgICAgIGRzdW0gPTAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MCw2CisgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMgorICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEzLERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAKKyAgICAgICAgSUYoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgIEFCUyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRzdW0sImluc3RlYWQgb2YgIixka25vd25fc3VtLCIoRGlmZmVyZW5jZTogIiwKKyAgICAgJiAgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisgICAgICAgIGRwdCA9IDEKKworCisgICAgICAKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgIGRwdCA9IGRwdCpkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGRpZmYgPSAoIDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTAsIDYKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywgMTIKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MTMsIERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZGRpZmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLDMKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTQsNgorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMAorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIGlmICgubm90LiBsb2dpY19hbmQpIHRoZW4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgZW5kIGlmCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5PUi46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICguTk9ULiBsb2dpY19lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChsb2dpY19uZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxCisgICAgICAgIEVORCBETworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggYml0X2FuZCAuTFQuIDEgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMAorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZgorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46bWluX3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBtaW5fdmFsdWUgPSBNSU4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBkb3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOmRtaW4pPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBkX2FycmF5KGkpID0gaSAqIGR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtYXg9IC0gKDIqKjEwKQorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1BWDpkbWF4KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgZG1heD0gTUFYKGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGRtYXg9IE1BWChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRtYXg9IE1BWChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggZG1heCAubHQuIExPT1BDT1VOVCpkdCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBkb3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgQ0xPU0UoMikKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzAwNThhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSw0MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbiBmaXJzdHByaXZhdGUgZGlyZWN0aXZlIGJ5IGFkZGluZyBhIHZhcmlhYmxlIHdoaWNoIGlzIGRlZmluZWQgYmVmb3JlIHRoZSBwYXJhbGxlbCByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zZWN0aW9uX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sc3VtMAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0sc3VtMAorPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMTEKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgc2VjdGlvbgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHNlY3Rpb25zCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9IDExKjMrNworICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX2xhc3Rwcml2YXRlLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTcxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNjIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNlY3Rpb25fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpLCBpMCwgc3VtLCBzdW0wCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGksaTAsc3VtCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+IHByaXZhdGUoaSxzdW0wKQorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTEsIDM5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiA5OTkgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tdHM6dGVzdD4KKworCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9wcml2YXRlLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiODA5MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX3ByaXZhdGUuZgpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHBhcmFsbGVsIHNlY3Rpb24gcHJpdmF0ZSBjbGF1c2UuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9uIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNlY3Rpb25fcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sc3VtMCxpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSxzdW0wLGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMAorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bTAsaSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaSk8L29tcHRzOmNyb3NzY2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NDAwLCA2OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT03MDAsIDk5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHNlY3Rpb25zCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3CisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcmVkdWN0aW9uLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9yZWR1Y3Rpb24uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2U3MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcmVkdWN0aW9uLmYKQEAgLTAsMCArMSw3NDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb25zIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zZWN0aW9uX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0yLCBrbm93bl9zdW0sIGkyCisgICAgICAgIElOVEVHRVIga25vd25fcHJvZHVjdCxpbnRfY29uc3QKKyAgICAgICAgSU5URUdFUiBNQVhfRkFDVE9SCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZGtub3duX3N1bSxkcHQKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBQQVJBTUVURVIgKGludF9jb25zdD0xMCxrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGksZHVtbXkKKyAgICAgICAgSU5URUdFUiBzdW0sIGRJRmYKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkdAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRzdW0sIGRkSUZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdAorICAgICAgICBMT0dJQ0FMIGxvZ2ljcyhMT09QQ09VTlQpCisgICAgICAgIElOVEVHRVIgaW50X2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgTE9HSUNBTCBsb2dpY19hbmQsIGxvZ2ljX29yLCBsb2dpY19lcXYsbG9naWNfbmVxdgorICAgICAgICBJTlRFR0VSIGJpdF9hbmQsIGJpdF9vcgorICAgICAgICBJTlRFR0VSIGV4Y2x1c2l2X2JpdF9vcgorICAgICAgICBJTlRFR0VSIG1pbl92YWx1ZSwgbWF4X3ZhbHVlCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorCisgICAgICAgIElOVEVHRVIgRE9VQkxFX0RJR0lUUworICAgICAgICBJTlRFR0VSIGN1dDEsIGN1dDIsIGN1dDMsIGN1dDQKKyAgICAgICAgUEFSQU1FVEVSIChET1VCTEVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtNikKKworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBpLHN1bSxkSUZmLHByb2R1Y3QsZHQsZHN1bSxkZElGZixsb2dpY19hbmQsCisgICAgICYgICAgbG9naWNfb3IsbG9naWNfZXF2LGxvZ2ljX25lcXYsbG9naWNzLGludF9hcnJheSxiaXRfYW5kLGJpdF9vciwKKyAgICAgJiAgICBleGNsdXNpdl9iaXRfb3IsbWluX3ZhbHVlLGRtaW4sZG1heCxkX2FycmF5LG1heF92YWx1ZQorICAgICAgICAKKyAgICAgICAgY3V0MSA9IE5JTlQoTE9PUENPVU5UIC8gMy4zKQorICAgICAgICBjdXQyID0gY3V0MSArIDEKKyAgICAgICAgY3V0MyA9IGN1dDEgKiAyCisgICAgICAgIGN1dDQgPSBjdXQzICsgMQorCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBjdXQxID0gTklOVChMT09QQ09VTlQgLyAzLjMpCisgICAgICAgIGN1dDIgPSBjdXQxICsgMQorICAgICAgICBjdXQzID0gY3V0MSAqIDIKKyAgICAgICAgY3V0NCA9IGN1dDMgKyAxCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQyLCBjdXQzCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZElGZiA9IGtub3duX3N1bQorCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uICgtOiBkSUZmKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBkSUZmID0gZElGZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDIsIGN1dDMKKyAgICAgICAgICBkSUZmID0gZElGZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRJRmYgPSBkSUZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKyAgCisgICAgICAgIElGICggZElGZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkSUZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICBzdW0sImluc3RlYWQgb2YgMC4iCisgICAgICAgIEVORCBJRgorCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEKKyEgICBUZXN0IGZvciBET3VibGVzCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTAsNgorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsMTIKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xMyxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworIAorICAgICAgICBJRiAoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgYWJzKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBET3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERJRmZlcmVuY2U6ICIsCisgICAgICYgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZHB0ID0gMQorICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZGRJRmYgPSAoIDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsCishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRJRmYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0wLCA2CisgICAgICAgICAgZGRJRmYgPSBkZElGZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsIDEyCisgICAgICAgICAgZGRJRmYgPSBkZElGZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEzLCBET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkZElGZiA9IGRkSUZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggYWJzKGRkSUZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBESUZmZXJlbmNlIHdpdGggRE91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgZGRJRmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsMworICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT00LDYKKyAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMAorICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5hbmQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLmFuZC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhc3MgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigub3IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm9yLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5lcXYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5lcXYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLmVxdi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuZXF2LiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBsb2dpY19lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgTkVRViwgd2hpY2ggaXMgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5mYWxzZS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5mYWxzZS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5uZXF2Ljpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm5lcXYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpYW5kOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgYml0X2FuZCA9IGlhbmQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgIGJpdF9hbmQgPSBpYW5kKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgIGJpdF9hbmQgPSBpYW5kKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLmx0LiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGlhbmQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfYW5kID0gaWFuZCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfYW5kID0gaWFuZCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBpYW5kICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpb3I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X29yID0gaW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9vciA9IGlvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IGlvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oaW9yOmJpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfb3IgPSBJb3IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X29yID0gSW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpZW9yOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGllb3I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMTAgLSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1pbl92YWx1ZSA9IDY1NTM1CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtaW46bWluX3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBtaW5fdmFsdWUgPSBtaW4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgbWluX3ZhbHVlID0gbWluKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgbWluX3ZhbHVlID0gbWluKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtYXg6bWF4X3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBtYXhfdmFsdWUgPSBtYXgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgbWF4X3ZhbHVlID0gbWF4KG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgbWF4X3ZhbHVlID0gbWF4KG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgRE91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IDEwIC0gaSpkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWluID0gMioqMTAKKyAgICAgICAgZHQgPSAwLjUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1pbjpkbWluKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBkbWluPSBtaW4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBkbWluPSBtaW4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIGRtaW49IG1pbihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBET3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1heDpkbWF4KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIGRtYXg9IG1heChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtYXggLkxULiBMT09QQ09VTlQqZHQgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERPdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAwCisgICAgICAgIEVORCBJRgorCisgICAgICAgIENMT1NFKDIpCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfY29weXByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfY29weXByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODc4YTY2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9jb3B5cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBjb3B5cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGUgY29weXByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFybGxlbCxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNpbmdsZV9jb3B5cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGksaix0aHJlYWQsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnJfaXRlcmF0aW9ucyxyZXN1bHQKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSxqLHRocmVhZCkKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgRE8gaT0wLExPT1BDT1VOVC0xCisgICAgICAgICAgdGhyZWFkPU9NUF9HRVRfVEhSRUFEX05VTSgpCishJG9tcCBzaW5nbGUgCisgICAgICAgICAgbnJfaXRlcmF0aW9ucz1ucl9pdGVyYXRpb25zKzEKKyAgICAgICAgICBqPWkKKyEkb21wIGVuZCBzaW5nbGUgPG9tcHRzOmNoZWNrPmNvcHlwcml2YXRlKGopPC9vbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgcmVzdWx0PXJlc3VsdCtqLWk7CishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgRU5EIERPCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGKHJlc3VsdCAuRVEuIDAgLkFORC4gCisgICAgICYgICAgIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfbm93YWl0LmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX25vd2FpdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDRhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX25vd2FpdC5mCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGF0b21pYzwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+c2luZ2xlX25vd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQsIHRvdGFsX2l0ZXJhdGlvbnMsIG15X2l0ZXJhdGlvbnMsaQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnJfaXRlcmF0aW9ucworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBucl9pdGVyYXRpb25zCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICB0b3RhbF9pdGVyYXRpb25zPTAKKyAgICAgICAgbXlfaXRlcmF0aW9ucz0wCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQgLTEKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4hJG9tcCBzaW5nbGU8L29tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCisgICAgICAgICAgbnJfaXRlcmF0aW9ucyA9IG5yX2l0ZXJhdGlvbnMgKyAxCis8b21wdHM6Y2hlY2s+ISRvbXAgZW5kIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSxteV9pdGVyYXRpb25zKQorICAgICAgICBteV9pdGVyYXRpb25zID0gMAorICAgICAgICBETyBpPTAsIExPT1BDT1VOVCAtMQorPG9tcHRzOmNoZWNrPiEkb21wIHNpbmdsZTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgbXlfaXRlcmF0aW9ucyA9IG15X2l0ZXJhdGlvbnMgKyAxCis8b21wdHM6Y2hlY2s+ISRvbXAgZW5kIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHRvdGFsX2l0ZXJhdGlvbnMgPSB0b3RhbF9pdGVyYXRpb25zICsgbXlfaXRlcmF0aW9ucworISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKCBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UIC5BTkQuCisgICAgICYgICAgIHRvdGFsX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQgKSBUSEVOCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfcHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkNGE2YQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdlbCBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmbHVzaCxvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zaW5nbGVfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zLCBpCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZSwgbXlyZXN1bHQsIG15aXQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gcmVzdWx0LG5yX2l0ZXJhdGlvbnMKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG15cmVzdWx0PTAKKyAgICAgICAgbXlpdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShpLCBteXJlc3VsdCwgbXlpdCkKKzxvbXB0czpvcnBoYW4+CisgICAgICAgIG15cmVzdWx0ID0gMAorICAgICAgICBteWl0ID0gMAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCishJG9tcCBiYXJyaWVyCisgICAgICAgIERPIGk9MCwgTE9PUENPVU5UIC0xCishJG9tcCBzaW5nbGUgPG9tcHRzOmNoZWNrPnByaXZhdGUobnJfdGhyZWFkc19pbl9zaW5nbGUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDAKKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSBucl90aHJlYWRzX2luX3NpbmdsZSArIDEKKyEkb21wIGZsdXNoCisgICAgICAgICAgbXlpdCA9IG15aXQgKyAxCisgICAgICAgICAgbXlyZXN1bHQgPSBteXJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlCishJG9tcCBlbmQgc2luZ2xlIG5vd2FpdAorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgIG5yX2l0ZXJhdGlvbnMgPSBucl9pdGVyYXRpb25zICsgbXlpdAorISRvbXAgZW5kIGNyaXRpY2FsCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBXUklURSgxLCopICJyZXN1bHQgaXMiLHJlc3VsdCwibnJfaXQgaXMiLG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vdGVzdGxpc3QtZi50eHQgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vdGVzdGxpc3QtZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3NjZlMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi90ZXN0bGlzdC1mLnR4dApAQCAtMCwwICsxLDQ1IEBACitkb19maXJzdHByaXZhdGUuZgorZG9fbGFzdHByaXZhdGUKK2RvX29yZGVyZWQKK2RvX3ByaXZhdGUKK2RvX3JlZHVjdGlvbgorI2RvX3NjaGVkdWxlX2R5bmFtaWMKKyNkb19zY2hlZHVsZV9ndWlkZWQKKyNkb19zY2hlZHVsZV9zdGF0aWMKK2hhc19vcGVubXAKKyNvbXBfYXRvbWljCitvbXBfYmFycmllcgorb21wX2NvcHlpbgorb21wX2NyaXRpY2FsCisjb21wX2ZsdXNoCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK29tcF9sb2NrCitvbXBfbWFzdGVyCitvbXBfbmVzdF9sb2NrCitvbXBfbmVzdF90ZXN0bG9jaworb21wX25lc3RlZAorb21wX251bV90aHJlYWRzCitvbXBfdGVzdGxvY2sKK29tcF90ZXN0c3VpdGUKK29tcF90aHJlYWRwcml2YXRlCisjb21wX3RpY2tzX3RpbWUKKyNvbXBfd29ya3NoYXJlCisjb21wX3d0aW1lCisjcGFyX2RvZmlyc3Rwcml2YXRlCisjcGFyX2RvX2xhc3Rwcml2YXRlCisjcGFyX2RvX29yZGVyZWQKKyNwYXJfZG9fcHJpdmF0ZQorI3Bhcl9kb19yZWR1Y3Rpb24KKyNwYXJfc2VjdGlvbmlyc3Rwcml2YXRlLmYKKyNwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorI3Bhcl9zZWN0aW9uX3ByaXZhdGUKKyNwYXJfc2VjdGlvbl9yZWR1Y3Rpb24KKyNzZWN0aW9uaXJzdHByaXZhdGUuZgorI3NlY3Rpb25fbGFzdHByaXZhdGUKKyNzZWN0aW9uX3ByaXZhdGUKKyNzZWN0aW9uX3JlZHVjdGlvbgorI3NpbmdsZQorI3NpbmdsZV9jb3B5cHJpdmF0ZQorI3NpbmdsZV9ub3dhaXQKKyNzaW5nbGVfcHJpdmF0ZQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9vbXBfbXlfc2xlZXAuZiBiL3JjMy90ZXN0c3VpdGUvb21wX215X3NsZWVwLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjYjA0YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvb21wX215X3NsZWVwLmYKQEAgLTAsMCArMSwyNiBAQAorISBVdGlsaXR5IGZ1bmN0aW9ucyB0byBoYXZlIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCBiZXR0ZXIgcmVzb2x1dGlvbiBhbmQKKyEgd2hpY2ggb25seSBzdG9wcyBvbmUgdGhyZWFkLgorCisgICAgICBzdWJyb3V0aW5lIG15X3NsZWVwKHNsZWVwdGltZSkKKyAgICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgICBkb3VibGUgcHJlY2lzaW9uIDo6IHNsZWVwdGltZQorICAgICAgICBpbnRlZ2VyIDo6IHUKKyAgICAgICAgaW50ZWdlciA6OiB0KDgpCisgICAgICAgIGludGVnZXIgOjogbXMxLCBtczIKKyAgICAgICAgaW50ZWdlciA6OiBjbnQKKworICAgICAgICB1ID0gc2xlZXB0aW1lICogMTAwMAorCisgICAgICAgIGNhbGwgZGF0ZV9hbmRfdGltZSh2YWx1ZXM9dCkKKworICAgICAgICAhIGNhbGN1bGF0ZSBzdGFydCB0aW1lIGluIG1zCisgICAgICAgIG1zMSA9IHQoOCkgKyB0KDcpKjEwMDAgKyB0KDYpKjYwMDAwICsgdCg1KSozNjAwMDAwCisKKyAgICAgICAgbXMyID0gbXMxCisgICAgICAgIGNudCA9IDAKKyAgICAgICAgZG8gd2hpbGUgKCAobXMyIC0gbXMxKSA8IHUpCisgICAgICAgICAgICBjYWxsIGRhdGVfYW5kX3RpbWUodmFsdWVzPXQpCisgICAgICAgICAgICBtczIgPSB0KDgpICsgdCg3KSoxMDAwICsgdCg2KSo2MDAwMCArIHQoNSkqMzYwMDAwMAorICAgICAgICAgICAgY250ID0gY250KzEKKyAgICAgICAgZW5kIGRvCisgICAgICBlbmQgc3Vicm91dGluZQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9vbXBfbXlfc2xlZXAuaCBiL3JjMy90ZXN0c3VpdGUvb21wX215X3NsZWVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5MGE1YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvb21wX215X3NsZWVwLmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBNWV9TTEVFUF9ICisjZGVmaW5lIE1ZX1NMRUVQX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZTxzdGRsaWIuaD4KKyNpbmNsdWRlPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+IAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIGhhdmUgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIGJldHRlciByZXNvbHV0aW9uIGFuZCB3aGljaCBvbmx5IHN0b3BzIG9uZSB0aHJlYWQuICovCisKK3N0YXRpYyB2b2lkIG15X3NsZWVwKGRvdWJsZSBzbGVlcHRpbWUpeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgc3RydWN0IHRpbWV6b25lIHR6cDsKKyAgZG91YmxlIHN0YXJ0OworICBkb3VibGUgcmVhbDsKKyAgaWYoZ2V0dGltZW9mZGF5KCZ0diwmdHpwKSE9MCkgeworICAgIHBlcnJvcigiZ2V0X3RpbWU6ICIpOworICAgIGV4aXQoLTEpOworICB9CisgIHN0YXJ0ID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIHJlYWw9c3RhcnQ7CisgIHdoaWxlKCAocmVhbC1zdGFydCk8c2xlZXB0aW1lKXsKKyAgICBpZihnZXR0aW1lb2ZkYXkoJnR2LCZ0enApIT0wKSB7CisgICAgICBwZXJyb3IoImdldF90aW1lOiAiKTsKKyAgICAgIGV4aXQoLTEpOworICAgIH0KKyAgICByZWFsID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZiBiL3JjMy90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzUzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpAQCAtMCwwICsxLDE0IEBACisgICAgICBJTlRFR0VSIE4gIVRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB0ZXN0IGlzIHJ1bgorICAgICAgUEFSQU1FVEVSIChOPTEpCisgICAgICBDSEFSQUNURVIqOCBPTVBUU19WRVJTSU9OCisgICAgICBQQVJBTUVURVIgKE9NUFRTX1ZFUlNJT049IjMuMC5hIikKKyAgICAgIElOVEVHRVIgTE9PUENPVU5UICFUaGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbG9vcCBpcyBydW4KKyAgICAgIFBBUkFNRVRFUiAoTE9PUENPVU5UPTEwMDApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRQorICAgICAgUEFSQU1FVEVSIChTTEVFUFRJTUUgPSAuMDEpCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRV9MT05HCisgICAgICBQQVJBTUVURVIgKFNMRUVQVElNRV9MT05HID0gMC41KQorICAgICAgSU5URUdFUiBOVU1fVEFTS1MKKyAgICAgIFBBUkFNRVRFUiAoTlVNX1RBU0tTPTI1KQorICAgICAgSU5URUdFUiBNQVhfVEFTS1NfUEVSX1RIUkVBRAorICAgICAgUEFSQU1FVEVSIChNQVhfVEFTS1NfUEVSX1RIUkVBRD01KQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmggYi9yYzMvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODA4ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIEdsb2JhbCBoZWFkZXJmaWxlIG9mIHRoZSBPcGVuTVAgVGVzdHN1aXRlICovCisKKy8qIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBvbXB0c19tYWtlSGVhZGVyLnBsIHNjcmlwdCB1c2luZyB0aGUgZm9sbG93aW5nIG9waW9uczogKi8KKy8qIC1mPW9tcHRzLWMuY29uZiAtdD1jICAqLworCisKKyNpZm5kZWYgT01QX1RFU1RTVUlURV9ICisjZGVmaW5lIE9NUF9URVNUU1VJVEVfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworLyogVmVyc2lvbiBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT01QVFNfVkVSU0lPTiAiMy4wYSIKKworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9PUENPVU5UIAkxMDAwCisjZGVmaW5lIFJFUEVUSVRJT05TIAkgIDIwCisvKiBmb2xsb3dpbmcgdGltZXMgYXJlIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgU0xFRVBUSU1FCSAwLjAxCisjZGVmaW5lIFNMRUVQVElNRV9MT05HCSAwLjUKKworLyogRGVmaW5pdGlvbnMgZm9yIHRhc2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTlVNX1RBU0tTICAgICAgICAgICAgICAyNQorI2RlZmluZSBNQVhfVEFTS1NfUEVSX1RIUkVBRCAgICA1CitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBvcmRlcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZCAqLworaW50IHRlc3Rfb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCB0ZXN0X29tcF90YXNrd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFza3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2t3YWl0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2t3YWl0ICovCitpbnQgdGVzdF9vbXBfYmFycmllcihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgYmFycmllciAqLworaW50IGNyb3NzdGVzdF9vbXBfYmFycmllcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBiYXJyaWVyICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgaWYgKi8KK2ludCB0ZXN0X29tcF9hdG9taWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IGNyb3NzdGVzdF9vbXBfYXRvbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IHRlc3Rfb21wX2dldF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfZ2V0X251bV90aHJlYWRzICovCitpbnQgY3Jvc3N0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfZ2V0X251bV90aHJlYWRzICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzZWN0aW9uIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25fcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzZWN0aW9uIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGlmICovCitpbnQgdGVzdF9vbXBfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfbG9jayAqLworaW50IGNyb3NzdGVzdF9vbXBfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9sb2NrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2hhcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzaGFyZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzaGFyZWQgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ltcF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfaW1wX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgdGVzdF9vbXBfdGFza19wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9hdXRvKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgYXV0byAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2F1dG8oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGF1dG8gKi8KK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGVfZm9yKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90aHJlYWRwcml2YXRlX2ZvcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGFza191bnRpZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgdW50aWVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX3VudGllZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIHVudGllZCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3NpbmdsZV9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNpbmdsZSBub3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2luZ2xlIG5vd2FpdCAqLworaW50IHRlc3Rfb21wX2NyaXRpY2FsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBjcml0aWNhbCAqLworaW50IGNyb3NzdGVzdF9vbXBfY3JpdGljYWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgY3JpdGljYWwgKi8KK2ludCB0ZXN0X29tcF9nZXRfd3RpY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF93dGljayAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X3d0aWNrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF93dGljayAqLworaW50IHRlc3Rfb21wX3NpbmdsZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2xlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zaW5nbGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2luZ2xlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF90YXNreWllbGQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza3lpZWxkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IHRlc3RfaGFzX29wZW5tcChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBfT1BFTk1QICovCitpbnQgY3Jvc3N0ZXN0X2hhc19vcGVubXAoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBfT1BFTk1QICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX3Rlc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfdGVzdF9sb2NrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90ZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfdGVzdF9sb2NrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmVsbGVsIG51bV90aHJlYWRzICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJlbGxlbCBudW1fdGhyZWFkcyAqLworaW50IHRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25zX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF9uZXN0ZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX25lc3RlZCAqLworaW50IGNyb3NzdGVzdF9vbXBfbmVzdGVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX25lc3RlZCAqLworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRocmVhZHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3RocmVhZHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGhyZWFkcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2VjdGlvbnMgcmVkdWN0aW9uICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uc19yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2VjdGlvbnMgcmVkdWN0aW9uICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIGZpbmFsICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgZmluYWwgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZmx1c2goRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZsdXNoICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mbHVzaChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmbHVzaCAqLworaW50IHRlc3Rfb21wX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIG9yZGVyZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9vcmRlcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBvcmRlcmVkICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9jb3B5cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF90YXNrX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIGlmICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgaWYgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmaXJzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX2NvbGxhcHNlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgY29sbGFwc2UgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9jb2xsYXBzZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgY29sbGFwc2UgKi8KK2ludCB0ZXN0X29tcF9pbl9wYXJhbGxlbChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfaW5fcGFyYWxsZWwgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2luX3BhcmFsbGVsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2luX3BhcmFsbGVsICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShkeW5hbWljKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMpICovCitpbnQgdGVzdF9vbXBfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfbWFzdGVyKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBtYXN0ZXIgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX21hc3RlcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBtYXN0ZXIgKi8KK2ludCB0ZXN0X29tcF9zaW5nbGVfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2VsIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNpbmdlbCBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGFzayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFzayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZGVmYXVsdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZGVmYXVsdCAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZGVmYXVsdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBkZWZhdWx0ICovCitpbnQgdGVzdF9vbXBfZm9yX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG5vd2FpdCAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0ICovCitpbnQgdGVzdF9vbXBfdGVzdF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX3Rlc3RfbmVzdF9sb2NrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90ZXN0X25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF90ZXN0X25lc3RfbG9jayAqLworaW50IHRlc3Rfb21wX25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfbmVzdF9sb2NrICovCitpbnQgY3Jvc3N0ZXN0X29tcF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfbmVzdF9sb2NrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCB0ZXN0X29tcF9tYXN0ZXJfMyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgbWFzdGVyICovCitpbnQgY3Jvc3N0ZXN0X29tcF9tYXN0ZXJfMyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBtYXN0ZXIgKi8KK2ludCB0ZXN0X29tcF9nZXRfd3RpbWUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF93dGltZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X3d0aW1lKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF93dGltZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvb21wdHMtYy5jb25mIGIvcmMzL3Rlc3RzdWl0ZS9vbXB0cy1jLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwYjk1MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvb21wdHMtYy5jb25mCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKiBWZXJzaW9uIGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBPTVBUU19WRVJTSU9OICIzLjBhIgorCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMT09QQ09VTlQgCTEwMDAKKyNkZWZpbmUgUkVQRVRJVElPTlMgCSAgMjAKKy8qIGZvbGxvd2luZyB0aW1lcyBhcmUgaW4gc2Vjb25kcyAqLworI2RlZmluZSBTTEVFUFRJTUUJIDAuMDEKKyNkZWZpbmUgU0xFRVBUSU1FX0xPTkcJIDAuNQorCisvKiBEZWZpbml0aW9ucyBmb3IgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOVU1fVEFTS1MgICAgICAgICAgICAgIDI1CisjZGVmaW5lIE1BWF9UQVNLU19QRVJfVEhSRUFEICAgIDUKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvb21wdHMtZi5jb25mIGIvcmMzL3Rlc3RzdWl0ZS9vbXB0cy1mLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1YWYzMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvb21wdHMtZi5jb25mCkBAIC0wLDAgKzEgQEAKKyFFbXB0eSBjb25maWcgZmlsZQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9vbXB0cy5jb25mIGIvcmMzL3Rlc3RzdWl0ZS9vbXB0cy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzMTM1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL29tcHRzLmNvbmYKQEAgLTAsMCArMSwyNiBAQAorPGNvbmZpZz4KKzxnbG9iYWxjb25maWc+Cis8bG9nZmlsZT5vbXB0cy5sb2c8L2xvZ2ZpbGU+Cis8c2luZ2xldGVzdHRpbWVvdXQ+MTIwPC9zaW5nbGV0ZXN0dGltZW91dD4KKzxkaXNwbGF5ZXJyb3JzPjE8L2Rpc3BsYXllcnJvcnM+Cis8ZGlzcGxheXdhcm5pbmdzPjA8L2Rpc3BsYXl3YXJuaW5ncz4KKzxlbnZzZXR0aHJlYWRzY29tbWFuZD5PTVBfTlVNX1RIUkVBRFM9JW47IGV4cG9ydCBPTVBfTlVNX1RIUkVBRFM7PC9lbnZzZXR0aHJlYWRzY29tbWFuZD4KKzxyZXN1bHRzZmlsZT5yZXN1bHRzLnR4dDwvcmVzdWx0c2ZpbGU+Cis8bnVtdGhyZWFkcz44PC9udW10aHJlYWRzPgorPC9nbG9iYWxjb25maWc+CisKKzxsYW5ndWFnZXM+Cis8bGFuZ3VhZ2U+Cis8bGFuZ3VhZ2VuYW1lPmM8L2xhbmd1YWdlbmFtZT4KKzxkaXI+YzwvZGlyPgorPGZpbGVleHRlbnNpb24+YzwvZmlsZWV4dGVuc2lvbj4KKzx0ZW1wbGF0ZXBhcnNlcm5hbWU+dGVtcGxhdGVfcGFyc2VyX2MucGw8L3RlbXBsYXRlcGFyc2VybmFtZT4KKzwvbGFuZ3VhZ2U+Cis8bGFuZ3VhZ2U+Cis8bGFuZ3VhZ2VuYW1lPmZvcnRyYW48L2xhbmd1YWdlbmFtZT4KKzxkaXI+Zm9ydHJhbjwvZGlyPgorPGZpbGVleHRlbnNpb24+ZjwvZmlsZWV4dGVuc2lvbj4KKzx0ZW1wbGF0ZXBhcnNlcm5hbWU+dGVtcGxhdGVfcGFyc2VyX2ZvcnRyYW4ucGw8L3RlbXBsYXRlcGFyc2VybmFtZT4KKzwvbGFuZ3VhZ2U+Cis8L2xhbmd1YWdlcz4KKzwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9vbXB0c19tYWtlSGVhZGVyLnBsIGIvcmMzL3Rlc3RzdWl0ZS9vbXB0c19tYWtlSGVhZGVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyMTJjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL29tcHRzX21ha2VIZWFkZXIucGwKQEAgLTAsMCArMSwxMDEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIG9tcHRzX21ha2VIZWFkZXIgW29wdGlvbnNdIC1mPU5BTUUgLXQ9RElSCisjCisjIENyZWF0cyB0aGUgaGVhZGVyZmlsZSBmb3IgdGhlIE9wZW5NUC1UZXN0c3VpdGUgb3V0IG9mIHRoZSB0ZW1wbGF0ZWZpbGVzIAorIyB3aXRjaCBhcmUgaW4gdGhlIGRlZmF1bHQvZXhwbGljaXRlbHkgc3BlY2lmaWVkIGRpciBhbmQgdGhlIHNldHRpbmdzIGluIHRoZQorIyBnaXZlbiBjb25maWcgZmlsZS4gCisjIAorIyBBVFRFTlRJT046CisjCUF0IHRoZSBtb21lbnQgaXQgYnVpbHRzIG9ubHkgYSBjLWhlYWRlcmZpbGUhCisjCisjIC1mPUZJTEVOQU1FOiBVc2luZyBmaWxlIEZJTEVOQU1FIGFzIGNvbmZpZ2ZpbGUKKyMgLXQ9RElSOglEaXJlY3RvcnkgaG9sZGluZyB0aGUgdGVtcGxhdGUgZmlsZXMKKyMgCisjIG9wdGlvbnMKKyMgLWk9RklMRU5BTUU6IEluY2x1ZGUgb3RoZXIgSGVhZGVyZmlsZS4gVGhlIGZpbGVzIHRvIGJlIGluY2x1ZGVkIG11c3QgYmUgc3BlY2lmaWVkCisjIAlhZnRlciBzZXR0aW5nIHRoaXMgb3B0aW9uLiAoTm90IGltcGxlbWVudGVkIHlldC4pCisjIC1vPUZJTEVOQU1FOiBvdXRwdXRmaWxlbmFtZSAoZGVmYXVsdCBpcyAib21wX3Rlc3RzdWl0ZS5oIikKKworJGhlYWRlcmZpbGUgPSAiXC9cKiBHbG9iYWwgaGVhZGVyZmlsZSBvZiB0aGUgT3Blbk1QIFRlc3RzdWl0ZSBcKlwvXG5cblwvXCogVGhpcyBmaWxlIHdhcyBjcmVhdGVkIHdpdGggdGhlIG9tcHRzX21ha2VIZWFkZXIucGwgc2NyaXB0IHVzaW5nIHRoZSBmb2xsb3dpbmcgb3Bpb25zOlwgKlwvXG5cL1wqICI7CitpZihAQVJHViA+IDApCit7CisJZm9yZWFjaCAkb3B0IChAQVJHVikKKwl7CisJCSRoZWFkZXJmaWxlIC49ICIkb3B0ICI7CisJfQorfQorZWxzZQoreworCSRoZWFkZXJmaWxlIC49ICJObyBvcHRpb25zIHdlcmUgc3BlY2lmaWVkIjsKK30KKyRoZWFkZXJmaWxlIC49IiBcKlwvXG5cblxuIjsKKwordXNlIEdldG9wdDo6TG9uZzsKK0dldE9wdGlvbnMoIi1vPXMiID0+IFwkb3V0ZmlsZSwgIi1mPXMiID0+XCRjb25maWdmaWxlLCAiLXQ9cyIgPT4gXCR0ZW1wbGF0ZWRpciwgIi1pPXMiID0+IFwkaW5jbHVkZSk7CisKKyRpbmNsdWRlID0gIiI7CisKKworIyBHZXR0aW5nIGFuZCB2ZXJpZnlpbmcgdGhlIG5lY2Vzc2FyeSBvcHRpb25zOgoraWYoISRjb25maWdmaWxlKSB7CQorCWRpZSAiQ29uZmlnIGZpbGUgbmFtZSBpcyBtaXNzaW5nLiI7Cit9CQorZWxzZSB7CisgICAgaWYgKCEoLWUgJGNvbmZpZ2ZpbGUpKSB7CisJICBkaWUgIkNvdWxkIG5vdCBmaW5kIGNvbmZpZyBmaWxlICRjb25maWdmaWxlLiI7CisJfQorfQorCQoraWYoISR0ZW1wbGF0ZWRpcikgewkKKwlkaWUgIkRpcmVjdG9yeW5hbWUgaXMgbWlzc2luZy4iOworfQkKKworaWYoISRvdXRmaWxlKXsKKwkkb3V0ZmlsZSA9ICJvbXBfdGVzdHN1aXRlLmgiOwkjIHNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGhlYWRlcmZpbGUKK30KKworCisKKyNAaW5jbHVkZWZpbGVzOwkJCQkJIyBsaXN0IGhvbGluZyBleHRyYSBpbmNsdWRlZmlsZXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIAorCisKKyMgZ2VuZXJhdGluZyB0aGUgaGVhZCBvZiB0aGUgaW5jbHVkZWd1YXJkOgorJGhlYWRlcmZpbGUgLj0gIlwjaWZuZGVmIE9NUF9URVNUU1VJVEVfSFxuXCNkZWZpbmUgT01QX1RFU1RTVUlURV9IXG5cbiI7CisKKyMgaW5zZXJ0aW5nIGdlbmVyYWwgc2V0dGluZ3Mgb3V0IG9mIHRoZSBjb25maWdmaWxlOgorb3BlbihPTVBUU19DT05GLCRjb25maWdmaWxlKSBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUgJGNvbmZpZ2ZpbGUuIjsKK3doaWxlKDxPTVBUU19DT05GPil7CisJJGhlYWRlcmZpbGUgLj0gJF87Cit9CitjbG9zZShPTVBUU19DT05GKTsKKworIyBzZWFyY2hpbmcgdGhlIHRlc3RzOgorb3BlbmRpciBURU1QTEFURURJUiwgJHRlbXBsYXRlZGlyIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gZGlyICR0ZW1wbGF0ZWRpci4iOworQHRlbXBsYXRlcyA9IGdyZXAgLyguKilcLmMvLCByZWFkZGlyIFRFTVBMQVRFRElSOworY2xvc2VkaXIgVEVNUExBVEVESVI7CisKKyMgaW5zZXJ0aW5nIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnM6Citmb3JlYWNoICR0ZW1wbGF0ZSAoQHRlbXBsYXRlcyl7CisJJHNvdXJjZSA9ICIiOworCW9wZW4oVEVNUExBVEUsJHRlbXBsYXRlZGlyLiIvIi4kdGVtcGxhdGUpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIGZvbGxvd2luZyBzb3VyY2VmaWxlOiAiLiR0ZW1wbGF0ZWRpci4iLyIuJHRlbXBsYXRlOworCXdoaWxlKDxURU1QTEFURT4peworCQkkc291cmNlIC49ICRfOworCX0KKwljbG9zZShURU1QTEFURSk7CisJJHNvdXJjZSA9fiAvXDxvbXB0c1w6dGVzdGNvZGVcOmZ1bmN0aW9ubmFtZVw+KC4qKVw8XC9vbXB0c1w6dGVzdGNvZGVcOmZ1bmN0aW9ubmFtZVw+LzsKKwkkZnVuY3Rpb25uYW1lID0gJDEuIihGSUxFIFwqIGxvZ2ZpbGUpOyI7CisJJHNvdXJjZSA9fiAvXDxvbXB0c1w6ZGlyZWN0aXZlXD4oLiopXDxcL29tcHRzXDpkaXJlY3RpdmVcPi87CisJJGRpcmVjdGl2ZSA9ICQxOworCSRoZWFkZXJmaWxlIC49ICJpbnQgdGVzdF8iLiRmdW5jdGlvbm5hbWUuIiAgLyogVGVzdCBmb3IgIi4kZGlyZWN0aXZlLiIgKi9cbiI7CisJJGhlYWRlcmZpbGUgLj0gImludCBjcm9zc3Rlc3RfIi4kZnVuY3Rpb25uYW1lLiIgIC8qIENyb3NzdGVzdCBmb3IgIi4kZGlyZWN0aXZlLiIgKi9cbiI7Cit9CisKKyMgaW5zZXJ0aW5nIHRoZSBlbmQgb2YgdGhlIGluY2x1ZGVndWFyZDoKKyRoZWFkZXJmaWxlIC49ICJcbiNlbmRpZiI7CisKKyMgY3JhZXRpbmcgdGhlIGhlYWRlcmZpbGU6CitvcGVuKE9VVEZJTEUsIj4iLiRvdXRmaWxlKSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgdGhlIGhhZWRhZXJmaWxlICgkb3V0ZmlsZSkiOworcHJpbnQgT1VURklMRSAkaGVhZGVyZmlsZS4iXG4iOworY2xvc2UoT1VURklMRSk7CisKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvb21wdHNfcGFyc2VyLnBsIGIvcmMzL3Rlc3RzdWl0ZS9vbXB0c19wYXJzZXIucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOThkNzI3MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvb21wdHNfcGFyc2VyLnBsCkBAIC0wLDAgKzEsMTY3IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgb21wdHNfcGFyc2VyIFtvcHRpb25dIFNPVVJDRUZJTEUKKyMgCisjIENyZWF0cyB0aGUgdGVzdHMgYW5kIHRoZSBjcm9zc3Rlc3RzIGZvciB0aGUgT3Blbk1QLVRlc3RzdWl0ZSBvdXQgb2YgYW4gdGVtcGxhdGVmaWxlcyB3aGljaCBhcmUgZ2l2ZW4gdG8gdGhlIHByb2dyYW1tLgorIyAKKyMgT3B0aW9uczoKKyMgLXRlc3Q6IAltYWtlIHRlc3QKKyMgLWNyb3NzdGVzdDogCW1ha2UgY3Jvc3N0ZXN0CisjIC1vcnBoYW4JaWYgcG9zc2libGUgZ2VuZXJhdGUgdGVzdHMgdXNpbmcgb3JwaGFuIHJlZ2lvbnMgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCisjIC1sYW5nPUxBTkcJcHJlcHJvY2Vzc2luZyBmb3IgbGFuZ3VhZ2UgTEFORywgd2hlcmUgTEFORyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBsYW5ndWFnZXM6CisjCQljLCBmb3J0cmFuCisjIC1vPUZJTEVOQU1FCW91dHB1dGZpbGUgKG9ubHkgd2hlbiBvbmUgdGVtcGxhdGVmaWxlIGlzIHNwZWNpZmllZCkKKworCisjIFVzaW5nIEdldG9wdDo6bG9uZyB0byBleHRyYWN0IHRoZSBwcm9ncmFtbSBvcHRpb25zCit1c2UgR2V0b3B0OjpMb25nOworIyBVc2luZyBmdW5jdGlvbnM6IFNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlc3Rjb2RlCit1c2Ugb21wdHNfcGFyc2VyRnVuY3Rpb25zOworCisjIEdldHRpbmcgZ2l2ZW4gb3B0aW9ucworR2V0T3B0aW9ucygiLXRlc3QiID0+IFwkdGVzdCwiLWNyb3NzdGVzdCIgPT4gXCRjcm9zc3Rlc3QsICItbz1zIiA9PiBcJG91dHB1dGZpbGUsICItb3JwaGFuIiA9PiBcJG9ycGhhbiwgIi1mISIsICItbGFuZz1zIiA9PiBcJGxhbmd1YWdlKTsKKworIyBSZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgdGVtcGxhdGVmaWxlcy4gCisjIEFkZGluZyB0aGVzZSB0byB0aGUgbGlzdCBvZiB0byBiZSBwYXJzZWQgZmlsZXMgaWYgdGhleSBleGlzdC4KK2ZvcmVhY2ggJGZpbGUoQEFSR1YpCit7CisJaWYoLWUgJGZpbGUpeyBwdXNoKEBzb3VyY2VmaWxlcywkZmlsZSk7IH0KKwllbHNlIHsgcHJpbnQgIkVycm9yOiBVbmtub3duIE9wdGlvbiAkZmlsZVxuIjsgfQorfQorCQorIyBDaGVja2luZyBpZiBvcHRpb25zIHdlcmUgdmFsaWQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwcmVwYXJhdGlvbnMgYW5kIGNoZWNrcyBmb3Igc291cmNlZmlsZXMKK2lmKEBzb3VyY2VmaWxlcyA9PSAwKXtkaWUgIk5vIGZpbGVzIHRvIHBhcnNlIGFyZSBzcGVjaWZpZWQhIjt9CitpZigkb3V0cHV0ZmlsZSAmJiAoQHNvdXJjZWZpbGVzICE9IDEgfHwgKCR0ZXN0ICYmICRjcm9zc3Rlc3QpICkgKXtkaWUgIlRoZXJlIHdlcmUgbXVsdGlwbGUgZmlsZXMgZm9yIG9uZSBvdXRwdXRmaWxlcyBzcGVjaWZpZWQhIjt9IAorIyBwcmVwYXJhdGlvbnMgZm9wciBvcnBoYW4gdGVzdHMKK2lmKCRvcnBoYW4peyAkb3JwaGFucHJlZml4ID0gIm9ycGhhbmVkIjsgfQorZWxzZSB7ICRvcnBoYW5wcmVmaXggPSAiIjsgfQorIyBwcmVwYXJhdGlvbnMgZm9yIHRlc3QgLyBjcm9zc3Rlc3QKK2lmKCR0ZXN0KXtwdXNoKEB0ZXN0dHlwZXMsInRlc3QiKTsgCisjICVjaGVja3NbJ3Rlc3QnXT0iY2hlY2siOworfQoraWYoJGNyb3NzdGVzdCl7cHVzaChAdGVzdHR5cGVzLCJjdGVzdCIpOworIyAlY2hlY2tzWydjcm9zc3Rlc3QnXT0iY3Jvc3NjaGVjayI7Cit9CisjIHByZXBhcmF0aW9ucyBhbmQgY2hlY2tzIGZvciBsYW5ndWFnZQoraWYoJGxhbmd1YWdlIGVxImMiKSB7ICRleHRlbnNpb24gPSAiYyI7fQorZWxzaWYoJGxhbmd1YWdlIGVxICJmb3J0cmFuIiBvciAkbGFuZ3VhZ2UgZXEgImYiKSB7ICRsYW5ndWFnZSA9ICJmIjsgJGV4dGVuc2lvbiA9ICJmIjt9CitlbHNlIHsgZGllICJZb3UgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgbGFuZ3VhZ2UhIjsgfQorICAgIAorCisjIFJlYWRpbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIHRlc3RzIGludG8gQHNvdXJjZXMKK2ZvcmVhY2ggJHNyY2ZpbGUgKEBzb3VyY2VmaWxlcykKK3sKKwkjIFJlYWRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgc291cmNlZmlsZQlpbnRvICRzcmMKKwlvcGVuKFRFU1QsJHNyY2ZpbGUpIG9yIHByaW50ICJFcnJvcjogQ291bGQgbm90IG9wZW4gdGVtcGxhdGUgJHNyY2ZpbGVcbiI7CisJd2hpbGUoPFRFU1Q+KXsgJHNyYyAuPSAkXzsgfQorCWNsb3NlKFRFU1QpOworCSMgQWRkaW5nIHRoZSBjb250ZW50ICRzcmMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBAc291cmNlcworCXB1c2goQHNvdXJjZXMsJHNyYyk7Cit9CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitpZigkbGFuZ3VhZ2UgZXEgImMiKSB7ICRtYWlucHJvY3NyYyA9ICJvbXB0c19zdGFuZGFsb25lUHJvYy5jIjsgfQorZWxzaWYoJGxhbmd1YWdlIGVxICJmIikgeyAkbWFpbnByb2NzcmMgPSAib21wdHNfc3RhbmRhbG9uZVByb2MuZiI7IH0gCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7CisJJG1haW5wcm9jIC49ICRfOworfQorCitmb3JlYWNoICR0ZXN0dHlwZSAoQHRlc3R0eXBlcykKK3sKKyAgZm9yZWFjaCAkc3JjKEBzb3VyY2VzKQorICB7CisjIFNvbWUgdGVtcG9yYXJ5IHRlc3RpbmZvcm1hdGlvbjoKKyAgICAoJGRlc2NyaXB0aW9uKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0ZGVzY3JpcHRpb24nLCRzcmMpOworICAgICgkZGlyZWN0aXZlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpkaXJlY3RpdmUnLCRzcmMpOworICAgICgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRzcmMpOworCisgICAgb3BlbihPVVRGSUxFLCI+Ii4kbGFuZ3VhZ2UuJG9ycGhhbnByZWZpeC4kdGVzdHR5cGUuIl8iLiRmdW5jdGlvbm5hbWUuIi4iLiRleHRlbnNpb24pIG9yIGRpZSgiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiKTsKKworIyBDcmVhdGluZyB0aGUgc291cmNlIGZvciB0aGUgdGVzdDoKKyAgICAoJGNvZGUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlJywkc3JjKTsKKyMgUHV0dGluZyB0b2dldGhlciB0aGUgZnVuY3Rpb25zIGFuZCB0aGUgbWFpbnByb2dyYW1tOgorICAgICRjb2RlIC49ICRtYWlucHJvYzsKKyAgICAKKyMgZ2V0IHRoZSBwYXJhbWV0ZXJzIDxvbXB0czpvcnBoYW46cGFyYW1zPiBieSBqb29uCisjIHRoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdAorICAgICgkcGFybXMpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjpwYXJtcycsJGNvZGUpOworICAgICgkcGFybXMpID0gbGVhdmVfc2luZ2xlX3NwYWNlKCRwYXJtcyk7CisjIHRvIHJlbW92ZSBwYXJhbWV0ZXJzIHRhZyBiZXR3ZWVuICdvbXB0czpvcnBoYW46cGFybXMnIGJ5IGpvb24KKyAgICAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCRjb2RlKTsKKyAgICAKKyMgTWFrZSBtb2RpZmljYXRpb25zIGZvciB0aGUgb3JwaGFuZWQgdGVzdHZlcnNpb24gaWYgbmVjZXNzYXJ5OgorICAgIGlmKCRvcnBoYW4pCisgICAgeworIyBHZXQgdGhlIGdsb2JhbCB2YXJpYWJsZXM6CisgICAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICAgJG9ycGh2YXJzZGVmID0gIiI7CisgICAgICBmb3JlYWNoICRfIChAZGVmcykKKyAgICAgIHsKKwkjcHJpbnQgJF87CisJaWYobm90IC9eWyBdKiQvZ3MpIHsgJG9ycGh2YXJzZGVmID0gam9pbigiXG4iLCRvcnBodmFyc2RlZiwkXyk7IH0gCisJI3ByaW50ICJPS1xuIi4kb3JwaHZhcnNkZWY7IAorICAgICAgfQorICAgICAgaWYoJGxhbmd1YWdlIGVxICJmIikKKyAgICAgIHsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBzdWJyb3V0aW5lczoKKwkkb3JwaGZ1bmNzID0gY3JlYXRlX29ycGhfZm9ydHJhbmZ1bmN0aW9ucygiJHRlc3R0eXBlXyIsICRjb2RlKTsKKyMgUmVwbGFjZSBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzOgorCSgkY29kZSkgPSBvcnBoYW5fcmVnaW9uczJmb3J0cmFuZnVuY3Rpb25zKCAiJHRlc3R0eXBlXyIsICgkY29kZSkgKTsKKwkoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKyAgICAjdG8gZmluZCBvcnBoYW4gY2FsbCBzdGF0ZW1ldG4gYW5kIGFkZCBwYXJhbWV0ZXJzCisgICAgCisjIFB1dCBhbGwgdG9nZXRoZXI6CisJJGNvZGUgPSAkY29kZSAuICRvcnBoZnVuY3M7CisgICAgICB9CisgICAgICBlbHNpZigkbGFuZ3VhZ2UgZXEgImMiKQorICAgICAgeworIyBHZW5lcmF0ZSBwcmVkZWNsYXJhdGlvbnMgZm9yIG9ycGFobiBmdW5jdGlvbnM6CisJJG9ycGhmdW5jc2RlZnMgPSBvcnBoX2Z1bmN0aW9uc19kZWNsYXJhdGlvbnMoIiR0ZXN0dHlwZV8iLCRjb2RlKTsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBmdW5jdGlvbnM6CisJJG9ycGhmdW5jcyA9IGNyZWF0ZV9vcnBoX2NmdW5jdGlvbnMoIiR0ZXN0dHlwZV8iLCRjb2RlKTsKKyMgUmVwbGE6ZSBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzOgorCSgkY29kZSkgPSBvcnBoYW5fcmVnaW9uczJjZnVuY3Rpb25zKCAiJHRlc3R0eXBlXyIsICgkY29kZSkgKTsKKyMgRGVsZXRpbmcgdGhlIGZvcm1lciBkZWNsYXJhdGlvbnMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgb3JwaGFuIHJlZ2lvbnM6CisJKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisJJGNvZGUgPSAiI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kb3JwaHZhcnNkZWYgLiAkb3JwaGZ1bmNzZGVmcyAuICRjb2RlIC4gJG9ycGhmdW5jczsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCXByaW50ICJBbiBlcnJvciBvY2N1cnJlZCEiOworICAgICAgfQorICAgIH0KKyMgcmVtb3ZlIHBhcmFtZXRlcnMgYmV0d2VlbiA8b21wdHM6b3JwaGFuOnBhcm1zPiB0YWdzLCBhZGRlZCBieSBqb29uCisgICAgKCRjb2RlKT0gcmVwbGFjZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCRjb2RlKTsKKyAgICAKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIG9ycGFobiByZWdpb25zIGFuZCBpdHMgdmFyaWFibGVzOgorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnZhcnMnLCcnLCcnLCgkY29kZSkpOworCisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gZm9yIG9ycGhhbmVkIGRpcmVjdGl2ZSBwYXJhbWV0ZXMsIGFkZGVkIGJ5IGpvb24KKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCcnLCgkY29kZSkpOworICAgIAorICAgIGlmKCR0ZXN0dHlwZSBlcSAidGVzdCIpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNoZWNrJywnJywnJywoJGNvZGUpKTsKKyAgICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsKCRjb2RlKSk7CQkKKyAgICB9CisgICAgZWxzaWYoJHRlc3R0eXBlIGVxICJjdGVzdCIpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIGNyb3NzdGVzdGNvZGUgYW5kIHJlbW92ZSB0aGUgY29kZSBmb3IgdGhlIHRlc3RzOiAKKyAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjaGVjaycsKCRjb2RlKSk7CQkKKyAgICB9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisgICAgKCRjb2RlKSA9IHJlcGxhY2VfdGFncygndGVzdGZ1bmN0aW9ubmFtZScsJHRlc3R0eXBlLiJfIi4kZnVuY3Rpb25uYW1lLCgkY29kZSkpOworICAgICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ2RpcmVjdGl2ZScsJGRpcmVjdGl2ZSwoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHRlc3R0eXBlLiJfIiwnJywoJGNvZGUpICk7CisjCSRjb2RlID0gICJcI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kY29kZTsKKyMgV3JpdGUgdGhlIHJlc3VsdCBpbnRvIHRoZSBmaWxlIGFuZCBjbG9zZSBpdDoKKyAgICBwcmludCBPVVRGSUxFICRjb2RlOworICAgIGNsb3NlKE9VVEZJTEUpOworICB9Cit9CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL29tcHRzX3BhcnNlckZ1bmN0aW9ucy5wbSBiL3JjMy90ZXN0c3VpdGUvb21wdHNfcGFyc2VyRnVuY3Rpb25zLnBtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4Y2VkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL29tcHRzX3BhcnNlckZ1bmN0aW9ucy5wbQpAQCAtMCwwICsxLDI4MCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgZnVuY3Rpb25zLnBtCisjIFRoaXMgcGFja2FnZSBjb250YWlucyBhIHNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIG9wZW5NUCBUZXN0dWl0ZS4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzdWJyb3V0aW5lcyB0byBleHRyYWN0LCBtb2RpZnkgb3IgZGVsZXRlIHRhZ3MgZnJvbSB0aGUgdGVtcGxhdGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTElTVCBnZXRfdGFnX3ZhbHVlcyggJHRhZ25hbWUsICRzdHJpbmcgKQorIyBzdWJydXRpbmUgdG8gZ2V0IHRoZSB0ZXh0IGVuY2xvZGVkIGJ5IGEgdGFnLgorIyBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSBpbm5lciB0ZXh0cyBvZiB0aGUgZm91bmQgdGFncworc3ViIGdldF90YWdfdmFsdWVzCit7CisJbXkgKCAkdGFnbmFtZSwgJHN0cmluZyApOworCSggJHRhZ25hbWUsICRzdHJpbmcgKSA9IEBfOworCW15IChAdG1wLEB0bXAyKTsKKyAgIAlAdG1wID0gc3BsaXQoL1w8JHRhZ25hbWVcPi8sJHN0cmluZyk7IAorCWZvcmVhY2ggJF8oQHRtcCl7CisJCXB1c2goQHRtcDIsc3BsaXQoL1w8XC8kdGFnbmFtZVw+LykpOworCX0KKwlteShAcmVzdWx0LCRpKTsKKwkkaT0xOyAjIGNvdXRlciB0byBnZXQgb25seSBldmVyeSBzZWNvbmQgaXRlbQorCWZvcmVhY2ggJF8oQHRtcDIpeworCQlpZigkaSUyIGVxIDApeworCQkJcHVzaChAcmVzdWx0LCRfKTsKKwkJfQorCQkkaSsrOworCX0KKwlyZXR1cm4gQHJlc3VsdDsKK30KKworIyBMSVNUIHJlcGxhY2VfdGFncyggJHRhZ25hbWUsICRyZXBsYWNlc3RyaW5nLCBAbGlzdCApCisjIHN1YnJ1dGluZSB0byByZXBsYWNlIHRhZ3MgYnkgYSByZXBsYWNlc3RyaW5nLiAKKyMgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHNyaW5ncyBhZnRlciBjb252ZXJzaW9uLgorc3ViIHJlcGxhY2VfdGFncworeworCW15ICgkdGFnbmFtZSwgJHJlcGxhY2VzdHJpbmcsIEBzdHJpbmdsaXN0LCBAcmVzdWx0KTsKKwkoJHRhZ25hbWUsICRyZXBsYWNlc3RyaW5nLCBAc3RyaW5nbGlzdCkgPSBAXzsKKwlmb3JlYWNoICRfKEBzdHJpbmdsaXN0KSB7CisJCXMjXDwkdGFnbmFtZVw+KC4qPylcPFwvJHRhZ25hbWVcPiMkcmVwbGFjZXN0cmluZyNnczsKKwkJcHVzaChAcmVzdWx0LCRfKTsKKwl9CisJcmV0dXJuIEByZXN1bHQ7Cit9CisKKyMgTElTVCBlbmxhcmdlX3RhZ3MoICR0YWduYW1lLCAkYmVmb3JlLCAkYWZ0ZXIsIEBsaXN0ICkKKyMgc3VicnV0aW5lIHRvIHJlcGxhY2UgdGFncyBieSB0aGUgdGFncyBhZGRlZCBieSBhIHN0cmluZyBiZWZvcmUgYW5kIGFmdGVyLiAKKyMgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHNyaW5ncyBhZnRlciBjb252ZXJzaW9uLgorc3ViIGVubGFyZ2VfdGFncworeworCW15ICgkdGFnbmFtZSwgJGJlZm9yZSwgJGFmdGVyLCBAc3RyaW5nbGlzdCxAcmVzdWx0KTsKKwkoJHRhZ25hbWUsICRiZWZvcmUsICRhZnRlciwgQHN0cmluZ2xpc3QpID0gQF87CisJZm9yZWFjaCAkXyhAc3RyaW5nbGlzdCkgeworCQlzI1w8JHRhZ25hbWVcPiguKj8pXDxcLyR0YWduYW1lXD4jJGJlZm9yZSQxJGFmdGVyI2dzOworCQlwdXNoKEByZXN1bHQsJF8pOworCX0KKwlyZXR1cm4gQHJlc3VsdDsKK30KKworIyBMSVNUIGRlbGV0ZV90YWdzKCAkdGFnbmFtZSwgQGxpc3QgKQorIyBzdWJydXRpbmUgdG8gZGVsZXRlIHRhZ3MgaW4gYSBzdHJpbmcuIAorIyBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY2xlYXJlZCBzdHJpbmdzCitzdWIgZGVsZXRlX3RhZ3MKK3sKKwlteSgkdGFnbmFtZSxAc3RyaW5nbGlzdCk7CisJKCR0YWduYW1lLCBAc3RyaW5nbGlzdCkgPSBAXzsKKwlteShAcmVzdWx0KTsKKwlmb3JlYWNoICRfKEBzdHJpbmdsaXN0KSB7CisJCXMjXDwkdGFnbmFtZVw+KC4qPylcPFwvJHRhZ25hbWVcPiMjZ3M7CisJCXB1c2goQHJlc3VsdCwkXyk7CisJfQorCXJldHVybiBAcmVzdWx0OworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc3Vicm91dGluZXMgZm9yIGdlbmVyYXRpbmcgIm9ycGFobmVkIiB0ZXN0cyAJCQkJCQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTQ0FMQVIgY3JlYXRlX29ycGhfY2Z1bmN0aW9ucyggJHByZWZpeCwgJGNvZGUgKQorIyByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBmdW5jdGlvbnMgZm9yIHRoZSAKKyMgb3JwaGFuIHJlZ2lvbnMuCitzdWIgY3JlYXRlX29ycGhfY2Z1bmN0aW9ucworeworCW15ICgkY29kZSxAZGVmcyk7CisJKCRjb2RlKSA9IEBfOworCUBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbicsJGNvZGUpOworCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKwlteSAoIEByZXN1bHQsJGZ1bmN0aW9uc3JjLCAkaSk7CisJJGZ1bmN0aW9uc3JjID0gICJcbi8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGRlZmluaXRpb25zIG9mIHRoZSBvcnBoYW4gZnVuY3Rpb25zICovXG4iOworCisJJGkgPSAxOworCWZvcmVhY2ggKEBkZWZzKSB7CisJCSRmdW5jdGlvbnNyYyAuPSAiXG52b2lkIG9ycGgkaVxfJGZ1bmN0aW9ubmFtZSAoRklMRSAqIGxvZ0ZpbGUpIHsiOworCQkkZnVuY3Rpb25zcmMgLj0gJF87CisJCSRmdW5jdGlvbnNyYyAuPSAiXG59XG4iOworCQkkaSsrOworCX0KKwkkZnVuY3Rpb25zcmMgLj0gIi8qIEVuZCBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBkZWZpbml0aW9ucyAqL1xuIjsKKwlyZXR1cm4gJGZ1bmN0aW9uc3JjOworfQorCisjIFNDQUxBUiBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zKCAkcHJlZml4LCAkY29kZSApCisjIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGZ1bmN0aW9ucyBmb3IgdGhlIAorIyBvcnBoYW4gcmVnaW9ucy4KK3N1YiBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zCit7CisJbXkgKCRwcmVmaXgsJGNvZGUsQGRlZnMsJG9ycGhhbl9wYXJtcyk7CisJKCRwcmVmaXgsJGNvZGUsJG9ycGhhbl9wYXJtcykgPSBAXzsKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW4nLCRjb2RlKTsKKworICAgICN0byByZW1vdmUgc3BhY2UgYW5kIHB1dCBhIHNpbmdsZSBzcGFjZQorICAgIGlmKCRvcnBoYW5fcGFybXMgbmUgIiIpCisgICAgeworICAgICAgJG9ycGhhbl9wYXJtcyA9fiBzL1sgXHRdKy8vc2c7CisgICAgICAkb3JwaGFuX3Bhcm1zID1+IHMvWyBcdF0rXG4vXG4vc2c7CisgICAgfQorICAgIAorCSgkb3JwaGFudmFyc2RlZnMpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjp2YXJzJywkY29kZSk7CisJZm9yZWFjaCAoQHZhcnNkZWYpIHsKKwkJaWYgKG5vdCAvW14gXG4kXSovKXsgJG9ycGhhbnZhcnNkZWZzID0gam9pbigiXG4iLCRvcnBoYW52YXJzZGVmLCRfKTt9CisJfQorCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKwlteSAoIEByZXN1bHQsJGZ1bmN0aW9uc3JjLCAkaSk7CisJJGZ1bmN0aW9uc3JjID0gICJcbiEgRGVmaW5pdGlvbnMgb2YgdGhlIG9ycGhhbiBmdW5jdGlvbnNcbiI7CisJJGkgPSAxOworCWZvcmVhY2ggJF8oQGRlZnMpCisJeworCQkkZnVuY3Rpb25zcmMgLj0gIlxuICAgICAgU1VCUk9VVElORSBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWVcKCRvcnBoYW5fcGFybXNcKVxuICAgICAgIjsKKyAgICAgICAgJGZ1bmN0aW9uc3JjIC49ICJJTkNMVURFIFwib21wX3Rlc3RzdWl0ZS5mXCJcbiI7CisJCSRmdW5jdGlvbnNyYyAuPSAkb3JwaGFudmFyc2RlZnMuIlxuIjsKKwkJJGZ1bmN0aW9uc3JjIC49ICRfOworCQkkZnVuY3Rpb25zcmMgLj0gIlxuIjsKKwkJJGZ1bmN0aW9uc3JjIC49ICIgICAgICBFTkQgU1VCUk9VVElORVxuISBFbmQgb2YgZGVmaW5pdGlvblxuXG4iOworCQkkaSsrOworCX0KKwlyZXR1cm4gJGZ1bmN0aW9uc3JjOworfQorCisjIExJU1Qgb3JwaGFuX3JlZ2lvbnMyY2Z1bmN0aW9ucyggJHByZWZpeCwgQGNvZGUgKQorIyByZXBsYWNlcyBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzIGluIEMvQysrLgorc3ViIG9ycGhhbl9yZWdpb25zMmNmdW5jdGlvbnMKK3sKKwlteSAoJGNvZGUsICRpLCAkZnVuY3Rpb25uYW1lKTsKKwkoJGNvZGUpID0gQF87CisJJGkgPSAxOworCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKyAgICAgICAgd2hpbGUoIC9cPG9tcHRzXDpvcnBoYW5cPiguKilcPFwvb21wdHNcOm9ycGhhblw+L3MpIHsKKyAgICAgICAgICAgIHMjXDxvbXB0c1w6b3JwaGFuXD4oLio/KVw8XC9vbXB0c1w6b3JwaGFuXD4jb3JwaCRpXF8kZnVuY3Rpb25uYW1lIChsb2dGaWxlKTsjczsKKyAgICAgICAgICAgICRpKys7CisgICAgICAgIH0KKwlyZXR1cm4gJGNvZGU7Cit9CisKKyMgTElTVCBvcnBoYW5fcmVnaW9uczJmb3J0cmFuZnVuY3Rpb25zKCAkcHJlZml4LCBAY29kZSApCisjIHJlcGxhY2VzIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHMgaW4gZm9ydHJhbgorc3ViIG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMKK3sKKwlteSAoICRwcmVmaXgsIEBjb2RlLCAkbXlfcGFybXMsICRpLCAkZnVuY3Rpb25uYW1lKTsKKwkoJHByZWZpeCwgKCRjb2RlKSwgJG15X3Bhcm1zKSA9IEBfOworCSRpID0gMTsKKwkoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkY29kZSk7CisJZm9yZWFjaCAkXygoJGNvZGUpKQorCXsKKwkJd2hpbGUoIC9cPG9tcHRzXDpvcnBoYW5cPiguKilcPFwvb21wdHNcOm9ycGhhblw+L3MpCisJCXsKKwkJCXMjXDxvbXB0c1w6b3JwaGFuXD4oLio/KVw8XC9vbXB0c1w6b3JwaGFuXD4jICAgICAgQ0FMTCBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWVcKCRteV9wYXJtc1wpOyNzOworCQkJJGkrKzsKKwkJfQorCX0KKwlyZXR1cm4gKCRjb2RlKTsKK30KKworIyBTQ0FMQVIgb3JwaF9mdW5jdGlvbnNfZGVjbGFyYXRpb25zKCAkcHJlZml4LCAkY29kZSApCisjIHJldHVybnMgYSBzcmluZyBpbmNsdWRpbmcgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCAKKyMgaW4gdGhlIG9ycGhhbiByZWdpb25zLiBUaGUgZnVuY3Rpb24gbmFtZXMgYXJlIGdlbmVyYXRlZCB1c2luZyAKKyMgdGhlICRwcmVmaXggYXMgcHJlZml4IGZvciB0aGUgZnVuY3Rpb25uYW1lLgorc3ViIG9ycGhfZnVuY3Rpb25zX2RlY2xhcmF0aW9ucworeworCW15ICgkcHJlZml4LCAkY29kZSk7CisJKCRwcmVmaXgsICRjb2RlKSA9IEBfOworCW15ICggQGRlZnMsICRyZXN1bHQgKTsKKwkKKwkjIGNyZWF0aW5nIGRlY2xhcmF0aW9ucyBmb3IgbGF0ZXIgdXNlZCBmdW5jdGlvbnMKKwkkcmVzdWx0IC49ICJcblxuLyogRGVjbGFyYXRpb24gb2YgdGhlIGZ1bmN0aW9ucyBjb250YWluaW5nIHRoZSBjb2RlIGZvciB0aGUgb3JwaGFuIHJlZ2lvbnMgKi9cbiNpbmNsdWRlIDxzdGRpby5oPlxuIjsKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW4nLCRjb2RlKTsKKwlteSAoJGZ1bmN0aW9ubmFtZSwkaSk7CisJKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJGNvZGUpOworCSRpID0gMTsKKwlmb3JlYWNoICRfKEBkZWZzKSB7CisJCSRyZXN1bHQgLj0gIlxudm9pZCBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWUgKCBGSUxFICogbG9nRmlsZSApOyI7CisJCSRpKys7CisJfQorCSRyZXN1bHQgLj0gIlxuXG4vKiBFbmQgb2YgZGVjbGFyYXRpb24gKi9cblxuIjsKKwlyZXR1cm4gJHJlc3VsdDsKK30KKworIyBTQ0FMQVIgbWFrZV9nbG9iYWxfdmFyc19kZWZpbml0aW9uKCAkY29kZSApCisjIHJldHVybnMgYSBzcmluZyBpbmNsdWRpbmcgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUgdmFycyBuZWVkZWQgdG8KKyMgYmUgZGVjbGFyZWQgZ2xvYmFsIGZvciB0aGUgb3JwaGFuIHJlZ2lvbi4KK3N1YiBtYWtlX2dsb2JhbF92YXJzX2RlZgoreworCW15ICggJGNvZGUgKTsKKwkoJGNvZGUpID0gQF87CisJbXkgKCBAZGVmcywgJHJlc3VsdCwgQHRtcCwgQHRtcDIgLCRwcmVkZWZpbml0aW9ucyk7CisJCisJIyBjcmVhdGluZyBnbG9iYWwgZGVjbGFyYXRpb25zIGZvciB0aGUgdmFyaWFibGVzLgorCSRyZXN1bHQgID0gIlxuXG4vKiBEZWNsYXJhdGlvbiBvZiB0aGUgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG9ycGhhbiByZWdpb24uICovXG4iOworCQorCSMgZ2V0IGFsbCB0YWdzIGNvbnRhaW5pbmcgdGhlIHZhcmlhYmxlIGRlZmluaXRpb25zCisJQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnZhcnMnLCRjb2RlKTsKKwlmb3JlYWNoICRfKEBkZWZzKQorCXsKKwkJIyBjdXR0aW5nIHRoZSBkaWZmZXJlbnQgZGVjbGFyYXRpb25zIGluIHRoZSBzYW1lIHRhZyBieSB0aGUgJzsnIGFzIGN1dHRtYXJrCisJCUB0bXAgPSBzcGxpdCgvOy8sJF8pOworCQlmb3JlYWNoICRfKEB0bXApCisJCXsKKwkJCSMgcmVwbGFjaW5nIG5ld2xpbmVzIGFuZCBkb3VibGUgc3BhY2VzCisJCQlzL1xuLy9nczsKKwkJCXMvICAvL2dzOworCQkJIyBwdXQgdGhlIG5ldyBkZWNsYXJhdGlvbiBhdCB0aGUgZW5kIG9mICRyZXN1bHQKKwkJCWlmKCRfIG5lICIiKXsgJHJlc3VsdCAuPSAiXG4gJF87IjsgfQorCQl9CisJfQorCSRyZXN1bHQgLj0gIlxuXG4vKiBFbmQgb2YgZGVjbGFyYXRpb24uICovXG5cbiI7CisJcmV0dXJuICRyZXN1bHQ7Cit9CisKKyMgU0NBTEFSIGV4dGVybl92YXJzX2RlZmluaXRpb24oICRjb2RlICkKKyMgcmV0dXJucyBhIHNyaW5nIGluY2x1ZGluZyB0aGUgZGVjbGFyYXRpb24gZm9yIHRoZSB2YXJzIG5lZWRlZCB0bworIyBiZSBkZWNsYXJlZCBleHRlcm4gZm9yIHRoZSBvcnBoYW4gcmVnaW9uLgorc3ViIGV4dGVybl92YXJzX2RlZgoreworCW15ICggJGNvZGUgKTsKKwkoJGNvZGUpID0gQF87CisJbXkgKCBAZGVmcywgJHJlc3VsdCwgQHRtcCwgQHRtcDIgLCRwcmVkZWZpbml0aW9ucyk7CisJCisJIyBjcmVhdGluZyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBleHRlcm4gdmFyaWFibGVzLgorCSRyZXN1bHQgID0gIlxuXG4vKiBEZWNsYXJhdGlvbiBvZiB0aGUgZXh0ZXJuIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBvcnBoYW4gcmVnaW9uLiAqL1xuIjsKKwkjICRyZXN1bHQgLj0gIlxuI2luY2x1ZGUgPHN0ZGlvLmg+XG4jaW5jbHVkZSA8b21wLmg+XG4iOworCSRyZXN1bHQgLj0gIlxuZXh0ZXJuIEZJTEUgKiBsb2dGaWxlOyI7CisJCisJIyBnZXQgYWxsIHRhZ3MgY29udGFpbmluZyB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW46dmFycycsJGNvZGUpOworCWZvcmVhY2ggJF8oQGRlZnMpCisJeworCQkjIGN1dHRpbmcgdGhlIGRpZmZlcmVudCBkZWNsYXJhdGlvbnMgaW4gdGhlIHNhbWUgdGFnIGJ5IHRoZSAnOycgYXMgY3V0dG1hcmsKKwkJQHRtcCA9IHNwbGl0KC87LywkXyk7CisJCWZvcmVhY2ggJF8oQHRtcCkKKwkJeworCQkJIyByZXBsYWNpbmcgbmV3bGluZXMgYW5kIGRvdWJsZSBzcGFjZXMKKwkJCXMvXG4vL2dzOworCQkJcy8gIC8vZ3M7CisJCQkjIGN1dHRpbmcgb2ZmIGRlZmluaXRpb25zCisJCQlAdG1wMiA9IHNwbGl0KCI9IiwkXyk7CisJCQkjIHB1dCB0aGUgbmV3IGRlY2xhcmF0aW9uIGF0IHRoZSBlbmQgb2YgJHJlc3VsdAorCQkJJHJlc3VsdCAuPSAiXG5leHRlcm4gJHRtcDJbMF07IjsKKwkJfQorCX0KKwkkcmVzdWx0IC49ICJcblxuLyogRW5kIG9mIGRlY2xhcmF0aW9uLiAqL1xuXG4iOworCXJldHVybiAkcmVzdWx0OworfQorCitzdWIgbGVhdmVfc2luZ2xlX3NwYWNlCit7CisgIG15KCRzdHIpOworICAoJHN0cik9QF87CisgIGlmKCRzdHIgbmUgIiIpCisgIHsKKyAgICAkc3RyID1+IHMvXlsgXHRdKy8gLzsKKyAgICAkc3RyID1+IHMvWyBcdF0rXG4kL1xuLzsKKyAgICAkc3RyID1+IHMvWyBcdF0rLy9nOworICB9CisgIHJldHVybiAkc3RyOworfQorCityZXR1cm4gMTsKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuYyBiL3JjMy90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTFiNTkzCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5jCkBAIC0wLDAgKzEsNTEgQEAKK2ludCBtYWluKCkKK3sKKwlpbnQgaTsJCQkvKiBMb29wIGluZGV4ICovCisJaW50IHJlc3VsdDsJCS8qIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJvZ3JhbSAqLworCWludCBmYWlsZWQ9MDsgCQkvKiBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzICovCisJaW50IHN1Y2Nlc3M9MDsJCS8qIG51bWJlciBvZiBzdWNjZWVkZWQgdGVzdHMgKi8KKwlzdGF0aWMgRklMRSAqIGxvZ0ZpbGU7CS8qIHBvaW50ZXIgb250byB0aGUgbG9nZmlsZSAqLworCXN0YXRpYyBjb25zdCBjaGFyICogbG9nRmlsZU5hbWUgPSAiPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPi5sb2ciOwkvKiBuYW1lIG9mIHRoZSBsb2dmaWxlICovCisKKworCS8qIE9wZW4gYSBuZXcgTG9nZmlsZSBvciBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIG9uZS4gKi8KKwlsb2dGaWxlID0gZm9wZW4obG9nRmlsZU5hbWUsIncrIik7CisKKwlwcmludGYoIiMjIyMjIyMjIE9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlIFYgJXMgIyMjIyMjXG4iLCBPTVBUU19WRVJTSU9OICk7CisJcHJpbnRmKCIjIyBSZXBldGl0aW9uczogJTNkICAgICAgICAgICAgICAgICAgICAgICAjIyMjXG4iLFJFUEVUSVRJT05TKTsKKwlwcmludGYoIiMjIExvb3AgQ291bnQgOiAlNmQgICAgICAgICAgICAgICAgICAgICMjIyNcbiIsTE9PUENPVU5UKTsKKwlwcmludGYoIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIpOworCXByaW50ZigiVGVzdGluZyA8ZGlyZWN0aXZlPjwvZGlyZWN0aXZlPlxuXG4iKTsKKworCWZwcmludGYobG9nRmlsZSwiIyMjIyMjIyMgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgViAlcyAjIyMjIyNcbiIsIE9NUFRTX1ZFUlNJT04gKTsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiMjIFJlcGV0aXRpb25zOiAlM2QgICAgICAgICAgICAgICAgICAgICAgICMjIyNcbiIsUkVQRVRJVElPTlMpOworCWZwcmludGYobG9nRmlsZSwiIyMgTG9vcCBDb3VudCA6ICU2ZCAgICAgICAgICAgICAgICAgICAgIyMjI1xuIixMT09QQ09VTlQpOworCWZwcmludGYobG9nRmlsZSwiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIik7CisJZnByaW50Zihsb2dGaWxlLCJUZXN0aW5nIDxkaXJlY3RpdmU+PC9kaXJlY3RpdmU+XG5cbiIpOworCisJZm9yICggaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrICkgeworCQlmcHJpbnRmIChsb2dGaWxlLCAiXG5cbiVkLiBydW4gb2YgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiBvdXQgb2YgJWRcblxuIixpKzEsUkVQRVRJVElPTlMpOworCQlpZig8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+KGxvZ0ZpbGUpKXsKKwkJCWZwcmludGYobG9nRmlsZSwiVGVzdCBzdWNjZXNzZnVsLlxuIik7CisJCQlzdWNjZXNzKys7CisJCX0KKwkJZWxzZSB7CisJCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yOiBUZXN0IGZhaWxlZC5cbiIpOworCQkJcHJpbnRmKCJFcnJvcjogVGVzdCBmYWlsZWQuXG4iKTsKKwkJCWZhaWxlZCsrOworCQl9CisJfQorCisgICAgaWYoZmFpbGVkPT0wKXsKKwkJZnByaW50Zihsb2dGaWxlLCJcbkRpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMuXG4iKTsKKwkJcHJpbnRmKCJEaXJlY3RpdmUgd29ya2VkIHdpdGhvdXQgZXJyb3JzLlxuIik7CisJCXJlc3VsdD0wOworCX0KKwllbHNleworCQlmcHJpbnRmKGxvZ0ZpbGUsIlxuRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAlaSB0aW1lcyBvdXQgb2YgJWkuICVpIHdlcmUgc3VjY2Vzc2Z1bFxuIixmYWlsZWQsUkVQRVRJVElPTlMsc3VjY2Vzcyk7CisJCXByaW50ZigiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAlaSB0aW1lcyBvdXQgb2YgJWkuXG4laSB0ZXN0KHMpIHdlcmUgc3VjY2Vzc2Z1bFxuIixmYWlsZWQsUkVQRVRJVElPTlMsc3VjY2Vzcyk7CisJCXJlc3VsdCA9IChpbnQpICgoKGRvdWJsZSkgZmFpbGVkIC8gKGRvdWJsZSkgUkVQRVRJVElPTlMgKSAqIDEwMCApOworCX0KKwlwcmludGYgKCJSZXN1bHQ6ICVpXG4iLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmYgYi9yYzMvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmY2FiNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuZgpAQCAtMCwwICsxLDY4IEBACishVGhpcyBpcyB0aGUgbWFpbiBkcml2ZXIgdG8gaW52b2tlIGRpZmZlcmVudCB0ZXN0IGZ1bmN0aW9ucworICAgICAgUFJPR1JBTSA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+X21haW4KKyAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgIElOVEVHRVIgZmFpbGVkLCBzdWNjZXNzICFOdW1iZXIgb2YgZmFpbGVkL3N1Y2NlZWRlZCB0ZXN0cworICAgICAgSU5URUdFUiBudW1fdGVzdHMsY3Jvc3NjaGVja2VkLCBjcm9zc2ZhaWxlZCwgagorICAgICAgSU5URUdFUiB0ZW1wLHRlbXAxCisgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgIElOVEVHRVIgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPgorCisKKyAgICAgIENIQVJBQ1RFUio1MCBsb2dmaWxlbmFtZSAhUG9pbnRlciB0byBsb2dmaWxlCisgICAgICBJTlRFR0VSIHJlc3VsdCAKKworICAgICAgbnVtX3Rlc3RzID0gMAorICAgICAgY3Jvc3NjaGVja2VkID0gMAorICAgICAgY3Jvc3NmYWlsZWQgPSAwCisgICAgICByZXN1bHQgPSAxCisgICAgICBmYWlsZWQgPSAwCisKKyAgICAgICFPcGVuIGEgbmV3IGxvZ2ZpbGUgb3Igb3ZlcndyaXRlIHRoZSBleGlzdGluZyBvbmUuCisgICAgICBsb2dmaWxlbmFtZSA9ICJiaW4vZm9ydHJhbi88dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+LmxvZyIKKyEgICAgICBXUklURSAoKiwqKSAiRW50ZXIgbG9nRmlsZW5hbWU6IiAKKyEgICAgICBSRUFEICAoKiwqKSBsb2dmaWxlbmFtZQorCisgICAgICBPUEVOICgxLCBGSUxFID0gbG9nZmlsZW5hbWUpCisgCisgICAgICBXUklURSAoKiwqKSAiIyMjIyMjIyMgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgViAzLjBhICMjIyMjIyIKKyAgICAgIFdSSVRFICgqLCopICIjIyBSZXBldGl0aW9uczoiLCBOIAorICAgICAgV1JJVEUgKCosKikgIiMjIExvb3AgQ291bnQgOiIsIExPT1BDT1VOVAorICAgICAgV1JJVEUgKCosKikgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisgICAgICBXUklURSAoKiwqKQorCisgICAgICBjcm9zc2ZhaWxlZD0wCisgICAgICByZXN1bHQ9MQorICAgICAgV1JJVEUgKDEsKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgV1JJVEUgKDEsKikgIlRlc3RpbmcgPGRpcmVjdGl2ZT48L2RpcmVjdGl2ZT4iCisgICAgICBXUklURSAoMSwqKSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICBXUklURSAoMSwqKSAKKyAgICAgIFdSSVRFICgxLCopICJ0ZXN0bmFtZTogPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiIKKyAgICAgIFdSSVRFICgxLCopICIoQ3Jvc3N0ZXN0cyBzaG91bGQgZmFpbCkiCisgICAgICBXUklURSAoMSwqKQorICAgICAgCisgICAgICBETyBqID0gMSwgTgorICAgICAgICB0ZW1wID0gIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJRiAodGVtcCAuRVEuIDEpIFRIRU4KKyAgICAgICAgICBXUklURSAoMSwqKSAgaiwgIi4gdGVzdCBzdWNjZXNzZnVsLiIKKyAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyArIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIFdSSVRFICgxLCopICJFcnJvcjogIixqLCAiLiB0ZXN0IGZhaWxlZC4iCisgICAgICAgICAgZmFpbGVkID0gZmFpbGVkICsgMQorICAgICAgICBFTkRJRgorICAgICAgRU5EIERPCisKKyAgICAgIAorICAgICAgSUYgKGZhaWxlZCAuRVEuIDApIFRIRU4KKyAgICAgICAgV1JJVEUgKDEsKikgIkRpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMuIgorICAgICAgICBXUklURSAoKiwqKSAiRGlyZWN0aXZlIHdvcmtlZCB3aXRob3V0IGVycm9ycy4iCisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgV1JJVEUgKCosKikgIlJlc3VsdDoiLHJlc3VsdAorICAgICAgRUxTRQorICAgICAgICBXUklURSAoMSwqKSAiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAiLCBmYWlsZWQsICIgdGltZXMuIgorICAgICAgICBXUklURSAoKiwqKSAiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAiLCBmYWlsZWQsICIgdGltZXMuIgorICAgICAgICByZXN1bHQgPSBmYWlsZWQgKiAxMDAgLyBOCisgICAgICAgIFdSSVRFICgqLCopICJSZXN1bHQ6IixyZXN1bHQKKyAgICAgIEVORElGCisgICAgICBDQUxMIEVYSVQgKHJlc3VsdCkKKyAgICAgIEVORCBQUk9HUkFNIApkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9ydW50ZXN0LnBsIGIvcmMzL3Rlc3RzdWl0ZS9ydW50ZXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0NzIzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL3J1bnRlc3QucGwKQEAgLTAsMCArMSw1OTIgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyBydW50ZXN0IFtvcHRpb25zXSBGSUxFTkFNRQorIworIyBSZWFkIHRoZSBmaWxlIEZJTEVOQU1FLiBFYWNoIGxpbmUgY29udGFpbnMgYSB0ZXN0LgorIyBDb252ZXJ0IHRlbXBsYXRlIHRvIHRlc3QgYW5kIGNyb3NzdGVzdC4KKyMgSWYgcG9zc2lsYmxlIGdlbmVyYXRlIG9ycGhhbmVkIHRlc3R2ZXJzaW9ucywgdG9vLgorIyBVc2UgbWFrZSB0byBjb21waWxlIHRoZSB0ZXN0CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdsb2JhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBydW50ZXN0c2NyaXB0IGl0c2VsZjoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgbmFtZSBvZiB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIHRlc3RzdWl0ZToKKyRjb25maWdfZmlsZSAgICA9ICJvbXB0cy5jb25mIjsKKyRsb2dmaWxlICAgICAgICA9ICJvbXB0cy5sb2ciOyAjIG92ZXJ3cml0ZWFibGUgYnkgdmFsdWUgaW4gY29uZmlnIGZpbGUKKyRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCA9ICdPTVBfTlVNX1RIUkVBRFM9JW47IGV4cG9ydCBPTVBfTlVNX1RIUkVBRFM7JzsKKyRkZWJ1Z19tb2RlICAgICA9IDA7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBZnRlciB0aGlzIGxpbmUgdGhlIHNjcmlwdCBwYXJ0IGJlZ2lucyEgRG8gbm90IGVkaXQgYW5pdGhpbmcgYmVsb3cKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyBOYW1lc3BhY2VzOgordXNlIEdldG9wdDo6TG9uZzsKKyN1c2UgVW5peDo6UElEOwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBvbXB0c19wYXJzZXJGdW5jdGlvbnM7CisKKyMgRXh0cmFjdGluZyBnaXZlbiBvcHRpb25zCitHZXRPcHRpb25zKCJoZWxwIiwKKyAgICAgICJsaXN0bGFuZ3VhZ2VzIiwKKyAgICAgICJsYW5nPXMiLAorICAgICAgImxpc3QiLAorICAgICAgInRlc3RpbmZvPXMiLAorICAgICAgIm51bXRocmVhZHM9aSIsCisgICAgICAidGVzdD1zIiwKKyAgICAgICJjb21waWxlISIsCisgICAgICAicnVuISIsCisgICAgICAib3JwaGFuISIsCisgICAgICAicmVzdWx0ZmlsZT1zIgorICAgICAgKTsKKworIyBHZXQgZ2xvYmFsIGNvbmZpZ3VyYXRpbm8gb3B0aW9ucyBmcm9tIGNvbmZpZyBmaWxlOgoraWYoISAtZSAkY29uZmlnX2ZpbGUpeyBlcnJvciAoIkNvdWxkIG5vdCBmaW5kIGNvbmZpZyBmaWxlICRjb25maWdfZmlsZVxuIiwgMSk7fQorb3BlbiAoQ09ORklHLCAiPCRjb25maWdfZmlsZSIpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gY29uZmlnIGZpbGUgJGNvbmZpZ19maWxlXG4iLCAyKTsKK3doaWxlICg8Q09ORklHPikgeyAkY29uZmlnIC49ICRfOyB9CitjbG9zZSAoQ09ORklHKTsKKworKCRsb2dmaWxlKSA9IGdldF90YWdfdmFsdWVzICgibG9nZmlsZSIsICRjb25maWcpOworKCR0aW1lb3V0KSA9IGdldF90YWdfdmFsdWVzICgic2luZ2xldGVzdHRpbWVvdXQiLCAkY29uZmlnKTsKKygkZGlzcGxheV9lcnJvcnMpID0gZ2V0X3RhZ192YWx1ZXMoImRpc3BsYXllcnJvcnMiLCAkY29uZmlnKTsKKygkZGlzcGxheV93YXJuaW5ncykgPSBnZXRfdGFnX3ZhbHVlcyAoImRpc3BsYXl3YXJuaW5ncyIsICRjb25maWcpOworKCRudW10aHJlYWRzKSA9IGdldF90YWdfdmFsdWVzICgibnVtdGhyZWFkcyIsICRjb25maWcpOworKCRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCkgPSBnZXRfdGFnX3ZhbHVlcygiZW52c2V0dGhyZWFkc2NvbW1hbmQiLCRjb25maWcpOworJGVudl9zZXRfdGhyZWFkc19jb21tYW5kID1+IHMvXCVuLyRudW10aHJlYWRzL2c7CitAbGFuZ3VhZ2VzID0gZ2V0X3RhZ192YWx1ZXMgKCJsYW5ndWFnZSIsICRjb25maWcpOworCitpZiAoIWRlZmluZWQoJG9wdF9jb21waWxlKSkgeyRvcHRfY29tcGlsZSA9IDE7fQoraWYgKCFkZWZpbmVkKCRvcHRfcnVuKSkgICAgIHskb3B0X3J1biA9IDE7fQoraWYgKCFkZWZpbmVkKCRvcHRfb3JwaGFuKSkgeyRvcHRfb3JwaGFuID0gMTt9CitpZiAoIWRlZmluZWQoJG9wdF9yZXN1bHRzZmlsZSkpIHsoJG9wdF9yZXN1bHRzZmlsZSkgPSBnZXRfdGFnX3ZhbHVlcygicmVzdWx0c2ZpbGUiLCAkY29uZmlnKTt9CitpZiAoIGRlZmluZWQoJG9wdF9udW10aHJlYWRzKSAmJiAoJG9wdF9udW10aHJlYWRzID4gMCkpIHskbnVtdGhyZWFkcyA9ICRvcHRfbnVtdGhyZWFkczt9CitpZiAoJGRlYnVnX21vZGUpIHsKK3ByaW50IDw8RU9GOworVGVzdHN1aXRlIGNvbmZpZ3VyYXRpb246CitMb2dmaWxlID0gJGxvZ2ZpbGUKK1RpbWVvdXQgPSAkdGltZW91dCBzZWNvbmRzCitMYW5ndWFnZTogICRvcHRfbGFuZworRGlzcGxheSBlcnJvcnM6ICAgJGRpc3BsYXlfZXJyb3JzCitEaXNwbGF5IHdhcm5pbmdzOiAkZGlzcGxheV93YXJuaW5ncworUmVzdWx0c2ZpbGU6ICAgICAgJG9wdF9yZXN1bHRzZmlsZQorTnVtdGhyZWFkczogJG51bXRocmVhZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU9GCit9CisKKyRudW1fY29uc3RydWNzICAgID0gMDsKKyRudW1fdGVzdHMgICAgICAgID0gMDsKKyRudW1fZmFpbGVkX3Rlc3RzID0gMDsKKyRudW1fc3VjY2Vzc2Z1bF90ZXN0cyAgID0gMDsKKyRudW1fdmVyaWZpZWRfdGVzdHMgICAgID0gMDsKKyRudW1fZmFpbGVkX2NvbXBpbGF0aW9uID0gMDsKKworJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkID0gMDsKKyRudW1fbm9ybWFsX3Rlc3RzX2NvbXBpbGVfZXJyb3IgPSAwOworJG51bV9ub3JtYWxfdGVzdHNfdGltZWRfb3V0ID0gMDsKKyRudW1fbm9ybWFsX3Rlc3RzX3N1Y2Nlc3NmdWwgPSAwOworJG51bV9ub3JtYWxfdGVzdHNfdmVyaWZpZWQgPSAwOworCiskbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZCA9IDA7CiskbnVtX29ycGhhbmVkX3Rlc3RzX2NvbXBpbGVfZXJyb3IgPSAwOworJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQgPSAwOworJG51bV9vcnBoYW5lZF90ZXN0c19zdWNjZXNzZnVsID0gMDsKKyRudW1fb3JwaGFuZWRfdGVzdHNfdmVyaWZpZWQgPSAwOworCitpZiAoJG9wdF9oZWxwKSAgICAgICAgIHsgcHJpbnRfaGVscF90ZXh0ICgpOyAgIGV4aXQgMDsgfQoraWYgKCRvcHRfbGlzdGxhbmd1YWdlcyl7IHByaW50X2F2YWlsX2xhbmdzICgpOyBleGl0IDA7IH0KK2lmICgkb3B0X2xpc3QpICAgICB7IHByaW50X2F2YWlsX3Rlc3RzICgpOyAgIGV4aXQgMDsgfQoraWYgKCRvcHRfdGVzdGluZm8pIHsgcHJpbnRfdGVzdGluZm8gKCk7ICAgICAgZXhpdCAwOyB9CitpZiAoJG9wdF90ZXN0KSAgICAgeyB3cml0ZV9yZXN1bHRfZmlsZV9oZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICBleGVjdXRlX3NpbmdsZV90ZXN0ICgpOyBleGl0IDA7IH0KK2lmICgtZSAkQVJHVlswXSkgICB7IHdyaXRlX3Jlc3VsdF9maWxlX2hlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVfdGVzdGxpc3QoJEFSR1ZbMF0pOyBwcmludF9yZXN1bHRzKCk7CisgICAgICAgICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeSgpOyBleGl0IDA7fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzdWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRnVuY3Rpb24gd2hpY2ggcHJpbnRzIHRoZSByZXN1bHRzIGZpbGUKK3N1YiBwcmludF9yZXN1bHRzCit7CisgICAgc3lzdGVtKCJlY2hvOyBjYXQgJG9wdF9yZXN1bHRzZmlsZTsgZWNobzsiKTsKK30KKworIyBGdW5jdGlvbiB3aGljaCBwcmludHMgYSBzdW1tYXJ5IG9mIGFsbCB0ZXN0CitzdWIgcmVzdWx0X3N1bW1hcnkKK3sKKyAgICBteSAkbnVtX2RpcmVjdGl2ZXMgPSBAdGVzdF9yZXN1bHRzOworCisgICAgcHJpbnQgPDxFT0Y7CisKK1N1bW1hcnk6CitTIE51bWJlciBvZiB0ZXN0ZWQgT3BlbiBNUCBjb25zdHJ1Y3RzOiAkbnVtX2NvbnN0cnVjdHMKK1MgTnVtYmVyIG9mIHVzZWQgdGVzdHM6ICAgICAgICAgICAgICAgICRudW1fdGVzdHMKK1MgTnVtYmVyIG9mIGZhaWxlZCB0ZXN0czogICAgICAgICAgICAgICRudW1fZmFpbGVkX3Rlc3RzCitTIE51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzOiAgICAgICAgICAkbnVtX3N1Y2Nlc3NmdWxfdGVzdHMKK1MgKyBmcm9tIHRoaXMgd2VyZSB2ZXJpZmllZDogICAgICAgICAgICRudW1fdmVyaWZpZWRfdGVzdHMKKworTm9ybWFsIHRlc3RzOgorTiBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzOiAgICAgICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkCitOICsgZnJvbSB0aGlzIGZhaWwgY29tcGlsYXRpb246ICAgICAgICAkbnVtX25vcm1hbF90ZXN0c19jb21waWxlX2Vycm9yCitOICsgZnJvbSB0aGlzIHRpbWVkIG91dCAgICAgICAgICAgICAgICAkbnVtX25vcm1hbF90ZXN0c190aW1lZF9vdXQKK04gTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHM6ICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX3N1Y2Nlc3NmdWwKK04gKyBmcm9tIHRoaXMgd2VyZSB2ZXJpZmllZDogICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX3ZlcmlmaWVkCisKK09ycGhhbmVkIHRlc3RzOgorTyBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzOiAgICAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c19mYWlsZWQKK08gKyBmcm9tIHRoaXMgZmFpbCBjb21waWxhdGlvbjogICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfY29tcGlsZV9lcnJvcgorTyArIGZyb20gdGhpcyB0aW1lZCBvdXQgICAgICAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQKK08gTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHM6ICAgICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfc3VjY2Vzc2Z1bAorTyArIGZyb20gdGhpcyB3ZXJlIHZlcmlmaWVkOiAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c192ZXJpZmllZAorRU9GCisKK30KKworIyBGdW5jdGlvbiB0aGF0IGV4ZWN1dGVzdCB0aGUgdGVzdHMgc3BlY2lmaWVkIGluIHRoZSBnaXZlbiBsaXN0CitzdWIgZXhlY3V0ZV90ZXN0bGlzdAoreworICAgIG15ICgkZmlsZW5hbWUpID0gQF87CisgICAgIyBvcGVuaW5nIHRlc3RsaXN0CisgICAgb3BlbihURVNUUywkZmlsZW5hbWUpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gICRmaWxlbmFtZVxuIiwgMSk7CitURVNUOiB3aGlsZSAoPFRFU1RTPikgeworICAgICAgICBpZiAoL15ccyojLykge25leHQgVEVTVDt9CisgICAgICAgIGlmICgvXlxzKiQvKSB7bmV4dCBURVNUO30KKyAgICAgICAgJG9wdF90ZXN0ID0gJF87CisgICAgICAgIGNob21wICgkb3B0X3Rlc3QpOworICAgICAgICBleGVjdXRlX3NpbmdsZV90ZXN0ICgpOworICAgIH0KKyMgcHJpbnQgRHVtcGVyKEB0ZXN0X3Jlc3VsdHMpOworfQorCisjIEZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYSBzeXN0ZW0gY29tbWFuZCBidXQgdGFrZXMgY2FyZSBvZiB0aGUgZ2xvYmFsIHRpbWVvdXQKKyMgSWYgY29tbWFuZCBkaWQgbm90IGZpbmlzaCBpbmJldHdlZW4gcmV0dXJucyAnLScgb3RoZXJ3aXNlIHRoZSBleGl0IHN0YXR1cyBvZgorIyB0aGUgc3lzdGVtIGNvbW1hbmQKK3N1YiB0aW1lZF9zeXNfY29tbWFuZAoreworICAgIG15ICgkY29tbWFuZCkgPSBAXzsKKyAgICBteSAkZXhpdF9zdGF0dXMgPSAnLSc7CisKKyMgc2V0IHVwIHRoZSB0aW1lb3V0IGZvciB0aGUgY29tbWFuZAorICAgIGV2YWwgeworICAgICAgICBsb2NhbCAkU0lHe0FMUk19ID0gc3ViIHtkaWUgImFsYXJtXG4ifTsKKyAgICAgICAgYWxhcm0gJHRpbWVvdXQ7CisgICAgICAgIGxvZ19tZXNzYWdlX2FkZCAoIlN0YXJ0aW5nIGNvbW1hbmQgXCIkY29tbWFuZFwiIik7CisgICAgICAgICRleGl0X3N0YXR1cyA9IHN5c3RlbSAoJGNvbW1hbmQpOworICAgICAgICBhbGFybSAwOworICAgIH07CisjIGNoZWNrIGlmIGNvbW1hbmQgZmluaXNoZWQgZHVyaW5nIHRoZSBtYXhpbXVtIGV4ZWN1dGlvbiB0aW1lCisgICAgaWYgKCRAIGVxICJhbGFybVxuIikgeworIyB0ZXN0IHRpbWVkIG91dAorIwkJbXkgJHBpZCA9IFVuaXg6OlBJRC0+bmV3KCk7CisjCQkkcGlkLT5nZXRfcGlkb2YoJGNvbW1hbmQsIDEpOworIwkJJHBpZC0+a2lsbCgpOworICAgICAgICBpZiAoJGRlYnVnX21vZGUpIHsKKwkgICAgbG9nX21lc3NhZ2VfYWRkICgiQ29tbWFuZCBcIiRjb21tYW5kXCIgcmVhY2hlZCBtYXggZXhlY3V0aW9uIHRpbWUuXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIlRPIjsKKyAgICB9CisjIHRlc3QgZmluaXNoZWQKKyAgICByZXR1cm4gJGV4aXRfc3RhdHVzOworfQorCisjIEZ1bmN0aW9uIHRoYXQgcnVucyB0aGUgdGVzdHMgZ2l2ZW4gYXMgYSBhcnJheSBjb250YWluaW5nIHRoZSB0ZXN0bmFtZXMKKyMgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwZXJjZW50IHZhbHVlcyBvZiB0aGUgcGFzc2VkIHRlc3RzIGFuZCB0aGUKKyMgc3VjY2Vzc2Z1bCBjcm9zc3Rlc3RzLgorc3ViIHJ1bl90ZXN0Cit7CisgICAgbXkgKCR0ZXN0bmFtZSwgJG9ycGhhbikgPSBAXzsKKyAgICBteSAkYmluX25hbWUsICRjYmluX25hbWU7CisgICAgbXkgJGNtZCwgJGV4aXRfc3RhdHVzLCAkZmFpbGVkOworICAgIG15ICRyZXN1bHR0ZXN0LCAkcmVzdWx0Y3Rlc3Q7CisKKyMgcGF0aCB0byB0ZXN0IGFuZCBjcm9zc3Rlc3QgZWl0aGVyIGluIG5vcm1hbCBvciBpbiBvcnBoYW5lZCB2ZXJzaW9uCisgICAgaWYgKCRvcnBoYW4pIHsKKyAgICAgICAgJGJpbl9uYW1lICA9ICJiaW4vJG9wdF9sYW5nL29ycGhfdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY2Jpbl9uYW1lID0gImJpbi8kb3B0X2xhbmcvb3JwaF9jdGVzdF8kdGVzdG5hbWUiOworICAgIH0gZWxzZSB7CisgICAgICAgICRiaW5fbmFtZSAgPSAiYmluLyRvcHRfbGFuZy90ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRjYmluX25hbWUgPSAiYmluLyRvcHRfbGFuZy9jdGVzdF8kdGVzdG5hbWUiOworICAgIH0KKyMgQ2hlY2sgaWYgZXhlY3V0YWJsZXMgZXhpc3QKKyAgICBpZiAoISAtZSAkYmluX25hbWUpIHsKKyAgICAgICAgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIGV4ZWN1dGFibGUgXCIkYmluX25hbWVcIi4iKTsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJy0nLCAnY3Jvc3N0ZXN0JyA9PiAnLScpOworICAgIH0KKyMgcnVuIHRoZSB0ZXN0CisgICAgJGNtZCA9ICIkZW52X3NldF90aHJlYWRzX2NvbW1hbmQgLi8kYmluX25hbWUgPiRiaW5fbmFtZS5vdXQiOworICAgIHByaW50ICJSdW5uaW5nIHRlc3Qgd2l0aCAkbnVtdGhyZWFkcyB0aHJlYWRzIC4iOworICAgICRleGl0X3N0YXR1cyA9IHRpbWVkX3N5c19jb21tYW5kICgkY21kKTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayBpZiB0ZXN0IGZpbmlzaGVkIHdpdGhpbiBtYXggZXhlY3V0aW9uIHRpbWUKKyAgICBpZiAoJGV4aXRfc3RhdHVzIGVxICdUTycpIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkICh0aW1lb3V0KVxuIjsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJ1RPJywgJ2Nyb3NzdGVzdCcgPT4gJy0nKQorICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjaGVjayBpZiBhbGwgdGVzdHMgd2VyZSBzdWNjZXNzZnVsCisgICAgJGZhaWxlZCA9ICRleGl0X3N0YXR1cyA+PiA4OworICAgIGlmICgkZmFpbGVkIDwgMCBvciAkZmFpbGVkID4gMTAwKSB7ICRmYWlsZWQgPSAxMDA7IH0KKyAgICAkcmVzdWx0dGVzdCA9IDEwMCAtICRmYWlsZWQ7CisgICAgaWYgKCRyZXN1bHR0ZXN0IGVxIDEwMCkgeworICAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzIC4uLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkICRmYWlsZWRcJSBvZiB0aGUgdGVzdHNcbiI7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHR0ZXN0LCAnY3Jvc3N0ZXN0JyA9PiAnLScpOworICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRvIGNyb3NzdGVzdAorIyBjaGVjayBpZiBleGVjdXRhYmxlIGV4aXN0CisgICAgaWYgKCEgLWUgJGNiaW5fbmFtZSkgeworICAgICAgICB0ZXN0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgZXhlY3V0YWJsZSBcIiRjYmluX25hbWVcIi4iKTsKKyAgICAgICAgcHJpbnQgIi4uLiBub3QgdmVyaWZpZWQgKGNyb3NzdGVzdCBtaXNzaW5nKVxuIjsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJHJlc3VsdHRlc3QsICdjcm9zc3Rlc3QnID0+ICctJyk7CisgICAgfQorIyBydW4gY3Jvc3N0ZXN0CisjIFRlc3Qgd2FzIHN1Y2Nlc3NmdWwsIHNvIGl0IG1ha2VzIHNlbnNlIHRvIHJ1biB0aGUgY3Jvc3N0ZXN0CisgICAgJGNtZCA9ICIkZW52X3NldF90aHJlYWRzX2NvbW1hbmQgLi8kY2Jpbl9uYW1lID4gJGNiaW5fbmFtZS5vdXQiOworICAgICRleGl0X3N0YXR1cyA9IHRpbWVkX3N5c19jb21tYW5kICgkY21kKTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayBpZiBjcm9zc3Rlc3QgZmluaXNoZWQgd2l0aGluIG1heCBleGVjdXRpb24gdGltZQorICAgIGlmICgkZXhpdF9zdGF0dXMgZXEgJ1RPJykgeworICAgICAgICBwcmludCAiLi4uIG5vdCB2ZXJpZmllZCAodGltZW91dClcbiI7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHQsICdjcm9zc3Rlc3QnID0+ICdUTycpOworICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0ZXN0IGlmIGNyb3NzdGVzdHMgZmFpbGVkIGFzIGV4cGVjdGVkCisgICAgJHJlc3VsdGN0ZXN0ID0gJGV4aXRfc3RhdHVzID4+IDg7CisgICAgaWYgKCRyZXN1bHRjdGVzdCA+IDApIHsKKyAgICAgICAgcHJpbnQgIi4uLiBhbmQgdmVyaWZpZWQgd2l0aCAkcmVzdWx0Y3Rlc3RcJSBjZXJ0YWludHlcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQgIi4uLiBidXQgbWlnaHQgYmUgbHVja3lcbiI7CisgICAgfQorICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHR0ZXN0LCAnY3Jvc3N0ZXN0JyA9PiAkcmVzdWx0Y3Rlc3QpOworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit9CisKKyMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIHRlc3QgYmluYXJpZXMgb3V0IG9mIHRoZSBzb3VyY2Vjb2RlCitzdWIgY29tcGlsZV9zcmMKK3sKKyAgICBteSAoJHRlc3RuYW1lLCAkb3JwaGFuKSA9IEBfOworICAgIHByaW50ICJDb21waWxpbmcgc291cmVzIC4uLi4uLi4uLi4uLiI7CisgICAgaWYgKCRvcnBoYW4pIHsKKyMgTWFrZSBvcnBoYW5lZCB0ZXN0cworICAgICAgICAkZXhlY19uYW1lICAgICA9ICJiaW4vJG9wdF9sYW5nL29ycGhfdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY3Jvc3NleGVfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL29ycGhfY3Rlc3RfJHRlc3RuYW1lIjsKKyAgICAgICAgJHJlc3VsdHRlc3QgID0gc3lzdGVtICgibWFrZSAkZXhlY19uYW1lID4gJGV4ZWNfbmFtZVxfY29tcGlsZS5sb2ciICk7CisgICAgICAgICRyZXN1bHRjdGVzdCA9IHN5c3RlbSAoIm1ha2UgJGNyb3NzZXhlX25hbWUgPiAkY3Jvc3NleGVfbmFtZVxfY29tcGlsZS5sb2ciICk7CisgICAgfSBlbHNlIHsKKyMgTWFrZSB0ZXN0CisgICAgICAgICRleGVjX25hbWUgICAgID0gImJpbi8kb3B0X2xhbmcvdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY3Jvc3NleGVfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL2N0ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRyZXN1bHR0ZXN0ICA9IHN5c3RlbSAoIm1ha2UgJGV4ZWNfbmFtZSA+ICRleGVjX25hbWVcX2NvbXBpbGUubG9nIiApOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCJtYWtlICRjcm9zc2V4ZV9uYW1lID4gJGNyb3NzZXhlX25hbWVcX2NvbXBpbGUubG9nIiApOworICAgIH0KKyAgICBpZiAoJHJlc3VsdHRlc3QpIHsgdGVzdF9lcnJvciAoIkNvbXBpbGF0aW9uIG9mIHRoZSB0ZXN0IGZhaWxlZC4iKTsgfQorICAgIGlmICgkcmVzdWx0Y3Rlc3QpeyB0ZXN0X2Vycm9yICgiQ29tcGlsYXRpb24gb2YgdGhlIGNyb3NzdGVzdCBmYWlsZWQuIik7IH0KKworICAgIGlmICgkcmVzdWx0dGVzdCBvciAkcmVzdWx0Y3Rlc3QpIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkXG4iOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzXG4iOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggcHJlcGFyZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZToKK3N1YiBpbml0X2RpcmVjdG9yeV9zdHJ1Y3R1cmUKK3sKKyAgICBteSAoJGxhbmd1YWdlKSA9IEBfOworICAgIGlmICgtZSAiYmluIiAmJiAtZCAiYmluIikgeyB3YXJuaW5nICgiT2xkIGJpbmFyeSBkaXJlY3RvcnkgZGV0ZWN0ZWQhIik7fQorICAgIGVsc2UgeyBzeXN0ZW0gKCJta2RpciBiaW4iKTsgfQorICAgIGlmICgtZSAiYmluLyRsYW5ndWFnZSIgJiYgLWQgImJpbi8kbGFuZ3VhZ2UiKSB7CisgICAgICAgIHdhcm5pbmcgKCJPbGQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgbGFuZ3VhZ2UgJGxhbmd1YWdlIGZvdW5kLiIpO30KKyAgICBlbHNlIHsgc3lzdGVtICgibWtkaXIgYmluLyRsYW5ndWFnZSIpOyB9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIHNvdXJjZWNvZGUgZm9yIHRoZSBnaXZlbiB0ZXN0CitzdWIgbWFrZV9zcmMKK3sKKyAgICBteSAoJHRlc3RuYW1lLCAkb3JwaGFuKSA9IEBfOworICAgIG15ICR0ZW1wbGF0ZV9maWxlOworICAgIG15ICRzcmNfbmFtZTsKKworICAgICR0ZW1wbGF0ZV9maWxlID0gIiRkaXIvJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgIGlmICghLWUgJHRlbXBsYXRlX2ZpbGUpIHsgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGZvciBcIiR0ZXN0bmFtZVwiIik7IH0KKworICAgIHByaW50ICJHZW5lcmF0aW5nIHNvdXJjZXMgLi4uLi4uLi4uLiI7CisgICAgaWYgKCRvcnBoYW4pIHsKKyMgTWFrZSBvcnBoYW5lZCB0ZXN0cworICAgICAgICAkc3JjX25hbWUgPSAiYmluLyRvcHRfbGFuZy9vcnBoX3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0dGVzdCA9IHN5c3RlbSAoIi4vJHRlbXBsYXRlcGFyc2VybmFtZSAtLXRlc3QgLS1vcnBoYW4gJHRlbXBsYXRlX2ZpbGUgJHNyY19uYW1lIik7CisgICAgICAgICRzcmNfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL29ycGhfY3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCIuLyR0ZW1wbGF0ZXBhcnNlcm5hbWUgLS1jcm9zc3Rlc3QgLS1vcnBoYW4gJHRlbXBsYXRlX2ZpbGUgJHNyY19uYW1lIik7CisgICAgfSBlbHNlIHsKKyMgTWFrZSB0ZXN0CisgICAgICAgICRzcmNfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0dGVzdCA9IHN5c3RlbSAoIi4vJHRlbXBsYXRlcGFyc2VybmFtZSAtLXRlc3QgLS1ub29ycGhhbiAkdGVtcGxhdGVfZmlsZSAkc3JjX25hbWUiKTsKKyAgICAgICAgJHNyY19uYW1lID0gImJpbi8kb3B0X2xhbmcvY3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCIuLyR0ZW1wbGF0ZXBhcnNlcm5hbWUgLS1jcm9zc3Rlc3QgLS1ub29ycGhhbiAkdGVtcGxhdGVfZmlsZSAkc3JjX25hbWUiKTsKKyAgICB9CisgICAgaWYgKCRyZXN1bHR0ZXN0KSB7IHRlc3RfZXJyb3IgKCJHZW5lcmF0aW9uIG9mIHNvdXJjZWNvZGUgZm9yIHRoZSB0ZXN0IGZhaWxlZC4iKTsgfQorICAgIGlmICgkcmVzdWx0Y3Rlc3QpeyB0ZXN0X2Vycm9yICgiR2VuZXJhdGlvbiBvZiBzb3VyY2Vjb2RlIGZvciB0aGUgY3Jvc3N0ZXN0IGZhaWxlZC4iKTsgfQorCisgICAgaWYgKCRyZXN1bHR0ZXN0IG9yICRyZXN1bHRjdGVzdCkgeworICAgICAgICBwcmludCAiLi4uLiBmYWlsZWRcbiI7CisgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzXG4iOworICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworIyBGdW5jdGlvbiB3aGljaCBjaGVja3MgaWYgYSBnaXZlbiB0ZXN0IGlzIG9ycGhhbmFibGUKK3N1YiB0ZXN0X2lzX29ycGhhbmFibGUKK3sKKyAgICBteSAoJHRlc3RuYW1lKSA9IEBfOworICAgIG15ICRzcmM7CisgICAgbXkgJGZpbGUgPSAiJGRpci8kdGVzdG5hbWUuJGV4dGVuc2lvbiI7CisgICAgaWYoISAtZSAkZmlsZSl7IHRlc3RfZXJyb3IgKCJDb3VsZCBub3QgZmluZCB0ZXN0IGZpbGUgJGZpbGVcbiIpO30KKyAgICBvcGVuIChURVNULCAiPCRmaWxlIikgb3IgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBvcGVuIHRlc3QgZmlsZSAkZmlsZVxuIik7CisgICAgd2hpbGUgKDxURVNUPikgeyAkc3JjIC49ICRfOyB9CisgICAgY2xvc2UgKFRFU1QpOworICAgIHJldHVybiAkc3JjID1+L29tcHRzOm9ycGhhbi87Cit9CisKK3N1YiB3cml0ZV9yZXN1bHRfZmlsZV9oZWFkCit7CisgICAgb3BlbiAoUkVTVUxUUywgIj4kb3B0X3Jlc3VsdHNmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBmaWxlICckb3B0X3Jlc3VsdHNmaWxlJyB0byB3cml0ZSByZXN1bHRzLiIsIDEpOworICAgICRyZXN1bHRsaW5lID0gc3ByaW50ZiAiJS0yNXMgJS1zXG4iLCAiI1Rlc3RlZCBEaXJlY3RpdmUiLCAiXHR0XHRjdFx0b3RcdG9jdCI7CisgICAgcHJpbnQgUkVTVUxUUyAkcmVzdWx0bGluZTsKK30KKworIyBGdW5jdGlvbiB3aGljaCBhZGRzIGEgcmVzdWx0IHRvIHRoZSBsaXN0IG9mIHJlc3VsdHMKK3N1YiBhZGRfcmVzdWx0Cit7CisgICAgbXkgKCR0ZXN0bmFtZSwgJHJlc3VsdCkgPSBAXzsKKyMJcHJpbnQgRHVtcGVyKEB7JHJlc3VsdH0pOworCisgICAgJG51bV9jb25zdHJ1Y3RzKys7CisKKyAgICBvcGVuIChSRVNVTFRTLCAiPj4kb3B0X3Jlc3VsdHNmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBmaWxlICckb3B0X3Jlc3VsdHNmaWxlJyB0byB3cml0ZSByZXN1bHRzLiIsIDEpOworCisgICAgaWYgKCR7JHJlc3VsdH1bMF1bMF0pIHsKKwkJJG51bV90ZXN0cyArKzt9CisKKwlpZiAoJG9wdF9jb21waWxlIGFuZCAkeyRyZXN1bHR9WzBdWzFdIGVxIDApIHsKKwkJJHskcmVzdWx0fVswXVsyXXt0ZXN0fSAgICAgID0gJ2NlJzsKKwkJJHskcmVzdWx0fVswXVsyXXtjcm9zc3Rlc3R9ID0gJy0nOworCQkkbnVtX25vcm1hbF90ZXN0c19jb21waWxlX2Vycm9yKys7CisJICAgICRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCsrOworCX0KKworICAgIGlmICgkb3B0X3J1biBhbmQgJHskcmVzdWx0fVswXVsyXSBhbmQgJHskcmVzdWx0fVswXVsyXXt0ZXN0fSBuZSAnY2UnKSB7CisgICAgICAgIGlmICgkeyRyZXN1bHR9WzBdWzJde3Rlc3R9ID09IDEwMCkgeworICAgICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfc3VjY2Vzc2Z1bCsrOworICAgICAgICAgICAgaWYgKCR7JHJlc3VsdH1bMF1bMl17Y3Jvc3N0ZXN0fSA9PSAxMDApeworCQkJCSRudW1fbm9ybWFsX3Rlc3RzX3ZlcmlmaWVkKys7fQorCQl9IGVsc2lmICgkeyRyZXN1bHR9WzBdWzJde3Rlc3R9IGVxICdUTycpeworCQkJJG51bV9ub3JtYWxfdGVzdHNfdGltZWRfb3V0Kys7CisJCQkkbnVtX25vcm1hbF90ZXN0c19mYWlsZWQrKzsKKwkJfSBlbHNlIHsKKwkJCSRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCsrOworCQl9CisgICAgfQorICAgICRyZXN1bHRsaW5lID0gIiR7JHJlc3VsdH1bMF1bMl17dGVzdH1cdCR7JHJlc3VsdH1bMF1bMl17Y3Jvc3N0ZXN0fVx0IjsKKworICAgIGlmICgkeyRyZXN1bHR9WzFdWzBdKSB7CisJCSRudW1fdGVzdHMgKys7fQorICAgIGVsc2UgeyAkcmVzdWx0bGluZSAuPSAiLVx0LVxuIjsgfQorCisgICAgaWYgKCRvcHRfY29tcGlsZSBhbmQgJHskcmVzdWx0fVsxXVsxXSBlcSAwKSB7CisJCSR7JHJlc3VsdH1bMV1bMl17dGVzdH0gICAgICA9ICdjZSc7CisJCSR7JHJlc3VsdH1bMV1bMl17Y3Jvc3N0ZXN0fSA9ICctJzsKKwkJJG51bV9vcnBoYW5lZF90ZXN0c19jb21waWxlX2Vycm9yKys7CisJCSRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkKys7CisJfQorCisgICAgaWYgKCRvcHRfcnVuIGFuZCAkeyRyZXN1bHR9WzFdWzJdIGFuZCAkeyRyZXN1bHR9WzFdWzJde3Rlc3R9IG5lICdjZScpIHsKKyAgICAgICAgaWYgKCR7JHJlc3VsdH1bMV1bMl17dGVzdH0gPT0gMTAwKSB7CisgICAgICAgICAgICAkbnVtX29ycGhhbmVkX3Rlc3RzX3N1Y2Nlc3NmdWwrKzsKKyAgICAgICAgICAgIGlmICgkeyRyZXN1bHR9WzFdWzJde2Nyb3NzdGVzdH0gPT0gMTAwKXsKKwkJCQkkbnVtX29ycGhhbmVkX3Rlc3RzX3ZlcmlmaWVkKys7fQorCQl9IGVsc2lmICgkeyRyZXN1bHR9WzFdWzJde3Rlc3R9IGVxICdUTycpeworCQkJJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQrKzsKKwkJCSRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkKys7CisgICAgICAgIH0gZWxzZSB7CisJCQkkbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZCsrOworCQl9CisgICAgfQorICAgICRyZXN1bHRsaW5lIC49ICIkeyRyZXN1bHR9WzFdWzJde3Rlc3R9XHQkeyRyZXN1bHR9WzFdWzJde2Nyb3NzdGVzdH1cbiI7CisKKyAgICAkbnVtX2ZhaWxlZF90ZXN0cyA9ICRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCArICRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkOworCSRudW1fZmFpbGVkX2NvbXBpbGF0aW9uID0gJG51bV9ub3JtYWxfdGVzdHNfY29tcGlsZV9lcnJvciArICRudW1fb3JwaGFuZWRfdGVzdHNfY29tcGlsZV9lcnJvcjsKKwkkbnVtX3N1Y2Nlc3NmdWxfdGVzdHMgPSAkbnVtX25vcm1hbF90ZXN0c19zdWNjZXNzZnVsICsgJG51bV9vcnBoYW5lZF90ZXN0c19zdWNjZXNzZnVsOworCSRudW1fdmVyaWZpZWRfdGVzdHMgPSAkbnVtX25vcm1hbF90ZXN0c192ZXJpZmllZCArICRudW1fb3JwaGFuZWRfdGVzdHNfdmVyaWZpZWQ7CisKKyAgICAkcmVzdWx0bGluZTIgPSBzcHJpbnRmICIlLTI1cyAlLXMiLCAiJHRlc3RuYW1lIiwgIlx0JHJlc3VsdGxpbmUiOworICAgIHByaW50IFJFU1VMVFMgJHJlc3VsdGxpbmUyOworfQorCisjIEZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIGEgc2luZ2xlIHRlc3QKK3N1YiBleGVjdXRlX3NpbmdsZV90ZXN0Cit7CisgICAgbXkgQHJlc3VsdDsKKyAgICBpbml0X2xhbmd1YWdlX3NldHRpbmdzICgkb3B0X2xhbmcpOworICAgIGluaXRfZGlyZWN0b3J5X3N0cnVjdHVyZSAoJG9wdF9sYW5nKTsKKyAgICBsb2dfbWVzc2FnZV9hZGQgKCJUZXN0aW5nIGZvciBcIiRvcHRfdGVzdFwiOiIpOworICAgIHByaW50ICJUZXN0aW5nIGZvciBcIiRvcHRfdGVzdFwiOlxuIjsKKyMgdGVzdHMgaW4gbm9ybWFsIG1vZGUKKyAgICBpZiAoJG9wdF9jb21waWxlKXsgJHJlc3VsdFswXVswXSA9IG1ha2Vfc3JjICgkb3B0X3Rlc3QsIDApOworICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WzBdWzFdID0gY29tcGlsZV9zcmMgKCRvcHRfdGVzdCwgMCk7fQorICAgIGlmICgkb3B0X3J1biAmJiAkcmVzdWx0WzBdWzFdID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFswXVsyXSA9IHtydW5fdGVzdCAoJG9wdF90ZXN0LCAwKX07fQorIyB0ZXN0cyBpbiBvcnBoYW5lZCBtb2RlCisgICAgaWYgKCRvcHRfb3JwaGFuICYmIHRlc3RfaXNfb3JwaGFuYWJsZSgkb3B0X3Rlc3QpKXsKKyAgICAgICAgbG9nX21lc3NhZ2VfYWRkICgiVGVzdGluZyBmb3IgXCIkb3B0X3Rlc3RcIiBpbiBvcnBoYW5lZCBtb2RlOiIpOworICAgICAgICBwcmludCAiKyBvcnBoYW5lZCBtb2RlOlxuIjsKKyAgICAgICAgaWYgKCRvcHRfY29tcGlsZSkgeyAkcmVzdWx0WzFdWzBdID0gbWFrZV9zcmMgKCRvcHRfdGVzdCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsxXVsxXSA9IGNvbXBpbGVfc3JjICgkb3B0X3Rlc3QsIDEpO30KKyAgICAgICAgaWYgKCRvcHRfcnVuICYmICRyZXN1bHRbMV1bMV0gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRbMV1bMl0gPSB7cnVuX3Rlc3QgKCRvcHRfdGVzdCwgMSl9O30KKyAgICB9CisgICAgYWRkX3Jlc3VsdCgkb3B0X3Rlc3QsIFxAcmVzdWx0KTsKK30KKworIyBGdW5jdGlvbiB0aGF0IHByaW50cyBpbmZvIGFib3V0IGEgZ2l2ZW4gdGVzdAorc3ViIHByaW50X3Rlc3RpbmZvCit7CisgICAgaW5pdF9sYW5ndWFnZV9zZXR0aW5ncygkb3B0X2xhbmcpOworICAgIG15ICRkb2MgPSAiIjsKKyAgICBteSAkZmlsZSA9ICRkaXIuIi8iLiRvcHRfdGVzdGluZm8uIi4iLiRleHRlbnNpb247CisgICAgaWYgKCEgLWUgJGZpbGUpIHtlcnJvciAoIkNvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGZvciB0ZXN0ICRvcHRfdGVzdGluZm8iLCA1KTt9CisgICAgb3BlbiAoVEVTVCwiPCRmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiB0ZW1wbGF0ZSBmaWxlIFwiJGZpbGVcIiBmb3IgdGVzdCAkb3B0X3Rlc3RpbmZvIiwgNik7CisgICAgd2hpbGUgKDxURVNUPikgeyRkb2MgLj0gJF87fQorICAgIGNsb3NlIChURVNUKTsKKworICAgIChteSAkb21wX3ZlcnNpb24pID0gZ2V0X3RhZ192YWx1ZXMgKCJvbXB0czpvbXB2ZXJzaW9uIiwgJGRvYyk7CisgICAgKG15ICRkZXBlbmRlbmNlcykgPSBnZXRfdGFnX3ZhbHVlcyAoIm9tcHRzOmRlcGVuZGVuY2VzIiwgJGRvYyk7CisgICAgKG15ICRkZXNjcmlwdGlvbikgPSBnZXRfdGFnX3ZhbHVlcyAoIm9tcHRzOnRlc3RkZXNjcmlwdGlvbiIsICRkb2MpOworICAgIG15ICRvcnBoYW5hYmxlID0gJ25vJzsKKyAgICBpZiAoJGRvYyA9fiAvb21wdHM6b3JwaGFuLykgeyRvcnBoYW5hYmxlID0gJ3llcyc7fQorICAgIHByaW50IDw8RU9GOworSW5mbyBmb3IgdGVzdCAkb3B0X3Rlc3RpbmZvOgorT3BlbiBNUCBzdGFuZGFyZDogJG9tcF92ZXJzaW9uCitPcnBoYW5lZCBtb2RlOiAkb3JwaGFuYWJsZQorRGVwZW5kZW5jaWVzOiAgJGRlcGVuZGVuY2VzCitEZXNjcmlwdGlvbjogICAkZGVzY3JpcHRpb24KK0VPRgorfQorCisjIEZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHNldHRpbmdzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKK3N1YiBpbml0X2xhbmd1YWdlX3NldHRpbmdzCit7CisgICAgbXkgKCRsYW5ndWFnZSkgPSBAXzsKKyAgICBmb3JlYWNoIG15ICRsYW5nIChAbGFuZ3VhZ2VzKSB7CisgICAgICAgIChteSAkbmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoImxhbmd1YWdlbmFtZSIsICRsYW5nKTsKKyAgICAgICAgaWYgKCRuYW1lIGVxICRsYW5ndWFnZSkgeworICAgICAgICAgICAgKCRleHRlbnNpb24pID0gZ2V0X3RhZ192YWx1ZXMgKCJmaWxlZXh0ZW5zaW9uIiwgJGxhbmcpOworICAgICAgICAgICAgKCRkaXIpICAgICAgID0gZ2V0X3RhZ192YWx1ZXMgKCJkaXIiLCAkbGFuZyk7CisgICAgICAgICAgICAoJHRlbXBsYXRlcGFyc2VybmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoInRlbXBsYXRlcGFyc2VybmFtZSIsICRsYW5nKTsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgIyBDaGVjayBpZiB3ZSBmb3VuZCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlIGluIHRoZSBjb25maWcgZmlsZQorICAgIGlmICghJGV4dGVuc2lvbiBhbmQgISRkaXIpIHsKKyAgICAgIGVycm9yICgiTGFuZ3VhZ2UgJGxhbmd1YWdlIGNvdWxkIG5vdCBiZSBmb3VuZC5cbiIsIDMpOworICAgIH0KK30KKworCisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgYWxsIGF2YWlsYWJsZSB0ZXN0cyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCitzdWIgcHJpbnRfYXZhaWxfdGVzdHMKK3sKKyAgICBpbml0X2xhbmd1YWdlX3NldHRpbmdzKCRvcHRfbGFuZyk7CisgICAgbXkgQHRlc3RzOworICAgIG9wZW5kaXIoRElSLCIkZGlyIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBkaXJlY3RvcnkgJGRpciIsIDQpOworICAgIHdoaWxlKCRfID0gcmVhZGRpcihESVIpKSB7IGlmICgvXC4kZXh0ZW5zaW9uJC8pIHtzL1wuJGV4dGVuc2lvbi8vOyBwdXNoIChAdGVzdHMsICRfKTt9fQorICAgIGNsb3NlZGlyKERJUik7CisgICAgcHJpbnQgIkZvdW5kICIuKEB0ZXN0cykuIiB0ZXN0czpcbiIuICItIiB4IDMwIC4gIlxuIjsKKyAgICBmb3JlYWNoIChAdGVzdHMpIHsgcHJpbnQgJF8uIlxuIjt9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgYWxsIGF2YWlsYWJsZSB0ZXN0cyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCitzdWIgcHJpbnRfYXZhaWxfbGFuZ3MKK3sKKyAgICBpZiAoQGxhbmd1YWdlcyA+IDApIHsKKyAgICAgICAgcHJpbnQgIkF2YWlsYWJsZSBsYW5ndWFnZXM6XG4iOworICAgICAgICBmb3JlYWNoIChAbGFuZ3VhZ2VzKSB7CisgICAgICAgICAgICAobXkgJG5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCJsYW5ndWFnZW5hbWUiLCAkXyk7CisgICAgICAgICAgICBwcmludCAiJG5hbWVcbiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCAiTm8gbGFuZ3VhZ2VzIGF2YWlsYWJsZVxuIjsKKyAgICB9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgdGhlIGVycm9yIG1lc3NhZ2UKK3N1YiBwcmludF9oZWxwX3RleHQKK3sKKyAgICBwcmludCA8PEVPRjsKK3J1bnRlc3QucGwgW29wdGlvbnNdIFtGSUxFXQorCitFeGVjdXRlcyB0aGUgdGVzdHMgbGlzdGVkIGluIEZJTEUuIEZJTEUgaGFzIHRvIGNvbnRhaW4gdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cywKK29uZSB0ZXN0IHBlciBsaW5lLiBMaW5lcyBzdGFydGluZyB3aXRoICcjJyB3aWxsIGJlIGlnbm9yZWQuCitBIGxhbmd1YWdlIGhhcyB0byBiZSBzcGVjaWZpZWQgZm9yIGFsbCBjb21tYW5kcyBleGNlcHQgLS1oZWxwIGFuZCAtLWxpc3RsYW5ndWFnZXMuCisKK09wdGlvbnM6CisgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXlzIHRoaXMgaGVscCBtZXNzYWdlCisgIC0tbGlzdGxhbmd1YWdlcyAgIGxpc3RzIGFsbCBhdmFpbGFibGUgbGFuZ3VhZ2VzCisgIC0tbGFuZz1zICAgICAgICAgIHNlbGVjdCBsYW5ndWFnZQorICAtLWxpc3QgICAgICAgICAgICBsaXN0IGF2YWlsYWJsZSB0ZXN0cyBmb3IgYSBsYW5ndWFnZQorICAtLXRlc3RpbmZvPU5BTUUgICBzaG93IGluZm8gZm9yIHRlc3QgTkFNRQorICAtLW51bXRocmVhZHM9TlVNICBzZXQgbnVtYmVyIG9mIHRocmVhZHMgKG92ZXJ3cml0ZXMgY29uZmlnIGZpbGUgc2V0dGluZ3MpCisgIC0tdGVzdD1OQU1FICAgICAgIGV4ZWN1dGUgc2luZ2xlIHRlc3QgTkFNRQorICAtLW5vY29tcGlsZSAgICAgICBkbyBub3QgY29tcGlsZSB0ZXN0cworICAtLW5vcnVuICAgICAgICAgICBkbyBub3QgcnVuIHRlc3RzCisgIC0tbm9vcnBoYW4gICAgICAgIHN3aXRjaCBvZiBvcnBoYW5lZCB0ZXN0cworICAtLXJlc3VsdGZpbGU9TkFNRSB1c2UgTkFNRSBhcyByZXN1bHRmaWxlIChvdmVyd3JpdGVzIGNvbmZpZyBmaWxlIHNldHRpbmdzKQorRU9GCit9CisKKyMgRnVuY3Rpb24gdGhhdCB3cml0ZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgYSBmYWlsZWQgdGVzdCAvIHBhcnQgb2YgYSB0ZXN0CitzdWIgdGVzdF9lcnJvcgoreworICAgbXkgKCRtZXNzYWdlKSA9IEBfOworICAgbG9nX21lc3NhZ2VfYWRkICgiRVJST1I6ICRtZXNzYWdlIik7CisgICBpZiAoJGRpc3BsYXlfZXJyb3JzIGVxIDEpIHsgcHJpbnQgU1RERVJSICJFUlJPUjogJG1lc3NhZ2VcbiI7IH0KK30KKworIyBGdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gd2FybmluZyBtZXNzYWdlCitzdWIgd2FybmluZyB7CisgIG15ICgkbWVzc2FnZSkgPSBAXzsKKyAgaWYgKCRkaXNwbGF5X3dhcm5pbmdzIGVxIDEpIHsgcHJpbnQgIldhcm5pb25nOiAkbWVzc2FnZVxuIjsgfQorICBsb2dfbWVzc2FnZV9hZGQgKCJXYXJuaW5nOiAkbWVzc2FnZSIpOworfQorCisjIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0cyB3aXRoIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZQorc3ViIGVycm9yIHsKKyAgbXkgKCRtZXNzYWdlLCAkZXJyb3JfY29kZSkgPSBAXzsKKyAgaWYgKCRkaXNwbGF5X2Vycm9ycyBlcSAxKSB7IHByaW50IFNUREVSUiAiRVJST1I6ICRtZXNzYWdlXG4iOyB9CisgIGxvZ19tZXNzYWdlX2FkZCAoIkVSUk9SOiAkbWVzc2FnZSIpOworICBleGl0ICgkZXJyb3JfY29kZSk7Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggYWRkcyBhbiBuZXcgZW50cnkgaW50byB0aGUgbG9nZmlsZSB0b2dldGhlciB3aXRoIGEgdGltZXN0YW1wCitzdWIgbG9nX21lc3NhZ2VfYWRkCit7CisgICAgKG15ICRtZXNzYWdlKSA9IEBfOworICAgICgkc2VjLCRtaW4sJGhvdXIsJG1kYXksJG1vbiwkeWVhciwkd2RheSwkeWRhdCwkaXNkc3QpID0gbG9jYWx0aW1lKCk7CisgICAgaWYobGVuZ3RoKCRob3VyKSA9PSAxKSB7ICRob3VyPSIwJGhvdXIiOyB9CisgICAgaWYobGVuZ3RoKCRtaW4pID09IDEpICB7ICRtaW49IjAkbWluIjsgICB9CisgICAgaWYobGVuZ3RoKCRzZWMpID09IDEpICB7ICRzZWM9IjAkc2VjIjsgICB9CisgICAgJG1vbj0kbW9uKzE7CisgICAgJHllYXI9JHllYXIrMTkwMDsKKyAgICBvcGVuIChMT0dGSUxFLCI+PiRsb2dmaWxlIikgb3IgZGllICJFUlJPUjogQ291bGQgbm90IGNyZWF0ZSAkbG9nZmlsZVxuIjsKKyAgICBwcmludCBMT0dGSUxFICIkbWRheS8kbW9uLyR5ZWFyICRob3VyLiRtaW4uJHNlYzogJG1lc3NhZ2VcbiI7Cit9CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9jLnBsIGIvcmMzL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfYy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZDZmMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfYy5wbApAQCAtMCwwICsxLDExNCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjIG9tcHRzX3BhcnNlciBbb3B0aW9uXSBJTkZJTEUgT1VURklMRQorIyAKKyMgQ3JlYXRzIHRoZSB0ZXN0cyBhbmQgdGhlIGNyb3NzdGVzdHMgZm9yIHRoZSBPcGVuTVAtVGVzdHN1aXRlIG91dCBvZiBhbiB0ZW1wbGF0ZWZpbGVzIHdoaWNoIGFyZSBnaXZlbiB0byB0aGUgcHJvZ3JhbW0uCisjIAorIyBPcHRpb25zOgorIyAtLXRlc3Q6IAltYWtlIHRlc3QKKyMgLS1jcm9zc3Rlc3Q6IAltYWtlIGNyb3NzdGVzdAorIyAtLW9ycGhhbglpZiBwb3NzaWJsZSBnZW5lcmF0ZSB0ZXN0cyB1c2luZyBvcnBoYW4gCisjCisjIFJldHVybjoKKyMgICAgICAgU3VjY2VzOiAgICAgICAgICAgICAgICAgMAorIyAgICAgICBUZW1wbGF0ZSBub3QgZm91bmQgICAgICAtMQorIworCisjIFVzaW5nIEdldG9wdDo6bG9uZyB0byBleHRyYWN0IHRoZSBwcm9ncmFtbSBvcHRpb25zCit1c2UgR2V0b3B0OjpMb25nOworIyBVc2luZyBmdW5jdGlvbnM6IFNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlc3Rjb2RlCit1c2Ugb21wdHNfcGFyc2VyRnVuY3Rpb25zOworCisjIEdldHRpbmcgZ2l2ZW4gb3B0aW9ucworR2V0T3B0aW9ucygidGVzdCIgPT4gXCR0ZXN0LCJjcm9zc3Rlc3QiID0+IFwkY3Jvc3N0ZXN0LCAib3JwaGFuISIgPT4gXCRvcnBoYW4pOworCisjIFJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSB0ZW1wbGF0ZWZpbGVzLiAKKyMgQWRkaW5nIHRoZXNlIHRvIHRoZSBsaXN0IG9mIHRvIGJlIHBhcnNlZCBmaWxlcyBpZiB0aGV5IGV4aXN0LgorCitteSAkdGVtcGxhdGVmaWxlOworbXkgJHNvdXJjZWZpbGU7CitteSAkbWFpbnByb2NzcmMgPSAib21wdHNfc3RhbmRhbG9uZVByb2MuYyI7IAorCiskdGVtcGxhdGVmaWxlID0gJEFSR1ZbMF07Ciskb3V0ZmlsZSA9ICRBUkdWWzFdOworCitpZiAoIS1lICR0ZW1wbGF0ZWZpbGUpIHsKKyAgICBwcmludCAiVGVtYXBsdGUgZmlsZSBub3QgZm91bmQiOworICAgIGV4aXQgLTE7Cit9CisKKwkKKyMgQ2hlY2tpbmcgaWYgb3B0aW9ucyB3ZXJlIHZhbGlkOgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcHJlcGFyYXRpb25zIGFuZCBjaGVja3MgZm9yIHNvdXJjZWZpbGVzCisKKyMgUmVhZGluZyB0aGUgdGVtcGxhdGUgZm9yIHRoZSB0ZXN0cyAKK29wZW4oVEVTVCwkdGVtcGxhdGVmaWxlKSBvciBkaWUgIkVycm9yOiBDb3VsZCBub3Qgb3BlbiB0ZW1wbGF0ZSAkc3JjZmlsZVxuIjsKK3doaWxlKDxURVNUPil7ICRzcmMgLj0gJF87IH0KK2Nsb3NlKFRFU1QpOworCisjIEV4dHJhY3RpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIG1haW5wcm9ncmFtbSBhbmQgc2F2aW5nIGl0IGluICRtYWlucHJvY3NyYworb3BlbihNQUlOUFJPQywkbWFpbnByb2NzcmMpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIHNvdXJjZWZpbGUgZm9yIHRoZSBtYWluIHByb2dyYW0gJG1haW5wcm9jc3JjIjsKK3doaWxlKDxNQUlOUFJPQz4peyAkbWFpbnByb2MgLj0gJF87IH0KK2Nsb3NlIChNQUlOUFJPQyk7CisKKyMgU29tZSB0ZW1wb3JhcnkgdGVzdGluZm9ybWF0aW9uOgorbXkgKCRkZXNjcmlwdGlvbikgID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czp0ZXN0ZGVzY3JpcHRpb24nLCRzcmMpOworbXkgKCRkaXJlY3RpdmUpICAgID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czpkaXJlY3RpdmUnLCRzcmMpOworbXkgKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRzcmMpOworCitvcGVuIChPVVRGSUxFLCI+JG91dGZpbGUiKSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgdGhlIG91dHB1dCBmaWxlIGZvciAkZGlyZWN0aXZlIjsKKworIyBDcmVhdGluZyB0aGUgc291cmNlIGZvciB0aGUgdGVzdDoKK215ICgkY29kZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGUnLCRzcmMpOworIyBQdXR0aW5nIHRvZ2V0aGVyIHRoZSBmdW5jdGlvbnMgYW5kIHRoZSBtYWlucHJvZ3JhbW06CiskY29kZSAuPSAkbWFpbnByb2M7CisKK215ICR0ZXN0cHJlZml4ID0gIiI7CisKKyMgTWFrZSBtb2RpZmljYXRpb25zIGZvciB0aGUgb3JwaGFuZWQgdGVzdHZlcnNpb24gaWYgbmVjZXNzYXJ5OgoraWYgKCRvcnBoYW4pIHsKKyMgR2V0IHRoZSBnbG9iYWwgdmFyaWFibGVzOgorICAgIEBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoIm9tcHRzOm9ycGhhbjp2YXJzIiwkY29kZSk7CisgICAgJG9ycGh2YXJzZGVmID0gIiI7CisgICAgZm9yZWFjaCAoQGRlZnMpIHsKKyAgICAgICAgJG9ycGh2YXJzZGVmID0gam9pbigiXG4iLCRvcnBodmFyc2RlZiwkXyk7IAorICAgIH0KKyMgR2VuZXJhdGUgcHJlZGVjbGFyYXRpb25zIGZvciBvcnBhaG4gZnVuY3Rpb25zOgorICAgICRvcnBoZnVuY3NkZWZzID0gb3JwaF9mdW5jdGlvbnNfZGVjbGFyYXRpb25zKCRjb2RlKTsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBmdW5jdGlvbnM6CisgICAgJG9ycGhmdW5jcyA9IGNyZWF0ZV9vcnBoX2NmdW5jdGlvbnMoJGNvZGUpOworIyBSZXBsYTplIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHM6CisgICAgJGNvZGUgPSBvcnBoYW5fcmVnaW9uczJjZnVuY3Rpb25zKCRjb2RlKTsKKyMgRGVsZXRpbmcgdGhlIGZvcm1lciBkZWNsYXJhdGlvbnMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgb3JwaGFuIHJlZ2lvbnM6CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisgICAgJGNvZGUgPSAiI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIiAuICRvcnBodmFyc2RlZiAuICRvcnBoZnVuY3NkZWZzIC4gJGNvZGUgLiAkb3JwaGZ1bmNzOworICAgICR0ZXN0cHJlZml4IC49ICJvcnBoXyI7Cit9CisKKyMgUmVtb3ZlIHJlbWFpbmluZyBtYXJrcyBmb3IgdGhlIG9ycGFobiByZWdpb25zIGFuZCBpdHMgdmFyaWFibGVzOgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuJywnJywnJywoJGNvZGUpKTsKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKworaWYoJHRlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorICAgICR0ZXN0cHJlZml4IC49ICJ0ZXN0XyI7Cit9CitlbHNpZigkY3Jvc3N0ZXN0KSB7CisjIFJlbW92ZSB0aGUgbWFya3MgZm9yIHRoZSBjcm9zc3Rlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSB0ZXN0czogCisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjaGVjaycsKCRjb2RlKSk7CQkKKyAgICAkdGVzdHByZWZpeCAuPSAiY3Rlc3RfIjsKK30KKyMgTWFraW5nIHNvbWUgZmluYWwgbW9kaWZpY2F0aW9uczoKKygkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ3Rlc3RmdW5jdGlvbm5hbWUnLCR0ZXN0cHJlZml4LiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkdGVzdHByZWZpeCwnJywoJGNvZGUpICk7CisjCSRjb2RlID0gICJcI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kY29kZTsKKyMgV3JpdGUgdGhlIHJlc3VsdCBpbnRvIHRoZSBmaWxlIGFuZCBjbG9zZSBpdDoKK3ByaW50IE9VVEZJTEUgJGNvZGU7CitjbG9zZShPVVRGSUxFKTsKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvdGVtcGxhdGVfcGFyc2VyX2ZvcnRyYW4ucGwgYi9yYzMvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9mb3J0cmFuLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3MGE0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9mb3J0cmFuLnBsCkBAIC0wLDAgKzEsMTE1IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgb21wdHNfcGFyc2VyIFtvcHRpb25dIElORklMRSBPVVRGSUxFCisjIAorIyBDcmVhdHMgdGhlIHRlc3RzIGFuZCB0aGUgY3Jvc3N0ZXN0cyBmb3IgdGhlIE9wZW5NUC1UZXN0c3VpdGUgb3V0IG9mIGFuIHRlbXBsYXRlZmlsZXMgd2hpY2ggYXJlIGdpdmVuIHRvIHRoZSBwcm9ncmFtbS4KKyMgCisjIE9wdGlvbnM6CisjIC0tdGVzdDogCW1ha2UgdGVzdAorIyAtLWNyb3NzdGVzdDogCW1ha2UgY3Jvc3N0ZXN0CisjIC0tb3JwaGFuCWlmIHBvc3NpYmxlIGdlbmVyYXRlIHRlc3RzIHVzaW5nIG9ycGhhbiAKKyMKKyMgUmV0dXJuOgorIyAgICAgICBTdWNjZXM6ICAgICAgICAgICAgICAgICAwCisjICAgICAgIFRlbXBsYXRlIG5vdCBmb3VuZCAgICAgIC0xCisjCisKKyMgVXNpbmcgR2V0b3B0Ojpsb25nIHRvIGV4dHJhY3QgdGhlIHByb2dyYW1tIG9wdGlvbnMKK3VzZSBHZXRvcHQ6Okxvbmc7CisjIFVzaW5nIGZ1bmN0aW9uczogU2V0IG9mIHN1YnJvdXRpbmVzIHRvIG1vZGlmeSB0aGUgdGVzdGNvZGUKK3VzZSBvbXB0c19wYXJzZXJGdW5jdGlvbnM7CisKKyMgR2V0dGluZyBnaXZlbiBvcHRpb25zCitHZXRPcHRpb25zKCJ0ZXN0IiA9PiBcJHRlc3QsImNyb3NzdGVzdCIgPT4gXCRjcm9zc3Rlc3QsICJvcnBoYW4hIiA9PiBcJG9ycGhhbik7CisKKyMgUmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHRlbXBsYXRlZmlsZXMuIAorIyBBZGRpbmcgdGhlc2UgdG8gdGhlIGxpc3Qgb2YgdG8gYmUgcGFyc2VkIGZpbGVzIGlmIHRoZXkgZXhpc3QuCisKK215ICR0ZW1wbGF0ZWZpbGU7CitteSAkc291cmNlZmlsZTsKK215ICRtYWlucHJvY3NyYyA9ICJvbXB0c19zdGFuZGFsb25lUHJvYy5mIjsgCisKKyR0ZW1wbGF0ZWZpbGUgPSAkQVJHVlswXTsKKyRvdXRmaWxlID0gJEFSR1ZbMV07CisKK2lmICghLWUgJHRlbXBsYXRlZmlsZSkgeworICAgIHByaW50ICJUZW1hcGx0ZSBmaWxlIG5vdCBmb3VuZCI7CisgICAgZXhpdCAtMTsKK30KKworCQorIyBDaGVja2luZyBpZiBvcHRpb25zIHdlcmUgdmFsaWQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwcmVwYXJhdGlvbnMgYW5kIGNoZWNrcyBmb3Igc291cmNlZmlsZXMKKworIyBSZWFkaW5nIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRlc3RzIAorb3BlbihURVNULCR0ZW1wbGF0ZWZpbGUpIG9yIGRpZSAiRXJyb3I6IENvdWxkIG5vdCBvcGVuIHRlbXBsYXRlICRzcmNmaWxlXG4iOword2hpbGUoPFRFU1Q+KXsgJHNyYyAuPSAkXzsgfQorY2xvc2UoVEVTVCk7CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7ICRtYWlucHJvYyAuPSAkXzsgfQorY2xvc2UgKE1BSU5QUk9DKTsKKworIyBTb21lIHRlbXBvcmFyeSB0ZXN0aW5mb3JtYXRpb246CisoJGRlc2NyaXB0aW9uKSAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3RkZXNjcmlwdGlvbicsJHNyYyk7CisoJGRpcmVjdGl2ZSkgICAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOmRpcmVjdGl2ZScsJHNyYyk7CisoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHNyYyk7CisKK29wZW4gKE9VVEZJTEUsIj4kb3V0ZmlsZSIpIG9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiOworCisjIENyZWF0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSB0ZXN0OgorKCRjb2RlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZScsJHNyYyk7CisjIFB1dHRpbmcgdG9nZXRoZXIgdGhlIGZ1bmN0aW9ucyBhbmQgdGhlIG1haW5wcm9ncmFtbToKKyRjb2RlIC49ICRtYWlucHJvYzsKKworI3RoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdCwgZ2V0IHRoZSBwYXJhbWV0ZXJzIDxvbXB0czpvcnBoYW46cGFyYW1zPiBieSBqb29uCisgKCRwYXJtcykgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnBhcm1zJywoJGNvZGUpKTsKKyAoJHBhcm1zKSA9IGxlYXZlX3NpbmdsZV9zcGFjZSgkcGFybXMpOworICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJGNvZGUpOworCisjIE1ha2UgbW9kaWZpY2F0aW9ucyBmb3IgdGhlIG9ycGhhbmVkIHRlc3R2ZXJzaW9uIGlmIG5lY2Vzc2FyeToKK2lmICgkb3JwaGFuKSB7CisjIEdldCB0aGUgZ2xvYmFsIHZhcmlhYmxlczoKKyAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICRvcnBodmFyc2RlZiA9ICIiOworICAgIGZvcmVhY2ggKEBkZWZzKSB7CisgICAgICAgIGlmIChub3QgL15bIF0qJC9ncykgeyAkb3JwaHZhcnNkZWYgPSBqb2luKCJcbiIsJG9ycGh2YXJzZGVmLCRfKTsgfSAKKyAgICB9CisjIEdlbmVyYXRlIHRoZSBvcnBoYW4gc3Vicm91dGluZXM6CisgICAgICAgICRvcnBoZnVuY3MgPSBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zICgiIiwgKCRjb2RlKSwoJHBhcm1zKSk7CisjIFJlcGxhY2Ugb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxsczoKKyAgICAgICAgKCRjb2RlKSA9IG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMgKCIiLCAoJGNvZGUpLCgkcGFybXMpKTsKKyAgICAgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncyAoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKyMgdG8gZmluZCBvcnBoYW4gY2FsbCBzdGF0ZW1lbnQgYW5kIGFkZCBwYXJhbWV0ZXJzLCBieSBqb29uCisgICAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisgICAgICAgICRjb2RlID0gJGNvZGUgLiAkb3JwaGZ1bmNzOworfQorCisjIFJlbW92ZSByZW1haW5pbmcgbWFya3MgZm9yIHRoZSBvcnBhaG4gcmVnaW9ucyBhbmQgaXRzIHZhcmlhYmxlczoKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gZm9yIG9ycGhhbmVkIGRpcmVjdGl2ZSBwYXJhbWV0ZXMsIGFkZGVkIGJ5am9vbgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKworaWYoJHRlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorfQorZWxzaWYoJGNyb3NzdGVzdCkgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgY3Jvc3N0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgdGVzdHM6IAorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y2hlY2snLCgkY29kZSkpOwkJCit9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCd0ZXN0ZnVuY3Rpb25uYW1lJywidGVzdF8iLiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywidGVzdF8iLCcnLCgkY29kZSkgKTsKKyMJJGNvZGUgPSAgIlwjaW5jbHVkZSBcIm9tcF90ZXN0c3VpdGUuaFwiXG4iLiRjb2RlOworIyBXcml0ZSB0aGUgcmVzdWx0IGludG8gdGhlIGZpbGUgYW5kIGNsb3NlIGl0OgorcHJpbnQgT1VURklMRSAkY29kZTsKK2Nsb3NlKE9VVEZJTEUpOwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS90ZXN0bGlzdC1jLnR4dCBiL3JjMy90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzYTIxOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQKQEAgLTAsMCArMSw2OCBAQAorIyBMaXN0IGNvbnRhaW5pbmcgdGhlIHRlc3RzIG9mIHRoZSBPcGVuTVBWYWxpZGFpb24gU3VpdGUgYXZhaWxhYmxlIHRvIGNoZWNrCisjIHRoZSBjIGltcGxlbWVudGF0aW9uLgoraGFzX29wZW5tcAorb21wX2F0b21pYworb21wX2JhcnJpZXIKK29tcF9jcml0aWNhbAorb21wX2ZsdXNoCitvbXBfZm9yX2ZpcnN0cHJpdmF0ZQorb21wX2Zvcl9sYXN0cHJpdmF0ZQorb21wX2Zvcl9vcmRlcmVkCitvbXBfZm9yX3ByaXZhdGUKK29tcF9mb3JfcmVkdWN0aW9uCitvbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMKK29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkCitvbXBfZm9yX3NjaGVkdWxlX3N0YXRpYworb21wX2Zvcl9ub3dhaXQKK29tcF9nZXRfbnVtX3RocmVhZHMKK29tcF9nZXRfd3RpY2sKK29tcF9nZXRfd3RpbWUKK29tcF9pbl9wYXJhbGxlbAorb21wX2xvY2sKK29tcF9tYXN0ZXIKK29tcF9uZXN0X2xvY2sKK29tcF9wYXJhbGxlbF9jb3B5aW4KK29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQKK29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZQorb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24KK29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcworb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitvbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZQorb21wX3NlY3Rpb25fcHJpdmF0ZQorb21wX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25zX25vd2FpdAorb21wX3BhcmFsbGVsX2Zvcl9pZgorb21wX3NpbmdsZV9jb3B5cHJpdmF0ZQorb21wX3NpbmdsZV9ub3dhaXQKK29tcF9zaW5nbGVfcHJpdmF0ZQorb21wX3NpbmdsZQorb21wX3Rlc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfdGhyZWFkcHJpdmF0ZQorb21wX3BhcmFsbGVsX2RlZmF1bHQKK29tcF9wYXJhbGxlbF9zaGFyZWQKK29tcF9wYXJhbGxlbF9wcml2YXRlCitvbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfaWYKK29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24KKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjAKK29tcF9mb3JfY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKK29tcF90YXNreWllbGQKK29tcF90YXNrX2ZpbmFsCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL3Rlc3RsaXN0LWYudHh0IGIvcmMzL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTM4OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dApAQCAtMCwwICsxLDYzIEBACisjIExpc3QgY29udGFpbmluZyB0aGUgdGVzdHMgb2YgdGhlIE9wZW5NUFZhbGlkYWlvbiBTdWl0ZSBhdmFpbGFibGUgdG8gY2hlY2sKKyMgdGhlIGZvcnRhbiBpbXBsZW1lbnRhdGlvbi4KK2RvX2ZpcnN0cHJpdmF0ZQorZG9fbGFzdHByaXZhdGUKK2RvX29yZGVyZWQKK2RvX3ByaXZhdGUKK2RvX3JlZHVjdGlvbgorZG9fc2NoZWR1bGVfZHluYW1pYworZG9fc2NoZWR1bGVfZ3VpZGVkCitkb19zY2hlZHVsZV9zdGF0aWMKK2hhc19vcGVubXAKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfY29weWluCitvbXBfY3JpdGljYWwKK29tcF9mbHVzaAorb21wX2dldF9udW1fdGhyZWFkcworb21wX2luX3BhcmFsbGVsCitvbXBfbG9jaworb21wX21hc3Rlcgorb21wX25lc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfbmVzdGVkCitvbXBfbnVtX3RocmVhZHMKK29tcF90ZXN0bG9jaworb21wX3RocmVhZHByaXZhdGUKK29tcF9nZXRfd3RpY2tzCisjIyNvbXBfd29ya3NoYXJlX2RlZmF1bHQKK29tcF93b3Jrc2hhcmUKKyMjIyBCcmF1Y2h0IG1hbiBkZW4gb2RlciBvYmlnZW4gZXJ3ZWl0ZXJuPworb21wX3d0aW1lCitwYXJfZG9fZmlyc3Rwcml2YXRlCitwYXJfZG9fbGFzdHByaXZhdGUKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX3JlZHVjdGlvbgorcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fcHJpdmF0ZQorcGFyX3NlY3Rpb25fcmVkdWN0CitzZWN0aW9uX2ZpcnN0cHJpdmF0ZQorc2VjdGlvbl9sYXN0cHJpdmF0ZQorc2VjdGlvbl9wcml2YXRlCitzZWN0aW9uX3JlZHVjdGlvbgorb21wX3NpbmdsZQorc2luZ2xlX2NvcHlwcml2YXRlCitzaW5nbGVfbm93YWl0CitzaW5nbGVfcHJpdmF0ZQorCisjIE5ldyB0ZXN0cyBmb3IgT3Blbk1QIDMuMAorZG9fY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKKyNvbXBfdGFza3lpZWxkCisjb21wX3Rhc2tfZmluYWwKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvdGVzdHNfdG9faW50ZWdyYXRlL29tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuYyBiL3JjMy90ZXN0c3VpdGUvdGVzdHNfdG9faW50ZWdyYXRlL29tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTAxNTM0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgIEV4dGVuZGVkIHZlcnNpb24gb2Ygb21wX3NldF91bnNldF9sb2NrLmMgZm9yIHRlc3RpbmcgaGludGVkIGxvY2tzLgorICBDaGVjayB0byBtYWtlIHN1cmUgT3Blbk1QIGxvY2tzIGd1YXJhbnRlZSBtdXR1YWwgCisgIGV4Y2x1c2lvbiBmb3IgbXVsdGlwbGUgdGhyZWFkcy4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvbXAuaD4KKwordm9pZCBjc2NhbGwoaW50IGlkLCBpbnQgblsxMDAwXSwgaW50ICpwYXNzZWQsIG9tcF9sb2NrX3QgKmxvY2spIHsKKyAgICBpbnQgaTsKKworICAgIG9tcF9zZXRfbG9jayggbG9jayApOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgbltpXSA9IGlkOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIGlmICggbltpXSAhPSBpZCApIHsKKyAgICAgICAgICAgICpwYXNzZWQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIG9tcF91bnNldF9sb2NrKCBsb2NrICk7Cit9CisKK2ludCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3QgaGludCkgeworICAgIGludCBwYXNzZWQsIG5bMTAwMF0sIGosIGlkOworICAgIG9tcF9sb2NrX3QgbG9jazsKKyAgICAKKyAgICBwYXNzZWQgPSAxOworCisgICAga21wX2luaXRfbG9ja19oaW50ZWQoJmxvY2ssIGhpbnQpOworCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKG4sIHBhc3NlZCwgbG9jaykgcHJpdmF0ZShpZCwgaikJCisgICAgeworICAgICAgICBpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICBmb3IgKGogPSAxOyBqIDw9IDEwMDAwOyBqKyspIHsKKyAgICAgICAgICAgIGNzY2FsbCggaWQsIG4sICZwYXNzZWQsICZsb2NrICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvbXBfZGVzdHJveV9sb2NrKCZsb2NrKTsKKworICAgIGlmIChwYXNzZWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitpbnQgbWFpbigpIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9ub25lKTsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9jb250ZW5kZWQpOworICAgIHJldCArPSBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3VuY29udGVuZGVkKTsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSk7CisgICAgcmV0ICs9IGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpOworICAgIC8vIFRoaXMgb25lIHdpbGwgZW1pdCBXYXJuaW5nIG9uIG1hY2hpbmVzIHdpdGggbm8gVFNYLiAKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9hZGFwdGl2ZSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBwcmludGYoIiBUZXN0ICVzIGZhaWxlZFxuIiwgX19GSUxFX18pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiBUZXN0ICVzIHBhc3NlZFxuIiwgX19GSUxFX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL3Rlc3RzX3RvX2ludGVncmF0ZS9vbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmYgYi9yYzMvdGVzdHN1aXRlL3Rlc3RzX3RvX2ludGVncmF0ZS9vbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc0M2QzOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvdGVzdHNfdG9faW50ZWdyYXRlL29tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuZgpAQCAtMCwwICsxLDkwIEBACishCishIE1vZGlmaWVkIHZlcnNpb24gb2Ygb21wX3NldF91bnNldF9sb2NrLkYsIHVzaW5nIGhpbnRlZCBsb2NrIEFQSQorIQorICAgICAgcHJvZ3JhbSBvbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkCisKKyAgICAgIGludGVnZXIgcmV0CisjaWYgZGVmaW5lZChfT1BFTk1QKQorICAgICAgaW5jbHVkZSAnb21wX2xpYi5oJworCisgICAgICByZXQgPSAwCisgICAgICBjYWxsIGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfbm9uZSwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X2NvbnRlbmRlZCwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3VuY29udGVuZGVkLCByZXQpCisgICAgICBjYWxsIGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUsIHJldCkKKyAgICAgIGNhbGwgaGludGVkX2xvY2soa21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X2FkYXB0aXZlLCByZXQpCisjZWxzZQorICAgICAgcmV0ID0gMAorI2VuZGlmCisKKyAgICAgIGlmIChyZXQgLmVxLiAwKSB0aGVuCisgICAgICAgICAgcHJpbnQgKiwgJ1Rlc3Qgb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5mIHBhc3NlZCcKKyAgICAgIGVsc2UKKyAgICAgICAgICBwcmludCAqLCAnVGVzdCBvbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmYgZmFpbGVkJworICAgICAgZW5kaWYKKworICAgICAgc3RvcAorICAgICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgaGludGVkX2xvY2sobG9ja19oaW50LCByZXQpCisjaWYgZGVmaW5lZChfT1BFTk1QKQorICAgICAgaW5jbHVkZSAnb21wX2xpYi5oJworICAgICAgaW50ZWdlcihvbXBfbG9ja19raW5kKSBsb2NrCisgICAgICBpbnRlZ2VyKGttcF9sb2NrX2hpbnRfa2luZCkgbG9ja19oaW50CisjZWxzZQorICAgICAgaW50ZWdlciBsb2NrCisgICAgICBpbnRlZ2VyIGxvY2tfaGludAorI2VuZGlmCisgICAgICBpbnRlZ2VyIHJldAorICAgICAgbG9naWNhbCBwYXNzZWQKKyAgICAgIGludGVnZXIgbigxMDAwKSwgaiwgaWQKKyAgICAgIAorICAgICAgcGFzc2VkID0gLlRSVUUuCisKKyAgICAgIGNhbGwga21wX2luaXRfbG9ja19oaW50ZWQobG9jaywgbG9ja19oaW50KQorCishJG9tcCAgcGFyYWxsZWwKKyEkb21wJiAgICAgc2hhcmVkICAgICAgIChuLHBhc3NlZCxsb2NrKQorISRvbXAmICAgICBwcml2YXRlICAgICAgKGlkLGopICAgICAgCisjaWYgZGVmaW5lZChfT1BFTk1QKSAmJiAhZGVmaW5lZChfQVNTVVJFKQorICAgICAgaWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorI2Vsc2UKKyAgICAgIGlkID0gMAorI2VuZGlmCisjaWYgZGVmaW5lZChfQVNTVVJFKQorICAgICAgZG8gaiA9IDEsIDEwCisjZWxzZQorICAgICAgZG8gaiA9IDEsIDEwMDAwCisjZW5kaWYKKyAgICAgICAgICBjYWxsIGNzY2FsbChpZCwgbiwgcGFzc2VkLCBsb2NrKQorICAgICAgZW5kZG8KKyEkb21wICBlbmQgcGFyYWxsZWwKKworICAgICAgY2FsbCBvbXBfZGVzdHJveV9sb2NrKGxvY2spCisKKyAgICAgIGlmICgubm90LiBwYXNzZWQpIHRoZW4KKyAgICAgICAgICByZXQgPSByZXQgKyAxCisgICAgICBlbmRpZgorCisgICAgICBlbmQKKworICAgICAgc3Vicm91dGluZSBjc2NhbGwoaWQsIG4sIHBhc3NlZCwgbG9jaykKKyNpZiBkZWZpbmVkKF9PUEVOTVApCisgICAgICAgIGluY2x1ZGUgJ29tcF9saWIuaCcKKyAgICAgIGludGVnZXIob21wX2xvY2tfa2luZCkgbG9jaworI2Vsc2UKKyAgICAgIGludGVnZXIgbG9jaworI2VuZGlmCisgICAgICBpbnRlZ2VyIGlkLCBpLCBuKDEwMDApCisgICAgICBsb2dpY2FsIHBhc3NlZAorCisgICAgICBjYWxsIG9tcF9zZXRfbG9jayhsb2NrKQorICAgICAgZG8gaSA9IDEsMTAwMAorICAgICAgICAgIG4oaSkgPSBpZAorICAgICAgZW5kZG8KKyAgICAgIGRvIGkgPSAxLDEwMDAKKyAgICAgICAgICBpZiAobihpKSAubmUuIGlkKSBwYXNzZWQgPSAuRkFMU0UuCisgICAgICBlbmRkbworICAgICAgY2FsbCBvbXBfdW5zZXRfbG9jayhsb2NrKQorICAgICAgZW5kCmRpZmYgLS1naXQgYS9yYzMvd3d3L1JFQURNRS50eHQgYi9yYzMvd3d3L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2MDY1MwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy93d3cvUkVBRE1FLnR4dApAQCAtMCwwICsxLDExNiBAQAorCisgICAgICAgICAgICAgICBSRUFETUUgZm9yIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSG93IHRvIEJ1aWxkIERvY3VtZW50YXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gRG94eWdlbiogZm9ybWF0LCBhbmQgdGhpcyBkaXN0cmlidXRpb24KK3Nob3VsZCBjb21lIHdpdGggcHJlLWJ1aWx0IFBERiBkb2N1bWVudGF0aW9uIGluIGRvYy9SZWZlcmVuY2UucGRmLgorSG93ZXZlciwgYW4gSFRNTCB2ZXJzaW9uIGNhbiBiZSBidWlsdCBieSBleGVjdXRpbmc6CisKKyUgZG94eWdlbiBkb2MvZG94eWdlbi9jb25maWcKKworaW4gdGhlIHJ1bnRpbWUgZGlyZWN0b3J5LgorCitUaGF0IHdpbGwgcHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvYy9kb3h5Z2VuL2dlbmVyYXRlZAorZGlyZWN0b3J5LCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkgcG9pbnRpbmcgYSB3ZWIgYnJvd3NlciBhdCB0aGUKK2luZGV4Lmh0bWwgZmlsZSB0aGVyZS4KKworSWYgeW91IGRvbid0IGhhdmUgRG94eWdlbiBpbnN0YWxsZWQsIHlvdSBjYW4gZG93bmxvYWQgaXQgZnJvbQord3d3LmRveHlnZW4ub3JnLgorCisKK0hvdyB0byBCdWlsZCB0aGUgTExWTSogT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0luLXRyZWUgYnVpbGQ6CisKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQorQ2hlY2sgb3V0IG9wZW5tcCBpbnRvIGxsdm0vcHJvamVjdHMKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tYnVpbGQKKyQgbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQKKyQgY21ha2UgcGF0aC90by9sbHZtIC1EQ01BS0VfQ19DT01QSUxFUj08QyBjb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlcj4KKyQgbWFrZSBvbXAKKworT3V0LW9mLXRyZWUgYnVpbGQ6CisKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQorQ2hlY2sgb3V0IG9wZW5tcAorJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlL29wZW5tcC9ydW50aW1lCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCiskIGNtYWtlIHBhdGgvdG8vb3Blbm1wIC1EQ01BS0VfQ19DT01QSUxFUj08QyBjb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlcj4KKyQgbWFrZQorCitGb3IgZGV0YWlscyBhYm91dCBidWlsZGluZywgcGxlYXNlIGxvb2sgYXQgQnVpbGRfV2l0aF9DTWFrZS50eHQKKworQXJjaGl0ZWN0dXJlcyBTdXBwb3J0ZWQKKz09PT09PT09PT09PT09PT09PT09PT09CisqIElBLTMyIGFyY2hpdGVjdHVyZQorKiBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUKKyogSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisqIEFSTSogYXJjaGl0ZWN0dXJlCisqIEFhcmNoNjQgKDY0LWJpdCBBUk0pIGFyY2hpdGVjdHVyZQorKiBJQk0oUikgUG93ZXIgYXJjaGl0ZWN0dXJlIChiaWcgZW5kaWFuKQorKiBJQk0oUikgUG93ZXIgYXJjaGl0ZWN0dXJlIChsaXR0bGUgZW5kaWFuKQorKiBNSVBTIGFuZCBNSVBTNjQgYXJjaGl0ZWN0dXJlcworCitTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQS0zMiBhcmNoaXRlY3R1cmUsIEludGVsKFIpIDY0LCBhbmQKK0ludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZQorCisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgfCAgIGljYy9pY2wgICAgIHwgICAgZ2NjICAgICAgfCAgIGNsYW5nICAgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IExpbnV4KiBPUyAgIHwgICBZZXMoMSw1KSAgICB8ICBZZXMoMiw0KSAgIHwgWWVzKDQsNiw3KSAgIHwKK3wgRnJlZUJTRCogICAgfCAgIE5vICAgICAgICAgIHwgIE5vICAgICAgICAgfCBZZXMoNCw2LDcsOCkgfAorfCBPUyBYKiAgICAgICB8ICAgWWVzKDEsMyw0KSAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNykgICB8Cit8IFdpbmRvd3MqIE9TIHwgICBZZXMoMSw0KSAgICB8ICBObyAgICAgICAgIHwgTm8gICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCwgaWNjL2ljbCB2ZXJzaW9ucyAxMi54IGFyZQorICAgIHN1cHBvcnRlZCAoMTIuMSBpcyByZWNvbW1lbmRlZCkuCisoMikgR0NDKiB2ZXJzaW9uIDQuNyBpcyBzdXBwb3J0ZWQuCisoMykgRm9yIGljYyBvbiBPUyBYKiwgT1MgWCogdmVyc2lvbiAxMC41LjggaXMgc3VwcG9ydGVkLgorKDQpIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBub3Qgc3VwcG9ydGVkLgorKDUpIE9uIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSwgaWNjL2ljbCB2ZXJzaW9ucyAxMy4wCisgICAgb3IgbGF0ZXIgYXJlIHJlcXVpcmVkLgorKDYpIENsYW5nKiB2ZXJzaW9uIDMuMyBpcyBzdXBwb3J0ZWQuCisoNykgQ2xhbmcqIGN1cnJlbnRseSBkb2VzIG5vdCBvZmZlciBhIHNvZnR3YXJlLWltcGxlbWVudGVkIDEyOCBiaXQgZXh0ZW5kZWQKKyAgICBwcmVjaXNpb24gdHlwZS4gIFRodXMsIGFsbCBlbnRyeSBwb2ludHMgcmVsaWFudCBvbiB0aGlzIHR5cGUgYXJlIHJlbW92ZWQKKyAgICBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBjYW5ub3QgYmUgY2FsbGVkIGluIHRoZSB1c2VyIHByb2dyYW0uICBUaGUgZm9sbG93aW5nCisgICAgZnVuY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlOgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl8qCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2XyoKKyAgICBfX2ttcGNfYXRvbWljXypfZnAKKyg4KSBDb21tdW5pdHkgY29udHJpYnV0aW9uIHByb3ZpZGVkIEFTIElTLCBub3QgdGVzdGVkIGJ5IEludGVsLgorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUJNKFIpIFBvd2VyIDcgYW5kIFBvd2VyIDgKKworICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICB8ICAgZ2NjICAgICAgfCAgIGNsYW5nICAgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICBZZXMoMSwyKSAgfCBZZXMoMyw0KSAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gUG93ZXIgNywgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLgorKDIpIE9uIFBvd2VyIDgsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC4KKygzKSBPbiBQb3dlciA3LCBjbGFuZyB2ZXJzaW9uIDMuNyBpcyBzdXBwb3J0ZWQuCisoNCkgT24gUG93ZXIgOCwgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLgorCisKK0Zyb250LWVuZCBDb21waWxlcnMgdGhhdCB3b3JrIHdpdGggdGhpcyBSVEwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGZvbGxvd2luZyBjb21waWxlcnMgYXJlIGtub3duIHRvIGRvIGNvbXBhdGlibGUgY29kZSBnZW5lcmF0aW9uIGZvcgordGhpcyBSVEw6IGNsYW5nIChmcm9tIHRoZSBPcGVuTVAgZGV2ZWxvcG1lbnQgYnJhbmNoIGF0CitodHRwOi8vY2xhbmctb21wLmdpdGh1Yi5pby8gKSwgSW50ZWwgY29tcGlsZXJzLCBHQ0MuICBTZWUgdGhlIGRvY3VtZW50YXRpb24KK2ZvciBtb3JlIGRldGFpbHMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGljZXMKKz09PT09PT0KKworKk90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KZGlmZiAtLWdpdCBhL3JjMy93d3cvUmVmZXJlbmNlLnBkZiBiL3JjMy93d3cvUmVmZXJlbmNlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdjNDBjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3d3dy9SZWZlcmVuY2UucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3JjMy93d3cvY29udGVudC5jc3MgYi9yYzMvd3d3L2NvbnRlbnQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTZhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvd3d3L2NvbnRlbnQuY3NzCkBAIC0wLDAgKzEsMjcgQEAKK2h0bWwgeyBtYXJnaW46IDBweDsgfSBib2R5IHsgbWFyZ2luOiA4cHg7IH0KKworaHRtbCwgYm9keSB7CisgIHBhZGRpbmc6MHB4OworICBmb250LXNpemU6c21hbGw7IGZvbnQtZmFtaWx5OiJMdWNpZGEgR3JhbmRlIiwgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLCBBcmlhbCwgVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyBjb2xvcjogIzIyMjsKKyAgbGluZS1oZWlnaHQ6MS41OworfQorCitoMSwgaDIsIGgzLCB0dCB7IGNvbG9yOiAjMDAwIH0KKworaDEgeyBwYWRkaW5nLXRvcDowcHg7IG1hcmdpbi10b3A6MHB4O30KK2gyIHsgY29sb3I6IzMzMzMzMzsgcGFkZGluZy10b3A6MC41ZW07IH0KK2gzIHsgcGFkZGluZy10b3A6IDAuNWVtOyBtYXJnaW4tYm90dG9tOiAtMC4yNWVtOyBjb2xvcjojMmQ1OGI3fQorbGkgeyBwYWRkaW5nLWJvdHRvbTogMC41ZW07IH0KK3VsIHsgcGFkZGluZy1sZWZ0OjEuNWVtOyB9CisKKy8qIFNsaWRlcyAqLworSU1HLmltZ19zbGlkZSB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgbWFyZ2luLWxlZnQ6IGF1dG87CisgICAgbWFyZ2luLXJpZ2h0OiBhdXRvCit9CisKKy5pdGVtVGl0bGUgeyBjb2xvcjojMmQ1OGI3IH0KKworLyogVGFibGVzICovCit0ciB7IHZlcnRpY2FsLWFsaWduOnRvcCB9CmRpZmYgLS1naXQgYS9yYzMvd3d3L2luZGV4Lmh0bWwgYi9yYzMvd3d3L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjM2UwYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy93d3cvaW5kZXguaHRtbApAQCAtMCwwICsxLDI0MyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgorICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzwhLS0gTWF0ZXJpYWwgdXNlZCBmcm9tOiBIVE1MIDQuMDEgc3BlY3M6IGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEvIC0tPgorPGh0bWw+Cis8aGVhZD4KKyAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgIDx0aXRsZT5PcGVuTVAqIDogU3VwcG9ydCBmb3IgdGhlIE9wZW5NUCBsYW5ndWFnZTwvdGl0bGU+CisgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Im1lbnUuY3NzIj4KKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY29udGVudC5jc3MiPgorPC9oZWFkPgorCis8Ym9keT4KKzxkaXYgaWQ9Im1lbnUiPgorICA8ZGl2PgorICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy8iPkxMVk0gSG9tZTwvYT4KKyAgPC9kaXY+CisKKyAgPGRpdiBjbGFzcz0ic3VibWVudSI+CisgICAgPGxhYmVsPk9wZW5NUCBJbmZvPC9sYWJlbD4KKyAgICA8YSBocmVmPSIvaW5kZXguaHRtbCI+QWJvdXQ8L2E+CisgIDwvZGl2PgorCisgIDxkaXYgY2xhc3M9InN1Ym1lbnUiPgorICAgIDxsYWJlbD5RdWljayBMaW5rczwvbGFiZWw+CisgICAgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmxsdm0ub3JnL21haWxtYW4vbGlzdGluZm8vb3Blbm1wLWRldiI+b3Blbm1wLWRldjwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGlzdHMubGx2bS5vcmcvbWFpbG1hbi9saXN0aW5mby9vcGVubXAtY29tbWl0cyI+b3Blbm1wLWNvbW1pdHM8L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2J1Z3MvIj5CdWcgUmVwb3J0czwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdC9vcGVubXAvdHJ1bmsvIj5Ccm93c2UgU1ZOPC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy92aWV3dmMvbGx2bS1wcm9qZWN0L29wZW5tcC90cnVuay8iPkJyb3dzZSBWaWV3VkM8L2E+CisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgaWQ9ImNvbnRlbnQiPgorICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisgIDxoMT5PcGVuTVAmcmVnOzogU3VwcG9ydCBmb3IgdGhlIE9wZW5NUCBsYW5ndWFnZTwvaDE+CisgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKworICA8cD5UaGUgT3Blbk1QIHN1YnByb2plY3Qgb2YgTExWTSBjb250YWlucyB0aGUKKyAgICAgY29tcG9uZW50cyByZXF1aXJlZCB0byBidWlsZCBhbiBleGVjdXRhYmxlIE9wZW5NUCBwcm9ncmFtIHRoYXQgYXJlCisgICAgIG91dHNpZGUgdGhlIGNvbXBpbGVyIGl0c2VsZi4KKyAgPC9wPgorCisgIDxwPkhlcmUgeW91IGNhbiBmaW5kIDotCisgICAgPHVsPgorICAgICAgPGxpPgorICAgICAgICB0aGUgY29kZSBmb3IgdGhlIHJ1bnRpbWUgbGlicmFyeSBhZ2FpbnN0IHdoaWNoCisgICAgICAgIGNvZGUgY29tcGlsZWQgYnkgPHR0PmNsYW5nIC1mb3Blbm1wPC90dD4gbXVzdCBiZSBsaW5rZWQgYmVmb3JlIGl0CisgICAgICAgIGNhbiBydW4uCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICB0aGUgbGlicmFyeSB0aGF0IHN1cHBvcnRzIG9mZmxvYWQgdG8gdGFyZ2V0IGRldmljZXMgKGluCisgICAgICAgICJvZmZsb2FkIikKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIHRoZSBPcGVuVUggdGVzdC1zdWl0ZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBPcGVuTVAgcnVudGltZQorICAgICAgPC9saT4KKyAgICA8L3VsPgorICA8L3A+CisKKyAgPHA+U3VwcG9ydCBmb3IgdGhlIHBhcnRzIG9mIHRoZSBPcGVuTVAgNC4wIChhbmQgbGF0ZXIpIGxhbmd1YWdlIHRoYXQgYXJlIG5vdAorICBhc3NvY2lhdGVkIHdpdGggdGhlICJ0YXJnZXQiIGNvbnN0cnVjdHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUKKyAgInJ1bnRpbWUiIGRpcmVjdG9yeS4gU3VwcG9ydCBmb3Igb2ZmbG9hZGluZyBjb21wdXRhdGlvbiB2aWEgdGhlCisgICJ0YXJnZXQiIGRpcmVjdGl2ZSBpcyBpbiB0aGUgc2VwYXJhdGUgIm9mZmxvYWQiIGRpcmVjdG9yeS4gVGhhdAorICBidWlsZHMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRyYW5zZmVycmluZyBjb2RlCisgIGFuZCBkYXRhIHRvIGF0dGFjaGVkIGNvbXB1dGF0aW9uYWwgZGV2aWNlcyBzdWNoIGFzCisgIHRoZSBJbnRlbCZyZWcgWGVvbiBQaGkmIzAxNTMgY29wcm9jZXNzb3Igb3IgR1BVcy4KKyAgVGhlIFJFQURNRS50eHQgaW4gdGhlICJvZmZsb2FkIgorICBkaXJlY3RvcnkgZGVzY3JpYmVzIGhvdyB0byBidWlsZCB0aGUgb2ZmbG9hZCBsaWJyYXJ5LgorICA8L3A+CisKKyAgPHA+QWxsIG9mIHRoZSBjb2RlIGhlcmUgaXMgPGEKKyAgICAgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2RvY3MvRGV2ZWxvcGVyUG9saWN5Lmh0bWwjbGljZW5zZSI+ZHVhbCBsaWNlbnNlZDwvYT4KKyAgICAgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGFuZCB0aGUgVUlVQyBMaWNlbnNlIChhIEJTRC1saWtlIGxpY2Vuc2UpLgorICAgICBUaGUgTElDRU5TRS50eHQgZmlsZSBhdCB0aGUgdG9wIG9mIHRoZSBPcGVuTVAgcHJvamVjdCBjb250YWlucworICAgICB0aGUgbGljZW5zZSB0ZXh0IGFuZCBhc3NvY2lhdGVkIHBhdGVudCBncmFudHMuCisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMiBpZD0iZGlyLXN0cnVjdHVyZSI+U3RhdHVzPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgICA8cD5XaXRoIHRoZSByZWxlYXNlIG9mIENsYW5nIDMuOC4wLCBPcGVuTVAgMy4xIHN1cHBvcnQgaXMgZW5hYmxlZCBpbgorICAgQ2xhbmcgYnkgZGVmYXVsdCwgYW5kIHRoZSBPcGVuTVAgcnVudGltZSBpcyB0aGVyZWZvcmUgYnVpbHQgYXMgYQorICAgbm9ybWFsIHBhcnQgb2YgdGhlIENsYW5nIGJ1aWxkLCBhbmQgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgYmluYXJ5CisgICBkaXN0cmlidXRpb25zLllvdSBkbyBub3QsIHRoZXJlZm9yZSwgbmVlZCBleHBsaWNpdGx5IHRvIGNoZWNrIG91dCB0aGlzIGNvZGUsIG9yCisgICBidWlsZCBpdCBvdXQgb2YgdHJlZTsgYSBub3JtYWwgQ2xhbmcgY2hlY2sgb3V0IGFuZCBidWlsZCB3aWxsCisgICBhdXRvbWF0aWNhbGx5IGluY2x1ZGUgYnVpbGRpbmcgdGhlc2UgcnVudGltZSBsaWJyYXJpZXMuCisgICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9ImdvYWxzIj5GZWF0dXJlcyBhbmQgR29hbHM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgICA8dWw+CisgICAgICAgIDxsaT5TdXBwb3J0IGZvciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVubXAub3JnL21wLWRvY3VtZW50cy9PcGVuTVAzLjEucGRmIj5PcGVuTVAKKyAgICAgICAgICAzLjEgc3RhbmRhcmQgKFBERik8L2E+IGhhcyBiZWVuIGFjaGlldmVkIGluIHRoZSBDbGFuZyAzLjguMAorICAgICAgICAgIHJlbGVhc2UuCisgICAgICAgIDwvbGk+CisKKyAgICAgICAgPGxpPlN1cHBvcnQgZm9yIHRoZQorIDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbm1wLm9yZy9tcC1kb2N1bWVudHMvT3Blbk1QNC4wLjAucGRmIj5PcGVuTVAKKyAgICAgICAgICA0LjAgc3RhbmRhcmQgKFBERik8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5tcC5vcmcvbXAtZG9jdW1lbnRzL09wZW5NUDQuNS5wZGYiPk9wZW5NUAorICAgICAgICAgIDQuNSBzdGFuZGFyZCAoUERGKTwvYT4gaXMgbm93IGJlaW5nIGltcGxlbWVudGVkLiAoU29tZSBPcGVuTVAgNC4wCisgICAgICAgICAgYW5kIDQuNSBmZWF0dXJlcyBhcmUgYWxyZWFkeSBhdmFpbGFibGUpLgorICAgICAgICA8bGk+SGlnaCBwZXJmb3JtYW5jZS48L2xpPgorICAgICAgICA8bGk+QUJJIGNvbXBhdGliaWxpdHkgd2l0aCA8YSBocmVmPSJodHRwOi8vZ2NjLmdudS5vcmciPkdjYzwvYT4gYW5kCisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvaW50ZWwtY29tcGlsZXJzIj5JbnRlbCdzCisgICAgICAgIGV4aXN0aW5nIE9wZW5NUCBjb21waWxlcnMuPC9hPgorICAgICAgICBXZSBjdXJyZW50bHkgaGF2ZSBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIE9wZW5NUAorICAgICAgICAzLjEgY29kZSBjb21waWxlZCBieSBnY2MgNC45LCBob3dldmVyIHdlIGRvIG5vdCBoYXZlIHN1cHBvcnQKKyAgICAgICAgZm9yIE9wZW5NUCA0LjAgY29kZSB0aGF0IHVzZXMgdGFzayBjYW5jZWxsYXRpb24gd2hlbiBjb21waWxlZAorICAgICAgICBieSBnY2MgNC45LiBIb3cgd2Ugd2lsbCBzdXBwb3J0IHN1Y2ggY29kZSByZW1haW5zIGEgcmVzZWFyY2ggaXNzdWUuCisgICAgICAgIDwvbGk+CisgICAgPC91bD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMiBpZD0id2h5Ij5XaHkgaGF2ZSB0aGUgcnVudGltZSBjb2RlIGhlcmU/PC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgIDxwPkl0IG1ha2VzIHNlbnNlIHRvIGhhdmUgdGhlIHJ1bnRpbWUgc291cmNlcyBpbiB0aGUgc2FtZSBwbGFjZQorICAgIChhbmQgd2l0aCB0aGUgc2FtZSBsaWNlbnNlKSBhcyB0aGUgY29tcGlsZXIuCisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMiBpZD0icmVxdWlyZW1lbnRzIj5QbGF0Zm9ybSBTdXBwb3J0PC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgICA8cD5UaGUgcnVudGltZSBjYW4gYmUgYnVpbHQgd2l0aCBnY2MsIGljYyBvciBjbGFuZy4gSG93ZXZlciwgbm90ZQorICAgdGhhdCBhIHJ1bnRpbWUgYnVpbHQgd2l0aCBjbGFuZyBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0byB3b3JrIHdpdGgKKyAgIE9wZW5NUCBjb2RlIGNvbXBpbGVkIGJ5IHRoZSBvdGhlciBjb21waWxlcnMsIHNpbmNlIGNsYW5nIGRvZXMgbm90IHN1cHBvcnQKKyAgIGEgMTI4LWJpdCBmbG9hdCB0eXBlLCBhbmQgY2Fubm90IHRoZXJlZm9yZSBnZW5lcmF0ZSB0aGUgY29kZSB1c2VkCisgICBmb3IgcmVkdWN0aW9ucyBvZiB0aGF0IHR5cGUgKHdoaWNoIG1heSBvY2N1ciBpbiB1c2VyIGNvZGUgY29tcGlsZWQKKyAgIGJ5IHRoZSBvdGhlciBjb21waWxlcnMpLgorICAgPC9wPgorCisgIDxwPlRoZSBPcGVuTVAgcnVudGltZSBpcyBrbm93biB0byB3b3JrIG9uCisgICAgPHVsPgorICAgICAgPGxpPkFSTSZyZWc7Jm5ic3A7IGFyY2hpdGVjdHVyZSBwcm9jZXNzb3JzPC9saT4KKyAgICAgIDxsaT5Qb3dlclBDJnRyYWRlOyZuYnNwOyBwcm9jZXNzb3JzPC9saT4KKyAgICAgIDxsaT4zMiBhbmQgNjQgYml0IFg4NgorICAgICAgICBwcm9jZXNzb3JzIHdoZW4gY29tcGlsZWQgd2l0aCBjbGFuZywgd2l0aCB0aGUgSW50ZWwgY29tcGlsZXIKKyAgICAgICAgb3Igd2l0aCBnY2MsIGFuZCBhbHNvIHRoZSBJbnRlbCZyZWc7Jm5ic3A7WGVvbiBQaGkmdHJhZGU7IHByb2R1Y3QgZmFtaWx5LCB3aGVuIGNvbXBpbGVkIHdpdGgKKyAgICAgICAgdGhlIEludGVsIGNvbXBpbGVyLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5NSVBTIGFuZCBNSVBTNjQ8L2xpPgorICAgIDwvdWw+CisgICAgUG9ydHMgdG8gb3RoZXIgYXJjaGl0ZWN0dXJlcyBhbmQgb3BlcmF0aW5nIHN5c3RlbXMgYXJlIHdlbGNvbWUuCisgIDwvcD4KKworICA8cD5BIGZ1bGwgT1MgYW5kIGFyY2hpZWN0dXJlIGNvbXBhdGliaWxpdHkgbWF0cml4IGlzIGluCisgICAgPGEgaHJlZj0iUkVBRE1FLnR4dCI+UkVBRE1FLnR4dDwvYT4KKyAgPC9wPgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDI+R2V0IGl0IGFuZCBnZXQgaW52b2x2ZWQhPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgIDxwPkZpcnN0IHBsZWFzZSByZXZpZXcgb3VyCisgICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9kb2NzL0RldmVsb3BlclBvbGljeS5odG1sIj5EZXZlbG9wZXIncyBQb2xpY3k8L2E+LgorCisgIDxwPlRvIGNoZWNrIG91dCB0aGUgY29kZSwgdXNlOjwvcD4KKworICA8dWw+CisgIDxsaT48Y29kZT5zdm4gY28gaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3Qvb3Blbm1wL3RydW5rIG9wZW5tcDwvY29kZT48L2xpPgorICA8L3VsPgorCisgIDxwPgorICAgICBOb3RlIHRoYXQgZm9yIGFuIGluLXRyZWUgYnVpbGQsIHlvdSBzaG91bGQgY2hlY2sgb3V0IG9wZW5tcCB0byBsbHZtL3Byb2plY3RzLgorICA8L3A+CisKKyAgPHA+SW4tdHJlZSBidWlsZDo8L3A+CisgIDx1bD4KKyAgICA8bGk+PGNvZGU+Y2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZTwvY29kZT48L2xpPgorICAgIDxsaT5DaGVjayBvdXQgb3Blbm1wIGludG8gbGx2bS9wcm9qZWN0czwvbGk+CisgICAgPGxpPjxjb2RlPmNkIHdoZXJlLXlvdS13YW50LXRvLWJ1aWxkPC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPm1rZGlyIGJ1aWxkICZhbXA7JmFtcDsgY2QgYnVpbGQ8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+Y21ha2UgcGF0aC90by9sbHZtIC1EQ01BS0VfQ19DT01QSUxFUj0mbHQ7QyBjb21waWxlciZndDsgLURDTUFLRV9DWFhfQ09NUElMRVI9Jmx0O0MrKyBjb21waWxlciZndDs8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+bWFrZSBvbXA8L2NvZGU+PC9saT4KKyAgPC91bD4KKworICA8cD5PdXQtb2YtdHJlZSBidWlsZDo8L3A+CisgIDx1bD4KKyAgICA8bGk+PGNvZGU+Y2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZTwvY29kZT48L2xpPgorICAgIDxsaT5DaGVjayBvdXQgb3Blbm1wPC9saT4KKyAgICA8bGk+PGNvZGU+Y2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZS9vcGVubXAvcnVudGltZTwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5ta2RpciBidWlsZCAmYW1wOyZhbXA7IGNkIGJ1aWxkPC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPmNtYWtlIHBhdGgvdG8vb3Blbm1wIC1EQ01BS0VfQ19DT01QSUxFUj0mbHQ7QyBjb21waWxlciZndDsgLURDTUFLRV9DWFhfQ09NUElMRVI9Jmx0O0MrKyBjb21waWxlciZndDs8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+bWFrZTwvY29kZT48L2xpPgorICA8L3VsPgorCisgIDxwPkZ1bGwgZGV0YWlscyBvZiBob3cgdG8gYnVpbGQgYXJlIGluIHRoZQorICAgIDxhIGhyZWY9IlJFQURNRS50eHQiPlJFQURNRS50eHQ8L2E+IGFuZCBCdWlsZF9XaXRoX0NNYWtlLnR4dCAoaW5zaWRlIHRoZSBydW50aW1lLyBzdWJkaXJlY3RvcnkpCisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMz5Ob3RlczwvaDM+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPHA+CisKKzwvcD4KKworICA8cD5TZW5kIGRpc2N1c3Npb25zIHRvIHRoZQorICAoPGEgaHJlZj0iaHR0cDovL2xpc3RzLmxsdm0ub3JnL21haWxtYW4vbGlzdGluZm8vb3Blbm1wLWRldiI+T3Blbk1QIG1haWxpbmcgbGlzdDwvYT4pLjwvcD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyPkRlc2lnbiBEb2N1bWVudHM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzx1bD4KKzxsaT48YSBocmVmPSJSZWZlcmVuY2UucGRmIj5SdW50aW1lIGRlc2lnbiAoUERGKTwvYT48L2xpPgorPC91bD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5Db3B5cmlnaHQgbm90aWNlczwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzx1bD4KKzxsaT4KKyAgVGhlIE9wZW5NUCBuYW1lIGFuZCB0aGUgT3Blbk1QIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiB0aGUKKyAgT3Blbk1QIEFyY2hpdGVjdHVyZSBSZXZpZXcgQm9hcmQuCis8L2xpPgorPGxpPgorICBJbnRlbCBpcyBhIHRyYWRlbWFyayBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIKKyAgY291bnRyaWVzLgorPC9saT4KKzxsaT4KKyAgUG93ZXJQQyBpcyBhIHRyYWRlbWFyayBvZiBJQk0gQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yIG90aGVyCisgIGNvdW50cmllcy4KKzwvbGk+Cis8bGk+CisgIEFSTSBpcyBhIHRyYWRlbWFyayBvZiBBUk0gQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yCisgIG90aGVyIGNvdW50cmllcy4KKzwvbGk+Cis8bGk+CisgIE1JUFMgaXMgYSB0cmFkZW1hcmsgb2YgTUlQUyBDb21wdXRlciBTeXN0ZW1zIGluIHRoZSBVLlMuIGFuZC9vcgorICBvdGhlciBjb3VudHJpZXMuCis8L2xpPgorPC91bD4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmMzL3d3dy9tZW51LmNzcyBiL3JjMy93d3cvbWVudS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4ODdiMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy93d3cvbWVudS5jc3MKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKi8KKy8qIHBhZ2UgbGF5b3V0ICovCisvKioqKioqKioqKioqKioqLworCitbaWQ9bWVudV0geworCXBvc2l0aW9uOmZpeGVkOworCXdpZHRoOjI1ZXg7Cit9CitbaWQ9Y29udGVudF0geworCS8qICoqKioqICBFRElUIFRISVMgVkFMVUUgSUYgQ09OVEVOVCBPVkVSTEFQUyBNRU5VICoqKioqICovCisJcG9zaXRpb246YWJzb2x1dGU7CisgIGxlZnQ6MjlleDsKKwlwYWRkaW5nLXJpZ2h0OjRleDsKK30KKworLyoqKioqKioqKioqKioqLworLyogbWVudSBzdHlsZSAqLworLyoqKioqKioqKioqKioqLworCisjbWVudSAuc3VibWVudSB7CisJcGFkZGluZy10b3A6MWVtOworCWRpc3BsYXk6YmxvY2s7Cit9CisKKyNtZW51IGxhYmVsIHsKKwlkaXNwbGF5OmJsb2NrOworCWZvbnQtd2VpZ2h0OiBib2xkOworCXRleHQtYWxpZ246IGNlbnRlcjsKKwliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTkyLDE5MiwxOTIpOworfQorI21lbnUgYSB7CisJcGFkZGluZzowIC4yZW07CisJZGlzcGxheTpibG9jazsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisJYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzNSwyMzUsMjM1KTsKK30KKyNtZW51IGE6dmlzaXRlZCB7CisJY29sb3I6cmdiKDEwMCw1MCwxMDApOworfQo=